1. 项目概述
作为一名长期从事SLAM算法开发的工程师,我最近在复现fast-lio2算法时遇到了状态初始化方面的挑战。本文将详细解析fast-lio2中基于LiDAR-IMU的实时初始化过程,特别是其中涉及的状态量迭代机制。这个初始化环节直接决定了后续定位与建图的精度和稳定性,是算法实现中最为关键的技术难点之一。
在工业级应用中,一个鲁棒的初始化系统需要处理传感器噪声、运动模糊、计算效率等多重约束。fast-lio2通过创新的IEKF(迭代扩展卡尔曼滤波)框架,结合ESKF(误差状态卡尔曼滤波)的协方差推导方法,实现了毫米级精度的实时初始化。下面我将结合代码实现,拆解这个过程中的每个技术细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法原理
2.1 卡尔曼滤波基础框架
在fast-lio2的初始化阶段,算法核心建立在卡尔曼滤波的框架之上。传统卡尔曼滤波(KF)包含两个主要环节:
-
预测步骤:基于IMU的运动模型预测状态量
code复制x_pred = F * x_prev + B * u P_pred = F * P_prev * F^T + Q其中Q代表过程噪声协方差
-
更新步骤:利用LiDAR观测修正预测值
code复制K = P_pred * H^T * (H * P_pred * H^T + R)^-1 x_update = x_pred + K * (z - H * x_pred) P_update = (I - K * H) * P_pred其中R代表观测噪声协方差
然而,在LiDAR-IMU初始化这种强非线性系统中,传统KF的线性假设会导致严重误差。这就是fast-lio2转向IEKF和ESKF的根本原因。
2.2 迭代扩展卡尔曼滤波(IEKF)
fast-lio2采用IEKF进行状态更新,其核心迭代过程如下图所示:

与标准EKF的单次更新不同,IEKF通过多次迭代逐步逼近最优估计。具体迭代步骤如下:
-
初始化迭代变量:
c++复制Eigen::MatrixXd H = compute_jacobian(x_pred); Eigen::MatrixXd K = P_pred * H.transpose() * (H * P_pred * H.transpose() + R).inverse(); Eigen::VectorXd dx = K * (z - h(x_pred)); -
迭代更新:
c++复制for (int iter = 0; iter < max_iter; ++iter) { x_temp = x_pred ⊕ dx; // ⊕表示流形上的加法 Ei
