ESC
输入关键词搜索文章标题和内容

FAST-LIVO2 深度解析 LiDAR-Inertial-Visual 三源融合里程计

本文由 linuxROS 整理发布,首发于 linuxros.cn,转载请注明出处。

FAST-LIVO2 深度解析 LiDAR-Inertial-Visual 三源融合里程计

项目概览

核心功能与定位

FAST-LIVO2 是香港大学 MARS 实验室开源的快速直接法 LiDAR-惯性-视觉里程计框架,发表于 IEEE T-RO 2024(arxiv 2408.14035),代码于 2025 年 1 月正式开源。它将 3D LiDAR、IMU 和相机三种传感器通过紧耦合 ESIKF(误差状态迭代卡尔曼滤波)顺序更新机制融合,在严重退化环境中仍能实现高精度定位与建图。

项目核心创新在于直接法统一处理 LiDAR 和视觉测量,无需特征提取,所有传感器共享同一个体素地图(Voxel Map),实现 LiDAR 点对面残差与视觉光度残差在同一个滤波框架中的紧耦合融合。开发者主笔为郑纯然(Chunran Zheng),核心贡献包括 ESIKF 顺序更新、平面先验改进、参考块动态更新、在线曝光时间估计与按需体素射线投射。

目标用户与解决的问题

适用人群包括无人机/无人车开发者、多传感器融合 SLAM 研究人员、退化环境(隧道、走廊、弱纹理)定位工程团队、直接法视觉里程计学习者以及 3D 重建与彩色点云应用开发者。

针对的工程痛点:

  • 单一 LiDAR 在几何退化环境(长走廊、隧道)中定位失败
  • 单一视觉在弱纹理/弱光照环境中里程计漂移
  • 传统多传感器融合系统计算开销大,无法实时运行
  • LiDAR 与视觉测量模型不统一,融合效果差
  • 特征提取方法依赖手工设计,难以适配不同传感器

一、系统整体架构与分层设计

1.1 架构总览

flowchart TB subgraph S1["传感器层"] direction TB L1["3D LiDAR<br/>Avia/Mid-360"] L2["IMU<br/>200-1000Hz"] L3["相机<br/>灰度/RGB"] end subgraph S2["预处理层"] direction TB P1["IMU前向传播<br/>高频积分"] P2["点云去畸变<br/>反向传播"] P3["扫描重组<br/>Scan Recombination"] P4["图像预处理<br/>仿射变换+梯度"] end subgraph S3["ESIKF顺序更新核心"] direction TB K1["状态预测<br/>IMU运动模型"] K2["LiDAR更新<br/>Point-to-Plane"] K3["视觉更新<br/>光度残差"] K4["收敛判断<br/>迭代终止"] end subgraph S4["统一地图层"] direction TB M1["体素地图<br/>Voxel Map"] M2["平面拟合<br/>法线优化"] M3["视觉地图点<br/>参考块管理"] end subgraph S5["输出层"] direction TB O1["6DoF位姿<br/>SE3"] O2["彩色点云<br/>Colored Cloud"] O3["导航定位<br/>Odom→Nav2"] end S1 --> S2 S2 --> S3 S3 <--> S4 S3 --> S5 style L1 fill:#E3F2FD style L2 fill:#E3F2FD style L3 fill:#E3F2FD style P1 fill:#F3E5F5 style P2 fill:#F3E5F5 style P3 fill:#F3E5F5 style P4 fill:#F3E5F5 style K1 fill:#E3F2FD style K2 fill:#E3F2FD style K3 fill:#E3F2FD style K4 fill:#FFF8E1 style M1 fill:#E8F5E9 style M2 fill:#E8F5E9 style M3 fill:#E8F5E9 style O1 fill:#E3F2FD style O2 fill:#E3F2FD style O3 fill:#E3F2FD

1.2 核心模块交互关系

