先说明一下,IMU标定这件事,在国内机器人、自动驾驶、无人机圈子里的地位,基本等同于厨房里的“先烧水”。你算法再牛、传感器再贵,IMU的零偏没弄干净、外参给得稀里糊涂,系统跑起来就是各种漂移和打架。这些年我经手过的项目里,因为IMU没标好导致VIO初始化失败、Lidar建图出现重影的情况,掰着指头数都数不过来。所以这篇就专门聊聊目前最常用的两种IMU标定方式:内参标定和外参标定,把原理、工具、流程、坑位一次说透。
1. 两种标定方式到底在标什么
很多刚入行的朋友一听到“IMU标定”,第一反应就是拿个转台转几圈就完事。但实际工程里,IMU标定从来不是一件孤立的事,它分两条完全不同的技术路线:一条是标传感器自身的“脾气”,也就是内参标定;另一条是标IMU跟其他传感器之间的“相对关系”,也就是外参标定。两者解决的问题不同、方法不同、工具链也不同,但很多项目失败,恰恰是没搞清楚自己到底该做哪一个。
1.1 内参标定:摸清IMU自己的家底
内参标定这个事,字面意思很好懂,就是把IMU这个传感器本身的误差模型参数给估计出来。这里说的误差不是简单的“测量不准”,而是有明确物理意义的几类:零偏(Bias)、比例因子(Scale Factor)、安装误差(Misalignment),以及由温度和噪声驱动的随机游走。其中零偏又分常值零偏和零偏不稳定性,后者直接决定了系统静止时的数据漂移速度,对视觉惯性里程计(VIO)和激光惯性系统(LIO)的影响是致命的。
我经常用一个特别土的类比来解释内参标定的作用:一台体重秤,放上去显示的数字总比真实体重多2斤,这就是零偏;你在秤上放10斤的东西它显示12斤,放20斤的东西显示24斤,这就是比例因子不是1;如果秤本身没放平,往一边倾斜导致读数偏大,这就接近安装误差。内参标定干的事,就是把这些“歪门邪道”全部量化出来,然后在下游算法里补偿掉,让IMU输出的角速度和加速度尽可能接近真值。
内参标定目前主流的有两种路线:一种是基于Allan方差分析法,主要用来拿零偏稳定性和随机游走系数,这些参数通常是给滤波器和优化器当噪声先验用的;另一种是多位置法(六面法)配合转台,用来标定比例因子、安装误差和常值零偏,这种标定出来的参数可以直接写进IMU驱动里做硬件层面的补偿。后面我会把两种方法的具体操作和数据处理细节分开讲。
1.2 外参标定:解决多传感器之间的“谁来对谁”
外参标定解决的问题更偏向系统集成层面:当IMU和相机、激光雷达装在同一台设备上时,我们需要知道IMU坐标系到相机坐标系、IMU坐标系到激光雷达坐标系的旋转和平移矩阵。这个矩阵如果给错,后果几乎是灾难性的——视觉特征和IMU积分量的坐标系对不上,初始化出来的重力方向是歪的,整个SLAM系统在五分钟之内就会崩。
外参标定有一个很容易混淆的点需要拎清楚:外参标定可以分成“估计外参”和“在线优化外参”两种工程实现方式。离线估计一般用专用标定工具,比如kalibr这类,采集完数据、跑完求解,得到一个固定的外参写进配置文件里,后续系统一直用这个值;在线优化则是在算法运行过程中,把外参作为状态量丢进优化器里,和位姿一起迭代求解。实际部署中,很多系统是两手抓——先用离线工具算一个初值,再放到线里的优化器不断修正,防止温度变化、机械形变导致外参漂移。
这里还牵扯到热词里提到的“imu和图像里程对应”问题。直白一点说,VIO系统之所以能工作,依赖的核心假设就是IMU的积分结果可以用来预测相机在两帧之间的运动。这个预测准不准,一半取决于内参标定得好不好(零偏和噪声),另一半就取决于IMU和相机的外参给得对不对。外参错个一两度,短时间内可能看不出来,跑个几十秒之后轨迹就开始起飞,这个现象我在自己搭的测试平台上见了无数次。
1.3 为什么说“先内参,后外参”是铁律
在工程顺序上,有一个不成文但极其关键的潜规则:内参不准,外参必歪。原因特别直白,外参标定的本质,是拿IMU的积分量和视觉/激光的观测量做对齐。如果IMU本身零偏没估掉、比例因子是错的,那它给出的角速度增量就是错的,这时候再去解外参,解出来的旋转矩阵一定是个错误值,用来补偿IMU本身的误差。
我自己吃过这个亏。早期做个双目视觉惯性里程计的项目,直接拿厂商给的出厂内参就去跑kalibr联合标定,出来的外参旋转误差看着在合理范围,但一上真机就发散。后来我把IMU放在转台上好好做了个多位置内参标定,再把内参喂给kalibr重新联合标定,一次就过了。从那以后我就给自己定了个规矩:IMU内参标定永远是系统搭建的第一步,不标完内参绝不碰外参。这个顺序问题,怎么说都不过分。
2. 内参标定实操:Allan方差与多位置法的取舍
内参标定这块,如果只是自己搭个原型验证算法,不一定非要上高精度转台。但想标得准、标得稳,至少得对原理和数据处理流程有清晰认知。下面我把两种主流方式分别拆开讲,包括各自的适用场景、操作步骤和结果解读方法。
2.1 Allan方差分析到底在分析什么
Allan方差这名字听起来高大上,本质上就是一个统计学工具。把IMU静止放置一段时间(一般至少采集一到两小时,最好四小时以上),然后对陀螺仪和加速度计的输出做Allan方差分析,就能把隐藏在噪声里的各类误差分量给分离出来。它能给到的东西包括:角度随机游走(ARW)、零偏不稳定性(Bias Instability)、速率随机游走(RRW),以及量化噪声和速率斜坡。
这几种误差项怎么理解?角度随机游走可以想象成你每看一次表,指针位置都有一个微小的随机抖动,这个抖动随时间的累积效应表现为积分角度会有随机漂移;零偏不稳定性则是更长尺度上的“慢漂”,有时候向左一会儿向右,看着像个缓慢变化的随机过程;速率随机游走则对应加速度计层面上的类似问题。得到这些参数之后,最直接的用处就是填到ESKF(误差状态卡尔曼滤波器)或者因子图优化器里,作为IMU噪声协方差矩阵的输入。
2.2 Allan方差分析实操步骤与数据解读
做Allan方差分析,我的推荐流程分四步走。
第一步是数据采集:把IMU固定在一个绝对静止的平台上,注意一定要避免任何振动干扰,采集时长我建议至少写两小时起步,有条件的话采四小时。时间越长,Allan方差曲线在长相关时间段的置信度越高,零偏不稳定性也估计得越准。数据频率保持原始频率就行,不用做抽稀。
第二步是数据预处理:把IMU刚上电前几分钟的数据切掉不要,因为传感器上电之后需要一段热稳定时间,这期间的零偏变化剧烈,混进分析里会把结果搞脏。
第三步是运行Allan方差计算。这里我不建议自己纯手写,Amazing!有很多现成的工具能用。比较省事的有Python生态的allan-variance库,或者MATLAB的imuSensor工具箱里也有现成的分析函数。核心计算逻辑不算复杂,但自己实现容易忽略“重叠式Allan方差”和“非重叠式”在统计特性上的差异,直接用成熟工具更稳妥。
第四步是读图。Allan方差一般用log-log坐标画出来,横轴是相关时间,纵轴是Allan方差。曲线从左到右会有几个明显阶段:斜率为-1/2的段对应角度随机游走,曲线最低点对应的纵轴值的一半就是零偏不稳定性,斜率为+1/2的段对应速率随机游走,斜率为+1的段是量化噪声。实际读的时候,我会重点抓住曲线最低点和两边的斜率特征,把ARW和Bias Instability读出来记录到标定档案里。
2.3 多位置法:用手头的设备把比例因子和安装误差逼出来
Allan方差给的是随机误差和噪声统计特性,但没法直接给比例因子、安装误差和常值零偏。要拿这仨,工程上最常用的是多位置法,最经典的就是“六面法”。
六面法的原理不复杂:加速度计在静止时只感受重力,所以你把它依次摆成六个不同的姿态,让重力分别沿+X、-X、+Y、-Y、+Z、-Z方向作用,每个姿态下读取加速度计输出,就能联立解出零偏、比例因子和安装误差。如果IMU自身带有温度补偿,那在这个流程里最好同时记录温度数据,标定完之后生成一个温度-零偏的补偿表,效果会好很多。
对于陀螺仪,多位置法思路类似但稍有不同,转台是必须的。让IMU绕不同轴保持恒定角速度旋转,对比真实角速度和测量角速度,就能把陀螺仪的零偏、比例因子和轴间耦合误差给解出来。没有转台的情况下,陀螺仪的比例因子标定会非常费劲,所以很多纯视觉团队干脆忽略这部分,直接用出厂值,但这种策略在高动态场景下会出问题。我建议能上转台就上转台,哪怕是单轴的也比你盲猜强得多。
标定完之后,每个轴向都会得到一组方程。我自己在用的时候,一般会把六面法做成一个脚本,自动读取六个位置的静态数据,然后求解一个12维的未知数向量(3个加速度计零偏、3个比例因子、6个安装误差),同时用最小二乘做一次全局优化,最后把计算出的补偿矩阵写进IMU驱动,在数据进入算法之前就先把原始值修正掉。
2.4 内参标定的几个容易翻车的细节
内参标定看似不难,但实际做起来翻车点不少。第一,数据质量是一切的前提。采集Allan方差数据时,如果平台没放稳,哪怕只是楼上装修的电钻振动,都会在长相关时间区间上制造假的随机游走,读出来的零偏不稳定性会大得离谱。第二,六面法的姿态精度很关键。用水平尺和斜面凑合的简易工装,姿态误差控制在一两度以内勉强能接受,如果做不到,建议用光学平台或者3D打印的直角工装,把误差控制到0.1度级别。第三,温度问题千万别忽略。消费级IMU的零偏随温度漂移非常显著,我见过一个项目在空调房里标定的内参,拿到-10度的室外环境下,系统直接没法用。有条件的话,应该在目标工作温度范围内做多个温度点的标定,然后拟合出一条温度曲线。
3. 外参标定实操:kalibr联合标定与Lidar-IMU标定
外参标定是另一种完全不同的游戏。它不再关心IMU自己的误差模型,而是要把IMU和另一个传感器之间的相对位姿关系给求出来。用手上现有工具,最典型的就是kalibr做“相机-IMU联合标定”和各类Lidar-IMU标定工具。热词里提到的“lidar imu标定”和“kalibr相机imu联合标定”,是外参标定领域里最常见也最核心的两个场景。
3.1 kalibr联合标定的原理与数据采集要求
kalibr是苏黎世联邦理工开源的一套多传感器标定工具箱,其中kalibr_calibrate_imu_camera这个模块专门用来联合标定相机和IMU之间的相对旋转和平移。它的核心原理可以这么理解:相机通过观测标定板上的特征点,估计出一串相机的运动轨迹;IMU通过积分,估计出一串IMU的运动轨迹。如果相机和IMU之间的外参是正确的,那么把IMU的轨迹通过外参变换到相机坐标系下,两条轨迹应该能完美对齐。基于这个思想,kalibr构建了一个优化问题,把外参、IMU零偏、重力方向等一起丢进图优化里求解。
kalibr对数据采集的要求很严格,这也是很多人跑不通的常见原因。采集时需要注意:标定板必须是apriltag网格板,要打印得平整、贴得平整;运动时要让相机看到足够的角点,不能跑出视野;要保证IMU的激励充分,包括加速、减速、旋转,动作尽量做得“用力”但平滑,避免剧烈抖动带来的运动模糊。一个常见误区是觉得动作越夸张越好,其实不然,kalibr需要的是充分的角速度和线加速度激励,而不是高频振动。我自己的经验是,每组数据采集控制在30到60秒,中间尽量覆盖六自由度的运动,重复采集四五组,选质量最好的一组去跑。
3.2 kalibr联合标定实操流程与参数解读
操作kalibr的具体流程,如果环境已经搭好(Ubuntu + ROS),核心命令就几步:
第一步,用相机采集标定板图像和IMU数据。如果你用的是ROS环境,要用rosbag record同时录制相机话题和IMU话题。录制前记得确认两个话题的时间戳同步问题,IMU发布频率一般要大于相机帧率的若干倍,保证积分有足够的中间量。
第二步,把录好的bag转成kalibr需要的格式,然后先用kalibr_calibrate_cameras做相机内参和畸变系数的标定,这个内参结果会作为联合标定的输入。注意,这个过程不需要IMU参与,单纯是相机对标定板的求解。
第三步,运行联合标定:
kalibr_calibrate_imu_camera --target april_6x6_50x50cm.yaml \ --cam camchain.yaml \ --imu imu.yaml \ --bag dataset.bag \ --time-calibration其中imu.yaml里需要写好IMU的噪声密度、随机游走等先验,这些参数正是从第2章的内参标定中拿到的。--time-calibration表示同时估计相机和IMU之间的时间延迟,如果传感器硬件上没有做严格的时钟同步,这个选项务必打开。
跑完后会输出一个results.yaml文件,里面包含外参的旋转四元数和平移向量,以及时间延迟的估计值。读结果的时候,重点看两点:一是优化报告里的残差大小,残差太大说明标定失败,需要检查数据质量或者IMU先验是否合理;二是外参的不确定性(协方差),如果某个轴的方差特别大,说明那个方向上的运动激励不足,需要补采数据。
3.3 Lidar-IMU标定:原理差异与工具选型
Lidar和IMU的联合标定,思路和相机-IMU标定类似,但实现路径上差异很大。相机可以通过标定板提供非常明确的特征点对应关系,而激光雷达的观测是稀疏的三维点云,在室内场景下不容易像图像那样稳定提取到角点。所以Lidar-IMU标定的主流方案分两种流派:一种是把标定板放到Lidar可以扫出明显平面特征的位置,通过拟合平面来构建约束,比如lidar_imu_calib这个开源工具就是走的这个路线;另一种是直接利用Lidar的点云配准结果,比如LIO-SAM这类系统在初始化阶段会做在线外参校准,用点云配准的位姿变化和IMU积分位姿变化对齐来求外参。
实际操作中怎么选?如果你手上的Lidar是机械式多线雷达,点云比较稠密,室内有标定板或特征墙,那用基于平面的离线标定工具效率很高;如果你用的是固态雷达,视场角有限,特征提取困难,那更推荐在SLAM系统内部做在线外参初始化+优化,而不是费劲做离线标定。
Lidar-IMU外参标定的一个核心技巧是:运动激励要充足。和kalibr一样,Lidar-IMU标定算法依赖IMU的加速度和角速度激励来提供足够的可观测性。绕着重力方向转圈的激励是不够的,要让设备在三个轴向上都做充分的旋转和加减速运动。我实测下来,如果只做水平面的旋转和前后平移,解出来的外参平移分量方差会明显偏大,把Z轴的旋转分量加进去后,结果会稳定很多。
3.4 外参标定的验证方法:别急着写进代码里
很多人在标定完成后拿到一组外参就直接写进配置了,这是大忌。我强烈建议在使用外参前多做一步验证:把IMU积分轨迹通过外参变换到相机(或Lidar)坐标系下,再和视觉(或点云配准)的轨迹放在一起画出来,肉眼看两条轨迹是不是吻合的,旋转和平移方向是不是一致的。如果两条轨迹在某个方向上有系统性偏差,不要怀疑,外参大概率有问题。
还有一种更好用的验证方法,就是跑一次短距离的SLAM建图,人为地让设备做几个大回环。如果回环闭合正常、地图没有重影,那外参基本是靠谱的;如果地图出现明显的倾斜或重影,优先怀疑外参的旋转分量。这类验证手段花不了多少时间,但能省掉后面无数排查的力气。
我之前帮一个朋友调试一套Lidar-IMU系统,标定结果看起来残差很小,但建图总在Z方向有轻微倾斜。排查了很久最后发现是标定时运动激励不够,Z轴的旋转没有被充分激发,导致俯仰角外参漂移。后来重新做了一组大幅度“点头”动作的数据再标定,问题迎刃而解。这类问题从标定报告的协方差里其实能发现端倪,但很多人根本没看就直接用了,踩了坑也只能回头来翻报告。
4. 常见问题与排查技巧实录(速查表)
IMU标定这件事,做多了你就会发现,问题来来回回就那么几个。我把实战中遇到的典型问题整理成了一个速查表,方便大家踩坑时快速对照。
| 常见现象 | 可能原因 | 排查与解决办法 |
|---|---|---|
| kalibr联合标定残差大,优化不收敛 | IMU内参先验给得不合理 | 先做Allan方差分析,更新imu.yaml中的噪声密度和随机游走参数 |
| 外参标定完成后建图Z轴倾斜 | 标定运动中Z轴旋转激励不足 | 补充绕前向轴的旋转运动,查看标定结果协方差确认 |
| VIO初始化耗时过长或失败 | IMU零偏初值过大 | 用六面法标定内参,并在初始化阶段做严格的静止检测 |
| 相机和IMU轨迹对齐后有固定方向偏移 | 时间戳不同步或外参平移分量错误 | 开启--time-calibration,检查传感器驱动的时间戳处理 |
| Allan方差曲线末端乱跳 | 采集时间不够或平台有振动干扰 | 延长静态采集时间到2小时以上,排查环境振动源 |
| 同型号新设备标定结果差异大 | 装配一致性差或温度不同 | 每台设备单独标定,并记录标定时环境温度 |
这套速查表基本覆盖了我见过的大部分标定翻车现场,照着排查,能省下不少瞎折腾的时间。
4.1 时间同步问题:两个传感器各说各话
外参标定里头最阴魂不散的问题就是时间同步。判断是不是时间同步问题的方法很简单:把相机轨迹和IMU变换后的轨迹画在同一张图里,如果两者在形状上高度一致,但整体有一个固定角度或者固定距离的偏移,而且这个偏移不管怎么改外参都消不掉,那十有八九是时间不同步。
ROS环境下,最简单粗暴的时间校准方式是:在启动传感器驱动时,用rostopic hz分别检查两个话题的实际发布频率,确认没有丢帧或突发延迟。更精确的做法是购买支持硬件时间同步的传感器板卡,或者在算法层面做时间偏移估计,kalibr的--time-calibration选项就是干这个的。注意,即使kalibr估计出了一个时间偏移,也建议在代码里把它固化下来作为补偿,而不是每次都依赖估计。
4.2 线上外参估计算法为什么会把外参调飞
有一种情况比较特殊:系统本身带在线外参校准功能,比如VINS-Mono里就有外参在线估计的模块。刚开始跑得好好的,跑着跑着外参突然“漂”到了一个离谱的值,然后整个系统崩掉。这种问题一般有两个原因:一是激励不足导致外参不可观,在运动模式很单一的场景(比如长时间匀速直线行驶的车辆)里,外参的某些自由度本来就不可能被观测到;二是外参和IMU零偏之间存在耦合,优化器把外参误差和零偏误差搅在一起了,解出来的互相抵消,看起来位姿没崩,但实际上已是一笔糊涂账。
我的建议是,在量产或长期运行的项目里,在线外参估计只作为慢速修正手段,外参的主值一定要从离线标定里拿;如果运动模式长期单一,干脆把外参估计模块关闭,只保留固定值。这个选择听起来不够“智能”,但工程上往往是最稳的。
5. 从标定数据到标定档案:一次扎实的标定流程该怎么办
很多团队把标定当成一次性操作,标完就扔。但真正把一个系统做稳定,我会建议把标定做成可持续的流程,每次标定留下完整的档案记录,包括标定时间、环境温度、设备编号、IMU型号、内参结果、外参结果、残差报告、数据分析图表等。这些记录在你之后排查问题、复现bug、评估设备一致性的时候,价值是无法估量的。
5.1 标定档案记录哪些内容
标定档案的核心字段,我一般这样设计:
- 设备唯一标识(SN号)
- 标定日期、标定人员
- 标定环境(温度、湿度、是否在室内外)
- IMU型号、固件版本
- 内参标定结果(零偏、比例因子、安装误差、ARW、零偏不稳定性)
- 外参标定结果(四元数、平移向量、时间延迟)
- 标定使用的数据包存储路径和时长
- 标定报告截图或残差汇总
- 验证实验记录(短距离建图、轨迹对齐图)
这份档案的作用不只是追溯,更重要的是可以横向对比同型号多台设备的标定结果分布。如果10台相同型号的设备,标定的比例因子差异特别大,那就要怀疑是传感器出厂质检有问题,还是安装工装的一致性不行。这个信息对排查批量性系统问题时特别有用。
5.2 标定频率与触发条件
那多久标一次才合理?我的实践经验是,分情况讨论:研发原型阶段,改动结构、更换传感器、重新设计工装后都必须重新标定;量产阶段,如果设计冻结、装配工艺稳定,可以只在首件和抽检时标定;如果设备经历过高低温冲击、剧烈摔落,即便外观正常,也应该重新标定内参和外参。总结成一句话:凡是可能影响传感器相对位置或IMU自身误差模型的变更,都要触发一次完整的重新标定。
还有一个容易被忽视的问题是,重新标定的结果和旧结果对比时,要控制在合理的差异范围内。如果重新标定的外参和上次相比旋转差超过1度,平移差超过几个毫米,那就要思考是标定过程噪声太大,还是结构真的发生了形变。这种对比验证,也是标定档案存在意义的一部分。
6. 写给初学者的几个工程建议
最后这部分,我谈谈个人在实际项目里沉淀出来的一些感受和建议,算是我自己在标定这条路上摸爬滚打多年的心得。不一定能直接照搬,但至少能帮你少走几个大弯。
6.1 工具选择宁可少而精,也不要贪多求全
有人喜欢给每个传感器厂商都装一套配套标定工具,Ego-motion标定用一个软件,相机IMU标定用另一个,Lidar IMU标定又换一个,最后电脑里装了一堆环境依赖相互冲突,光配环境就花了两天。以我的经验,一套完整的标定工作流,其实只需要两到三套核心工具:一套做Allan方差分析(Python库即可),一套做相机-IMU联合标定(kalibr),再加一套做Lidar-IMU标定(按上文的工具选型,选一个即可)。先把这三套工具的作用和参数调明白了,比什么都强。
6.2 保存原始数据,三思而后删
标定成功之后,原始rosbag、标定板图像、中间配置文件,建议都按项目归档存好。一方面,当你换了新的算法版本,或者想重新评估传感器性能变化时,原始数据可以用来复现和对比;另一方面,有些标定问题在当时看不太出来,几个月后发现异常,回过来重新分析原始数据往往能提供关键线索。我的习惯是,每个标定session的原始数据至少保留到项目发布后的两三个月,绝不随手删除。
6.3 心态建设:标定结果不是“一次定终身”
传感器是物理器件,会老化,会受温度影响,会受机械应力影响。这个月标定的参数,放到极端环境下可能就不准了。所以做系统设计的时候,一定要为传感器误差的变化留出裕量。比如滤波器里IMU的噪声参数就算标得很准,也建议在实际使用中稍微放大一点,给模型误差留点余量;外参即便离线标定了,也要在软件层面保留在线微调的接口。说到底,标定不是一劳永逸的银弹,而是一个技术风险控制手段,它做的是把已知误差干掉,把未知误差降到可以接受的范围。
我在实际项目里踩过不少坑,很多看起来是算法问题的bug,最后都能回溯到“标定没做干净”这一件事上。所以文末我想认认真真给在座的同行提个醒:任何IMU相关系统的高层算法调试,都值得你先回头确认一遍标定是否正确可靠。这一小步,往往能帮你节省后面几周甚至几个月的排查时间。标定这件事,做的时候觉得枯燥,但它真的是整个传感器融合系统的地基,地基歪一寸,高楼歪一丈。别嫌麻烦,认真做好它,你会回来感谢自己的。