FAST-LIO 实战:从 LI-Init 标定到 YAML 配置全解析
1. FAST-LIO 与 LI-Init 标定基础FAST-LIO 是近年来激光雷达 SLAM 领域的热门算法它以计算效率高、鲁棒性强著称。但要让 FAST-LIO 在实际项目中发挥最佳性能LI-Init 标定是绕不开的第一步。所谓 LI-Init就是激光雷达Lidar与惯性测量单元IMU之间的时空标定包括外参旋转和平移和时间偏移的校准。我第一次接触 FAST-LIO 时以为只要把设备装好就能直接跑通结果建图效果惨不忍睹——点云扭曲得像抽象画。后来才发现LI-Init 标定的精度直接决定了后续建图的质量。这就好比用歪斜的尺子画直线工具本身没问题但基准没校准好结果自然南辕北辙。LI-Init 的核心是解决两个问题空间标定和时间标定。空间标定确定激光雷达与 IMU 之间的相对位置和姿态时间标定则解决两者数据采集时的时间同步问题。实测发现即使是毫秒级的时间误差也会导致高速运动时的点云畸变。2. LI-Init 标定实战步骤2.1 硬件准备与环境搭建标定前需要准备已固定连接的激光雷达和 IMU 设备标定板建议使用棋盘格或 AprilTag稳定的供电系统我习惯用 Velodyne VLP-16 和 Xsens MTi-3 组合这套配置性价比高且兼容性好。安装时要注意确保设备刚性连接避免振动导致相对位移记录初始安装角度后续标定可验证准确性检查线缆不会在移动中拉扯设备环境搭建建议使用 Ubuntu 20.04 ROS Noetic这是目前最稳定的组合。安装依赖时特别注意sudo apt-get install ros-noetic-pcl-ros ros-noetic-tf2-sensor-msgs2.2 数据采集技巧采集数据时最容易犯三个错误运动轨迹太单一只做平移或只旋转速度变化不够丰富时间太短建议至少3分钟我的标准采集流程设备对准标定板静止10秒用于初始对齐以不同速度做8字形运动配合俯仰、偏航等三维旋转最后再静止10秒实测发现包含急加速和急刹车的运动数据对标定精度提升最明显。记得在室内环境操作避免GPS等干扰源。2.3 标定执行与结果验证运行标定命令roslaunch li_init_calibration li_init.launch关键参数解读max_calib_time: 建议设为300秒太短可能欠拟合bag_rate: 播放速度1.0为实时scan4map: 设为true可提升特征点提取质量标定完成后要验证两个指标重投影误差应小于0.05m时间偏移量正常在毫秒级我曾遇到外参标定不准的情况检查发现是IMU的安装方向在配置文件中设反了。建议用rviz可视化标定结果直观检查点云与IMU坐标系的对齐情况。3. YAML 配置文件深度解析3.1 通用参数设置common部分是整个系统的基石几个易错点common: lid_topic: /velodyne_points # 必须与实际话题一致 imu_topic: /imu/data # 注意检查话题频率 time_sync_en: false # 除非时间同步有问题 time_offset_lidar_to_imu: 0.0 # LI-Init标定得到的时间偏移特别提醒time_sync_en这个参数90%的新手会设错。只有在硬件确实无法同步时才设为true否则会引入额外误差。我曾在无人机项目中发现设为true后高速飞行时的点云会出现周期性抖动。3.2 预处理参数优化preprocess部分直接影响点云质量preprocess: lidar_type: 2 # 1-Livox 2-Velodyne 3-Ouster scan_line: 16 # 必须与激光雷达线束一致 blind: 2 # 过滤近距离噪点 timestamp_unit: 2 # 时间戳单位微秒对于不同场景建议调整室内场景blind设为1.5米室外场景scan_line需准确设置32线雷达要改对应值高速运动timestamp_unit必须正确否则会丢帧3.3 建图参数调优mapping部分是性能关键mapping: acc_cov: 0.1 # IMU加速度计噪声 gyr_cov: 0.1 # IMU陀螺仪噪声 fov_degree: 180 # 有效视场角 det_range: 50.0 # 最大检测距离经验参数无人机场景det_range建议80-100米手持设备fov_degree可缩小到120度高动态环境适当增大acc_cov和gyr_cov有个坑我踩过三次extrinsic_est_en在线标定功能在设备固定后一定要关闭否则会引入漂移。曾经有个项目跑了2小时后地图突然扭曲就是这个参数没设对。4. 实战问题排查指南4.1 常见报错与解决点云不显示检查lidar_type是否匹配确认lid_topic与ROS话题一致使用rostopic hz /velodyne_points检查频率建图漂移重新验证LI-Init标定结果检查IMU数据是否正常特别是角速度调整acc_cov和gyr_cov参数系统崩溃降低scan_line数值可能是内存不足关闭dense_publish_en减少输出检查pcd_save_en是否导致存储压力4.2 性能优化技巧实时性优化设置scan_bodyframe_pub_en: false关闭不必要的可视化publish选项使用interval控制点云保存频率精度提升在extrinsic_T中微调Z轴偏移激光雷达安装高度增大fov_degree包含更多特征点在动态环境中启用extrinsic_est_en内存管理pcd_save: pcd_save_en: true interval: 100 # 每100帧保存一次这个配置可以避免长时间运行时内存溢出。我在做仓库巡检机器人时曾因为设成-1导致8小时后系统崩溃。5. 进阶应用场景5.1 多传感器融合配置当加入GPS或视觉传感器时需要在YAML中扩展配置fusion: gps_en: true gps_topic: /gps/data gps_cov: 0.5 vision_en: false注意GPS需要确保有良好的天空视野设置合适的gps_cov城市环境建议1.0以上注意坐标系转换通常需要ENU到NED的转换5.2 动态环境适应对于行人或车辆较多的场景启用动态物体过滤dynamic_filter: enable: true threshold: 0.5提高IMU权重mapping: imu_weight: 1.5减小地图更新间隔map_update: 0.5 # 秒这套配置在我参与的商场导航项目中效果显著误匹配率降低了60%。5.3 长期建图优化对于需要重复建图的场景使用子地图策略submapping: enable: true size: 20.0 # 子地图边长米启用回环检测loop_closure: enable: true interval: 5.0保存关键帧配置keyframe: min_distance: 0.5 min_angle: 15.0这套方案在园区巡检机器人上实现了厘米级重复定位精度。