K2E-B-S18-1 · Paper Note

FAST-LIO

Created 2023-08-25Updated 2026-06-08slam / papers / s-slam-systems / s18-fast-lio

  • Description:FAST-LIO 论文笔记 — 紧耦合迭代卡尔曼滤波激光惯性里程计,前向/反向传播运动补偿、IEKF 迭代状态更新、卡尔曼增益新形式(避免高维矩阵求逆)、源码架构走读
  • My Notion Note ID:K2E-B-S18-1
  • Created:2023-08-25
  • Updated:2026-06-08
  • License转载欢迎:转载请注明作者 Yu Zhang 并附原文出处(yuzhang.io

Table of Contents


1. Summary

Title: FAST-LIO: A Fast, Robust LiDAR-Inertial Odometry Package by Tightly-Coupled Iterated Kalman Filter Authors: Wei Xu, Fu Zhang (HKU MARS Lab,DJI 资助) Paper: arXiv:2010.08196 (IEEE RA-L 2021, 6(2)) Github: hku-mars/FAST_LIO

FAST-LIO 提出用紧耦合迭代扩展卡尔曼滤波 (IEKF) 融合 LiDAR 特征点与 IMU,实现快速鲁棒的激光惯性里程计。论文核心贡献是一个新的卡尔曼增益公式,把计算复杂度从测量维度(激光点数 mm,可达上千)降到状态维度(n=18n=18,固定),使高密度点云的实时融合成为可能。

系统在流形 SO(3)×R15SO(3)\times\mathbb{R}^{15} 上运作,用 /\boxplus/\boxminus 算子统一处理旋转量。反向传播对激光扫描期间的运动畸变进行去除,然后 IEKF 迭代重线性化收敛,最后把当前帧配准进 kd-tree 地图。

在无人机平台(DJI Manifold 2-C)上实时运行:户外建筑物序列(140 m)漂移仅 0.05%(0.07 m);相比 LOAM 处理时间 59 ms,FAST-LIO 在更多点的条件下(1430 vs 1107 points)仅需 23 ms。

FAST-LIO 系统框架:LiDAR 输入→地图检索→残差计算→IEKF 迭代→状态更新(10–50 Hz 输出)


2. Key Contributions

  • 新卡尔曼增益公式:利用矩阵求逆引理将 m×mm\times m 求逆改写为 n×nn\times n,复杂度从测量维度降到状态维度
  • 紧耦合 IEKF:在流形上迭代重线性化,处理点-面残差的强非线性
  • 反向传播运动补偿:以扫描结束时刻为基准,IMU 反向积分去除帧内运动畸变
  • 轻量、鲁棒,适合无人机等算力受限平台

3. Method

3.1 状态与流形

状态在流形 M=SO(3)×R15\mathcal{M} = SO(3)\times\mathbb{R}^{15} 上:

x=[RGI,  pGI,  vGI,  bω,  ba,  g](1)\mathbf{x} = \bigl[\mathbf{R}_{GI},\;\mathbf{p}_{GI},\;\mathbf{v}_{GI},\;\mathbf{b}_\omega,\;\mathbf{b}_a,\;\mathbf{g}\bigr] \tag{1}

RGISO(3)\mathbf{R}_{GI}\in SO(3):IMU 到全局系旋转;pGI\mathbf{p}_{GI}:位置;vGI\mathbf{v}_{GI}:速度;bω,ba\mathbf{b}_\omega, \mathbf{b}_a:陀螺/加速度计 bias;g\mathbf{g}:重力方向(可观)。

/\boxplus/\boxminus 算子:旋转部分用李代数 so(3)\mathfrak{so}(3) 进行加减,其余分量普通加减,见 李群与李代数

3.2 前向传播(预测步)

每来一帧 IMU,先按离散运动学传播名义状态均值ff 为连续 IMU 动力学,uiu_i 为 IMU 输入,噪声取 0,Δt\Delta t 为 IMU 间隔):

x^i+1=x^i(Δtf(x^i,ui,0))(1b)\hat{\mathbf{x}}_{i+1} = \hat{\mathbf{x}}_i \boxplus \bigl(\Delta t \cdot f(\hat{\mathbf{x}}_i, \mathbf{u}_i, \mathbf{0})\bigr) \tag{1b}

