)
搞机器人和自动驾驶的朋友对IMU肯定是又爱又恨。这东西便宜、小巧、输出频率高但要是没标定好它就能让你的定位系统在十秒钟内飘到天上去。我见过太多人把IMU买回来接上线就直接开跑结果里程计飞了、地图糊了最后排查半天问题根本不是算法而是IMU压根没校准。所以今天我就把工程上最常用的“二种imu标定方式”掰开揉碎讲清楚。这里的两种方式我按实际项目中的分工来分第一种是IMU内参标定主要解决“这个传感器本身准不准”的问题第二种是相机/激光雷达与IMU的联合外参标定解决的是“几个传感器之间怎么对齐”的问题。这两件事搞明白了lidar imu标定、imu和图像里程对应、kalibr相机imu联合标定这些具体操作才能顺利落地。先说结论内参标定是地基外参标定是楼层。地基打不牢上面再精致的外参结果也经不起推敲。但很多入门资料把这两件事混在一起讲导致新手拿到工具也不知道自己在标什么。这篇文章会覆盖原理、实操步骤、参数计算和我在项目里踩过的坑内容偏工程向适合正在做SLAM、组合导航、机器人底盘的朋友参考。1. IMU标定到底在干什么先分清内参和外参1.1 IMU“标定”这个词包含了两件完全不同的事IMU全称是惯性测量单元里面装了三轴加速度计和三轴陀螺仪。所谓标定工程上可以拆成两个层面。第一层是内参标定。每个IMU出厂后因为芯片制造公差、焊接应力、温度漂移等原因它的加速度计和陀螺仪输出并不是“理想值”。比如你把它静止放在桌面上理论上加速度计应该输出9.8m/s²的重力加速度但实际测量往往是9.82或者9.75而且三个轴的读数还不一样。陀螺仪静止时理论上是0但实际可能有0.01rad/s的偏置。这个“输出和真实值之间的映射关系”就是内参。内参标定要估计的是零偏bias、尺度因子scale、轴间安装误差misalignment。第二层是外参标定。IMU从来不是孤立工作的它通常和相机、激光雷达、轮式里程计一起装在机器人上。我们需要知道IMU坐标系和相机坐标系之间的旋转矩阵和平移向量这就是外参。lidar imu标定、kalibr相机imu联合标定本质上都是在做这一层的事情。这两层标定有个关键区别内参标定可以在实验室里一劳永逸地做一次只要温度变化不大、没摔过结果能稳定用很久而外参标定通常在现场做因为传感器之间的安装关系一旦拆装就会变化甚至车辆长期震动也会让外参发生微小漂移。1.2 如果不标定会发生什么不标定内参最直接的后果是积分发散。SLAM里IMU的作用是提供高频运动约束比如在相机帧间通过预积分preintegration估计相对运动。如果加速度计零偏有0.05g的误差速度积分1秒就会带来0.5m/s的误差10秒后位置误差就是几十米。陀螺仪的零偏则会导致姿态持续旋转漂移这个在纯视觉SLAM里往往是致命的因为图像特征匹配一旦视角偏移过大就彻底丢失。不标定外参最典型的后果是相机和IMU数据“打架”。比如你明明把IMU安装在相机右侧5cm处结果软件里还以为是重合的那融合后的轨迹就会出现系统性偏差——转弯时轨迹弯得不够或者弯过头。在激光雷达和IMU联合标定不准确的情况下点云畸变矫正会出错建出来的地图会出现重影甚至变成“双影世界”。我用个生活比喻内参标定是给秤校准砝码外参标定是确认这把秤放在桌子的哪个位置。砝码不准称什么都白搭位置没放对读数是对的但测量方式本身就错了。1.3 两种标定方式的整体对比在动手操作之前先用一张表把两种方式的轮廓梳理清楚这样后面看细节时不容易迷路。对比项内参标定以六面体法和转台法为代表外参联合标定以Kalibr和Lidar-IMU标定流程为代表估计什么加速度计/陀螺仪零偏、尺度因子、安装误差IMU与其他传感器坐标系间的旋转、平移有时还包括时间延迟依赖设备六面体治具、水平台面、高精度转台可选棋盘格/Aprilgrid标定板或结构化场景、相机/激光雷达适用阶段传感器出厂检验、长期稳定性验证、温度补偿前处理系统集成、传感器换装后、融合算法启动前精度量级零偏可标到0.01g以内尺度因子千分之一级旋转外参精度可达0.1°~1°平移精度取决于数据质量工具链自写脚本或用imu_utils、imu_tkKalibr、lidar_align、LIO-SAM自带标定、OpenCalib核心风险操作过程不规范导致“标了个寂寞”激励不足导致参数不可观优化结果纯属随机这两种方式不是二选一的关系而是串行关系。我的项目流程一般是新拿到的IMU先做内参标定并验证装到设备上后再做联合外参标定。下面分别讲实操。2. 方式一转台与静态六面体法——把IMU内参“秤”出来2.1 内参标定的数学模型先搞懂要解什么方程加速度计的内参模型工程上最常用的形式是[ a_{meas} T_a K_a a_{true} b_a n_a ]其中(a_{meas}) 是加速度计实际输出(a_{true}) 是理想加速度(K_a) 是尺度因子对角矩阵(T_a) 是轴间非正交误差矩阵(b_a) 是零偏(n_a) 是噪声。陀螺仪模型类似[ \omega_{meas} T_g K_g \omega_{true} b_g n_g ]标定的过程就是通过一系列已知姿态或已知角速度的激励反解出 (T)、(K)、(b) 这些参数。问题在于真值从哪里来答案是重力。重力是一个天然、稳定、处处相同的加速度参考而地球自转则是一个很弱的角速度参考。这也是为什么内参标定最普及的方法是“静态多位置”法让IMU静止在不同姿态下这时候理论上加速度计的“真值”就是重力向量在传感器各轴上的投影。陀螺仪因为静止时角速度真值为0所以静止数据直接取平均就能得到零偏——注意如果IMU精度极高需要考虑地球自转分量但普通MEMS级别陀螺仪的地球自转信号淹没在噪声里一般直接忽略。2.2 六面体标定的完整实操流我以六面体法为主因为这是我在项目里用最多、成本最低的方案。所谓六面体法就是用一个六个面都经过精密加工的金属块把IMU固定在其中一个面上然后轮流让六个面分别朝上、朝下放置记录每个姿态下IMU的静态输出。第一步准备硬件。你需要一台待标定的IMU模块确认供电稳定、采样率固定建议不低于100Hz。一块精密六面体治具。这个治具的面的平面度要足够好最好带螺纹孔来锁IMU保证IMU和治具之间没有相对松动。一个绝对水平的桌面或大理石平台。一套数据采集程序能同步存下三轴加速度和三轴角速度以及时间戳。第二步采集六个面的数据。以IMU的z轴为例依次让z轴朝上与朝下、x轴朝上与朝下、y轴朝上与朝下共6个姿态。每个姿态放置稳定后至少采集60秒静止数据。为什么60秒因为我们要对每个姿态的数据取平均来估计零偏采集时间越长噪声平均掉的效果越好。对于MEMS级别的IMU60秒静止数据通常能把随机噪声的影响压到非常小。需要注意每次切换姿态之后要等大约10到20秒再开始记录因为手动放置治具会引入低频振动和温度扰动必须让IMU稳定下来。第三步整理观测数据。对每个姿态i取加速度计三轴均值为 (\bar{a}i [\bar{a}{ix}, \bar{a}{iy}, \bar{a}{iz}]^T)。理论上第i个姿态下三个轴应当分别感受到重力在三个方向的分量。比如z轴朝上时理想加速度计输出应该是 ([0,0,-g]^T)z轴朝下时应该是 ([0,0,g]^T)。第四步构建并求解最小二乘问题。以加速度计z轴为例观测方程为[ \bar{a}{iz} s_z a{iz}^{true} b_z \text{misalignment项} ]如果忽略轴间误差那么对6个姿态可以建立6个方程含有两个未知数 (s_z, b_z)超定方程用最小二乘求伪逆。轴间安装误差需要更多姿态或转台才能解但通常6位置法已经能把零偏和尺度因子标得不错。我实际标过一颗某品牌的MEMS加速度计6位置法算出来的零偏大约是0.023g尺度因子z轴约0.9962也就是说它的z轴增益比理想值低约0.4%。这个误差看起来不大但在纯惯性推算里跑60秒就会造成约7米的垂直方向漂移所以“看着不大”的误差其实很致命。第五步陀螺仪零偏标定。让IMU静止放置10分钟取陀螺仪三轴输出的平均值就是零偏。更讲究的做法是分别记录多个静止段检查零偏的重复性。通常陀螺仪零偏会在上电后前几分钟有小幅变化因为温度在爬升所以建议整机开机稳定后再采集。2.3 转台法能标得更细但成本也更高六面体法虽然便宜但有个固有的弱点它几乎解不出精细的轴间安装误差也标不了陀螺仪的尺度因子因为地球自转信号太弱。如果项目对姿态精度要求高比如无人机或自动驾驶就要上转台。转台法的核心思想是用一台高精度转台给IMU施加一个已知的角速度然后对比陀螺仪输出与该角速度解出尺度因子和安装误差。简单说让转台以固定角速度旋转记录陀螺仪输出再换一个方向旋转建立方程求解。转台法的坑在于转台本身的精度决定了标定上限。廉价转台的角速度抖动比陀螺仪噪声还大标出来的尺度因子可能比不标还差。所以我不建议新手一上来就买几千块的“标定转台”折腾先把六面体法做好很多项目已经够用。如果确实需要高精度标定选择专业的转台厂商或者送计量院做比自己在实验室硬来可靠得多。2.4 内参标定验证标完不等于能用标定做完一定不要急着拿这套内参去跑SLAM。先做一次验证。最常见的验证方法是“静止漂移测试”把IMU水平固定静止放置15分钟用标定后的参数做纯积分观察姿态和位置漂移。在MEMS级别15分钟内姿态漂移如果控制在几度以内位置漂移在几十米以内说明零偏补偿基本到位。如果位置漂移仍然爆炸式增长大概率是零偏没标干净或者数据采集姿态有误配。另一个验证方法是用标定前后的数据对比在同一个运动序列上做预积分看预积分出的轨迹一致性是否提高。这个在拥有相机或激光雷达外参标定之后更好做。我在实际项目中还发现一个高频问题IMU的温度漂移。室温下标定的零偏到户外低温环境可能变化50%以上。所以如果设备工作温度范围大需要考虑用温度箱做多个温度点的标定或者使用带内置温度补偿的工业级IMU。这个环节容易被忽视等到冬天露天测试时才开始怀疑人生。3. 方式二Kalibr与Lidar-IMU联合标定——参数“算”出来而不是“测”出来3.1 联合标定的核心逻辑把传感器变成彼此的“尺子”如果说内参标定是让IMU认识自己联合外参标定就是让IMU和“邻居”建立关系。以kalibr相机imu联合标定为例它不依赖转台只需要拿设备对着一个标定板“晃一晃”然后用算法同时估计IMU和相机之间的外参以及时间延迟。原理可以这样理解在设备运动过程中相机会通过观测标定板估计出自己的运动轨迹视觉里程计IMU通过积分估计出自己的运动轨迹。如果外参是对的那么这两条轨迹在同一个坐标系里应该重合如果外参有偏差轨迹就会错开。于是标定问题变成了一个优化问题寻找一组旋转平移、时间延迟乃至IMU内参残差的最小值。这套思路的美妙之处在于它把标定问题转化成了大家熟悉的“最小二乘优化”用Ceres等非线性优化库求解。这也是Kalibr能火起来的原因——开源、操作门槛低、鲁棒性尚可。3.2 激励运动的“可观性”原理决定标定成败的关键联合标定最常见的问题是数据采了一堆优化不收敛或者结果方差巨大。绝大多数原因是激励不足。所谓激励就是传感器需要感受到足够丰富、足够剧烈的运动变化。如果设备一直匀速运动加速度计的输出几乎恒定视觉轨迹和IMU轨迹之间无法形成足够的约束外参中平移量就不可观。同样如果一直直线运动旋转外参的某些分量也解不出来。我在数据采集时要求操作员执行这样的动作设备在标定板前约0.5到1米反复做八字形挥动包含快速俯仰、偏航、滚转同时要有明显的加速和减速中间不要静止超过1秒持续20到40秒。这样做的目的是让角速度和加速度都有大幅变化外参的每个自由度都能被“激活”。这个原理可以类比成拍集体照时喊“大家动一动”——如果所有人站成一排不动照片里不易区分前后顺序一旦左右走动谁在前谁在后立刻清楚。传感器标定同理动得越剧烈参数越能从观测中被分离出来。3.3 Kalibr标定的具体流程与参数准备用Kalibr做相机IMU联合标定我的标准流程分四步。第一步准备工作。你要有一块Aprilgrid或棋盘格标定板格子数量和边长要记录清楚。先单独标定相机内参kalibr自带kalibr_calibrate_cameras命令可以完成输出camchain.yaml和相机参数结果。相机内参没标好之前别急着做联合标定否则误差会全部耦合进IMU外参里。第二步配置IMU描述文件imu.yaml。这个文件要写明IMU的加速度计和陀螺仪的噪声密度noise density和随机游走random walk单位分别是 (m/s^2/\sqrt{Hz}) 和 (rad/s/\sqrt{Hz})。这些值可以去IMU芯片手册里找找不到的话可以先按参考值填标定结果会弱化对初始值的依赖但顺序不能乱。第三步录制数据。用rosbag录制话题包含图像话题、IMU话题务必检查两个话题的时间戳。IMU频率建议200Hz以上图像频率在20到30Hz即可运动方式参照上一节的“八字形挥动”。第四步运行联合标定命令kalibr_calibrate_imu_camera \ --cam camchain.yaml \ --imu imu.yaml \ --target april_6x6_80x80cm.yaml \ --bag dataset.bag \ --timeoffset-padding 0.05跑完之后会得到一份标定报告里面包含相机与IMU外参、时间延迟以及优化残差。我会重点看两个东西一是时间延迟的估计如果偏大比如超过50ms可能是ROS时间戳有问题千万不要忽视二是残差分布如果残差有显著的非随机模式说明运动模型或传感器同步没有处理好。3.4 Lidar-IMU联合标定的实操差异雷达和IMU联合标定原理与Kalibr一致区别在于雷达没有“标定板”这种现成的姿态参考通常用连续帧点云配准来估计运动。工具上老牌的lidar_align用点云配准结果和IMU积分轨迹做优化而新一代的LIO-SAM等框架自带雷达IMU标定模块有时可以在线优化外参省去专门的标定环节。我在项目里用lidar_align踩过不少坑。最典型的是室内采集环境过于空旷点云配准本身精度就差导致标定结果不可靠。所以雷达IMU联合标定对场景的要求更高最好是有明显结构特征的室内走廊或仓库不要有大量玻璃、白墙等低反射表面也不要选在空旷大草地。另外雷达和IMU之间的时间同步问题比相机更为严重。很多雷达驱动有内部时延比如Velodyne系列和Livox系列延时特性不同。如果标定结果显示雷达与IMU之间时间延迟达到几十毫秒外参里的偏航角往往会有明显偏差。这种情况优先解决时间同步而不是盲目调外参。3.5 IMU与图像里程计的对应关系为什么联合标定后还是对不上热词里专门有一个“imu和图像里程对应”我单独说一下。完成联合标定之后IMU和视觉里程计在短时间内应当能够互相验证。如果你的系统里两者对不上往往是这几个原因时间同步没有真正做到硬件级图像曝光时间没有补偿。相机曝光中间时刻和IMU采集时刻不一致在高动态运动下会出现几十毫秒的偏差对纯视觉惯导融合精度有明显影响。可以使用硬件时间同步线如GPOI触发或者至少在软件里补偿曝光中点时间。外参标定用的数据是在低动态下采集的外参对高动态运动的适应能力差。相机内参和畸变系数在标定后没有重新验证焦距误差会等价转换成位移误差。我在自己的项目里一般会用“图-惯对齐检查”来做验收手持设备快速晃动把视觉特征点和IMU预积分轨迹投影到同一张图上如果两者重合度在几个像素以内说明标定合格。4. 两种方式的对比选型与问题排查实录4.1 什么时候用内参标定什么时候用联合标定很多人问既然Kalibr能同时优化IMU内参和外参是不是内参标定就可以省了我的答案是别省。Kalibr的IMU内参优化更多是作为外参优化过程中的副产品它不是专门针对内参标定的收敛稳定性和参数可区分度都不如专门的静态/转台法。而且Kalibr能够优化的内参通常只有零偏和噪声参数对尺度因子和轴间误差的处理有限。工程上稳妥的做法是先用六面体法做一次扎实的内参标定然后在联合标定时用更准确的IMU噪声参数作为输入。这样两个步骤互相补充误差被逐层剥离最终融合系统的精度才会高。从时间成本看六面体内参标定半小时搞定Kalibr标定一次也就几十分钟加起来的时间投入换来的是稳定可靠的传感器融合基础非常划算。4.2 常见问题与排查速查表现象可能原因排查与解决思路标定后静止时位置仍然快速漂移零偏未准确估计或温度漂移延长静止采集时间检查是否开机后立即采集考虑温度补偿Kalibr优化不收敛激励不足、标定板检测失败、时间戳不同步重新采集数据加强六自由度运动检查图像清晰度用rosbag info检查时间戳lidar_align结果离谱点云配准误差大、场景结构缺失、初值太差换结构化场景提供粗略外参作为初始值约束搜索范围外参的roll/pitch固定但yaw漂移大yaw方向激励不够或者时间延迟未补偿增加偏航方向的大幅度转动检查时间延迟IMU和相机数据融合后高频抖动外参平移不准或时间同步抖动检查外参平移量级是否合理加固硬件同步4.3 我的独家避坑习惯操作标定流程这么多年我养成了几个习惯每次都能帮我省下大把排查时间。第一个习惯是每次标定都在一个独立文件夹里存好原始数据包、配置文件和结果报告文件名带上日期和硬件SN码。因为标定结果异常时没有原始现场数据几乎无法回排。很多项目事故最后查下来都是“当时标定时用的数据是有问题的”但数据已经删了只能重新标。第二个习惯是标定结果一定要用“另一段独立采集的数据”来验证而不是用标定数据本身。用标定数据检查标定结果就像用自己出的题自己考参考意义不大。我会专门跑一段与标定运动模式完全不同的测试序列例如标定用八字形验证就用直线加转弯的组合运动。第三个习惯是凡是更换过硬件安装位置、拆装过传感器支架或者摔过设备我都会立刻重新做一次联合外参标定。很多团队觉得“上次已经标过了”然后一直沿用旧外参结果地图精度莫名其妙下降最后才发现是固定支架松动了几毫米但劣化已经累积了很长时间。传感器安装的微小变化对高精度系统的影响远比你想象更大。5. 关于两种方式我个人项目里的最终建议如果你问我一个从零开始的机器人系统怎么安排IMU标定最合理我会推荐三步走新IMU到手先用六面体法把内参标定搞定解决“这个IMU本身准不准”的问题然后装机用Kalibr或lidar_align做联合外参标定解决“传感器之间怎么配合”的问题最后花半小时做一次独立轨迹验证确保标定结果在新数据上也成立。这三步并不是复杂的科学工程但每一步都有人跳过然后付出更多时间返工。另外我建议团队里至少有一个成员能把内参模型的最小二乘推导亲自写一遍不要只会调用现成工具。因为工具会迭代、会更换但“标定到底在解什么方程”这个底层的理解不会过时。遇到Kalibr不收敛、lidar外参诡异这些情况能基于模型判断是不是数据问题而不是像无头苍蝇一样乱试参数。标定这件事说到底是跟传感器误差模型做斗争理解了误差模型你就掌握了主动权。