flowchart LR subgraph IN["输入"] direction TB IMU["IMU数据<br/>200-1000Hz"] LID["LiDAR点云<br/>10-20Hz"] CAM["图像帧<br/>20-30Hz"] end subgraph F["ESIKF滤波器"] direction TB PROP["状态预测<br/>+协方差传播"] LUP["LiDAR更新<br/>点对面残差"] VUP["视觉更新<br/>光度残差"] PROP --> LUP LUP --> VUP end subgraph MP["统一地图"] direction TB VM["体素地图"] IKD["ikd-Tree近邻"] end IMU --> PROP LID --> LUP CAM --> VUP VM --> LUP VM --> VUP IKD --> LUP LUP --> VM VUP --> VM VUP --> OUT["位姿输出"] VM --> MAPOUT["地图输出"] style IMU fill:#E3F2FD style LID fill:#E3F2FD style CAM fill:#E3F2FD style PROP fill:#F3E5F5 style LUP fill:#F3E5F5 style VUP fill:#F3E5F5 style VM fill:#E8F5E9 style IKD fill:#E8F5E9 style OUT fill:#E8F5E9 style MAPOUT fill:#E8F5E9

1.3 技术栈选型

层级 技术选型 说明
核心语言 C++17 高性能实时计算
线性代数 Eigen >= 3.3.4 矩阵运算、SVD 分解
李群/李代数 Sophus(double-only 分支) SE3/SO3 位姿表示
点云处理 PCL >= 1.6 点云滤波与变换
视觉处理 OpenCV >= 3.2 图像处理、光流跟踪
相机模型 Vikit(rpg_vikit) 针孔/鱼眼相机模型
地图结构 ikd-Tree 增量式 k-d 树,O(log n) 查询
滤波框架 IKFoM 流形上的迭代卡尔曼滤波
机器人中间件 ROS1(Noetic,兼容 16.04~20.04) 话题通信、参数配置
可视化 RViz 点云/轨迹/地图实时显示
构建系统 CMake + catkin ROS 包编译

二、完整数据流处理路径

2.1 从数据采集到决策输出的全流程

flowchart TB A1["🔴 IMU原始数据"] --> B1["前向传播<br/>高频积分"] A2["🔴 LiDAR原始点云"] --> B2["去畸变<br/>反向传播补偿"] A3["🔴 相机原始图像"] --> B3["图像预处理<br/>仿射+梯度"] B1 --> C1["状态预测"] B1 --> B2 B2 --> D1["扫描重组"] B3 --> D1 D1 --> E1["ESIKF迭代更新"] C1 --> E1 E1 --> F1{"LiDAR更新<br/>收敛?"} F1 -->|"否"| E1 F1 -->|"是"| F2{"视觉更新<br/>收敛?"} F2 -->|"否"| E1 F2 -->|"是"| G1["✅ 后验状态<br/>SE3位姿"] G1 --> H1["地图更新<br/>体素+ikd-Tree"] G1 --> H2["位姿发布<br/>/Odometry"] G1 --> H3["点云发布<br/>/cloud_registered"] H1 --> H4["彩色点云地图<br/>/cloud_map"] style A1 fill:#FFEBEE style A2 fill:#FFEBEE style A3 fill:#FFEBEE style B1 fill:#E3F2FD style B2 fill:#E3F2FD style B3 fill:#E3F2FD style C1 fill:#F3E5F5 style D1 fill:#F3E5F5 style E1 fill:#F3E5F5 style F1 fill:#FFF8E1 style F2 fill:#FFF8E1 style G1 fill:#E8F5E9 style H1 fill:#E3F2FD style H2 fill:#E3F2FD style H3 fill:#E3F2FD style H4 fill:#E8F5E9

2.2 ESIKF 顺序更新时序

sequenceDiagram participant IMU as IMU participant LIDAR as LiDAR participant CAM as 相机 participant ESIKF as ESIKF participant MAP as 体素地图 IMU->>ESIKF: 前向传播(400Hz) Note over ESIKF: 状态预测+协方差传播 LIDAR->>ESIKF: 点云到达(10Hz) ESIKF->>ESIKF: 反向传播去畸变 loop 迭代(最多5次) ESIKF->>MAP: 查询近邻(ikd-Tree) MAP-->>ESIKF: 返回平面参数 ESIKF->>ESIKF: LiDAR更新 CAM->>ESIKF: 图像帧到达 ESIKF->>MAP: 查询可见体素 MAP-->>ESIKF: 视觉地图点 ESIKF->>ESIKF: 视觉更新+曝光估计 end ESIKF->>MAP: 更新地图 ESIKF-->>IMU: 输出Odometry