(论文 Eq.4)

再传播误差状态协方差

P^k=FxPk1FxT+FwQFwT(2)\hat{\mathbf{P}}_{k} = \mathbf{F}_x\,\mathbf{P}_{k-1}\,\mathbf{F}_x^T + \mathbf{F}_w\,\mathbf{Q}\,\mathbf{F}_w^T \tag{2}

Fx\mathbf{F}_x:误差状态转移雅可比;Fw\mathbf{F}_w:噪声雅可比;Q\mathbf{Q}:IMU 过程噪声协方差;P^k\hat{\mathbf{P}}_k:预测协方差。

3.3 反向传播与运动补偿

问题:一帧 LiDAR 扫描耗时 ~100 ms,扫描期间载体在运动,帧内各点在不同位姿下采集→运动畸变。

FAST-LIO 方案:以扫描结束时刻 tkt_k 为基准,对帧内每个点(采集时刻 ρj<tk\rho_j < t_k),用 IMU 从 tkt_k 反向积分得到 IjI_j 相对 IkI_k 的相对位姿 TˇIjIk\check{\mathbf{T}}^{I_k}_{I_j}(只是个刚体变换,不是完整 18 维状态),把点变换到 tkt_k 时刻坐标系→去畸变(paper Eq.10):

pfjLk=TLI1TˇIjIkTLIpfjLj\mathbf{p}^{L_k}_{f_j} = \mathbf{T}_{LI}^{-1}\,\check{\mathbf{T}}^{I_k}_{I_j}\,\mathbf{T}_{LI}\,\mathbf{p}^{L_j}_{f_j}

TLI\mathbf{T}_{LI} 为 LiDAR-IMU 外参,pfjLj\mathbf{p}^{L_j}_{f_j} 为点在采集时刻 LiDAR 系坐标。

3.4 残差

每个去畸变后的点 pj\mathbf{p}_j,在地图中找最近平面,残差 = 点到平面距离:

zj=ujT ⁣(RGI(RILpj+pIL)+pGIqj)(3)z_j = \mathbf{u}_j^T\!\left(\mathbf{R}_{GI}(\mathbf{R}_{IL}\,\mathbf{p}_j + \mathbf{p}_{IL}) + \mathbf{p}_{GI} - \mathbf{q}_j\right) \tag{3}

uj\mathbf{u}_j:平面法向量;qj\mathbf{q}_j:平面上一点;RIL,pIL\mathbf{R}_{IL}, \mathbf{p}_{IL}:LiDAR-IMU 外参。论文 Eq.12 是更一般形式 zj=Gj(p^fjqj)z_j = \mathbf{G}_j(\hat{\mathbf{p}}_{f_j} - \mathbf{q}_j)平面特征 Gj=ujT\mathbf{G}_j = \mathbf{u}_j^T(如上),特征 Gj=uj\mathbf{G}_j = \lfloor\mathbf{u}_j\rfloor_\wedge(点到线,LOAM 风格)。

3.5 迭代状态更新(IEKF)

标准 EKF 一步更新——对强非线性点-面残差收敛不够精确。FAST-LIO 在当前估计点反复重线性化。第 κ\kappa 次迭代的更新不是简单加增量,而含两项(paper Eq.18):

x^κ+1=x^κ(Kzκ(IKH)(Jκ)1(x^κx^k))(4)\hat{\mathbf{x}}^{\kappa+1} = \hat{\mathbf{x}}^\kappa \boxplus \Bigl(-\mathbf{K}\mathbf{z}^\kappa - (\mathbf{I}-\mathbf{K}\mathbf{H})(\mathbf{J}^\kappa)^{-1}(\hat{\mathbf{x}}^\kappa \boxminus \hat{\mathbf{x}}_k)\Bigr) \tag{4}

