1. 为什么激光雷达和IMU的联合标定值得你花时间
如果你正在做激光雷达SLAM,尤其是用LIO-SAM这类紧耦合方案,那激光雷达和IMU的联合标定这件事,早晚都得面对。我见过太多人在这上面栽跟头——建图飘得亲妈都不认识,回环检测死活不触发,重力方向歪到离谱,最后排查一圈发现是外参没标定好。这不是危言耸听,LIO-SAM对激光雷达和IMU之间的外参非常敏感,尤其是旋转外参,差个一两度,建图效果就能从“能用”掉到“没法看”。
LIO-SAM的核心思路是把激光雷达的scan matching和IMU的预积分紧耦合在一起,IMU提供高频的运动先验,激光雷达提供低频但精确的几何约束。这个融合框架要正常工作,前提是它得知道IMU和激光雷达之间的相对位姿关系——也就是外参。外参包括平移和旋转两部分,平移影响相对小一些,旋转一旦有偏差,IMU积分出来的姿态和激光雷达匹配出来的姿态就对不上,优化过程直接跑偏。
这篇文章面向的是已经跑通LIO-SAM基本流程、但建图效果不理想的同学,也适合刚接触激光雷达惯性融合、想搞清楚标定到底在标什么的人。我会从标定的基本原理讲起,然后手把手走一遍完整流程,最后把我在实际项目中踩过的坑和排查方法都倒出来。你不需要有很深的数学背景,但得对ROS的基本操作和LIO-SAM的启动流程有概念。
2. 联合标定到底在标什么:核心概念拆解
2.1 外参和内参的区别,别搞混了
很多人一上来就说“我要标定IMU”,但其实标定分两种:内参标定和外参标定。内参是传感器自身的特性参数,比如IMU的零偏、尺度因子、轴间非正交误差,激光雷达的测距精度、角度分辨率这些。外参是两个传感器之间的相对位姿,通常表示为一个旋转矩阵加一个平移向量,从IMU坐标系到激光雷达坐标系的变换。
LIO-SAM需要的主要是外参,具体来说是IMU到激光雷达的旋转和平移。内参方面,消费级IMU的零偏和噪声密度一般用出厂值或者Allan方差标定结果就行,LIO-SAM的配置文件里也有对应的噪声参数可以调。但外参如果不准,后面怎么调参都是白搭。
2.2 旋转外参为什么比平移外参更致命
平移外参的误差主要影响的是杠杆臂效应——当载体做旋转运动时,IMU和激光雷达因为安装位置不同,感受到的线速度不一样。但LIO-SAM的优化框架对平移误差有一定的容忍度,因为激光雷达的scan matching会不断修正位置估计。
旋转外参就不一样了。IMU测量的是角速度和加速度,角速度积分得到姿态变化,加速度在去除重力后积分得到速度。如果旋转外参有偏差,IMU积分出来的姿态变化方向就和激光雷达实际观测到的运动方向不一致。LIO-SAM在优化时会把这种不一致当成误差来最小化,结果就是要么优化不收敛,要么收敛到一个错误的结果——建图飘、重力方向歪、Z轴漂移,都是这么来的。
我实测过,旋转外参偏差超过2度,LIO-SAM在长廊环境里建图就会明显分层;偏差超过5度,基本就没法用了。
2.3 LIO-SAM对标定精度的实际需求
LIO-SAM的配置文件params.yaml里有一个extrinsicRot和extrinsicTrans参数,分别对应旋转外参和平移外参。旋转外参以3x3矩阵形式给出,平移外参是3x1向量。官方示例里给的是Identity矩阵和零向量,意思是假设IMU和激光雷达坐标系完全对齐、位置重合——这在实际中当然不可能。
那标定到什么精度够用?根据我的经验,旋转外参的误差控制在1度以内,平移外参误差控制在2厘米以内,LIO-SAM就能稳定工作。当然这取决于你的应用场景,如果是室内小场景,要求可以放宽;如果是室外大场景或者高速运动,要求就更严。
3. 标定前的准备工作:硬件、软件和数据
3.1 硬件连接与时间同步检查
标定之前,先确认你的硬件连接没问题。激光雷达和IMU通常通过不同的接口连接到主机,激光雷达走网口或USB,IMU走USB或串口。如果你用的是集成式的激光雷达惯性模组,那硬件连接就简单很多,但时间同步仍然要检查。
时间同步是标定的前提。如果激光雷达和IMU的时间戳对不齐,标定出来的外参肯定不准。检查方法很简单:录一段包,用rosbag info看两个话题的时间戳分布,或者用rqt_plot把两个话题的时间戳画出来对比。如果偏差在毫秒级以内,问题不大;如果偏差到几十毫秒,就得先解决时间同步。
注意:有些IMU的驱动会自己打时间戳,而不是用ROS的
ros::Time::now(),这种情况下要确认驱动的时间戳来源是否和激光雷达一致。
3.2 需要的软件工具和ROS包
标定外参常用的工具是lidar_align和imu_utils,但lidar_align主要用于激光雷达和里程计的标定,对IMU外参的标定支持有限。更常用的方案是手动标定加优化,或者用kalibr做相机-IMU标定再迁移思路。
对于LIO-SAM的外参标定,我推荐两种方案:一是用lidar_imu_calib这类专门的开源工具,二是手动测量加迭代优化。前者适合有标定板的情况,后者适合没有标定板、只能靠环境特征的情况。
软件方面,你需要ROS(Melodic或Noetic都行)、LIO-SAM的编译环境、rosbag工具,以及一个能可视化点云和轨迹的工具,比如rviz或cloudcompare。
3.3 数据采集:怎么录包才有用
数据采集是标定中最容易被忽视的环节。很多人随便录一段包就开始标定,结果标出来的参数根本不能用。正确的做法是:
- 选择特征丰富的环境,比如有墙壁、柱子、地面纹理的室内空间,避免空旷场地或纯走廊。
- 运动要充分激励所有轴:分别绕X、Y、Z轴旋转,做8字运动,前后左右移动都要有。
- 运动速度不要太快,避免运动模糊和IMU饱和。
- 录包时间控制在1-2分钟,太短激励不充分,太长数据处理慢。
录包时同时录激光雷达点云、IMU数据、以及TF变换(如果有的话)。命令大概是:
rosbag record /lidar_points /imu/data /tf /tf_static录完之后用rosbag info确认数据完整,没有丢帧。
4. 手把手标定流程:从零到可用的外参
4.1 第一步:确认IMU内参和噪声参数
在标定外参之前,先确认IMU的内参和噪声参数。LIO-SAM的配置文件里有四个噪声参数:imuAccNoise、imuGyrNoise、imuAccBiasN、imuGyrBiasN。这些参数可以从IMU的数据手册查到,也可以用Allan方差标定工具(如imu_utils)标定。
如果你用的是消费级IMU,比如MPU6050或ICM20602,数据手册里的噪声密度值一般够用。如果用的是工业级IMU,建议做一次Allan方差标定,精度会更高。
实操心得:Allan方差标定需要静止录制至少2小时的数据,很多人嫌麻烦就跳过了。但实测下来,用数据手册值和用Allan方差标定值,LIO-SAM的建图效果差别不大,除非你的IMU特别差。所以时间紧的话,可以先跳过这一步。
4.2 第二步:粗测外参——手动测量加坐标变换
外参的粗测可以用手动测量的方式。具体来说,就是测量IMU和激光雷达在载体上的相对位置和朝向。平移外参直接用尺子量,旋转外参根据安装方式估算。
比如,如果IMU和激光雷达都是水平安装,IMU的X轴朝前,激光雷达的X轴也朝前,那旋转外参就是单位矩阵。如果IMU旋转了90度安装,那旋转外参就是绕Z轴旋转90度的矩阵。
手动测量的精度有限,但可以作为迭代优化的初值。把粗测的外参填入LIO-SAM的配置文件,跑一遍建图,观察效果。如果建图明显飘,说明外参偏差较大,需要进一步优化。
4.3 第三步:用LIO-SAM自带的优化流程迭代外参
LIO-SAM本身没有自动标定外参的功能,但你可以通过迭代的方式手动优化。具体做法是:
- 用粗测外参跑一遍LIO-SAM,保存轨迹和点云地图。
- 在
rviz里观察点云地图的质量,重点看墙壁是否重影、地面是否平整、回环是否闭合。 - 如果发现某个方向的偏差,调整对应的旋转外参分量,重新跑一遍。
- 重复上述过程,直到建图质量满意为止。
这个过程听起来很笨,但实际用起来效果不错。我一般会先调旋转外参的Roll和Pitch,再调Yaw,最后调平移。每次调整幅度控制在0.5度以内,避免跳过头。
4.4 第四步:用外部工具做精细标定
如果手动迭代效果不理想,可以用外部工具做精细标定。lidar_imu_calib是一个不错的选择,它通过最小化激光雷达点云和IMU积分轨迹之间的误差来优化外参。使用流程大概是:
- 安装
lidar_imu_calib包。 - 配置激光雷达和IMU的话题名称。
- 播放录好的包,启动标定节点。
- 等待优化收敛,保存标定结果。
标定结果会输出一个旋转矩阵和平移向量,直接填入LIO-SAM的配置文件即可。
注意:
lidar_imu_calib对标定数据的要求比较高,运动不充分或环境特征少都会导致标定失败。如果标定结果和手动测量值差很多,先检查数据质量,不要盲目相信工具输出。
4.5 第五步:验证标定结果——建图质量检查清单
标定完成后,怎么判断结果好不好?我整理了一个检查清单:
| 检查项 | 合格标准 | 不合格表现 |
|---|---|---|
| 墙壁重影 | 墙壁边缘清晰,无分层 | 墙壁出现明显重影或分层 |
| 地面平整度 | 地面点云在一个平面上 | 地面点云起伏明显 |
| 回环闭合 | 回到起点时轨迹闭合 | 轨迹有明显偏移 |
| 重力方向 | Z轴与地面垂直 | Z轴倾斜或漂移 |
| 长廊直线度 | 长廊两侧墙壁平行 | 墙壁弯曲或交叉 |
如果以上检查项都合格,说明外参标定得不错。如果有不合格项,回到第四步继续优化。
5. 避坑指南:我踩过的那些坑和解决方法
5.1 坑一:时间戳不同步导致标定完全失效
这是我遇到最多的坑。激光雷达和IMU的时间戳如果不同步,标定出来的外参完全没有意义。表现是:标定结果每次都不一样,或者标定结果和手动测量值差很多。
解决方法:先检查时间同步。如果激光雷达支持PPS或PTP同步,尽量用硬件同步。如果不支持,用软件同步,比如用message_filters做时间对齐。实在不行,就在录包时用同一个主机的时间戳,避免用传感器自己的时间戳。
5.2 坑二:运动激励不充分导致外参不可观
标定外参需要充分激励所有轴。如果只做平面运动,Roll和Pitch方向的外参就不可观,标定结果会在这两个方向上随机漂。表现是:标定结果中Roll和Pitch值每次都不一样,或者和手动测量值差很多。
解决方法:录包时一定要做充分的旋转运动,尤其是绕X轴和Y轴的旋转。8字运动、S形运动、原地旋转都要有。如果条件允许,把传感器拿在手里做各种姿态的运动,激励效果最好。
5.3 坑三:IMU内参不准导致外参标定偏差
IMU内参不准会影响外参标定。比如IMU的零偏如果没标定,积分出来的姿态会漂移,标定算法会把这种漂移误认为是外参误差。表现是:标定结果中旋转外参与手动测量值有系统性偏差。
解决方法:先标定IMU内参,至少把零偏标出来。如果IMU支持在线零偏估计,确保这个功能开启。LIO-SAM本身也有IMU零偏估计,但那是优化过程中的在线估计,不能替代标定。
5.4 坑四:环境特征少导致标定失败
标定需要环境特征。如果环境太空旷,激光雷达点云匹配会失败,标定算法没有足够的约束来优化外参。表现是:标定过程中优化不收敛,或者标定结果明显不对。
解决方法:选择特征丰富的环境录包,比如有墙壁、柱子、家具的室内空间。避免在空旷场地或纯走廊录包。如果只能在空旷环境录,可以在环境中临时放置一些箱子或板子,增加特征。
5.5 坑五:LIO-SAM配置文件参数写错
这个坑很低级,但确实经常发生。LIO-SAM的配置文件里,extrinsicRot是3x3矩阵,extrinsicTrans是3x1向量。很多人把旋转矩阵写成了欧拉角,或者把平移向量的单位搞错了(米和厘米混用)。表现是:LIO-SAM启动后建图完全乱套,或者直接崩溃。
解决方法:仔细检查配置文件格式。旋转矩阵按行展开,平移向量单位是米。如果不确定,先用单位矩阵和零向量跑一遍,确认LIO-SAM能正常工作,再填入标定值。
6. 标定后的调参与优化:让LIO-SAM跑得更稳
6.1 关键参数调整:噪声参数和优化参数
外参标定好之后,LIO-SAM的建图效果还取决于噪声参数和优化参数。imuAccNoise和imuGyrNoise影响IMU预积分的权重,值越小表示越信任IMU。如果建图飘,可以适当调大这两个值,降低IMU的权重。imuAccBiasN和imuGyrBiasN影响零偏估计的收敛速度,值越大收敛越快,但可能不稳定。
优化参数方面,lidarSmoothness影响激光雷达scan matching的平滑度,odometrySurfLeafSize影响特征提取的密度。这些参数需要根据实际场景调整,没有万能值。
6.2 建图效果不佳时的排查顺序
如果标定后建图效果仍然不理想,按以下顺序排查:
- 检查时间同步,确认激光雷达和IMU时间戳对齐。
- 检查外参,确认旋转矩阵和平移向量正确。
- 检查IMU内参,确认噪声参数和零偏参数合理。
- 检查环境特征,确认场景不是太空旷。
- 检查运动速度,确认没有运动模糊或IMU饱和。
- 调整噪声参数和优化参数,观察效果变化。
这个顺序是从硬件到软件、从数据到算法,逐步排查,避免盲目调参。
6.3 长期使用中的外参漂移问题
外参标定不是一劳永逸的。长期使用中,传感器可能因为振动、温度变化等原因发生微小位移,导致外参漂移。表现是:之前建图效果很好,用了一段时间后效果变差。
解决方法:定期检查外参,尤其是在剧烈振动或温度变化大的场景使用后。如果发现外参漂移,重新标定。有些系统支持在线外参估计,可以自动补偿漂移,但LIO-SAM本身不支持,需要外部工具辅助。
7. 常见问题速查表
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 建图飘,墙壁重影 | 旋转外参不准 | 重新标定旋转外参 |
| 重力方向歪 | Roll或Pitch外参不准 | 调整Roll和Pitch外参 |
| 回环不闭合 | 平移外参不准或时间不同步 | 检查平移外参和时间同步 |
| 标定结果每次不一样 | 运动激励不充分 | 增加旋转运动,充分激励所有轴 |
| 标定优化不收敛 | 环境特征少或数据质量差 | 换特征丰富的环境重新录包 |
| LIO-SAM启动崩溃 | 配置文件格式错误 | 检查旋转矩阵和平移向量格式 |
| 长廊建图弯曲 | Yaw外参不准 | 调整Yaw外参 |
| Z轴漂移 | 重力方向估计不准 | 检查IMU内参和Roll/Pitch外参 |
8. 个人实操体会与建议
我在多个项目中用LIO-SAM做过建图,外参标定这件事,说难不难,说简单也不简单。最关键的是要有耐心,不要指望一次标定就能完美。我的习惯是:先手动粗测,跑一遍建图看效果,然后迭代优化,最后用工具精细标定。整个过程快的话半天,慢的话一两天。
另外,标定数据比标定算法重要。我见过很多人纠结用哪个标定工具,却忽略了数据采集的质量。实际上,只要数据采集到位——时间同步、运动充分、环境特征丰富——用最简单的迭代方法也能标出可用的外参。反过来,数据质量差,再好的工具也标不准。
最后分享一个小技巧:标定完成后,把外参和标定数据保存下来,建个标定档案。下次再用同一套硬件时,直接复用外参,省去重新标定的时间。如果硬件有变动,再重新标定。这个习惯能帮你省下不少时间。