
做SLAM和机器人的人手里几乎都攥着IMU这颗“小陀螺”。它输出频率高、短时间内的积分相对可靠是相机和激光雷达在快速运动、逆光、遮挡场景下的最大底牌。但IMU也是出了名的“娇气”——同一型号、同一批次贴片出来的传感器装上板子之后加速度计零偏可能差出好几个mg陀螺仪的温漂更是能让长时间运行的里程计直接“飞掉”。这就是为什么业内一直强调标定不是可选项而是传感器融合前的必经步骤。而所谓“两种IMU标定方式”在实际工程里通常对应两条路线一是对IMU自身的内参标定二是IMU与相机、激光雷达之间的联合外参标定。两条路线解决的目标完全不同工具链也是两套很多人一上来就混着用工具结果越标越乱。这篇我就把这两种方式的原理、实操流程、常见坑位按我自己实践的顺序完整走一遍。1. 先把两种标定方式的边界划清楚1.1 内参标定与外参标定的本质区别理解IMU标定的第一步是把“内参”和“外参”这两个词彻底分开不然之后大概率会被各种工具的输出搞晕。内参标定处理的是IMU本身“测量得准不准”的问题。IMU的核心传感器是加速度计和陀螺仪理想情况下加速度计输出的比力和真实加速度之间是简单的比例关系陀螺仪输出的角速度也应该和真实角速度完全一致。但现实中每个轴上都存在零偏bias、尺度因子scale factor、安装误差misalignment最后还有一个随温度缓慢漂移的零偏变化。这些东西都属于内参。内参标定的产出就是把这几个参数估计出来让IMU的原始输出变成一个更接近真实物理量的数字。外参标定处理的是IMU和其他传感器之间“空间位姿关系对不对”的问题。比如相机-IMU标定标的就是IMU坐标系到相机坐标系的旋转和平移外加一个时间延迟。LiDAR-IMU标定同理是求IMU坐标系到LiDAR坐标系的外参。这类标定是为了在融合时把IMU的数据投影到相机或雷达坐标系下做到空间对齐。注意外参标定一般不会去修正IMU的内参它默认你已经做过内参标定或者直接在优化里把内参当作已知值固定住。用生活化一点的话来说内参解决的是“这把尺子量得准不准”外参解决的是“这把尺子和另一把尺子摆在一起读数怎么换算”。两个问题不在一个维度当然不是一套工具能一起搞定的。对比项内参标定外参联合标定解决的问题IMU自身测量是否准确IMU与其他传感器之间的相对位姿标定对象零偏、尺度因子、安装误差、噪声参数旋转R、平移t、时间偏移td典型工具imu_utils、六面法脚本、转台Kalibr、lidar_align、各类自研工具依赖设备静止平面、转台可选标定板、运动平台、纹理环境常见输出bias、noise_density、random_walkT_ic、time_offset、重投影误差只要把这张表放在脑子里后面每一步都不会跑偏。1.2 为什么不能只靠出厂参数肯定有人想问IMU芯片不是出厂都标定过吗数据手册上白纸黑字写着零偏、噪声密度为什么还要自己再标这个问题我在刚接触那几年也信过。直到有一次把一个号称“出厂已校准”的IMU装上自研板子静止放置一晚上第二天一上电加速度计三个轴的比力和1g对不上Z轴差了将近20mg。20mg什么概念做惯导解算静止时1mg的加速度零偏积分10秒就会产生大约0.05m/s的速度误差再乘上多旋翼一分钟的飞行时间位置漂移量已经很可观了。更别说温漂很多MEMS IMU的零偏随温度变化可以到每秒每小时几度的量级出厂参数根本覆盖不了你实际工作环境的温度范围。另一个现实问题是IMU一旦被焊接到电路板上它的安装轴和芯片标注的坐标系可能因为贴片工艺产生微小偏差这与PCB变形、散热不均匀等因素相关。这些偏差装配厂商不会替你测只能靠整机标定去补偿。所以凡是要求姿态解算精度和长期稳定性的系统基本都把“自标定”当成一个必做环节。内参标定不做好后面联合标定出来的外参也会被污染因为IMU的高频输出不准优化器会把误差强行塞进外参里去。2. IMU内参标定把加速度计和陀螺仪“盘”明白2.1 内参标定的数学模型零偏、尺度因子、安装误差先看一眼模型不用太深但至少要清楚自己在标什么。加速度计的测量模型可以简写成真实加速度 尺度因子矩阵 × 安装误差矩阵 ×测量值 - 零偏。陀螺仪的形式类似只是输入输出单位变成角速度工程上一般忽略地球自转的影响。各项含义零偏静止时传感器输出不为0的量单位是m/s^2或deg/s。这是影响最大的项必须标。尺度因子传感器输出和真实物理量之间的比例偏差一般按ppm或百分比计MEMS传感器通常在0.1%到1%的量级。安装误差三个加速度计或三个陀螺仪之间互相不垂直产生轴间耦合用3×3的下三角矩阵表示角度误差通常在0.1度到1度之间。标定内参的经典做法有两大类。第一类叫转台式标定把IMU放到高精度双轴转台上通过转台提供已知角速度和重力方向逐次旋转不同姿态列方程求解参数。这套方案精度最高但转台贵、操作流程长适合工厂产线不适合研发迭代。第二类叫手持或静止标定也叫无转台标定通过让IMU在多个静止姿态下采集数据利用重力做一个天然的基准再结合多个姿态下的输出差异把尺度、安装误差和零偏一起解出来。就算没有转台也能把零偏和尺度标到足够工程用的精度。这里要补充一个小知识点陀螺仪的尺度因子和安装误差单纯靠静止方法很难标得很准因为静止时陀螺仪不激励真实角速度为零你只能标出零偏。所以很多工程团队采取混合策略——加速度计内参用多姿态法标定陀螺仪内参靠转台或者联合标定时的运动激励来估计。这也是为什么Kalibr联合标定里能顺带优化陀螺仪的部分内参因为它有足够的运动激励。2.2 Allan方差分析不用实验室也能估出噪声参数标完零偏和尺度之后还有一类参数不能忽略噪声参数。在一些系统里噪声参数被直接当作固定先验而在另一些基于滤波的融合算法里噪声方差设得合适不合适直接决定系统是“飘”还是“崩”。这一般用Allan方差来标。Allan方差的做法听起来复杂实际很简单把IMU静止放置几个小时采集加速度计和陀螺仪的高频数据然后对数据按不同积分时间做方差分析画出一条log-log曲线。曲线里的不同区段代表了不同来源的噪声——水平段的高度对应零偏不稳定性斜率为-0.5的段对应角度随机游走或速度随机游走斜率为0.5的段对应量化噪声等等。实操时我常用的是imu_utils工具它会把采集到的bag文件离线跑一遍直接输出加速度计和陀螺仪的Allan方差曲线并拟合出各项噪声参数。这里有两个容易踩的坑数据长度不够。Allan方差要看到低频率段的水平区至少需要2小时以上的静止数据最好更长。很多论文里报的零偏不稳定性都是基于24小时数据你拿10分钟数据拟合出来的数字没有参考价值。静止一定不能是“假的静止”。放在桌上静止但如果旁边有人走动、空调风直吹、或者桌面本身有低频振动都会污染低频段。最好放在地下室、大理石台面上并且断开外部电源用电池供电避免工频干扰。我建议内参标定和噪声标定分开做各采集各的数据。内参多姿态法采集时长按分钟计Allan方差采集按小时计不要混在一起。2.3 六面静止法实操一个晚上完成批量标定说回最常被用到的加速度计内参标定。没有转台的话我一般用“六面静止法”把IMU依次摆成6个姿态让重力分别落在±X、±Y、±Z轴上每个姿态静止记录30到60秒取均值。为什么是6个面因为三轴加速度计加上零偏和尺度因子要解的参数不多6个面正好提供了足够的冗余约束。重力方向已知、大小已知每个姿态都能列出一组方程6组方程用最小二乘就能把参数解稳。具体操作上我习惯用3D打印的立方体夹具把IMU板卡固定到夹具里保证IMU的安装面可以平放在桌面上。每换一个姿态前等数据稳定1分钟再记录然后取平均值。6个面的数据全部拿完后用Python脚本做最小二乘同时画出残差检查有没有异常姿态。小提示如果手头没有3D打印夹具也可以用水平台面加直角挡块来近似但精度会受摆放误差影响。批量产线标定还是建议用自制的多面夹具或者直接上个微型转台。标完加速度计后陀螺仪零偏的标定相对简单静止放置1到2分钟对陀螺仪三个轴输出求均值就是零偏。注意这里要求IMU完全没有运动哪怕一点微小的旋转都会污染数据所以采集时最好用支架固定不要用手拿着。3. 相机-IMU联合标定Kalibr实战全记录3.1 两套传感器之间到底要标什么内参搞定了接下来就是联合标定。相机和IMU联合标定是视觉惯性里程计VIO和VI-SLAM系统里最费精力的一环因为VIO的核心假设就是“相机和IMU之间有一个固定的外参”包括从IMU坐标系到相机坐标系的旋转R_ic和平移t_ic以及两者之间的时间延迟。为什么时间延迟也要标因为IMU的数据触发时刻和图像曝光时刻不可能完全同步硬件同步电路做得再好也会有几毫秒到几十毫秒的偏差。这个小偏差在快速运动时会直接表现为视觉特征点位置和IMU预测位置不匹配导致联合优化发散。Kalibr提供了估计时间偏移的功能这实际上是两套传感器的时间戳对齐问题。为了标得准图像数据最好用全局快门相机。卷帘快门相机在快速运动时会产生明显的果冻效应会把特征点标定也带偏这也是为什么很多人看到Kalibr结果“看起来差不多但对不齐”的原因之一。另外联合标定还能顺便估计出IMU的陀螺仪零偏因为它可以借助视觉观测到的旋转来拟合IMU的角速度积分残差里就包含零偏项。但要注意这个零偏估计依赖的是短时间数据精度有限它更适合作为后续VIO系统初始化的初值不适合替代专门的内参标定。3.2 标定板选择与数据采集的“黄金标准”Kalibr的相机标定用Aprilgrid网格板因为它有编码信息不怕部分遮挡而且可以提供更精细的角点提取。标定板尺寸的选择要考虑相机视场角和分辨率板子在图像里占的面积越大角点提取越稳角点间距太小近距离时会变得模糊远距离时又无法识别。我常用的尺寸是A0纸打印的Aprilgrid方格尺寸约20到30mm每个格子内部有4×4个编码点。建议用哑光相纸打印打印后贴在硬质铝塑板上不要用普通打印纸贴在软板上否则角点位置会因板子弯曲产生毫米级误差。数据采集环节直接决定标定成败。我总结的“黄金标准”是光照充足且均匀避免反光避免直射强光。相机对Aprilgrid保持“逐步充满视野”的方式保证板子始终在画面内但不总是正对相机。运动方式要“慢中带快、角度丰富”既要缓慢平移让视差拉开也要快速旋转让IMU充分激励。如果IMU长期不做大幅角速度变化旋转部分的激励不足Kalibr估计出的外参会过度依赖视觉对快速运动段预测不准。采集时长30秒到2分钟不要只录十几秒。标定板的运动幅度要覆盖整个视野不要只在画面中央小范围移动。开始和结束各保持静止2秒以上给系统一个明确的静止区间有助于初始化。最后一点非常实用。很多人录数据时一开始就动Kalibr在初始帧找不到静止段往往初始化失败或者估计出的零偏特别大。加上静止段之后初始化稳定很多。3.3 跑通Kalibr从配置到结果解读Kalibr的相机-IMU标定命令大概是这样的kalibr_calibrate_imu_camera \ --target aprilgrid_6x6_36cm.yaml \ --cam camchain.yaml \ --imu imu.yaml \ --bag data.bag \ --time-calibration其中camchain.yaml里要填相机内参和畸变模型imu.yaml要填IMU的型号、频率、噪声密度和随机游走参数这些参数可以从前面Allan方差标定的结果里拿。如果暂时没有先用数据手册上的近似值Kalibr对这两个参数有一定容忍度但尽量给准。跑完之后会得到几个关键输出camchain-imucam.yaml里面是联合标定后的相机内参加外参外参在T_ci字段里表示从IMU到相机坐标系的变换。imu-cam.dump保存了优化过程的中间数据。一个包含重投影误差和IMU残差的PDF报告。我一般会重点看报告里的重投影误差。正常情况下均值应该在0.1像素到0.5像素之间如果超过1像素说明标定品质一般可能的原因包括板子不平整、曝光太短导致图像模糊、运动轨迹太窄或者卷帘快门引起的几何偏差。另外报告里还会给出优化迭代是否收敛、残差分布是否呈高斯形态。把残差分布打成直方图如果出现明显多峰或者尾巴很重基本就是数据里有坏帧或时间戳不对齐。实操里我还会做一次“信任性验证”拿着标定出来的外参在真机上允许视觉惯性里程计初始化做一段完全VIO依赖的快速运动对比运动前后的位置漂移。如果外参是对的初始化后几秒钟内IMU和视觉轨迹应该能吻合否则就得怀疑外参是否可靠。4. LiDAR-IMU联合标定比相机更“硬核”的外参求解4.1 LiDAR-IMU标定的难点在哪里LiDAR-IMU联合标定和相机-IMU联合标定很像都是求空间外参但难度上了不只一个档次。首先LiDAR的输出是稀疏点云没有纹理和色彩特征提取没有图像那样直观。点云里能稳定提取的是面、边和角但在实际场景里这些几何特征往往分布不均匀。其次LiDAR是机械旋转式扫描的一帧点云是几十到上百毫秒内逐步扫描出来的和IMU的采样时刻严格对应不上需要做更精细的时间同步和外推。第三LiDAR的观测信息本身对旋转和位移的激励差异很大——原地旋转时点云场景基本不变对平移外参的激励不足平移时又可能丢失近处的几何约束。所以标定数据如果采集不好优化问题会趋于病态得到的外参看着收敛实际一跑就崩。不过好消息是现在LiDAR-IMU标定工具已经比前几年完善多了而且很多新工具已经把时间偏移也纳入优化比如一些开源SDK自带的标定模块。对于做激光惯性里程计的朋友来说外参标定的质量直接决定了里程计在退化环境里能不能维持精度非常值得花时间。4.2 从lidar_align到自动标定工具的演进早期大家最常用的是lidar_align它把LiDAR点云和IMU轨迹的伴随距离作为优化目标离线估计外参。它的优点是思路清晰、代码简单但毛病也明显对初始外参敏感、依赖场景中的几何结构、需要人工指定初值区间经常收敛到局部最优。后来工业和学术界陆续提出了更鲁棒的方法思路基本都是“利用前端里程计的位姿约束外参”也就是先把LiDAR或IMU各自做成一个里程计得到两条轨迹然后取两轨迹间的刚性变换作为外参初值再放到全局优化里去精调。这种方法工程上很实用因为全程自动化不需要人工挑选特征。我自己在室内环境下优先用这类方法如果环境太重复比如是一条笔直走廊轨迹退化严重我会换回手动角点对齐或者添加更多旋转运动来补充激励。4.3 LiDAR-IMU标定实操记录我最近一次做LiDAR-IMU标定用的是一颗32线机械式LiDAR和一块工业级MEMS IMU。场景选在一个约20米见方的室内厂房里面有不少货架、柱子和墙面夹角几何纹理比较丰富。操作流程如下第一步把LiDAR和IMU刚性固定到一个铝板支架上测量两个传感器坐标系之间的大致距离作为平移初值。旋转初值先按安装朝向来设大概给一个欧拉角比如(0, 0, 0)或(pi, 0, 0)具体取决于LiDAR坐标系和IMU坐标系的朝向关系。这步别太随意因为很多工具对旋转初值很敏感。第二步推动平台在场景里缓慢移动同时做原地旋转和八字形运动。重点保证每个方向的旋转都够大每次旋转角度最好超过45度。平移速度不必很快但要保证点云有足够的覆盖。我录了大概3分钟数据用ROS bag记录下来。第三步跑标定工具。等工程完成后观察输出的外参和初值之间的差异看平移收敛量是否在几厘米以内、旋转收敛量是否在几度以内。如果突然收敛出一个离谱的外参比如平移跳了半米大概率是初值给错或者数据激励不足。第四步验证。把标定出的外参写进LIO算法的配置里在同样的厂房跑一圈对比里程计轨迹和人工拉尺量出的闭合误差检查漂移是否在可接受范围。这里有个独家建议标定LiDAR-IMU外参时尽量让IMU先做静态初始化比如上电后静止5秒再动。很多LIO系统有IMU检测逻辑上电后会利用静止数据估算重力方向和初始零偏这一步如果没做好整个运动过程中的IMU积分起点就是歪的标定结果自然也会偏离。5. 标定中的常见问题与排查技巧实录5.1 内参标定翻车现场内参标定看起来简单但翻车率不低。最常见的翻车情形是“六面法”中有某个面摆得不准导致最小二乘法把误差分摊到所有参数结果尺度因子和零偏全部偏离真实值。排查方法很简单标定完后用标定结果回代重新计算6个姿态的重力投影把残差打出来。正常应该每个姿态的残差都接近零如果某一个姿态残差明显偏大大概率是那个姿态的摆放角度出了问题。另外一个常见问题是“静止状态下数据仍有趋势项”。比如IMU放在桌上采样加速度计Z轴输出随时间缓慢变化这时采集到的均值没有意义。这种情况通常来自温漂和电路自热——刚上电时的IMU温度还在爬升零偏也在跟着变。我的习惯是先让系统上电预热至少5到10分钟再做多姿态标定能显著减小温漂影响。还有一次我用imu_utils做Allan方差发现陀螺仪的零偏不稳定性比数据手册高了一个数量级。排查半天最后发现是采集时USB供电抖动引起参考电压噪声换电池供电后数据立刻恢复正常。所以采集IMU数据时供电方案一定要干净。5.2 联合标定结果不收敛怎么办联合标定最常见的问题是Kalibr不收敛或者重投影误差很大。我的排查顺序基本是先检查图像角点检测是否稳定。把bag里的图像导出来看看检查景深、曝光、运动模糊是否影响角点识别。如果角点抖动严重怎么调都白搭。检查时间戳是否同步。ROS环境下如果相机和IMU消息之间有固定延迟即使外参正确优化残差也会有系统性的偏置。可以用--time-calibration参数打开时间偏移估计但前提是消息本身的时间戳不能有明显跳变。用命令检查相机和IMU的频率再确认时间戳延迟是否稳定。确认IMU的坐标系约定。Kalibr认为IMU的加速度计和陀螺仪输出在同一个坐标系并且角速度是机体坐标系下的角速度。如果你的IMU驱动里已经做了坐标变换或者把角速度符号变过Kalibr是感知不到的结果自然会错。降低对优化初值的期望。如果外参初值给得完全离谱比如把相机装在IMU右边却写成了左边Kalibr很可能收敛到局部最优。先自己量一下大概的平移距离和旋转角度再喂给工具。现象可能原因排查思路重投影误差均值1px板子弯曲、曝光异常、运动过激换硬板、调曝光、重新采集外参平移收敛异常大初值给错、旋转激励不足实测初值、加大旋转幅度初始化失败无静止段、IMU零偏过大加静止段、检查内参时间偏移估计乱跳时间戳跳变、消息频率不稳检查驱动、检查硬件时钟5.3 IMU检测逻辑与数据质量验证最后聊一个和标定强相关、但经常被忽略的点IMU的数据质量检测逻辑。这里说的不是硬件故障检测而是软件层面的“这条数据能不能用”的判断。在标定过程中我通常会在采集端加上几个简单的检测逻辑静止检测对IMU零偏做滑动窗口方差检测如果三个轴角速度方差小于某个阈值比如0.02 rad/s就判定为静止段。静止段在标定数据里非常重要它们是初始化和零偏估计的锚点。运动激励检测对加速度计和陀螺仪输出做统计计算角速度的峰峰值和加速度的方差。如果角速度长期在很小范围内波动说明运动激励不足联合标定大概率会不稳定。一般要求至少出现几次峰值超过0.5 rad/s的旋转运动。状态量合理性检测在Kalibr等工具启动前先检查IMU静止时的重力模长看是否接近9.8 m/s^2。如果偏差超过0.1 m/s^2多半是内参标定没做好或者传感器故障这时候直接去跑联合标定只会得到一个“看似收敛实则错误”的外参。这套检测逻辑我已经写进了自己的采集脚本里做成一个类似“采集前自检”的流程。标定工作能不能一次过很多时候不取决于优化算法而取决于你喂给算法的数据是否干净、激励是否充分。我个人的体会是IMU标定这件事真正难的不是某个算法而是对整个标定流程的“项目管理”。你要知道自己现在标的是什么内参还是外参需要哪种工具数据采集合不合格结果怎么验证。很多人标定不好不是不会跑命令而是不清楚每一步在优化什么、每个参数的实际物理意义是什么。按这篇文章里的顺序——先内参、再联合、后验证——一步一步来你会少踩很多坑。最后再分享一个小技巧标定完的配置和报告记得按传感器编号和日期归档不要只留一份“最后能用的”。下次设备的传感器一换或者机械结构一改老配置都会失效这时候你能快速定位到上次标定的环境和参数会省下很多重复排查的时间。祝大家标定一次就过。