ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

IMU标定全解:内参标定与外参标定的原理、步骤和避坑指南

IMU标定全解:内参标定与外参标定的原理、步骤和避坑指南 先叠个甲下面说的都是我实际项目里反复折腾过的经验不是教科书搬运。做机器人定位导航或者自动驾驶感知的同学应该都有过这种经历一套VINS系统跑起来前端图像和IMU数据单独看都没问题但系统初始化一直失败或者跑不到两分钟轨迹就飘得没法看。排查来排查去最后发现是IMU标定没做好。这里的“标定”其实包含两种完全不同的工作一种叫内参标定是给IMU自身做体检把零偏、尺度误差、随机噪声这些出厂毛病尽可能去掉另一种叫外参标定是把IMU坐标系和相机、激光雷达坐标系对齐。两者解决的问题完全不同很多人混为一谈结果就是越调越乱。这篇就按我实际项目里的做法把这两种标定方式掰开揉碎讲清楚。1. 先分清两件事IMU内参标定和外参标定不是同一个活1.1 IMU原始数据为什么不能直接用先看一个很实际的问题为什么买回来的IMU不能直接拿来算姿态因为MEMS惯性器件是微机械结构加工时就有不对称半导体材料内部应力、封装焊接形变都会导致输出和真实物理量之间有偏差。以陀螺仪为例我们拿到的角速度测量值可以写成ω_measured S_g * M_g * ω_true b_g n_g其中S_g是尺度因子误差M_g是轴间非正交矩阵b_g是零偏n_g是噪声。加速度计也是同样的模型只是还要额外处理重力加速度的敏感方向问题。这四项误差如果不处理积分出来的角度和位置会非常快地发散。最典型的例子静止放置的IMU陀螺仪读数不是0而是某个偏移值这个偏移就是零偏它会在积分过程中不断累积导致姿态跑到不知道哪里去。所以内参标定要回答的核心问题是IMU读到的值距离真实物理量还差多少差多少就用模型参数补回来。1.2 内参和外参各自的“标定对象”直接用一个表说明白比绕来绕去讲概念清楚对比项内参标定外参标定标定对象IMU自身的误差参数IMU与其它传感器的相对位姿输入数据IMU静止/转台运动数据IMU相机图像或IMULiDAR点云输出结果bias、scale factor、Allan方差参数旋转矩阵R和平移向量t6DOF典型工具imu_utils、allan_variance_ros、商业转台Kalibr、lidar_imu_calib、手眼标定解决什么问题IMU读到的数据准不准多个传感器数据怎么放到同一坐标系内参标定只跟IMU自己有关外参标定必须要另一个传感器参与。实际工程里这两个环节是串联关系内参是基础内参不准确外参标定的时候IMU提供的约束就是错的标出来的外参也一定是错的。1.3 标定缺失时系统会怎么坏不标定系统不会直接报错而是以一种很隐蔽的方式坏掉。我在项目里见到的典型现象有三类第一VINS或LIO-SAM初始化阶段反复重启因为IMU零偏初值给得不对重力方向估计始终不收敛系统会直接拒绝初始化。这种情况在室内机器人上特别常见表现就是程序打印一行初始化失败然后一直卡着不动很多人会误以为是前端特征点太少。第二组合导航在静止时看起来没问题一旦运动起来航向角快速漂移这种通常是陀螺零偏不稳定性和尺度误差在作怪。静止时零偏可以用简单的均值估计补掉一部分但运动过程中温度变化和随机游走会让残余零偏持续累积。第三相机和IMU外参给得不对时视觉特征点的重投影误差会非常大回环检测也能跑但位姿图优化后的轨迹就是畸形的。最直观的表现是系统在直线前进时估计出来的轨迹带了个弯曲的弧度。所以在动手标定之前先判断是哪种“标定”没做好比闷头调参数重要得多。2. 方式一内参标定——从六面静止到Allan方差2.1 确定性误差建模bias、scale factor、misalignment内参标定分成两块确定性误差和随机误差。确定性误差是指可以建模、可以补偿的那部分主要包括三个零偏bias静止时传感器输出不为零的偏移值。分常值零偏和温度相关零偏常值零偏可以在上电启动时估计温度相关零偏需要温补实验。尺度因子scale factor实际输出与理想输出的比例误差比如陀螺仪实际转1 rad/s输出却是1.002 rad/s。轴间误差misalignment三个敏感轴不严格正交相互之间有微小的夹角。安装、封装、制造都会带来这个误差。建模时一般把尺度因子和轴间误差合成一个矩阵再叠加零偏和噪声。加速度计的确定性误差标定比陀螺仪好做因为有重力这个天然的标准输入所以六面静止法在工程上很常用。2.2 六面静止法只用重力就能完成的零偏和尺度标定六面静止法的原理很简单静止时加速度计只感受重力把IMU的每个轴分别朝上和朝下放置就能解出零偏和尺度因子。以x轴为例朝上放置时a_x_up s_x * g b_x朝下放置时a_x_down s_x * (-g) b_x两个式子相加零偏就出来了b_x (a_x_up a_x_down) / 2两个式子相减尺度因子就出来了s_x (a_x_up - a_x_down) / (2g)实际操作时每个方向静止采集30到60秒取平均值代入计算。六个方向就是±x、±y、±z各一次。这个方法标加速度计的零偏和尺度因子非常实用不需要转台一个水平台面就够了。我自己的习惯是每个位置至少采1分钟而且中间人为干扰越少越好。有人在旁边走动、桌面轻微晃动都会让均值产生小偏差。别小看这点偏差加速度计尺度误差1e-3在积分10秒后位置误差可能就到了厘米级。轴间误差如果想标得更细可以把六面法扩展成多位置法比如12位置、24位置让重力在每个轴上的投影覆盖更多方向然后做最小二乘拟合。但多数机器人项目里六面法已经够用。2.3 速率法转台上的陀螺仪标定加速度计有重力当参考陀螺仪没有同样的天然参考。静止时陀螺仪的输出平均值可以直接当作零偏但要标定尺度因子和轴间误差就得给它一个已知的角速度这就是速率法。速率法需要转台转台给一个精确的角速度比如10 deg/s让IMU绕某一个轴旋转然后看陀螺仪实际输出是多少。输出与真实值的比值就是尺度因子绕不同轴转还能算出轴间误差。没有转台怎么办我见过一些团队用手动旋转来近似但只能得到零偏级别的结果尺度因子完全不可靠。如果项目里用的IMU是消费级MEMS上电零偏不稳定才是主要误差源尺度因子通常已经由出厂校准做掉了不做速率法也能跑但如果是光纤陀螺或战术级IMU速率法基本是必须的这类器件对尺度因子的要求高得多。2.4 用Allan方差拆解随机误差确定性误差标完之后还剩随机误差。随机误差不能用简单的加减乘除补偿但可以用Allan方差分析出它的统计特性。Allan方差的做法是让IMU静止采集一段长时间数据然后把数据按不同的聚类时间分成若干段求每段的均值再求这些均值之间的方差。不同误差源在Allan方差曲线上有不同斜率的特征段误差源Allan方差曲线特征量化噪声斜率 -1角度/速度随机游走斜率 -1/2零偏不稳定性斜率 0曲线最低点速率随机游走斜率 1/2速率斜坡斜率 1实际工程里最关心的是两个参数角度随机游走ARW和零偏不稳定性bias instability。角度随机游走对应积分误差里的白噪声部分零偏不稳定性对应低频漂移部分。这两个参数会直接喂给VINS、LIO-SAM这类系统的IMU噪声配置文件。采集数据时有个硬性要求静止时间要足够长建议至少2小时。时间太短的话Allan方差曲线在长聚类时间段的段是空的零偏不稳定性根本读不出来。我见过有人只采了10分钟数据就跑去算Allan方差出来的参数只能当笑话看。2.5 内参标定的实操步骤和我的检查清单用imu_utils做一次完整内参标定的流程大概是把IMU固定在水平台上确保静止记录IMU话题数据采集2小时以上rosbag保存。确保IMU的采样频率稳定最好是100Hz以上频率不稳会直接影响Allan方差结果。启动imu_utils读取bag里的IMU数据自动做Allan方差分析输出yaml格式的结果文件。检查输出参数的量级是否合理。消费级MEMS陀螺仪的ARW一般在0.01到0.1 deg/sqrt(h)零偏不稳定性在1到10 deg/h这个范围。如果数量级差得很远大概率是数据采集有问题。把yaml结果里的参数填到VINS、LIO-SAM的配置文件里注意单位和工具输出单位是否一致。我的检查清单里有一条很关键标定完之后把IMU静置在桌上再采30秒数据用标定后的参数重新积分姿态理论上姿态应该基本不动。如果静置情况下积分姿态还在漂说明Allan方差参数没填对或者确定性误差没标干净。3. 方式二外参标定——Kalibr和LiDAR联合标定的完整思路3.1 外参标定到底在求什么外参标定求的是IMU坐标系和另一个传感器坐标系之间的相对变换包含旋转矩阵R和平移向量t一共6个自由度。写出来就是p_imu R_ic * p_cam t_ic或者反过来写取决于你用的定义。这套变换的意义是当相机观测到一个特征点时系统需要知道这个特征点在IMU坐标系下的位置否则IMU预积分和视觉观测就对应不上。外参标定在SLAM系统里为什么重要因为几乎所有基于优化紧耦合的框架都会把外参作为优化变量或者至少作为固定约束。外参给错了IMU预测的残差和视觉重投影残差会互相打架优化器为了同时满足两边的约束只能把轨迹估计成妥协后的畸形解。这也是为什么外参标定不做好系统就是跑不对。3.2 Kalibr相机-IMU联合标定的完整流程Kalibr是苏黎世理工开源的工具做相机-IMU联合标定应该是目前社区里最常用的。完整的标定流程分两步第一步先单独标定相机内参。用kalibr_calibrate_cameras处理标定板图像得到相机内参和畸变系数。这一步之所以要先做是因为相机内参本身就是图像观测的模型内参错了后面IMU和图像的对齐全部会偏。第二步做相机-IMU联合标定。用kalibr_calibrate_imu_camera输入相机内参文件、标定板配置、IMU参数配置、采集好的rosbag输出就是IMU到相机的变换关系以及时间延迟。运动激励是决定成败的关键。这一点我必须强调采集数据时一定要让设备做充分的旋转运动而且旋转方向要覆盖各个轴绕同一个方向转圈是不行的。因为外参标定的本质是通过角速度约束来估计旋转如果角速度激励不充分旋转部分的可观性就不够标定结果会严重退化。业界公认的准则是慢速但充分的6自由度激励包含俯仰、横滚、偏航方向的旋转和随机平移整个过程持续2到5分钟。标定板也要注意推荐用AprilGrid而不是普通棋盘格因为棋盘格在运动模糊下角点检测容易丢AprilGrid对遮挡和模糊的鲁棒性好很多。3.3 LiDAR-IMU标定平面约束与手眼标定LiDAR-IMU标定和相机-IMU标定思路不太一样。相机给的是图像角点LiDAR给的是3D点云最常用的方法是利用环境中的平面特征基于平面法向量的一致性来做约束。核心思想是在标定的瞬间IMU测量的重力方向、LiDAR观测到的平面法向量方向经过外参变换后应该是对齐的。通过多帧点云拟合出平面再配合IMU的姿态积分构建非线性优化问题解出R和t。HKUST开源的lidar_imu_calib就是走这条路子。另一种常见思路是把问题转化为手眼标定形式是AXXB。A是IMU的姿态变化B是LiDAR里程计的姿态变化X就是待求的外参。这个思路的优点是算法成熟但在LiDAR里程计本身有漂移的情况下结果会受影响所以实际项目里我更偏向基于平面约束的联合优化方法。采集LiDAR-IMU标定数据时对环境有一个隐藏要求最好找室内有丰富平面结构的场景墙、地板、桌面、门都要有而且分布要均匀。全是空旷室外的话平面约束方向单一外参某些分量会标不出来。3.4 “IMU和图像里程计对应”的隐藏坑时间同步热词里提到的“IMU和图像里程对应”其实就是IMU预积分和视觉里程计的对应关系这背后藏着一个比外参更容易被忽略的坑时间同步。外参标定输出的R和t是空间变换但IMU和相机的时间戳如果不一致空间标得再准也没用。我遇到过的情况是相机曝光时间戳和IMU时间戳相差20毫秒外参标定出来的旋转在视觉上是对的但一旦车辆开始颠簸估计轨迹就出现周期性抖动。排查到最后发现单纯是时间戳没对齐。用Kalibr标定时它本身会估计一个时间延迟参数但这个延迟是在数据采集时的固定延迟。如果后续系统里的时间同步机制变了这个参数就得重新估。所以在工程项目里我建议把时间同步作为外参标定的一部分先用工具估计一次延迟再在系统里去对应修正。4. 两种标定方式如何选场景、信号判断与结果验证4.1 什么条件下必须做内参标定不是所有项目拿到IMU都需要先做完整内参标定。但下面几种情况我强烈建议做换了一批新的IMU模组或者第一次用某个型号的IMU厂家没给标定文件。这种时候Allan方差参数真的是睁开眼抓瞎。IMU工作环境的温度变化很大。MEMS零偏对温度非常敏感如果设备从室内到室外、冬天到夏天零偏很可能已经漂了。系统初始化频繁失败。初始化阶段要估计重力方向和biasbias初值不准会让整个优化掉进局部极小值。反过来如果用的是已经经过出厂标定的工业级IMU而且工作环境温度稳定可以只做一次Allan方差分析把随机误差参数拿到确定性误差直接沿用出厂值就行。4.2 什么条件下必须做外参标定外参标定的触发条件非常明确只要IMU和另一个传感器之间的相对位置发生了变化就必须重新标定。常见场景包括传感器集成板重新打了样IMU和相机的位置跟上一版不一样。设备经过跌落、重装就算看起来没动也要怀疑机械位置已经变了。多传感器融合系统里轮式里程计、相机、LiDAR、IMU同时存在每个传感器之间都需要外参。这里有个容易被忽视的点外参标定不是一次性工作。设备使用几个月后结构件可能发生微小变形受热后热膨胀系数不同的材料之间也会有相对位移。高精度场景下定期重新标定外参是很有必要的。4.3 标定结果的质量怎么验证标定完不能直接上系统先看几个指标内参方面主要看Allan方差曲线是否在长聚类时间出现明显的平坦区平坦区对应的纵坐标就是零偏不稳定性。如果曲线一直下降或者一直上升说明数据里混入了趋势项比如IMU在采集过程中慢慢变热、平台有低频振动这批数据要重采。外参方面相机-IMU联合标定完成后Kalibr会给一个重投影残差统计。残差均值越小越好一般控制在1个像素以内可以接受。如果残差达到几个像素优先怀疑标定板不平整、运动激励不足或者相机内参没标好。LiDAR-IMU标定完成后可以做一个简单的闭环验证把LiDAR点云通过外参投影到IMU坐标系再叠加IMU姿态轨迹看点云中的平面是否对齐。如果平面错开说明外参的旋转分量有问题如果平移错开说明平移分量有问题。5. 我在标定项目里踩过的坑和一直保留的检查习惯5.1 内参标定配置和代码里的参数单位不一致这是我踩得最痛的一坑。imu_utils输出的角度随机游走单位是deg/sqrt(h)但VINS-Mono里配置文件的单位是rad/sqrt(s)两者差了一个换算系数。直接抄过去初始化和精度全崩。换算关系是1 deg/sqrt(h) ≈ 0.0000481 rad/sqrt(s)。现在我会在每次改配置前先把单位换算写在注释里防止下次又忘。5.2 外参标定方向搞反Kalibr输出的变换是T_imu_cam还是T_cam_imu不同版本、不同教程说法不一致而且代码里经常有人再用旋转矩阵转欧拉角的步骤里把顺序搞反。我在一个项目里就因为这个外参看起来每个数值都对但系统跑起来轨迹是倒着歪的。后来形成的习惯是拿到标定文件后不直接写入系统先用一段测试数据做变换可视化把IMU坐标系、相机坐标系用坐标轴画出来看它们是不是符合实际安装位置。坐标系画出来之后方向对不对一目了然这种验证比对着矩阵发呆靠谱得多。5.3 标定板纸张不平整用普通打印纸贴标定板贴在硬纸板上还稍微卷边Kalibr角点检测能检测到但标定出来的相机内参会有肉眼看不出来的畸变误差。后来换成铝板背胶的标定板同样的流程重投影误差直接降了一个量级。标定耗材该花的钱确实不能省。5.4 静止采集时桌面在振动有一段时间内参标定结果死活不对Allan方差曲线在短时间部分异常陡峭后来才发现是IMU放在办公桌上而桌面下方就是空调风机低频振动一直存在。从那以后我采内参数据时都会把IMU放到大理石板或者水泥地面上并且关闭附近的大功率设备。5.5 我现在保留的标定检查习惯每次拿到新传感器组合我都会把标定拆成强制三步内参基础检查静止采30分钟数据跑一遍快速Allan方差确认ARW和零偏不稳定性在合理范围内。外参标定后可视化验证坐标系、点云投影、重投影残差全过一遍。端到端验证让设备做一组已知运动比如沿着直线匀速走10米看融合轨迹的终点误差是否在预期范围内。标定这件事技术难度谈不上高真正难的是把每一步的误差源控制住。我见过太多项目因为标定细节疏忽在后续调试上浪费几周时间。把上面的检查流程当成标准动作能省下大量自己都不知道去哪了的排查时间。
返回列表