文章目录阶段二LIO 前端 - 学习内容详解一、整体架构二、主流程分析三、点云匹配 (ObsModel)四、关键帧机制五、局部地图更新重点总结下一步计划阶段二LIO 前端 - 学习内容详解开始深入学习 LIO激光-惯性里程计前端。这是整个系统的核心部分按照代码流程来讲解。一、整体架构首先看 LaserMapping 类的结构见 laser_mapping.h 主要包含三个核心模块点云预处理 ( preprocess_ ) - 处理原始点云去畸变IMU 处理 ( p_imu_ ) - 处理 IMU 数据预测运动ESKF 滤波器 ( kf_ , kf_imu_ ) - 误差状态卡尔曼滤波器局部地图 ( ivox_ ) - 增量式 voxel 地图二、主流程分析看 Run() 函数 laser_mapping.cc 这是 LIO 的主循环步骤 1: 数据同步 (SyncPackages)if (!SyncPackages()) { return false; }重点 IMU 和 LiDAR 时间戳对齐因为 LiDAR 一帧点云有 0.1 秒的扫描时间需要用这期间的 IMU 数据做积分。看 SyncPackages() 函数取出最早的一帧点云取出这帧点云时间戳之前的所有 IMU 数据把它们放到 measures_ 中步骤 2: IMU 处理与运动补偿p_imu_-Process(measures_, kf_, scan_undistort_);做什么的 用 IMU 数据做预测积分给点云做运动补偿去畸变为什么需要 LiDAR 扫描一帧需要时间这期间机器人在运动所以点云会产生畸变需要用 IMU 预测的位姿来补偿。步骤 3: 第一帧处理if (flg_first_scan_) { // 初始化地图把第一帧点云加进去 ivox_-AddPoints(scan_down_world_-points); flg_first_scan_ false; return true; }步骤 4: 降采样voxel_scan_.setInputCloud(scan_undistort_); voxel_scan_.filter(*scan_down_body_);目的 减少点的数量提高计算效率步骤 5: ESKF 更新最关键kf_.Update(ESKF::ObsType::LIDAR, 1.0);这一步做了什么 调用 ObsModel() 函数计算当前点云和局部地图的匹配构建优化问题并求解更新状态量三、点云匹配 (ObsModel)这是 LIO 最核心的算法A. 查找近邻点ivox_-GetClosestPoint(point_world, points_near, fasterlio::NUM_MATCH_POINTS);从局部地图中找到当前点最近的几个点。B. 估计平面point_selected_surf_[i] math::esti_plane(plane_coef_[i], points_near, ...);用近邻点拟合一个平面。C. 计算残差点到平面距离float pd2 plane_coef_[i].dot(temp); residuals_[i] pd2;D. 构建 H 矩阵和残差向量并行计算std::for_each(std::execution::par_unseq, index.begin(), index.end(), [](...){ // 计算每个点的雅可比 J JTJ[i] (J.transpose() * J).eval() * w; JTr[i] J.transpose() * res * w; });注意 这里用了并行计算 std::execution::par_unseq 所以很快E. 可选点到点 ICPif (options_.enable_icp_part_) { // 也添加点到点的残差 }四、关键帧机制看 MakeKF() 函数if ((last_pose.translation() - cur_pose.translation()).norm() options_.kf_dis_th_ || (last_pose.so3().inverse() * cur_pose.so3()).log().norm() options_.kf_angle_th_) { MakeKF(); }什么时候创建关键帧 移动距离超过阈值默认 2 米旋转角度超过阈值默认 15 度创建关键帧做了什么 把当前点云加到局部地图 ivox_ 中把关键帧保存下来用于后端优化五、局部地图更新看 MapIncremental() 函数ivox_-AddPoints(points_to_add); ivox_-AddPoints(point_no_need_downsample);局部地图策略 不是把所有点都加进去而是有选择地加保持地图稀疏提高查询效率重点总结数据同步 IMU 和 LiDAR 时间戳对齐运动补偿 用 IMU 去除点云畸变点云匹配 点到平面 ICP并行计算 提高效率的关键关键帧机制 局部地图更新策略下一步计划下次学习ESKF 滤波器的具体实现 eskf.hpp IMU 处理模块 imu_processing.hpp 局部地图的 IVox 数据结构