第一项 Kzκ-\mathbf{K}\mathbf{z}^\kappa 是观测修正;第二项是先验残差拉回x^k\hat{\mathbf{x}}_k 为预测先验、Jκ\mathbf{J}^\kappa\boxplus 引入的流形雅可比)——正是它把迭代更新与普通 EKF 单步区分开。迭代直到 x^κ+1x^κ<ε\|\hat{\mathbf{x}}^{\kappa+1} \boxminus \hat{\mathbf{x}}^\kappa\| < \varepsilon 收敛(ε\varepsilon 为预设收敛阈值,典型取 10310^{-3} 量级;见 高斯滤波家族 §6)。

3.6 卡尔曼增益新形式

核心创新。标准增益:

K=PHT(HPHT+R)1(5)\mathbf{K} = \mathbf{P}\mathbf{H}^T(\mathbf{H}\mathbf{P}\mathbf{H}^T + \mathbf{R})^{-1} \tag{5}

括号内矩阵维度 = 测量维度 mm(激光点数,可达上千)→ O(m2)O(m^2) 计算复杂度(论文原文),极贵。

用矩阵求逆引理(Sherman-Morrison-Woodbury)改写:

K=(HTR1H+P1)1HTR1(6)\mathbf{K} = \bigl(\mathbf{H}^T\mathbf{R}^{-1}\mathbf{H} + \mathbf{P}^{-1}\bigr)^{-1}\mathbf{H}^T\mathbf{R}^{-1} \tag{6}

括号内矩阵维度 = 状态维度 n=18n = 18,与 mm 无关O(n3)O(n^3) 求逆。见 高斯滤波家族 §2


4. Experiments & Results

平台:Livox AVIA LiDAR + DJI Manifold 2-C(i7-8550U,8 GB)+ 定制 280 mm 轴距无人机。

计算复杂度对比——两种增益公式的实际耗时 (ms)(Table II):

激光点数 标准公式(旧) 新公式
307 7.1 0.07
717 23.4 0.11
998 109.3 0.25
1243 251 0.37
1453 1219 0.59
1802 1621 1.16

1243 点时旧公式需 251 ms(无法实时),新公式仅 0.37 ms——降低约 680 倍

系统对比(室内高旋转场景,Table III)

方法 有效特征点数 处理时间
LOAM 1107 59 ms
LOAM + IMU 1107 44 ms
FAST-LIO 1430 23 ms

FAST-LIO 用更多点、跑得更快。

轨迹漂移

  • UAV 室内圆形轨迹(半径 1.8 m,重复 4 圈):漂移 0.3%(0.08 m / 32 m)
  • 户外建筑物手持扫描(140 m):漂移 0.05%(0.07 m)

室内大旋转场景:FAST-LIO 地图(右下)远比 LOAM / LOAM+IMU(上两格)干净

UAV 室外轨迹:圆形路径 4 圈,起终点基本重合,蓝色方块 = 起点


5. Ablation & Discussion

论文无系统性消融实验,以下是主要设计权衡:

  • IEKF vs EKF:点-面残差强非线性,单步 EKF 收敛不够;迭代收敛后精度更高,论文未给精度对比数字,但实验结果隐含
  • 新增益公式的意义:仅降低计算量,不改变估计精度(数学等价);量化见表 Table II
  • 静态 kd-tree vs ikd-Tree:FAST-LIO v1 用静态 kd-tree,新点加入需局部重建;FAST-LIO2 引入 ikd-Tree(自平衡增量插入/删除),避免每帧重建整棵树→进一步提速
  • 反向传播 vs 前向插值去畸变:反向传播更精确(利用 IMU 全频率),计算量与前向相当

6. Strengths / Limitations / Future Work

优点

  • 滤波派 LIO 也能达到优化派精度(实验证明)
  • 新卡尔曼增益公式是可复用通用技巧,任何高维测量的 KF 都适用
  • 轻量:在无人机嵌入式计算机上实时运行,无 GPU 依赖
  • 开源,代码结构清晰

局限

  • 无回环 / 全局优化(纯里程计)
  • 静态 kd-tree,超大场景需频繁重建(FAST-LIO2 解决)
  • 仅支持点-面残差(LOAM 类),边缘特征选用相对保守

