Mid-360激光雷达与IMU标定实战:从环境配置到FAST-LIO集成

发布时间:2026/10/7 17:26:08
Mid-360激光雷达与IMU标定实战:从环境配置到FAST-LIO集成 把Mid-360接到工控机上绝大多数人第一反应是直接跑FAST-LIO看建图效果但我要泼一盆冷水激光雷达与IMU的标定没做好后面所有的点云拼接、SLAM轨迹、机器人定位都是在垃圾数据上盖楼。我去年刚接触Mid-360时也跳过这步结果建图不是飘就是重影最后老老实实回来补标定前后折腾了两周才把整套流程跑顺。这篇文章就是把我踩过的坑、验证过有效的步骤全部写出来从环境配置、IMU内参标定、雷达到IMU的外参标定到最后把结果集成进FAST-LIO全程照着做就能复现。这篇文章适合三类人看第一次用Mid-360做激光SLAM的入门者、在Ubuntu下被驱动编译折腾到头秃的开发者以及已经在跑FAST-LIO但建图效果不理想、想排查外参问题的人。我会把关键命令、参数含义和坑点都列出来尽量做到“抄作业就能跑通”。1. 标定之前先把环境整明白1.1 系统版本与ROS发行版怎么选Mid-360的官方SDK和FAST-LIO对系统环境其实相当挑剔。我用的是Ubuntu 20.04 ROS Noetic个人认为是当前最稳妥的组合。ROS 2的版本比如Humble虽然也能跑livox_ros_driver2但FAST-LIO的ROS 2分支在社区里更新频率不高很多人的移植方案还停留在实验阶段如果你不是专门折腾ROS 2的用户没必要在这里给自己加难度。为什么推荐Noetic而不是更老的Melodic原因有两个。一是livox_ros_driver2在Noetic上的CMake配置更省心老版本的ROS可能需要对源码做额外的兼容性修改二是FAST-LIO本身依赖PCL和EigenNoetic自带的PCL版本更高编译报错少得多。你要是手头只有Ubuntu 18.04也能跑但建议先参考livox_ros_driver2仓库里的旧分支说明把ROS版本切换宏改对再往下走。系统装好之后先建一个catkin工作空间这是后续所有源码的安身之处mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src这里提醒一句工作空间名字尽量不要用中文或带空格别笑我见过有人因为路径带中文导致PCL找不到点云文件排查了整整一天。1.2 驱动和FAST-LIO源码编译Mid-360必须用livox_ros_driver2来驱动老版的livox_ros_driver已经不支持Mid-360这是很多人编译通过却收不到点云的第一大原因。克隆仓库、编译的流程如下cd ~/catkin_ws/src git clone https://github.com/Livox-SDK/livox_ros_driver2.git cd livox_ros_driver2 # 如果你的ROS不是Noetic需要改一下CMakeLists里的ROS版本配置 cd ~/catkin_ws catkin_make这里有个容易忽略的细节livox_ros_driver2的根目录里也有一个package.xml和CMakeLists.txt但真正的驱动源码在build子目录结构里。你要是直接把整个仓库放进工作空间编译大概率会遇到找不到livox_ros_driver2头文件的问题。正确做法是编译前先看一下README确认make -j或catkin_make的步骤而不是无脑一次性编译。FAST-LIO的源码从HKU-MARS官方仓库拉取即可cd ~/catkin_ws/src git clone https://github.com/hku-mars/FAST_LIO.git cd ~/catkin_ws catkin_make编译常见问题我直接列出来Eigen3版本冲突如果系统里同时装了多个Eigen版本编译FAST-LIO时可能报“找不到Eigen/Dense”或版本不匹配。建议在CMakeLists.txt里显式指定Eigen路径或者用sudo apt install libeigen3-dev统一版本。PCL版本不对Noetic自带的PCL是1.10一般没问题。如果是自己源码编译的PCL尽量别改默认路径否则动态库链接会有各种幺蛾子。内存不够FAST-LIO编译时特别吃内存4G内存的机器建议加swap否则可能直接卡死或OOM。把这两块编译通过环境就算准备好了。接下来才是重头戏标定。2. 标定流程核心拆解2.1 先弄清要标定的“外参”是什么很多人一听到“激光雷达和IMU标定”就觉得高深其实本质非常简单IMU坐标系和激光雷达坐标系之间存在一个固定的旋转和平移关系这个关系用数学表示就是变换矩阵(T [R | t])我们标定的目的就是把这个矩阵求出来。Mid-360比较特殊它的机身内部本身就集成了一颗BMI088六轴IMU。也就是说你拿到的原始数据流里既有激光点云也有IMU测量值。那么为什么还要标定因为IMU芯片在出厂时和激光雷达光心之间的相对位置、朝向虽然有工厂标定值但当你通过结构件把Mid-360安装到机器人或车辆上时安装公差会导致实际外参和出厂值有偏差。尤其是旋转角哪怕偏了零点几度累积到几十米外就是几十厘米甚至更大的误差。外参标错会表现为什么现象最典型的就是静止时点云还能看机器人一运动点云立刻出现拖影、重影FAST-LIO建图轨迹缓慢漂移闭环修都修不回来IMU数据与点云配准的残差过大后端优化发散。我用一个生活类比来解释IMU和激光雷达就像两个人一起抬东西如果两个人都朝同一个方向使力事情会很顺利但如果其中一个人稍微偏了一点整个物体就会歪歪扭扭地往前挪。外参就是用来纠正这个人朝向偏差的。2.2 IMU内参标定实操IMU的内参标定主要解决两个指标噪声密度和随机游走。这两个参数直接决定了FAST-LIO在做状态估计时对IMU数据的信任权重。如果内参不对后端滤波器会觉得IMU数据“太可信”或“太不可信”两种情况都会让轨迹变差。常用工具有两个code_utils和imu_utils。后者是基于Allan方差的标定工具能统计出随机游走系数。安装流程是先把code_utils放进工作空间编译再把imu_utils放进去编译。注意前者必须先编译因为imu_utils的头文件依赖它。cd ~/catkin_ws/src git clone https://github.com/gaowenliang/code_utils.git git clone https://github.com/gaowenliang/imu_utils.git cd ~/catkin_ws catkin_make标定操作步骤将Mid-360固定在一个绝对静止的平台上避免任何振动录制至少两小时的IMU数据。对你没看错是两小时。Allan方差分析需要足够长的静态数据才能收敛出可靠曲线录半小时出来的结果往往方差很大实际用起来会飘播放bag包让imu_utils离线处理生成yaml文件roslaunch imu_utils mid360_imu.launch rosbag play imu_static.bag处理完成后在/home/用户名/imu_utils目录下会生成对应时间戳的yaml文件里面包含噪声密度和随机游走两个关键值。这里有个实操心得静态录制时长宁多勿少。我最早只是录了20分钟标定出来的随机游走值和官方参考值差了快一个数量级进FAST-LIO后整个轨迹一直在漂。后来狠心录了3小时结果就非常稳定了。2.3 外参标定的采集与计算雷达到IMU的外参标定落地时通常有两种路线路线一只做内置IMU的微调Mid-360出厂时已给出一组外参如果你的安装结构件加工精度很高、安装面也很平整可以直接先用出厂值跑FAST-LIO的在线外参估计让算法在运行过程中微调。这是最省事的方法也是我目前主力使用的方式。路线二自己外加IMU需要完整标定如果IMU不是Mid-360内置的而是自己装在外部的第二颗IMU那就需要用完整的lidar-imu外参标定工具来计算。社区里比较常用的方案是li_calib这类基于批量优化的工具。核心思路是采集雷达在特征丰富环境中缓慢旋转、加速、减速的六自由度运动数据算法再通过点云配准和IMU预积分的对齐关系反算出外参(R)和(t)。外参采集时的动作设计很重要我总结了一个“三要三不要”要做的动作绕三个轴分别做正反方向的旋转比如pitch上下、yaw左右、roll翻滚每个方向做至少3次动作幅度要大但速度不能太快时长控制在5到10分钟场景要选在墙壁、柱子、箱子等特征明显的地方。不要做的动作不要长时间直线匀速运动这种运动对IMU和雷达的联合标定几乎没有贡献不要在空旷场地跑点云没有特征配准直接失败不要走完一遍就停如果某一段运动不够充分后处理结果会非常不稳定。标定工具运行完之后会输出一组外参表现形式是平移向量和旋转矩阵或者欧拉角。拿到结果后先别急着写进FAST-LIO我习惯先用rviz或者livox_viewer把雷达点云和IMU轨迹叠加显示一下粗略验证方向是否合理。这一步能过滤掉约一半的异常结果。3. 把标定结果集成进FAST-LIO3.1 修改配置文件与启动项FAST-LIO的配置文件是YAML格式位置在src/FAST_LIO/config/mid360.yaml。点开这个文件会发现结构很清晰我们需要改动的主要是这几个字段common: lid_topic: /livox/lidar imu_topic: /livox/imu time_sync_en: false preprocess: lidar_type: 1 scan_line: 4 timestamp_unit: 2 blind: 2.0 mapping: acc_cov: 0.1 gyr_cov: 0.1 extrinsic_T: [0.0, 0.0, 0.0] extrinsic_R: [1, 0, 0, 0, 1, 0, 0, 0, 1]关于这些参数我逐个解释lid_topic和imu_topic对应livox_ros_driver2发布的话题名。Mid-360默认点云话题是/livox/lidarIMU话题是/livox/imu。如果你的驱动配置改过这里要同步改time_sync_en是否启用时间同步。如果使用Mid-360内置IMUIMU数据和点云数据出自同一设备时间戳对齐问题不大可以设成false。如果使用外部IMU强烈建议设成true并配置好对应的同步方式lidar_type1表示Livox自定义点云格式livox_ros_driver2/CustomMsg0表示标准PointCloud2。Mid-360默认用1scan_lineMid-360是4条扫描线这里写4。很多新手把这个当成“雷达线数”以为Mid-360不是机械式雷达就没有扫描线于是填了1结果程序直接崩timestamp_unit时间戳单位2表示秒一般来说保持2即可。改成0或1会导致时间被放大或缩小轨迹会异常发散extrinsic_T和extrinsic_R这就是第2章标定出的外参。extrinsic_T单位是米表示平移extrinsic_R按行优先填写旋转矩阵的9个元素。如果用欧拉角形式需要先手动转成旋转矩阵。这个转换不熟的人可以在MATLAB或Python里借助scipy.spatial.transform完成别手算容易错。我提供一个Python小脚本帮你把欧拉角转成旋转矩阵import numpy as np from scipy.spatial.transform import Rotation as R # 假设标定结果是roll-0.004, pitch0.012, yaw0.003弧度 r R.from_euler(xyz, [-0.004, 0.012, 0.003], degreesFalse) print(extrinsic_R 行优先:) print(r.as_matrix().flatten())3.2 开机建图验一次外参配置改完后启动顺序也有讲究。我第一次直接roslaunch fast_lio mapping_mid360.launch结果什么输出都没有后来发现是因为livox_ros_driver2的节点没有先启动。正确顺序是终端一启动驱动source ~/catkin_ws/devel/setup.bash roslaunch livox_ros_driver2 msg_Mid360.launch终端二启动FAST-LIOsource ~/catkin_ws/devel/setup.bash roslaunch fast_lio mapping_mid360.launch看到终端二刷出[ INFO] [xxx]: Iterative state update complete这类日志并且Rviz里逐渐出现点云地图说明节点已经正常跑起来了。启动后做三个验证动作先让设备静置10秒看看Rviz里点云有没有原地抖动。轻微抖动正常大幅跳动说明IMU内参或外参有问题手持设备或装在小车上缓慢走一个5米左右的闭环回到原点后观察地图终点和起始点是否重合。偏差在10厘米以内就算合格快速转动设备绕Z轴转一圈看点云是否出现明显拖影。如果拖影优先怀疑外参里的旋转分量不准。这套验证动作我在每次标定完都会跑一遍耗时不到10分钟但能省下后面排故障的大量时间。4. 实战排坑与效果调优4.1 建图飘和轨迹发散的排查思路建图飘这个问题我在群里被问过太多次症状通常是“地图一开始挺好走一会就开始偏”或者“原地转圈地图直接糊掉”。按照我的经验排查顺序应该是下面这样的不要跳步排查项目检查方法常见原因外参精度静置时观察Rviz中的点云抖动幅度外参旋转角误差偏大IMU内参对比标定yaml中的噪声密度和随机游走数值静态录制时间不足时间戳打印点云和IMU消息的时间戳观察延迟时间同步未开启或系统时钟漂移硬件固定轻敲雷达外壳看Rviz里点云是否共振安装支架刚性不足运动速度降低运动速度再测一次场景退化导致配准失效我最常遇到的原因是第一条外参旋转角的微小误差。FAST-LIO虽然有在线外参估计功能但也只是在一个较小的初始值附近微调如果初始值差得太离谱估计会陷入局部最优甚至直接发散。所以标定结果一定不能偷懒用单位矩阵代替。另外把mapping.acc_cov和gyr_cov两个参数适当调大代表对IMU数据的信任度降低在某些外参不是特别准的场景下反而能稳住轨迹。但这是权宜之计不要当作根治办法。想验证外参是否还有优化空间可以打开FAST-LIO日志里的残差输出如果残差明显偏大且随运动增大那基本就是外参还差着。4.2 点云异常与时间戳问题的处理Mid-360点云常见异常包括点云整体缺一块、点云出现断层、点云频率不稳定、Rviz里看不到点云。逐个说。点云整体缺一块大概率是雷达视角盲区或遮挡不是软件问题。Mid-360的水平视场角是360度但垂直视场角大约是-7度到52度正上方和正下方是死角安装时一定要把这个盲区遮挡因素考虑进去。点云断层和频率不稳定要优先检查USB接口。Mid-360走的是百兆网口转USB方案USB线材质量差或接口供电不足都会导致丢包。我在测试时遇到过“扫描场景里突然少了一面墙”的现象后来换了一根带屏蔽的USB线就好了。Rviz里完全看不到点云先用命令行确认话题是否有数据rostopic echo /livox/lidar -n1如果话题没有数据说明驱动没正常启动或者IP地址没设置对。Mid-360支持通过livox_ros_driver2的launch文件配置雷达IP默认一般是192.168.1.1具体以说明书为准。在配置工具livox_viewer里也能看到当前雷达IP改IP地址的操作和修改网卡静态IP类似改完记得重启驱动才生效。时间戳问题更隐蔽。如果Mid-360和外部IMU独立工作系统里存在两套时钟源即使都打上了时间戳也会因为时钟漂移导致数据不同步。解决办法是如果雷达内置IMU直接用同一设备的话题天然同源如果必须使用外部IMU开启FAST-LIO的time_sync_en并在硬件层面通过网络时间同步或PPS授时对齐各个传感器时钟。4.3 提升建图稳定性的一些小技巧标定做完、建图能跑之后想要让效果更稳定下面几个点值得注意固定好雷达后用扭矩扳手按指定力矩拧紧外壳螺丝。Mid-360的IMU对振动极其敏感螺丝松一两圈跑起来的点云就会飘。这个细节很多人忽略出了问题还以为是算法不行。不要过度依赖在线外参估计。我在调试阶段会打开外参估计帮助微调但最终交付前会把估计结果回写到YAML里然后关闭在线估计保证每次运行行为一致。定期回放bag测试。建图效果不好时先保存一份点云和IMU的bag包然后反复调整参数回放测试。这样可以避免每次都在现场重复跑动作排查效率高很多。保存地图时注意坐标系。如果需要把FAST-LIO保存的地图用于后续定位或Navigation先确认输出点云所在的坐标系是否和你的全局坐标系一致避免后期再做一次坐标转换。我个人在实际操作中的体会是标定这件事不能只做一次尤其是当设备被拆装过、或者换过安装板、换过机器人的安装位置之后都值得重新验证一遍外参。很多团队抱怨“FAST-LIO不稳定”最后查下来往往不是算法问题而是在拆装之后没有重新标定。最后再分享一个小技巧每次标定完把标定工具生成的中间数据、最终外参、当时的安装照片一起归档形成一份“外参档案”。下次遇到问题翻档案比重新标定快得多而且能在团队协作时省掉大量来回沟通的时间。Mid-360这套组合只要标定关过了后面就是一片坦途。