2.3 时间同步机制

ESIKF 顺序更新对时间同步要求严格:IMU 提供高频运动先验,LiDAR 与相机则按各自采样时刻进入滤波器。系统通过扫描重组(Scan Recombination)将异步采样的 LiDAR 点重组到相机采样时刻的扫描点,保证 LiDAR 与视觉在同一个 ESIKF 迭代内完成顺序更新。

时间戳对齐策略:

  • IMU 持续前向传播,提供 200-1000Hz 的运动预测
  • LiDAR 扫描期间使用 IMU 反向传播估计每个点的瞬时位姿
  • 相机曝光时刻作为 ESIKF 更新的参考时间锚点
  • 同步板(STM32 产生 PPS 脉冲)保证硬件级时间对齐

三、传感器系统与硬件配置

3.1 三种传感器角色分工

传感器 型号示例 频率 数据类型 系统角色
3D LiDAR Livox Avia / Mid-360 / Velodyne VLP-16 10Hz 3D 点云(x,y,z,intensity) 几何约束主传感器
IMU 内置 BMI088 / 外部 Xsens 200-1000Hz 加速度+角速度(6 轴) 运动预测+去畸变
相机 灰度 FLIR BFS / RGB Intel D435 20-30Hz 图像(640×480 / 752×480) 纹理约束辅助传感器

3.2 LiDAR 关键参数对比

参数 Livox Avia Livox Mid-360 Velodyne VLP-16
扫描模式 非重复扫描 非重复扫描 旋转式扫描
视场角 FOV 70°(H)×77°(V) 360°(H)×59°(V) 360°(H)×30°(V)
点云密度 ~240,000 pts/s ~200,000 pts/s ~300,000 pts/s
测距范围 0.2-450m 0.1-40m 0.3-100m
测距精度 ±2cm @ 20m ±2cm @ 20m ±3cm @ 20m
激光波长 905nm 905nm 903nm

LiDAR 在系统中的核心作用是提供几何约束(Point-to-Plane 残差)、通过 ikd-Tree 增量构建全局点云地图,并通过点云约束关系检测环境几何退化。

3.3 IMU 关键参数对比

参数 BMI088(内置) Xsens MTi-670(外部)
陀螺仪范围 ±125~±2000°/s ±450°/s
陀螺仪噪声密度 0.014°/s/√Hz 0.006°/s/√Hz
加速度计范围 ±3~±24g ±10g
加速度计噪声密度 175μg/√Hz 60μg/√Hz
采样频率 200-400Hz 400-1000Hz
标定方式 Allan 方差标定 出厂标定+Allan 方差

IMU 承担三类任务:400Hz 高频积分预测机器人运动状态、反向传播估计每个 LiDAR 点的瞬时位姿以补偿扫描期间运动、为 ESIKF 提供先验状态估计和协方差传播。

3.4 相机关键参数对比

参数 FLIR BFS-PGE-16S2M(灰度) Intel RealSense D435(RGB)
分辨率 640×480 / 752×480 640×480 / 1280×720
帧率 20-30fps 15-30fps
快门类型 全局快门 卷帘快门
镜头模型 针孔模型(ATAN) 针孔+畸变模型
标定方式 Kalibr 标定内外参 FAST-Calib 标定外参

相机在系统中提供直接法光度残差,补充 LiDAR 在几何退化环境中的约束,同时为点云地图赋予 RGB 颜色信息,在走廊、隧道等 LiDAR 退化场景中提供关键约束。

3.5 硬件同步方案

项目开源了手持设备 LIV_handhold,包含 STM32 同步板(产生 PPS 脉冲同步 LiDAR 和相机)、3D 打印外壳与传感器安装支架的 CAD 文件、LiDAR/IMU/相机/STM32 的完整接线方案、同步采集节点的 ROS 驱动代码。

四、RViz 可视化与数据查看

4.1 RViz 实时可视化话题

FAST-LIVO2 基于 ROS RViz 实现实时数据可视化,提供完整的可视化配置:

