1. FAST-LIO为什么需要调参数先搞懂自己的数据在什么水平先说结论FAST-LIO本身是开箱即用的但“开箱即用”和“在你的场景里精准建图”是两码事。我最早拿它跑官方数据集效果惊艳一换成自制的mid360数据地图直接飘成抽象画走廊走一半开始分层、墙角转弯处出现重影。后来才发现问题大多不是代码bug而是参数设置和数据特征不匹配。很多朋友跟我一开始一样拿到FAST-LIO2的源码把雷达话题和IMU话题一改catkin_make一跑就开始建图。前面几秒看起来挺正常越走越不对劲。这时候你去找issue发现大家都在问同一个问题“为什么我的地图飘了”答案往往就藏在配置文件那几十行参数里。1.1 FAST-LIO的核心工作方式FAST-LIO全称是Fast LiDAR-Inertial Odometry核心思路是用迭代扩展卡尔曼滤波IEKF把激光雷达点云和IMU数据紧耦合在一起再用ikd-Tree维护局部地图。它跟LOAM、Lego-LOAM那种“特征提取帧间匹配”的思路不一样它是直接拿原始点云去做配准少了特征提取这一层所以对环境的适应性更强室内室外都行。但这个“紧耦合”也意味着**IMU和激光雷达之间的信任权重、外参关系、点云疏密程度、局部地图精度全都会直接影响最终轨迹和地图质量。**这些就是参数控制的。你调的不是某个旋钮而是在调整雷达和IMU这两位“队友”之间的配合逻辑。1.2 自制数据比开源数据集难在哪开源数据集比如FAST-LIO官方仓库里的那些bag都是采集环境理想、传感器标定到位、运动模式平缓的“标准答案”。你自己的数据完全不是这个画风手持设备会有高频抖动走路时身体上下颠簸急停转身都是常态小车平台可能出现轮子打滑导致真实运动和IMU感知不一致室内房间特征稀疏白墙、玻璃、长走廊都是激光雷达的噩梦mid360这类固态雷达虽然视场角大但点云密度分布不均远距离点稀疏所以同样一套默认参数官方数据集能跑出漂移小于0.1米的效果你的数据可能直接漂出天际。这跟算法没关系纯属参数没有适应你的传感器状态和环境特征。1.3 调参之前先确认传感器状态我给所有找我帮忙排查的朋友的第一条建议永远是先别动参数先确认数据本身是健康的。怎么确认看三个东西一是话题频率。rostopic hz /livox/lidar和rostopic hz /livox/imu雷达频率稳定在10Hz左右、IMU在200Hz左右mid360内置IMU频率一般是200Hz如果有掉帧、频率波动剧烈后面调参全白搭。二是时间戳是否对齐。mid360的雷达话题和IMU话题时间戳要能做线性插值对齐如果雷达时间戳跳变、或时间戳是乱的FAST-LIO里时间补偿那块会直接把轨迹搞坏。三是IMU数据是否正常。你可以rqt_plot看一下加速度计和陀螺仪数据静止时加速度模长应该在9.8左右陀螺仪基本为0。如果IMU数据本身就是噪声一片后面你无论把gyr_cov调多小都没用数据源坏了滤波器只会把坏数据当成可信输入。这步检查做完再进入真正的调参环节。2. 核心参数逐个拆解每个旋钮到底控制什么FAST-LIO2的配置文件是yaml格式不同版本键名略有差异但核心参数基本一致。我拿使用量最大的mid360配置来说重点讲这几个2.1 点云抽稀point_filter_numpreprocess: lidar_type: 1 # 1为Livox2为Velodyne3为Ouster scan_line: 6 blind: 0.5 point_filter_num: 6 # 每隔6个点抽取1个point_filter_num的作用是控制每帧点云参与配准的数量。mid360每秒产生约20万点CPU根本扛不住全量处理所以每帧抽稀。这个值越大参与计算的点越少速度越快但精度会下降值越小点云越密精度上限越高但CPU占用率飙升。我的经验是**先设一个中庸的值比如6让系统能实时跑起来再根据建图效果微调。**如果地图表面出现明显的空孔或者薄墙拉丝说明抽稀太狠降到4或者3如果CPU占用95%以上且帧率只有十几帧考虑升到8甚至10。这里有个细节容易被忽略抽稀是均匀抽还是按距离抽不同版本实现有差异。但思路一样——让局部地图保留足够的几何约束又不要让计算量爆掉。2.2 局部地图的精度核心filter_size_surfmapping: filter_size_surf: 0.5这是ikd-Tree中局部地图体素滤波的分辨率也是我调参时优先动的参数之一。它决定了局部地图里点云被“网格化”的粒度。这个值越小局部地图保留的细节越多配准精度越高但计算量成倍增加值越大地图越粗糙配准容易“糊”。用mid360在室内场景默认0.5米偏大。室内墙壁、门框、柜子这些特征尺度都在0.1到0.5米之间0.5米的体素会把很多特征直接抹平。我一般先压到0.3试一下如果地图边缘明显锐利了且没有抖动再试试0.25。如果场景是非常空旷的室外矿场、大场地0.3反而会因为点云过于稀疏导致局部地图空洞需要适当放宽到0.4到0.5。判断这个参数是否合适的直观方法建图完成后看墙角、柱子的点云边缘是否锐利。如果边缘像被砂纸打过一样模糊那就调小。2.3 迭代与噪声max_iteration和laser_point_covmapping: max_iteration: 4max_iteration是每次更新时IEKF的最大迭代次数。这个参数直接决定了前端配准是否“较真”。默认4次在大部分场景够用但在快速转弯、剧烈抖动时4次迭代可能来不及收敛地图就会在转弯处出现偏差。我的习惯是在计算资源允许的情况下直接拉到6或8。代价是每帧计算耗时增加但换来的是转弯处轨迹更稳。如果你用的是一般的笔记本迭代8次可能带来明显卡顿那就保持4到6之间。laser_point_cov有的版本叫point_cov是激光点云的噪声协方差默认值通常在0.001附近。它的意义是告诉滤波器“我觉得雷达测距有多准”。这个值设置太小意味着你非常信任每个点点云里有一点噪声就会让轨迹跟着抖设置太大则意味着你不太信任雷达点滤波会更多依赖IMU可能导致轨迹平滑但丢失细节。如果你发现地图表面粗糙、像是点云抖动叠加可以把这个值稍微调大比如0.001调到0.002或0.003会让轨迹更平滑。前提是你的场景点云本身没有系统性偏差这需要靠外参来保证。2.4 IMU的信任权重acc_cov和gyr_covmapping: acc_cov: 0.1 gyr_cov: 0.1 b_acc_cov: 0.0001 b_gyr_cov: 0.0001这组参数是最容易踩坑的地方也是很多人“参数抄作业失败”的根本原因。acc_cov和gyr_cov分别代表加速度计和陀螺仪的噪声方差。数值越小滤波器越信任IMU数值越大越信任激光雷达。b_acc_cov和b_gyr_cov对应的是IMU零偏的随机游走噪声影响长期漂移。问题在于**不同IMU的噪声水平天差地别。**mid360内置的IMU属于消费级噪声偏大而有些DIY平台外接的ICM-20602、BMI088等工业级IMU噪声小得多。如果你用着噪声很大的内置IMU却把acc_cov和gyr_cov设成0.01这种很小的值滤波器就会“盲目信任”一个本身误差很大的IMU结果就是轨迹一会儿真一会儿假。我的经验是**先把这两个值调大让激光雷达在配准中有更高话语权。**比如默认0.1如果轨迹在直行时出现缓慢漂移、或者转弯后回不到原来的位置就把它调到0.3甚至0.5试试。代价是快速运动时轨迹可能有一些跳动感但整体稳定性会明显提升。如果你用的是较好的外接IMU可以反向操作把acc_cov和gyr_cov调小到0.01到0.03让IMU在短时间内的姿态预测更可靠快速旋转时反而比信任激光更稳。2.5 最容易被忽略的外参矩阵extrinsic: R: [0.9999, -0.0012, 0.0031, 0.0012, 0.9999, 0.0027, -0.0031, -0.0027, 0.9999] t: [0.018, 0.007, -0.012]extrinsic是激光雷达到IMU的外参包括旋转矩阵R和平移向量t。**这一个参数往往是建图精度的天花板。**如果你的外参不准后面所有参数调得再好地图依然会在运动时出现系统性漂移而且这种漂移是有方向性的——每次转弯都往同一个方向偏。我用mid360一个特别深的体会是出厂外参看起来精度还行但如果你把雷达装在一个自己设计的支架上哪怕只倾斜了1度转几圈之后累积误差就会让你怀疑人生。1度的姿态误差在10米距离上就会带来约17厘米的横向偏差。所以如果你自制设备一定要标定外参。两种方式一是用kalibr做雷达-IMU外参标定需要标定板二是用FAST-LIO自带的动态外参估计算法先跑一次粗略外参之后再用它建图。实测下来外参标定前后同一段数据的地图闭合误差可以从30厘米降到5厘米以内。3. 实操过程把一个飘成抽象画的地图拉回正轨我用一个实际案例来讲完整的调参流程。场景是室内办公室加走廊总长度约40米用mid360手持采集系统是Ubuntu 20.04 ROS Noetic FAST-LIO2。3.1 数据采集方式决定了50%的效果调参再厉害数据采集阶段如果犯了原则性错误后期很难补救。FAST-LIO没有回环检测它是纯里程计所以你必须让采集路径尽量有“回头路”这样即使中间累积了漂移建图结束后你也能通过目视检查发现偏差大小。纯走一条直线是没法验证精度的。另外两个重要建议起步时先在原地停1到2秒再开始走让滤波器完成初始收敛。我见过很多新手一开机就往前冲前几帧IMU还未对齐轨迹起点就歪了。转弯时尽量放慢速度避免原地转圈和剧烈甩动。固态雷达的视场角虽然大但快速旋转时点云畸变和IMU耦合误差会成倍放大。环境里尽量保留明显的几何特征比如墙角、门框、柱子。如果要扫描一整层楼优先保证走廊两端、房间门口这些位置有清晰的几何约束必要时可以在墙角贴个纸箱增加特征点。3.2 第一次跑出来的“症状”记录我先用官方默认参数跑了一遍数据现象非常典型直行段前10米轨迹与真实路径基本重合第一个转弯完成后轨迹出现明显内偏大约偏了15厘米后续经过走廊时地图里的墙面出现双层像两个平行世界叠在一起回到起点时轨迹闭合误差约35厘米这个症状组合指向两个嫌疑**外参不准导致转弯偏差以及IMU噪声被过度信任导致累积漂移。**于是我按优先级动手。3.3 调参顺序与具体改动调参不是乱试我的固定顺序是先保证外参正确再调整IMU信任最后优化点云密度。第一步重新标定外参。我用kalibr拍了大约2分钟的标定板数据重算外参发现出厂值在旋转矩阵上确实有约0.6度的偏差。更新外参后重新跑同一份数据闭合误差从35厘米降到12厘米。这一下就定位了问题主因。第二步调整acc_cov和gyr_cov。因为mid360内置IMU噪声较大我把acc_cov: 0.1改成acc_cov: 0.3gyr_cov: 0.1改成gyr_cov: 0.3同时把b_acc_cov、b_gyr_cov也分别从0.0001调大一点到0.0003。重新建图闭合误差从12厘米降到6厘米左右直行段的墙面重影也明显减轻。第三步优化局部地图细节。我把filter_size_surf从0.5调到0.3point_filter_num从6调到4。地图的分辨率立刻有了肉眼可见的提升墙面点云更密、墙角线条更锐利。代价是CPU占用率从60%升到85%但依然实时。最终这组参数让同一份数据的闭合误差控制在5厘米以内墙面重影消失走廊宽度和实测误差小于3厘米这对室内建图来说已经够用了。3.4 效果评判不能只看“图好看”建图效果好坏不能光凭肉眼看地图“像不像”。我建议量化评估闭合误差走一圈回到起点轨迹首尾偏差多少。这是最直观的整体精度指标特征尺寸验证地砖宽度、门宽、走廊宽度用激光测距仪实测几个特征尺寸和地图对比点云厚度在墙壁法向截一个剖面看点云分布厚度。理想情况下应该在2到3厘米以内mid360本身有测距噪声每次调参后都记录这三个指标的变化比凭感觉“看起来更准了”要靠谱得多。4. 高频问题排查与避坑实录这部分是我这些年用FAST-LIO踩坑最多的总结基本覆盖了论坛里最常见的求救帖。4.1 地图出现双层重影或拉丝现象墙面像有两个平行层转角处尤其明显。排查思路先确认外参再确认IMU。双层重影本质上是雷达点云和IMU预测位姿不一致。我有个项目里设备是3D打印的支架每次拆装后外参就会改变一开始没注意后来只要重影一律先重标外参。标完发现支架在打印时垂直度差了接近2度这已经是致命偏差。如果是转弯后重影明显大概率是外参旋转矩阵不准如果直行时也重影可能是激光点云噪声大导致配准发散这时候把laser_point_cov适当调大一点有帮助。4.2 长走廊、空旷场地漂移无解现象走进一条长走廊后轨迹开始慢慢往一侧偏移走出走廊后偏移更大几乎无法修正。原因长走廊是激光雷达的退化场景——沿着走廊方向没有有效几何约束雷达只看到两侧墙是平行的无法分辨自己到底走到了哪里。这不是调参能完全解决的问题。我的建议**不要试图通过参数解决退化场景要通过数据采集方式规避。**走走廊时尽量保持居中且不要有大幅横向摆动减少退化方向的无效运动。如果项目允许可以在走廊每隔一段放置一个特征明显的标志物纸箱、三角锥给雷达提供额外约束。类似地空旷停车场建图也是同样的道理。另外要说明FAST-LIO没有回环检测它是纯前端的里程计。如果你需要在大场景里面控制累积误差建议后续接一个LIO-SAM或者FAST-LIO-SAM做闭环优化或者用FAST-LIO输出位姿作为前端配合后续的因子图优化和回环检测。这也是为什么很多SLAM方案里FAST-LIO只做前端的原因。4.3 轨迹飞掉或突然跳变现象走到一半轨迹突然在世界系里偏离一大截甚至跳到天上然后后续所有建图都在错误位置上叠加。这种情况通常有几个原因外参错误到离谱的程度我见过直接把t填反的情况IMU的零偏未正确初始化滤波器在初始阶段就把IMU零偏收敛错了运动时IMU数据饱和或丢包处理方法采集时如果发现轨迹有跳变先从数据层面检查IMU是否连续、有无丢帧。rostopic echo打印IMU数据的帧间隔正常应该非常均匀。如果数据健康但还是跳变把max_iteration调到6以上基本能解决大部分快速运动导致的发散问题。4.4 静态环境地图边界毛糙现象设备静止时地图上同一根柱子会缓慢“呼吸”点云位置来回抖动。这往往是激光雷达噪声和滤波器参数共同作用的结果。mid360本身测距噪声在毫米级但如果环境光照、表面材质不好噪声会变大。我试过对着一块黑色吸光布建图点云噪声明显比白墙大很多。遇到这种情况把laser_point_cov调大、filter_size_surf也适当放大反而能让轨迹更稳。不要一味追求点云密、体素小那会把噪声也一起放大。4.5 常见问题速查表现象优先排查参数调整方向预期效果转弯后地图偏移extrinsic重标外参消除系统性转弯偏差直行缓慢漂移acc_cov/gyr_cov调大数值降低IMU信任直行段轨迹回正地图模糊、边缘糊filter_size_surf从0.5逐步降到0.3边缘锐利细节清晰点云稀疏空洞point_filter_num从6降到3或4点云密度增加快速运动轨迹跳变max_iteration从4调到6到8转弯和抖动更稳长走廊退化漂移无参数可解改采集路线或加外部约束减少无效几何运动静止时点云抖动laser_point_cov调大噪声协方差轨迹更平滑5. 写在最后的一点经验我玩FAST-LIO这几年最大的感受是**建图效果的瓶颈七成在数据和传感器三成在参数半成都不到在代码。**很多朋友一上来就纠结某个参数应该设成0.25还是0.3但真正的精度杀手往往是外参、数据质量和运动方式。所以调参之前先花时间确认设备状态和采集路线比什么都值得。参数这个东西永远不要直接照抄别人的配置。不同型号雷达、不同质量IMU、不同安装方式、不同环境特征最优参数组合都不可能一样。你手里的mid360和我的mid360虽然硬件一样但安装角度、数据采集习惯不同最佳参数就有差异。我用上面的顺序调参一般半小时内能找到一个90分的配置组合剩下的10分就需要根据你的具体场景慢慢磨了。最后再分享一个小技巧调参时每次只改一个参数并且记录下每一版参数跑出来的闭合误差和点云厚度。不要同时改三个参数否则出了问题根本不知道是谁的锅。这个习惯能帮你快速积累出属于自己设备的一套“参数手感”下次换一个场景或换一台设备调起来会快很多。