ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

LIO-SAM激光雷达与IMU联合标定全流程:外参配置、避坑指南与验证方法

LIO-SAM激光雷达与IMU联合标定全流程:外参配置、避坑指南与验证方法 1. 联合标定到底在做什么先说结论LIO-SAM跑得好不好、建图飘不飘八成取决于激光雷达和IMU之间的外参准不准。很多人拿到LIO-SAM第一件事就是编译、跑数据集结果一上自己的车或者自己的机器人地图要么分层、要么转圈漂移往往绕了一圈回来才发现问题就出在外参上。LIO-SAM的核心思想是“紧耦合”也就是把激光雷达的点云信息和IMU的角速度、加速度放到同一个优化框架里去解算。这里面的关键前提是系统认为每个时刻雷达坐标系和IMU坐标系之间的变换关系是已知的、固定的。这个变换关系就是外参通常表示成一个4×4的齐次变换矩阵。如果你给它的外参是错的哪怕偏了1度、偏了1厘米系统内部对点云的去畸变、帧间匹配、因子图优化都会受到影响。你会看到最简单的现象就是静止的时候点云发虚、转一圈回来起点和终点对不上稍微跑快一点整个地图直接散架。我在帮人排查LIO-SAM故障的时候最常说的一句话是先检查外参再去折腾算法参数。联合标定不是可选项而是跑LIO-SAM之前必须要过的关卡。这篇文章就把完整的标定流程、参数配置以及我踩过的坑全部整理出来照着做一遍基本上就不会再被外参问题折磨了。2. LIO-SAM的外参格式与数学含义2.1 外参到底长什么样在LIO-SAM的配置里外参是以extrinsicRot和extrinsicTrans两个参数形式给出的。打开config/params.yaml就能看到类似这样的内容# extrinsic parameters extrinsicRot: [1, 0, 0, 0, 1, 0, 0, 0, 1] extrinsicTrans: [-0.02, 0.01, 0.05]extrinsicRot是一个3×3的旋转矩阵extrinsicTrans是一个3×1的平移向量。两者合起来表达的是“从IMU坐标系到雷达坐标系的变换”也就是把IMU坐标系下的点变换到雷达坐标系下。这里要特别注意方向。LIO-SAM代码中的使用方式是先用外参把IMU测量值变换到雷达坐标系然后再参与激光雷达的配准。所以extrinsicRot和extrinsicTrans对应的是IMU到雷达的变换而不是雷达到IMU。很多人拿标定工具的结果直接填进去结果地图反而更飘就是因为方向反了。2.2 旋转矩阵与欧拉角的关系旋转矩阵的可读性很差日常交流中我们习惯说“雷达装在IMU前方5厘米、上方3厘米绕X轴转了2度”。这里说的“绕X轴转了2度”就是欧拉角的表达方式。标定工具输出的可能是四元数quaternion也可能是旋转矩阵你需要把它们转换成欧拉角来辅助判断数值是否合理。常用的转换思路是先根据你的安装方式估算一个大概的外参比如雷达装在IMU正前方平移就是[0.3, 0, 0.1]旋转基本接近单位阵然后微调几个小角度。标定工具给出的结果如果和你的估算差得离谱比如旋转矩阵里出现了接近90度的分量那大概率是坐标系定义不同导致的。判断时把握一个原则机械安装明明很规整标定结果却非常怪异先别急着信工具回头查一查工具输出的是“IMU到雷达”还是“雷达到IMU”是“雷达坐标系下的四元数”还是“IMU坐标系下的四元数”。这类问题我遇到过不下五次。2.3 平移与旋转哪个影响更大我实测下来旋转外参的影响远大于平移外参。原因是激光雷达点云在远距离处的角分辨率会被放大旋转误差0.5度在20米外的点就会偏移大约17厘米而平移误差0.05米在任何距离上都只偏移5厘米。对于室内环境或者车辆周围几米范围内的障碍物平移误差尚可用ICP之类的算法补偿一部分但旋转误差很难通过后端优化完全消除它会持续地扭曲点云形状。调参顺序上先调旋转、再调平移。旋转调到接近真实值之后平移误差的表现会变得更容易观察。反过来如果你平移差很多旋转也差很多两个误差耦合在一起你很难判断建图质量变差到底是谁的锅。3. 标定前准备与采集规范3.1 硬件与软件环境联合标定的前提是能够同时拿到雷达点云和IMU原始数据。这里不限制具体传感器型号只要满足两个条件即可激光雷达能输出有序点云velodyne、ouster、livox等都可以。IMU能输出原始的三轴角速度和三轴加速度不能是经过滤波或者融合后的姿态数据。软件方面最省事的方式是在Ubuntu 18.04或20.04上用ROS Melodic或者Noetic。LIO-SAM官方没有ROS2版本虽然有人移植过但不建议在标定这个环节折腾ROS2。标定工具我推荐使用lidar_imu_calib或者direct_visual_lidar_calibration。前者专门做雷达和IMU的外参标定功能直接后者是雷达和相机的联合标定工具如果你想顺带把相机也标了可以两个都装。3.2 数据采集的环境要求标定算法的原理是通过对比“IMU积分出来的运动轨迹”和“激光雷达帧间配准出来的运动轨迹”寻找一个外参使两者尽可能一致。所以采集数据的时候必须保证激光雷达有足够的特征可以被配准。我的建议是找一间有货架、柱子、墙面纹理清晰的房间室内面积不用太大20到50平方米就够。纯空旷的走廊、大片白墙、没有障碍物的空地都不合适因为雷达在空旷环境下扫出来的点云几乎没有几何约束帧间配准会失败或者漂移严重标定结果自然不可信。还要注意一点采集过程中不能有大量移动物体出现在视野里比如行人来回走动、门被频繁开关。这些问题会导致点云中某些区域出现无法匹配的离群点拉低配准精度。3.3 运动激励要充分很多人在这一步翻车。把设备放在桌面上原地转了几圈就以为数据够了。实际上理想的数据应该包含以下运动模式绕X轴、Y轴、Z轴分别旋转让IMU的陀螺仪三个轴都被充分激励。水平平移、垂直平移、前后运动让加速计三个轴也有充分的加速度激励。运动和静止交替出现。静止段的作用是给IMU提供零速校正的参考也是很多标定算法判断漂移的锚点。具体操作时手持设备做一个类似“写米字”的动作先左右平移再前后平移然后上下移动接着分别绕三个轴转动每个动作之间停顿2到3秒。整个过程控制在3到5分钟就够了不用录很长时间数据太长反而浪费后续处理时间。采集的bag包建议用rosbag直接录制话题和频率都保留原始信息。录制命令大致长这样rosbag record /points_raw /imu_raw -O calibration_data.bag其中/points_raw是雷达点云话题/imu_raw是IMU原始数据话题。录制前确认两个话题的时间戳是同步的。时间戳不同步的问题在后面的LIO-SAM运行中也会暴露出来表现为地图左右分层这里尽量从源头规避。4. 使用lidar_imu_calib完成标定4.1 安装与配置这个工具使用起来比较直接依赖项只有ROS和PCL。克隆到工作空间编译即可。编译完成后需要修改一个launch文件把雷达话题、IMU话题、雷达类型、IMU类型填进去。关键的参数大致是param namelidar_topic value/points_raw/ param nameimu_topic value/imu_raw/ param namelidar_type valuevelodyne/ param nameimu_type valuegx5/imu_type决定了解算IMU数据时使用的噪声模型和坐标约定不同IMU硬件对应不同的配置。如果列表里没有你的IMU型号选一个轴定义最接近的即可不需要过度纠结。轴定义的一致性比噪声模型的细微差异重要得多。4.2 跑通标定流程启动工具后它会自动将接收到的雷达点云和IMU数据存入缓存达到一定数量后开始求解。求解过程中会迭代优化外参并输出每一轮迭代的残差。整个计算过程通常需要1到5分钟取决于数据量和CPU性能耐心等就行。结束后工具会输出标定结果形如Rotation matrix: 0.9998 0.0012 -0.0185 -0.0010 0.9999 0.0123 0.0185 -0.0123 0.9998 Translation vector: 0.32 -0.01 0.08这里输出的旋转矩阵和平移向量通常对应“雷达坐标系到IMU坐标系”的变换。你可能需要根据自己的工具版本验证一下方向。验证方法很简单把平移向量的数值和你的实际安装尺寸对比一下雷达装在IMU前方0.3米平移向量的第一个分量就应该是0.3左右如果方向反了平移向量大多会变成负值。4.3 填入LIO-SAM配置拿到标定结果后需要把旋转矩阵转换成LIO-SAM所需的extrinsicRot和extrinsicTrans。LIO-SAM的params.yaml里已经留好了参数栏直接把矩阵按行填入即可。平移向量直接填入extrinsicTrans注意单位必须是米。填完之后建议先用录制的bag包离线跑一遍LIO-SAM观察建图效果。如果地图整体清晰、回环闭合良好说明标定结果正确如果出现点云双层、边缘发虚、轨迹漂移回到第2节的方向检查思路里排查。5. 时间同步问题的排查思路5.1 帧头错位的外在表现联合标定的前提是空间对齐而空间对齐的前提是时间对齐。雷达的每一帧点云和IMU的每一帧测量之间如果存在固定的时间偏移那么在外参完全正确的情况下地图依然会表现出“运动时发虚、静止时正常”的现象。严重时地图会沿着运动方向出现拖影。常见的时间偏移来源有三种传感器内部处理延迟、ROS话题的时间戳由不同硬件时钟产生、驱动节点里人为加的滤波参数。排查时先看rostopic输出的时间戳频率是否稳定再用rosbag play --clock配合use_sim_time参数来统一仿真时间这能排除一部分由于回放速度不稳定造成的时间抖动。5.2 如何判断时间偏移的大小一个实用的办法是观察标定工具的残差曲线。残差在迭代几次后如果能收敛到很小的值说明时间同步基本没问题。如果残差一直大幅度震荡、无法收敛或者收敛后旋转常量始终有明显偏差就要怀疑时间戳不对齐。对于时间偏移的修正能在驱动层处理就在驱动层处理。比如livox的驱动里有frame_id和timestamp调整选项velodyne驱动也支持通过pcap回放设置时间基准。不要在LIO-SAM内部强行加时间补偿那样做效率低且不好排查。5.3 建议的验证流程取一段静态数据把设备放在地面上雷达和IMU保持静止录制20秒以上。然后观察LIO-SAM输出的位姿轨迹静止状态下轨迹的漂移如果小于1厘米说明时间同步和零偏处理都基本合格。如果静态漂移很大先去标定IMU零偏再做外参标定。6. 标定结果验证方法6.1 点云拼接目测法标定完成后最直观的验证方式是把数据交给LIO-SAM跑一遍然后看建图效果。选择一个有明显几何结构的环境推着设备走一圈再回到起点观察地图有没有分层、重影、漂移。判断标准可以参考三点墙面是否平整、柱子边缘是否锐利、回到起点时地图是否闭合。如果三个标准都满足外参基本达到可用状态。如果某个标准不满足参考下表定位问题方向问题现象可能原因排查方向地图整体重影/双层外参旋转误差较大或IMU零偏未校准重新标定外参先校准IMU零偏运动时发虚、静止时清晰时间戳同步存在偏移检查传感器驱动话题时间戳统一时钟源回到起点时地图不闭合外参平移误差较大或里程计漂移查看轨迹终点偏移方向反向调整平移转弯时点云散乱旋转外参在小角度上有残余误差认真采集多组运动激励数据重新标定地面和墙面交叉处扭曲旋转外参中roll/pitch不准重点检查绕前后轴、左右轴的旋转角6.2 轨迹对比法如果你有外部定位基准如动捕系统、高精度RTK可以把LIO-SAM输出的轨迹和基准轨迹对齐计算APE或RPE误差。这个方法最定量、最客观但大多数人的实验条件下没有外部基准所以实用意义有限。退而求其次的方法是让设备走一个闭环路线回到起点后看轨迹终点与起点的距离差。这个差值如果小于总行驶距离的1%说明标定质量基本可用。比如走了一个30米的闭环终点与起点距离差小于0.3米我认为这个外参就可以放心用于后续实验了。6.3 多组数据重复验证不要只用一组数据下结论。我习惯的做法是采集三组不同的数据一组以旋转激励为主一组以平移激励为主一组做闭环路线。然后用同一组外参分别跑三组数据看三组数据的地图质量是否都稳定。如果某一组数据效果明显变差说明你的外参在某个运动维度上还是欠约束的需要重新采集针对性数据来标定。7. 高频避坑清单7.1 IMU零偏没有先校准LIO-SAM本身会在线估计IMU零偏但这是以初始外参大致正确为前提的。如果外参差得太多LIO-SAM的IMU预积分会被污染零偏估计也不会收敛。所以一个规范的操作顺序是先用imu_utils或者Kalibr的imu校准工具离线标定零偏再去做雷达和IMU的外参标定。零偏不准时外参标定的结果会带有隐性偏移跑LIO-SAM时你会发现无论怎么调外参地图总是有一点飘。7.2 直接用标定工具的默认坐标定义lidar_imu_calib以及其它标定工具通常默认雷达坐标系和IMU坐标系都是“右前上”X右、Y前、Z上。如果你的传感器驱动输出的是“前左上”或“右后上”之类的坐标定义就要手动加一个坐标系变换先把点云或IMU数据转换到标准坐标系再做标定。忽略这一步标定出来的外参往往是错的。7.3 拿静止数据做外参标定外参标定本质上是一个运动问题。雷达帧间配准和IMU积分都需要运动来提供约束。设备静止时雷达所有帧都是一样的IMU只输出重力加速度这两种数据组合起来无法解算外参。如果你发现标定工的结果一直在震荡、不稳定先看看自己的数据是不是大部分时间都在静止。7.4 用滤波后的IMU数据ROS驱动里有些IMU默认打开了低通滤波或数据融合输出的角度、速度已经是处理过的量。LIO-SAM期望的是原始的三轴角速度和加速度带滤波的数据会让IMU预积分的时间一致性变差。确认你的IMU消息里angular_velocity和linear_acceleration都是原始采样值且单位分别是rad/s和m/s^2。7.5 只标定一次就完事传感器在运输、安装、碰撞之后外参都可能发生微小变化。如果你的设备是长期固定在机器人上的建议每次实验前花几分钟做一次快速验证如果发现地图质量明显下降再重新做完整标定。标定过程熟练之后也就十到二十分钟别舍不得这点时间。8. 常见问题排查速查表在实际操作中有一些非常典型的“症状”这里整理成速查表方便你在现场快速定位问题方向。现象排查重点参考操作导入外参后建图反而比默认参数更差外参方向反了尝试将变换取逆旋转矩阵转置、平移向量取反静态场景下点云有重影IMU零偏或时间戳不同步先离线标定IMU零偏检查话题时间戳漂移水平转弯时地图明显漂移旋转外参中yaw角不准多采集绕竖直轴旋转的数据重新标定上下坡或爬楼梯时地图散乱旋转外参中pitch/roll不准多采集绕水平轴旋转的数据重新标定刚开始跑很准几分钟后越来越飘IMU零偏在线估计没有收敛提高初始外参精度减少IMU数据中的噪声同一组外参不同数据效果差异大采集数据激励不充分按3.3节列表补充各类运动动作这里再补充一个小技巧如果你使用Livox雷达LIO-SAM的配置里lidar_type要改成1对应livox因为livox是非重复扫描方式点云特性与velodyne差异很大。很多人在这里忘记修改导致LIO-SAM一直崩溃或者地图质量极差。9. 标定后的动态优化技巧9.1 LIO-SAM中的外参微调机制LIO-SAM内部有extrinsicRot、extrinsicTrans和extrinsicRPY三个参数组其中extrinsicRPY是给后端优化的外参初值。你可以在配置里把extrinsicRPY的协方差调大一些让后端在运行过程中对外参做微小调整。这个功能不可以完全依赖它只能修正小角度的误差但用来吸收长期运行中的微小机械形变很有效。我第一次用这个功能时把协方差调得过大结果后端疯狂调整外参地图看起来反而不稳定。后来把协方差设成适中偏小的值只允许外参在1度范围内变动效果就稳定多了。9.2 外参残差可视化检查LIO-SAM在运行时会输出里程计因子、回环因子的残差信息展示在终端里。如果你发现回环闭合之后残差值降不下去尤其是姿态相关的残差一直偏大就要怀疑外参还有残余误差。可以试着在终端里观察odometryFactor的残差均值通常收敛后应该在很小的数值范围如果一直很大建议回到第4节流程重新做一次完整标定。9.3 多传感器组合系统的外参管理如果你的系统里还有相机比如RGB-D相机或者单目相机建议把相机外参也纳入统一的标定流程。雷达和IMU标完之后再用direct_visual_lidar_calibration做雷达和相机的联合标定最后把相机到IMU的外参通过矩阵串联计算出来避免分段标定带来的误差累积。矩阵串联这块有一个容易踩的坑一定要搞清楚每个变换矩阵的参考系方向比如T_cam_imu T_cam_lidar * T_lidar_imu这个公式里左边是相机到IMU的变换矩阵右边的两个矩阵顺序不能颠倒。顺序错了整个系统所有传感器之间的外参会全部错乱。10. 写在最后标定是基本功别老想着一步到位我用LIO-SAM做激光惯性SLAM也有两三年了从一开始被标定折腾到怀疑人生到现在拿到新设备十分钟之内就能完成一套标定验证流程中间最深刻的体会是标定这件事没有捷径唯一靠谱的方式就是把每个步骤搞清楚、把每项数据采规范。如果你正在被外参问题折磨我的建议是不要急着在网上找现成的参数不同型号的传感器、不同安装方式外参差异非常大直接照搬别人的配置基本都是白费时间。静下心来走一遍完整的标定流程把采集数据的动作做规范把标定结果在LIO-SAM里验证一遍你会发现自己对传感器之间关系的理解也会上一个台阶。最后分享一个小技巧标定完成之后把外参和采集数据都保存到一个固定目录命名里注明日期和设备型号。下次改动机械结构、重新安装传感器之后再用同一组数据重新标定对比前后两次外参输出就能很快判断安装是不是装偏了。这个方法帮我排查过好几次“为什么设备拆装完之后建图突然就变差了”的疑难杂症。
返回列表