可视化项 ROS 话题 消息类型 说明
配准点云 /cloud_registered sensor_msgs/PointCloud2 去畸变后的当前帧点云
全局地图 /cloud_map sensor_msgs/PointCloud2 累积的彩色点云地图
里程计 /Odometry nav_msgs/Odometry 6DoF 位姿估计
轨迹路径 /path nav_msgs/Path 历史轨迹路径
当前扫描 /livox/lidar sensor_msgs/PointCloud2 LiDAR 原始点云
相机图像 /camera/image sensor_msgs/Image 相机实时图像

4.2 离线分析与评估工具链

工具 用途 说明
RViz 实时可视化 点云/轨迹/位姿/图像同步显示
evo 轨迹评估 ATE/RPE 指标计算,支持 KITTI/TUM 格式
PCL Viewer 点云离线查看 PCD 文件加载,支持颜色渲染
CloudCompare 地图后处理 大规模点云编辑、滤波、Mesh 生成
rosbag 数据录制回放 记录/回放传感器数据流

五、核心算法 ESIKF 与统一地图

5.1 算法清单与角色

算法 类型 在系统中的角色
ESIKF 状态估计 核心滤波框架,顺序更新状态
ikd-Tree 数据结构 增量式近邻查询,O(log n) 动态更新
Point-to-Plane ICP 点云配准 LiDAR 测量模型,几何约束
直接法视觉里程计 视觉定位 视觉测量模型,光度残差
体素地图 地图表示 LiDAR+视觉共享地图
法线优化 几何处理 提升 Point-to-Plane 精度

5.2 ESIKF 状态向量与顺序更新

ESIKF 核心思想是将系统状态分解为名义状态+误差状态,在误差状态空间进行线性化,通过迭代更新提高线性化精度。状态向量共 24 维:

来自 linuxros.cn · linuxROS
x = [R, p, v, b_a, b_g, g, R_LI, p_LI]ᵀ
     │  │  │   │    │   │   │     │
     │  │  │   │    │   │   │     └─ LiDAR-IMU 平移外参(3)
     │  │  │   │    │   │   └─────── LiDAR-IMU 旋转外参(3)
     │  │  │   │    │   └─────────── 重力向量(3)
     │  │  │   │    └─────────────── 陀螺仪偏置(3)
     │  │  │   └──────────────────── 加速度计偏置(3)
     │  │  └──────────────────────── 速度(3)
     │  └─────────────────────────── 位置(3)
     └────────────────────────────── 旋转 SO3(3)

顺序更新流程:

flowchart TB A["🔴 IMU前向传播"] --> B["状态预测 x̂, P̂"] B --> C["LiDAR测量更新<br/>点对面残差"] C --> D["视觉测量更新<br/>光度残差"] D --> E{"收敛?"} E -->|"否"| C E -->|"是"| F["✅ 后验状态输出"] style A fill:#FFEBEE style B fill:#F3E5F5 style C fill:#E3F2FD style D fill:#E3F2FD style E fill:#FFF8E1 style F fill:#E8F5E9

LiDAR 更新步骤:

  1. 从 ikd-Tree 查询每个点的 5 个近邻
  2. 拟合局部平面,计算法向量 n 和中心点 q
  3. 计算点对面残差 z = nᵀ(R·p_L + t - q)
  4. 计算雅可比矩阵 H = ∂z/∂δx
  5. 卡尔曼更新 K = P̂Hᵀ(HP̂Hᵀ + R)⁻¹,状态更新 δx = K·z
  6. 协方差更新 P = (I - KH)P̂(I - KH)ᵀ + KRKᵀ

视觉更新步骤:

  1. 从体素地图查询当前帧可见的视觉地图点
  2. 对每个地图点提取参考块(w×w 像素)和当前块
  3. 计算光度残差 z = I_cur(warp(p_ref, δx)) - I_ref(warp(p_ref))
  4. 仿射变换补偿光照变化,在线估计曝光时间
  5. 梯度加权:高梯度像素权重更大
  6. 同样的卡尔曼更新流程

5.3 ikd-Tree 增量式 k-d 树

ikd-Tree 突破传统 k-d 树不支持动态插入/删除的限制,通过增量式平衡策略实现 O(log n) 操作:

操作 时间复杂度 说明
点插入 O(log n) 增量插入,延迟平衡
点删除 O(log n) 标记删除,懒清理
近邻查询 O(log n) 5 近邻查询,用于平面拟合
树平衡 O(n) 周期性 超过阈值时触发重建
下采样 O(n) 树上直接体素下采样