后续工作

  • FAST-LIO2(T-RO 2022):直接用原始点 + ikd-Tree,精度和速度进一步提升
  • FasterLIO:用 iVox(基于体素的近似最近邻)替代 ikd-Tree
  • Point-LIO:去除显式特征提取,直接用全点云
  • 港大 MARS Lab 的 LIO 系列基石

7. Code Walkthrough

代码库:hku-mars/FAST_LIO(当前主分支对应 FAST-LIO2,含 ikd-Tree;算法流程与 v1 一致)

7.1 目录结构

FAST_LIO/
  src/
    laserMapping.cpp   ← 主节点:同步、预处理、调度
    IMU_Processing.hpp ← 前向/反向传播、状态预测
  include/
    ikd-Tree/          ← 增量 kd-tree (FAST-LIO2 引入)
    IKFoM_toolkit/
      esekfom/         ← 流形上 IEKF 库
  config/
    avia.yaml          ← Livox AVIA 参数
    velodyne.yaml      ← Velodyne 参数
  launch/
    mapping_avia.launch
    mapping_velodyne.launch

7.2 主节点流程(laserMapping.cpp)

main()
  ├── 初始化 ROS 参数、订阅者(LiDAR / IMU)、发布者
  ├── 创建 esekf 实例 kf(状态 18 维,输入 12 维)
  └── 主循环:
        sync_packages()          ← 对齐 LiDAR + IMU 时间戳
        p_imu->Process()         ← 前向传播 + 反向传播运动补偿
        kf.update_iterated_dyn_share_modified()  ← IEKF 迭代更新
        map_incremental()        ← 把当前帧点加入 kd-tree 地图

回调

  • livox_pcl_cbk() / standard_pcl_cbk():接收 LiDAR 数据,存入 lidar_buffer
  • imu_cbk():接收 IMU,缓冲到 imu_buffer(含时间戳修正)

7.3 IMU_Processing.hpp — 前向 / 反向传播

  • IMUPredict()(前向):每帧 IMU 用离散运动方程积分状态;同时传播误差协方差(式 2)
  • UndistortPcl()(反向):从扫描结束时刻反向积分,给帧内每个点计算相对位姿 check_state,变换到 tkt_k 时刻坐标系(式 3 前的去畸变)

7.4 esekfom — 流形 IEKF

  • 模板库,路径 include/IKFoM_toolkit/esekfom/;主类 esekf<state_ikfom, 12, input_ikfom>
  • update_iterated_dyn_share_modified():迭代调用用户定义的 h_share_model(计算残差 zjz_j 和雅可比 H\mathbf{H}),用新公式(式 6)计算增益,\boxplus 更新状态,直到收敛

7.5 关键配置参数(avia.yaml)

参数 含义
lid_topic LiDAR 点云话题
imu_topic IMU 话题
extrinsic_T / extrinsic_R LiDAR-IMU 外参(平移 + 旋转矩阵)
extrinsic_est_en 是否在线估计外参
scan_line 激光线数(影响特征提取)
pcd_save_enable 是否保存点云地图

7.6 paper-vs-code 差异

论文 代码
静态 kd-tree(v1 论文) 主分支用 ikd-Tree(v2 的增量树),v1 功能的 branch 已归档
反向传播描述基于 IMU 反向积分 UndistortPcl 实现时维护 check_state 链,逐点变换
新增益公式(式 6) esekfom/esekf.hppupdate_iterated_dyn_share_modified 直接实现
论文仅描述单线程 代码有 ROS 多回调线程,mtx_buffer + sig_buffer 保护共享队列

References

类别 链接
论文 Xu W., Zhang F. (2021). FAST-LIO: A Fast, Robust LiDAR-Inertial Odometry Package by Tightly-Coupled Iterated Kalman Filter. IEEE RA-L, 6(2). arXiv:2010.08196
FAST-LIO2 Xu W., Cai Y., He D., Lin J., Zhang F. (2022). FAST-LIO2: Fast Direct LiDAR-Inertial Odometry. IEEE T-RO. — ikd-Tree + 直接点
代码 github.com/hku-mars/FAST_LIO
相关 iEKF 见 高斯滤波家族 §6;矩阵求逆引理见 高斯滤波家族 §2;流形扰动见 李群与李代数 §9;激光去畸变见本文 §3.3