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 架构总览
1.2 核心模块交互关系
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 从数据采集到决策输出的全流程
2.2 ESIKF 顺序更新时序
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 维:
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)
顺序更新流程:
LiDAR 更新步骤:
- 从 ikd-Tree 查询每个点的 5 个近邻
- 拟合局部平面,计算法向量 n 和中心点 q
- 计算点对面残差
z = nᵀ(R·p_L + t - q) - 计算雅可比矩阵
H = ∂z/∂δx - 卡尔曼更新
K = P̂Hᵀ(HP̂Hᵀ + R)⁻¹,状态更新δx = K·z - 协方差更新
P = (I - KH)P̂(I - KH)ᵀ + KRKᵀ
视觉更新步骤:
- 从体素地图查询当前帧可见的视觉地图点
- 对每个地图点提取参考块(w×w 像素)和当前块
- 计算光度残差
z = I_cur(warp(p_ref, δx)) - I_ref(warp(p_ref)) - 仿射变换补偿光照变化,在线估计曝光时间
- 梯度加权:高梯度像素权重更大
- 同样的卡尔曼更新流程
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 导航系统集成
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+ 为预估值已删除。