与 Octree/nanoflann KD-Tree 对比:

特性 ikd-Tree Octree nanoflann KD-Tree
增量更新 O(log n) O(log n) 需重建
动态平衡 自动 自动 不支持
体素下采样 树上直接 天然支持 需额外处理
大规模性能 优秀 中等 优秀(静态)

5.4 直接法视觉里程计

直接法与特征点法对比:

特性 直接法(FAST-LIVO2) 特征点法(ORB-SLAM3)
特征提取 不需要 ORB 特征检测+描述子
残差定义 光度残差(像素灰度差) 几何残差(重投影误差)
对弱纹理 鲁棒(梯度加权) 容易丢失特征
计算开销 低(无需特征匹配) 高(特征提取+匹配)
地图表示 参考块(像素块) 地图点(3D 坐标)

视觉地图点选择策略采用可见体素查询、按需光线投射(Raycasting)确认可见性、基于残差大小和梯度方向剔除异常点、视角变化超过阈值时更新参考块图像。

5.5 体素地图统一表示

LiDAR 和视觉共享同一个体素地图,每个体素同时承载几何信息与视觉信息:

Voxel {
    ├── 几何信息
    │   ├── 点集 {p₁, p₂, ..., pₙ}     # 体素内 3D 点
    │   ├── 法向量 n                      # 平面法线
    │   ├── 平面中心 q                    # 平面中心点
    │   └── 平面拟合协方差                # 拟合不确定性
    │
    └── 视觉信息
        ├── 视觉地图点 p_v               # 3D 坐标
        ├── 参考块 I_ref                 # w×w 像素参考图像
        ├── 参考位姿 T_ref               # 参考帧位姿
        └── 仿射参数 a, b                # 光照补偿参数
}

六、导航定位与退化环境鲁棒性

6.1 ROS 话题输出

FAST-LIVO2 输出的定位信息通过 ROS 话题发布,可直接接入导航系统:

输出 话题 消息类型 频率 用途
位姿估计 /Odometry nav_msgs/Odometry 10Hz 6DoF 位姿
坐标变换 /tf tf2_msgs/TFMessage 10Hz camera_init→body
配准点云 /cloud_registered sensor_msgs/PointCloud2 10Hz 去畸变点云
全局地图 /cloud_map sensor_msgs/PointCloud2 1Hz 累积彩色地图
轨迹路径 /path nav_msgs/Path 10Hz 历史轨迹

6.2 Nav2 导航系统集成

flowchart TB subgraph FL["FAST-LIVO2 定位层"] direction TB F["LiDAR+IMU+Camera"] ODOM["/Odometry 6DoF"] MAP["/cloud_map"] F --> ODOM F --> MAP end subgraph N2["Nav2 导航系统"] direction TB PL["路径规划器<br/>NavFn/Smac"] CL["代价地图<br/>Costmap2D"] BT["行为树<br/>BehaviorTree"] MP["运动控制<br/>DWB/MPPI"] RC["恢复控制器"] end ODOM --> CL ODOM --> MP MAP --> CL PL --> BT BT --> CL CL --> MP MP --> CMD["/cmd_vel"] RC --> BT style F fill:#E3F2FD style ODOM fill:#E3F2FD style MAP fill:#E3F2FD style PL fill:#F3E5F5 style CL fill:#F3E5F5 style BT fill:#F3E5F5 style MP fill:#F3E5F5 style RC fill:#FFEBEE style CMD fill:#E8F5E9

6.3 退化环境互补策略

FAST-LIVO2 的核心优势在于退化环境中的鲁棒性,通过三传感器互补实现:

退化场景 LiDAR 状态 视觉状态 IMU 状态 融合策略
长走廊 几何退化 正常(纹理丰富) 正常 视觉补充走廊方向约束
隧道 几何退化(圆柱对称) 弱光照 正常 IMU 短期预测+视觉辅助
楼梯间 部分退化 正常 正常 视觉提供 6DoF 约束
弱纹理墙面 正常(几何丰富) 纹理退化 正常 LiDAR 主导定位
快速旋转 点云稀疏 运动模糊 正常 IMU 高频预测补偿
动态障碍 外点干扰 部分遮挡 正常 鲁棒核函数剔除外点

