FAST-LIO2后端优化代码逐行解读:从残差计算到地图更新的完整流程
FAST-LIO2后端优化代码逐行解读从残差计算到地图更新的完整流程当激光雷达在复杂环境中高速移动时如何实现精准的实时定位与建图FAST-LIO2通过创新的迭代误差状态卡尔曼滤波IEKF框架将IMU预积分与激光点云匹配深度融合构建了一套高效的SLAM解决方案。本文将深入解析其后端优化的完整代码实现路径帮助开发者掌握从残差计算到地图更新的核心技术细节。1. 状态初始化与预处理在进入迭代更新之前系统需要完成一系列关键准备工作// 外参转换旋转矩阵转欧拉角 V3D ext_euler SO3ToEuler(state_point.offset_R_L_I); fout_pre setw(20) Measures.lidar_beg_time - first_lidar_time euler_cur.transpose() state_point.pos.transpose() ext_euler.transpose() state_point.offset_T_L_I.transpose() state_point.vel.transpose() state_point.bg.transpose() state_point.ba.transpose() state_point.grav endl;这段代码完成了以下关键操作坐标系转换将IMU到激光雷达的外参旋转矩阵转换为欧拉角表示状态记录输出包含时间戳、姿态、位置、速度、偏置等完整状态信息数据预处理为后续的迭代优化准备初始状态估计关键参数说明参数名称数据类型描述state_pointStateType包含位置、姿态、速度等完整状态offset_R_L_ISO3IMU到激光雷达的旋转外参offset_T_L_IV3DIMU到激光雷达的平移外参2. 迭代卡尔曼滤波核心流程FAST-LIO2的核心创新在于其改进的迭代误差状态卡尔曼滤波实现double t_update_start omp_get_wtime(); double solve_H_time 0; kf.update_iterated_dyn_share_modified(LASER_POINT_COV, solve_H_time); state_point kf.get_x();2.1 迭代更新主循环在update_iterated_dyn_share_modified函数中主要执行以下步骤初始化误差状态vectorized_state dx_new vectorized_state::Zero();残差计算与雅可比矩阵求解dyn_share.valid true; h_dyn_share(x_, dyn_share); Eigen::Matrixscalar_type, Eigen::Dynamic, 12 h_x_ dyn_share.h_x;误差状态传播x_.boxminus(dx, x_propagated); dx_new dx;协方差矩阵更新P_ P_propagated; Matrixscalar_type, 3, 3 res_temp_SO3; MTK::vect3, scalar_type seg_SO3;2.2 卡尔曼增益计算根据状态维数与观测维数的关系采用不同的求逆策略if (n dof_Measurement) { // 状态维数大于观测维数时的标准卡尔曼增益计算 Matrixscalar_type, Eigen::Dynamic, Eigen::Dynamic K_ P_ * h_x_cur.transpose() * (h_x_cur * P_ * h_x_cur.transpose() / R Eigen::Matrixdouble, Dynamic, Dynamic::Identity(dof_Measurement, dof_Measurement)).inverse() / R; } else { // 状态维数小于等于观测维数时的稀疏矩阵求解 cov P_temp (P_ / R).inverse(); Eigen::Matrixscalar_type, 12, 12 HTH h_x_.transpose() * h_x_; P_temp.template block12, 12(0, 0) HTH; cov P_inv P_temp.inverse(); K_h P_inv.template blockn, 12(0, 0) * h_x_.transpose() * dyn_share.h; }迭代收敛条件误差状态增量小于预设阈值达到最大迭代次数默认为5次3. 状态更新与协方差传播完成迭代优化后系统需要更新状态和协方差矩阵state_point kf.get_x(); euler_cur SO3ToEuler(state_point.rot); pos_lid state_point.pos state_point.rot * state_point.offset_T_L_I;3.1 姿态表示转换FAST-LIO2使用多种姿态表示方式以适应不同需求旋转矩阵用于状态估计和变换计算欧拉角用于可视化和调试输出四元数用于ROS消息发布geoQuat.x state_point.rot.coeffs()[0]; geoQuat.y state_point.rot.coeffs()[1]; geoQuat.z state_point.rot.coeffs()[2]; geoQuat.w state_point.rot.coeffs()[3];3.2 协方差后验更新迭代完成后执行最终的协方差更新P_ L_ - K_x.template blockn, 12(0, 0) * P_.template block12, n(0, 0);这一步骤对应卡尔曼滤波中的协方差更新公式 [ P_{k|k} (I - K_k H_k) P_{k|k-1} ]4. 地图增量更新机制FAST-LIO2采用ikd-Tree作为地图表示实现了高效的点云插入与查询t3 omp_get_wtime(); map_incremental(); t5 omp_get_wtime();4.1 点云地图更新流程点云变换将当前帧点云转换到全局坐标系ikd-Tree插入高效地将新点云插入到树结构中动态平衡维护树的平衡以保证查询效率关键性能指标操作时间复杂度说明点插入O(log n)平均情况最近邻搜索O(log n)半径搜索树重建O(n)当不平衡时触发4.2 地图维护策略FAST-LIO2实现了智能化的地图维护机制if (pcl_wait_save-size() 0 pcd_save_en) { string file_name string(scans.pcd); string all_points_dir(string(string(ROOT_DIR) PCD/) file_name); pcl::PCDWriter pcd_writer; pcd_writer.writeBinary(all_points_dir, *pcl_wait_save); }地图维护包括内存管理定期释放无效节点数据持久化支持PCD格式地图保存动态更新根据场景变化调整地图结构5. 结果发布与性能分析系统通过多种ROS话题发布处理结果publish_odometry(pubOdomAftMapped); publish_path(pubPath); publish_frame_world(pubLaserCloudFull);5.1 实时性能监控FAST-LIO2内置了精细的性能分析工具aver_time_consu aver_time_consu * (frame_num - 1) / frame_num (t5 - t0) / frame_num; aver_time_icp aver_time_icp * (frame_num - 1) / frame_num (t_update_end - t_update_start) / frame_num; aver_time_match aver_time_match * (frame_num - 1) / frame_num (match_time) / frame_num;典型时间消耗分布前端预处理约15%IEKF迭代优化约60%地图更新约25%5.2 调试与日志记录完善的日志系统帮助开发者分析问题fout_out setw(20) Measures.lidar_beg_time - first_lidar_time euler_cur.transpose() state_point.pos.transpose() ext_euler.transpose() state_point.offset_T_L_I.transpose() state_point.vel.transpose() state_point.bg.transpose() state_point.ba.transpose() state_point.grav feats_undistort-points.size() endl;日志包含时间戳状态估计值点云特征数量关键性能指标在实际项目中调试FAST-LIO2时经常会遇到IEKF迭代不收敛的情况这时候需要重点检查点云匹配残差和雅可比矩阵的计算是否正确。另一个常见问题是ikd-Tree的内存增长过快可以通过调整地图更新频率和体素滤波参数来优化。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2615311.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!