多传感器融合第一步:IMU标定原理与实战全解

📅 发布时间:2026/9/9 5:28:36
多传感器融合第一步:IMU标定原理与实战全解 做多传感器融合的项目尤其是VIO、LIO这类涉及视觉惯导和激光惯导的系统第一关永远不是算法选型而是数据质量。而数据质量的头号前提就是IMU标定。我见过太多人拿一个没标过的IMU直接跑优化结果前端初始化疯狂漂移还以为是算法写错了。其实问题往往出在传感器本身就带着一堆出厂误差。IMU标定按我的习惯会分成两条线一条是内参标定把加速度计、陀螺仪自身的零偏、尺度因子、安装误差尽量洗干净另一条是外参标定也叫联合标定把IMU与相机、激光雷达之间的相对位姿关系搞准。这两种标定方式解决的问题完全不同缺一不可。这篇文章就把这两类标定的原理、实操流程和经验教训一次性讲透适合刚入门SLAM和多传感器融合的开发者也适合被标定问题反复折腾的老工程师用来对照排查。1. 两种标定方式的本质区别先搞清楚你到底要标什么1.1 IMU误差模型零偏、尺度因子、安装误差与非正交IMU本质上是一个测量加速度和角速度的传感器。加速度计测比力陀螺仪测角速度——这是它的物理基础。但真正输出出来的数字跟真实物理量之间存在系统误差。常见的误差源可以分成三类零偏尺度因子以及安装误差。零偏好比一把尺子的刻度起点没对齐。IMU静止的时候加速度计理论上应该读到1g的重力陀螺仪理论上应该读0但由于电路偏置、温度漂移实际静置时读数会有一个固定偏移。尺度因子则是刻度粗细不一致真实输入1g它读出1.003g这个比例偏差就是尺度因子。安装误差更复杂它通常来自三轴加速度计或三轴陀螺仪本身的轴并非严格正交也可能来自传感器贴装到电路板时芯片的微小歪斜。如果只是做滤波、做状态估计零偏影响最大因为一次积分误差就会随时间累积尺度因子和安装误差虽然影响相对隐蔽但在高动态运动和长时积分下同样会显著放大误差。这也是为什么完全依赖出厂参数跑SLAM经常出现不可复现的漂移同一个设备换个温度环境表现就判若两机。1.2 内参标定与外参标定的分界这两种标定方式分界线就是坐标系不同。内参标定工作在IMU自身的坐标系里目标是让加速度计和陀螺仪的输出尽量逼近真实物理量。标定完你手里的IMU输出才算“可信”。外参标定则完全不同IMU自身的输出已经准确了但IMU和相机、激光雷达之间还隔着一个刚体变换。比如车载套件里相机装在挡风玻璃后IMU装在车辆中轴附近它们之间有一个固定的旋转和平移关系。这个关系如果错了多传感器融合里所有残差项的坐标系就对不上优化必崩。用个生活化的类比内参标定是让一把尺子本身的刻度精准外参标定是搞清楚这把尺子相对于桌子的位置关系确保你量出来的结果能换算到桌子坐标。它们分别解决“明明量错了”和“量对了但不知道是相对于哪个参照物”这两种问题。这个区别在实际项目中非常关键。很多人把Kalibr、lidar-imu标定挂在嘴边以为跑个现成工具就是“IMU标定”结果根本不清楚自己到底在标内参还是外参一旦结果不对就无从下手排查。2. 方式一IMU内参标定让加速度计和陀螺仪“各自归位”2.1 多位置静态法的原理与数学本质内参标定最常见的思路是多位置静态法。它的物理基础很简单重力是一个已知大小和方向的参考量。IMU静止放置时加速度计理论上读到的就是重力加速度向量陀螺仪理论上读到的就是0。利用这个基准把IMU摆放成不同姿态就能构造出一组约束方程求解误差模型里的各个参数。误差模型通常可以写成这样a_meas S * R * a_true b n其中a_meas是加速度计的实际测量输出a_true是真实加速度S是尺度因子矩阵R包含安装误差引起的旋转非正交b是零偏n是随机噪声。摆放N个不同姿态每个静止姿态下加速度计的模长必须等于重力加速度大小把所有姿态的约束叠加起来就可以用最小二乘把S、R、b一起估计出来。陀螺仪的零偏标定相对简单静态放置足够长时间输出均值就是零偏。但陀螺仪的尺度因子和安装误差没法靠重力来标因为静止时陀螺的输入角速度是0根本没有激励。所以陀螺仪的完整标定往往需要转台提供已知角速度或者借助相机视觉求出的角速度作为参考。2.2 六面法与转台法的实操对比我在实际中使用最多的内参标定手段有两种手摆六面法和转台法。手摆六面法就是把IMU按六个方向依次静止放置X轴朝上、X轴朝下、Y轴朝上、Y轴朝下、Z轴朝上、Z轴朝下。每个方向采30秒到1分钟的静态数据。这个方法的门槛极低不需要额外硬件一张水平桌面就行适合快速估计零偏也适合在户外现场给VIO系统做一个基础校准。它的缺点是对尺度因子的约束不够充分因为每个轴只经历了正负1g两种输入能覆盖的工作区间有限。转台法则是利用精密转台提供已知角速度同时激励加速度计和陀螺仪的动态误差。转台旋转时陀螺仪输入角速度是精确已知的参考值这样尺度因子和安装误差的约束就非常充分。有条件的话转台法标出的内参精度会显著高于手摆法适合量产级传感器出厂标定。从经验来讲做科研或者原型验证手摆六面法已经够用做量产或者追求高精度转台法几乎是必需品。这里有一个非常关键的细节无论用哪种方法标定过程中IMU必须被固定牢固不能有轻微晃动否则加速度数据会混入振动噪声对拟合结果产生明显干扰。2.3 内参标定实操中的数据采集细节很多人觉得标定就是把IMU摆几个姿态然后交给工具去算。实际上数据采集阶段决定了结果的上下限具体来说有几个要点。第一要保证IMU在采样前充分供电稳定。不少IMU上电初期零偏漂移很大需要预热几分钟才能进入稳定状态。我一般会先让设备通电静置5分钟再开始采数据。第二每个位置静态采集时间不能太短。加速度计的随机噪声虽然不大但采集时间太短会让均值估计很不稳定30秒是一个比较合适的下限。第三摆放姿态要尽量覆盖三维空间。除了官方推荐的正交方向我会追加几个斜45度方向增加约束让尺度因子和安装误差解得更稳定。下表是我常用的一种六面法采集方案供参考序号姿态描述采集时长意图1X轴朝上水平放置30s以上激励X轴正重力响应2X轴朝下30s以上激励X轴负重力响应3Y轴朝上30s以上激励Y轴正重力响应4Y轴朝下30s以上激励Y轴负重力响应5Z轴朝上30s以上激励Z轴正重力响应6Z轴朝下30s以上激励Z轴负重力响应7-9可选斜45度姿态30s以上增强尺度因子约束这套流程下来总共也就五六分钟却能把内参拟合得比较稳。实际采集时注意桌面不要有软垫最好用硬质平台防止微小形变带来的误差。2.4 Allan方差与噪声特性分析内参标定除了零偏、尺度因子、安装误差还有一个经常被忽略的环节噪声特性分析最常用的工具是Allan方差法。让IMU长时间静止放置通常1小时以上对陀螺仪输出做Allan方差分析会得到一条双对数曲线。曲线上不同斜率的段分别对应量化噪声、角度随机游走、零偏不稳定性、速率随机游走等指标。读这条曲线的规律大致是斜率约-1的段对应量化噪声斜率约-1/2的段对应角度随机游走曲线底部平坦段对应零偏不稳定性斜率约1/2的段对应速率随机游走斜率约1的段对应速率斜坡。很多VIO系统在配置噪声参数时直接照抄数据手册而实际项目里参数跟手册标称差很大是常态。所以建议大家养成长时间采集一组静止数据、做一次Allan方差分析的习惯把噪声协方差直接写进系统模型。我在工程上常用的做法是对静态数据做Allan方差分析提取角度随机游走和零偏不稳定性的数值再换算到离散状态方程里的噪声协方差。这一步换来的收益非常直接滤波器对噪声参数的敏感度立马下降调参时间能省一大截。2.5 内参标定结果怎么验证标完内参不是结束验证才是关键。我的习惯是三步走。第一步重采一段静态数据。如果标定结果正确加速度计三轴输出的模长应该非常接近重力加速度g且波动很小陀螺仪输出均值接近零。如果加速度计模长偏得离谱多半是尺度因子或零偏没收敛。第二步做一次短时积分测试。把IMU随手拿起来运动几十秒用标定后的数据做姿态积分看看最终姿态角有没有明显漂移。零偏没标干净的话角度会随时间线性漂移。第三步放进实际系统里跑一下。在VIO系统里如果内参准了初始化的收敛速度和前端残差会明显变好。这些都可以量化不是玄学。3. 方式二IMU外参标定搞清IMU与相机和雷达之间的那个R和T3.1 手眼标定与AXXB外参标定里最核心的数学模型就是手眼标定核心公式是AX XB。这里X是待求的外参矩阵包含旋转和平移。A是IMU在两个时刻之间的运动变换B是相机或激光雷达在同一时间段内的运动变换。因为IMU和相机刚性连接所以满足A*X X*B这个约束多组运动约束联立起来就能解出X。手眼标定原本来自机器人领域解决的是“相机装在机械臂末端怎么求相机和末端之间关系”的问题所以叫“眼在手上”。后来被推广到多传感器融合变成了“眼在手外”的标定场景。无论是相机-IMU联合标定还是LiDAR-IMU标定本质上都在解同一个方程。理论听起来简单实际上要解好AXXB并不容易。因为A和B都来自传感器估计带着噪声和误差。运动幅度太小、旋转轴单一都会造成方程组条件数过大结果极其不稳定。这也是为什么外参标定前一定要充分激励传感器让运动轨迹足够丰富才能保证姿态估计的几何约束足够强。3.2 相机-IMU联合标定Kalibr的完整流程相机-IMU联合标定最常用的开源工具是Kalibr。这套工具出自苏黎世理工的机器人系统实验室支持标定相机内参、IMU内参以及相机和IMU之间的外参。整个流程可以归纳为三步准备、录制、求解。准备阶段的核心是标定板。Kalibr官方推荐使用Aprilgrid棋盘格它有编码信息角点能自动编号即使部分遮挡也能检测。标定板要打印平整、贴在硬质板子上不能折叠或卷曲否则检测到的角点位置有偏差直接拉低标定精度。我见过太多人用A4纸打印标定板还卷边结果重投影误差怎么都降不下来。录制阶段需要把相机和IMU固定在同一刚性结构上手持或者装在支架上在一个纹理丰富、光照稳定的环境里做充分的六自由度运动。录制时的激励要求是“三轴充分旋转同时保持平滑加速”一般建议运动1到2分钟。太剧烈的抖动会造成图像模糊太平滑的旋转又会让旋转约束不够这两种都是最典型的失败原因。录制完成后用kalibr_calibrate_imu_camera加载相机标定参数、IMU自带参数和bag文件工具会依次完成角点检测、时间戳同步、非线性优化最终输出相机-IMU外参以及IMU内参。看到结果文件不要直接跑路要认真读results文件里的残差和重投影误差。如果优化收敛但残差很大通常说明初始值给得不好或者激励不充分。重跑之前先检查录制数据质量而不是一味调参数。3.3 录制标定数据时的运动激励设计这一点我想单独拿出来说因为很多人在这里吃亏。所谓“充分激励”不是拿在手里乱晃而是要保证绕各自轴的旋转和平移都有足够丰富的变化。我常用的运动模板是数字“8”字形运动配合几个方向上的翻转确保三轴角速度都有明显峰值交叉出现。一个特别容易犯的错误是只做二维平面内的运动。比如有人手持传感器在水平面画圈这样相机和IMU主要只绕竖直轴旋转外参里的俯仰和横滚约束几乎没有工具即使能跑通结果也接近随机。我录数据前会在心里做个检查有没有绕X、Y、Z三个轴都转了有没有上下左右平移加速度计是否经历了几组不同的朝向如果这些答案都是肯定的再开始正式录制。3.4 LiDAR-IMU标定的思路与工具LiDAR-IMU联合标定的思路和相机-IMU类似但因激光数据形式不同约束构造也有区别。比较常见的做法是利用点云帧间配准求出的相对位姿作为B同时用IMU积分求出的相对位姿作为A再进入手眼标定框架求解外参。如果环境里有地面或平面也可以用点到面的距离约束来辅助标定平移分量。开源工具方面lidar-imu-cali是比较成熟的一套流程基本也是“录数据、跑优化、看结果”。需要特别注意LiDAR-IMU标定对场景要求很高场景不能太单调否则点云配准会退化也不能有大量动态物体否则配准出来的相对位姿带着动态噪声标定结果被严重污染。实际操作时我会优先选一个有缓坡、柱子、墙角的室内场地把雷达架高一点保证前后左右都有足够几何特征。3.5 时间戳同步是外参标定的隐形杀手外参标定最容易忽视、也最致命的问题是时间戳同步。手眼标定公式里A和B必须是同一时间段内传感器各自测得的运动。如果IMU和相机的时间戳有偏差哪怕只是几十毫秒只要运动稍快A和B的对应关系就错位了标出来的外参肯定偏得离谱。因此录制标定数据之前务必确认各传感器的时间戳是基于同一时钟源同步的。在ROS环境下我建议先跑一遍话题时间同步检测看看时间戳差值的分布是否稳定。很多标定工具内置了时间偏移估计比如Kalibr会输出timeoffset参数但它只能做微小修正不能掩盖硬件上的大时间戳错乱。这个坑我踩过很多次每次都是标定结果诡异排查到最后才发现是时间戳没对齐。4. 实操中最容易踩的坑与排查技巧4.1 激励不充分绝大多数标定失败的元凶不管是Kalibr还是其他标定工具官方文档都会反复强调运动激励但大家就是容易忽视。我见过有人拿着IMU和相机在桌上平放着录了两分钟视频期望能标出外参——这基本不可能。因为所有轴都要有充分旋转传感器要在六个自由度上“都动起来”。一个有效的检查方法是录制完成后画一下IMU的角速度曲线看是不是每个轴都有明显的峰谷和方向变化。如果某个轴几乎是平的那就算标定过程不报错结果也是不可信的。下面是我常用的检查逻辑可以套用检查项判断标准每轴角速度峰谷至少出现3次以上明显变化每轴加速度波动涵盖多个朝向不只是同一平面运动时长90秒到3分钟之间是否有静止段开头和结尾各3-5秒4.2 数据长度与静止段的取舍有些工具要求数据中包含初始静止段用来估计零偏、建立初始状态。所以录制时提前让IMU静止3到5秒再开始运动别一开机就动也别录完就立刻关机。另外数据太长不见得是好事超过5分钟的数据会让优化时间成倍增加却不一定带来精度提升。我一般把有效运动数据控制在90秒到3分钟之间足够覆盖充分运动又能保证求解速度。很多时候标定失败不是算法问题而是录制习惯问题。养成“先静后动、三段式录制”的习惯之后成功率会提高很多。4.3 标定结果的四个快速验证法拿到标定结果后教大家四个快速验证手段。第一看残差和重投影误差正常收敛时残差应该在一个可接受的范围内如果出现数量级异常基本可以断定标定数据有问题。第二用标定的外参把IMU轨迹投影到图像序列上观察投影轨迹是否与视觉特征点运动一致。如果轨迹和图像内容有交错或者明显偏离说明外参旋转部分出了问题。第三在一个闭环系统里做一次短时融合看初始化是否快速收敛。第四把同一组数据重复标定两次对比结果的一致性。如果两次外参旋转差异超过零点几度说明数据质量不够稳定建议重新录制。这四个方法各有侧重残差看收敛、投影看几何、融合看整体、重复看稳定性。项目汇报或者写文档的时候把这四组数据都附上也能让结果更有说服力。4.4 标定现场容易忽略的硬件问题标定问题很多时候出在硬件本身。固定不当是最常见的相机和IMU之间只要有一点点松动外参就会随时间漂移标定时时而好时而坏。很多人把传感器用双面胶临时粘在一起做标定一次性实验也许没事但只要中间有过碰撞或震动位置就会变化必须重新标定。另一个容易忽略的是供电。IMU对供电电压很敏感电池电量和稳压模块状态不同零偏都会不一样。如果标定完的零偏值和之前差很多先检查供电而不是怀疑算法。温度也一样冷启动和热机状态下测出的零偏可能完全不同量产测试时需要做温度补偿。4.5 内参与外参标定的先后顺序最后再说一个比较容易被新手忽略的流程问题内参标定永远先于外参标定。这一点我踩过两次坑之后就再也没跳过顺序。内参不准时外参标定的激励数据本身就带着系统误差解出来的外参即使看起来收敛也会在局部补偿内参误差掩盖真实问题。所以标准流程是先做IMU静态多位置内参标定再做相机内参标定张正友法或者Kalibr的相机标定模块都可以最后才做相机-IMU联合外参标定。如果项目中还涉及LiDAR同理雷达自身的位姿估计质量也要先确认再进外参联合优化。这个顺序本质上是“先尽量把单一传感器洗白再谈传感器之间的对齐”。5. 写在最后的经验总结做标定这件事大部分时间不是在跑工具而是在伺候数据。录制环境、光照、标定板状态、时间戳对齐、激励形式每一项都直接影响最终精度。我现在的习惯是每次进场做新设备测试第一件事就是花半小时录制一组标准标定数据之后所有传感器实验都复用这套数据。这半小时投资换来的是后面调参时大量减少的返工时间。最后再分享一个小技巧标定这事别只做一次。传感器的零偏会随温度和供电电压漂移外参会因为机械结构的微小松动而变化。我一般会在每次实验前快速标定一次零偏每隔一段时间重新做一次完整的外参标定并且把历次标定结果记录成表格。你会发现设备状态的变化都藏在标定结果的时间序列里这比任何额外状态监测都直观得多。把标定当成一个持续的过程而不是一次性的仪式多传感器融合的稳定性才能真正立得住。