6.4 UAV 自主导航应用

论文中展示了 FAST-LIVO2 在无人机自主导航中的完整应用:定位(实时 6DoF 位姿)→ 建图(实时 3D 点云地图)→ 规划(基于地图的 Bubble Planner 路径规划)→ 控制(MPC 轨迹跟踪)→ 避障(动态障碍物检测与规避)。所有计算均在机载计算机上实时完成。

6.5 精度评估数据

数据集 平台 传感器组合 ATE(m) 场景特点
NTU-VIRAL UAV Avia+IMU+灰度 0.026 室内复杂环境
Hilti-Obs 手持 OS0-128+IMU+灰度 0.034 建筑工地
MARS-LVIG 手持 Avia+IMU+灰度 0.035 校园室内外
自建-走廊 手持 Mid-360+IMU+RGB 0.041 LiDAR 退化环境
自建-隧道 手持 Avia+IMU+灰度 0.062 LiDAR+视觉退化
自建-森林 手持 Avia+IMU+灰度 0.045 无结构环境

七、快速上手与编译运行

7.1 环境依赖

# Ubuntu 16.04~20.04 + ROS Noetic
sudo apt install ros-noetic-desktop-full

# 核心依赖库
sudo apt install libpcl-dev libeigen3-dev libopencv-dev

7.2 Sophus 与 Vikit 编译

# Sophus(non-templated/double-only 分支)
git clone https://github.com/strasdat/Sophus.git
cd Sophus && git checkout a621ff
mkdir build && cd build && cmake ..
make && sudo make install

# Vikit(与 fast-livo1 不同,需用 rpg_vikit 仓库)
cd ~/catkin_ws/src
git clone https://github.com/xuankuzcr/rpg_vikit.git

7.3 主仓编译与运行

# 克隆并编译
cd ~/catkin_ws/src
git clone https://github.com/hku-mars/FAST-LIVO2
cd ~/catkin_ws
catkin_make
source devel/setup.bash

# 启动并播放数据集
roslaunch fast_livo mapping_avia.launch
rosbag play YOUR_DOWNLOADED.bag

7.4 推荐学习路径

顺序 内容 难度 预计时间
1 编译运行 + RViz 可视化 中 1 小时
2 阅读 ESIKF 框架代码 高 2 小时
3 理解 ikd-Tree 数据结构 高 2 小时
4 理解 LiDAR 测量模型 高 1 小时
5 理解直接法视觉模型 很高 3 小时
6 阅读论文(T-RO 2024) 很高 3 小时
7 接入自己的传感器平台 很高 1-2 天
8 集成 Nav2 导航系统 极高 2-3 天

八、项目资源信息

资源 标识
GitHub 仓库 hku-mars/FAST-LIVO2
论文 arxiv 2408.14035(T-RO 2024)
关联数据集 FAST-LIVO2-Dataset(OneDrive)
手持设备开源 xuankuzcr/LIV_handhold
标定工具 hku-mars/FAST-Calib
增量 k-d 树 hku-mars/ikd-Tree
卡尔曼滤波库 hku-mars/IKFoM
前代项目 hku-mars/FAST_LIO、hku-mars/r3live
许可证 GPL-2.0
主要语言 C++

FAST-LIVO2 用统一的体素地图和 ESIKF 顺序更新框架,将 LiDAR 的几何约束、IMU 的运动预测和相机的纹理约束融为一体。在走廊里 LiDAR 退化时视觉补位,在弱纹理时 LiDAR 主导,三传感器互补让机器人在任何环境中都不迷失方向。

注:基于 hku-mars/FAST-LIVO2 仓库 README 与 arxiv 2408.14035 论文校正技术参数:PCL 最低版本为 1.6(非 1.8)、OpenCV 最低版本为 3.2(非 4.2)、Sophus 使用 non-templated/double-only 分支、代码于 2025-01-23 正式开源。GitHub Stars 数据截至 2025 年 4 月约 2,197,原文 2,600+ 为预估值已删除。

版权声明

作者linuxROS
协议本作品采用 CC BY-NC-SA 4.0 许可协议:署名-非商业性使用-相同方式共享
关注欢迎关注微信公众号 linuxROS,获取更多机器人 / 嵌入式 / Linux 干货
返回首页