ARTICLE DETAIL

资讯详情

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

IMU标定方式全解析:从内参标定到相机/雷达联合标定

IMU标定方式全解析:从内参标定到相机/雷达联合标定 去年有段时间我在调一套室内移动机器人的融合定位传感器在桌面上放着一动不动算法输出的偏航角却在一分钟里悄悄漂了接近两度。排查了快一周最后发现罪魁祸首根本不是滤波器参数而是IMU标定方式出了问题——陀螺仪零偏还在沿用出厂标称值。那次之后我把整个imu标定方式梳理了一遍到底要标什么、能用哪几种手段、每一步做完怎么验收。这篇文章就把我在真实项目里积累的这套理解完整写出来也结合了大家在后台常问的雷达IMU标定、相机IMU联合标定、IMU内参标定这些具体场景。先把口径统一了。标题里说的二种很大不是指两个具体仪器而是按问题域一刀切的两大类一类是给IMU自己标也就是内参标定解决加速度计和陀螺仪自己测得准不准的问题另一类是给IMU和其他传感器标也就是外参标定解决IMU坐标系和相机、激光雷达坐标系之间怎么对齐的问题。这二者看起来都是标定但数据采集方式、工具链、验收标准完全不同混在一起谈最容易把人绕晕。1. IMU标定到底在标什么先把误差拆开再谈方式1.1 零偏为什么静止的设备还会飘加速度计和陀螺仪的原始输出本质上不是直接就能用的理想值。最典型的一个误差就是零偏bias。把IMU放在桌上完全不动理想情况下加速度计应该输出0陀螺仪也应该输出0但实际硬件会输出一个非零的恒定小量。这个量就是零偏它由MEMS器件本身的机械残余应力、电路偏置、封装应力共同造成。零偏的危害有多大算一笔账就清楚了。假设加速度计零偏为0.01g那就是约0.098 m/s²的恒定加速度误差。对加速度积分10秒速度误差就是0.98 m/s再积分一次位置误差可以达到4.9米。放在融合定位系统里相当于载体一直以为自己在朝某个方向加速。陀螺仪零偏同样恐怖一个0.03 deg/s的零偏积分60秒就是接近1.8度的姿态漂移这在视觉惯性里程计里足以让相机约束和IMU预测产生明显矛盾。1.2 比例因子与轴间耦合运动越剧烈错得越离谱除了零偏IMU还有比例因子误差。简单说真实输入1g的加速度输出可能只有0.99g这个0.01的比例偏差就是scale factor误差。单独看数值不大但在载体做大机动、持续加减速时误差随输入量级线性放大往往比零偏还难处理。更隐蔽的是轴间耦合误差也叫交轴误差或者安装误差。MEMS传感器在硅片上贴装时三个轴不可能做到绝对正交封装也会带来微小倾斜。结果就是一个轴方向有加速度时其他轴也会感应到一点分量。这类误差在低动态场景下几乎感受不到但一旦机器人做大角度旋转、扫地机急转弯、无人机做姿态机动轴间串扰就会把轨迹算歪。1.3 坐标系外参IMU和相机/雷达之间的公转私关系内参解决的是传感器自己的世界观外参解决的是传感器坐标系之间的交通规则。IMU有一个本体坐标系相机有相机坐标系激光雷达有雷达坐标系它们在物理上不重合存在一个刚体变换关系一个旋转矩阵R加上一个平移向量t统称外参。SLAM系统要融合视觉和惯性数据就必须先把IMU的加速度、角速度变换到相机坐标系下或者反过来把视觉位姿变换到IMU坐标系里。外参标定是第二种方式的核心它和内参标定有个根本区别内参可以单独对着转台或者重力方向标外参必须多传感器同时采集、联合优化因为你要解的是两个传感器坐标系之间的关系缺了任何一边的数据都没法算。2. 第一种方式内参标定——先让IMU把自己量准2.1 转台标定六位置法加多速率法精度的天花板工业界做IMU内参标定最标准的设备是高精度转台。原理其实不复杂用一个简化模型来表示加速度计输出a_m (I K_a) * a_t b_a n_a w_m (I K_g) * w_t b_g n_g其中a_t、w_t是真实的加速度和角速度b是零偏K矩阵里同时包含比例因子误差和轴间耦合误差。标定的本质就是找到K和b让模型在已知输入下预测输出与实测输出最一致。加速度计标定最经典的是六位置法。把IMU固定在一个正交夹具上依次让X、-X、Y、-Y、Z、-Z轴朝向重力方向每个姿态静止采集30到60秒取平均值。因为重力加速度的数值已知是1g方向上每个姿态都有一个理论输入六个姿态凑出足够多的方程联立最小二乘就能解出加速度计的零偏、比例因子和交轴耦合参数。陀螺仪标定靠的是速率法。转台提供精确已知的角速度比如对每个轴做±50、±100、±200 deg/s的正转反转记录陀螺仪输出均值从输入输出关系里拟合出比例因子和轴间耦合。注意转台的精度必须比IMU高一个数量级否则标定误差会被设备本身污染。工业量产时通常把IMU固定在温箱里的转台上从-40°C到85°C扫多个温度点每个温度点都做一次六位置加速率标定最后拟合成温度补偿曲线。2.2 Allan方差分析不依赖转台也能摸清噪声底转台标定解决的是确定性误差也就是不随时间变化的零偏和比例因子。但IMU还有一个维度必须标就是随机噪声特性。这个用Allan方差分析来做。原理也不难理解找一块绝对静止的台面让IMU以原始采样率连续采集好几个小时然后把数据按不同的积分时间分成一段一段统计每段均值之间的方差。以积分时间τ为横轴、Allan方差为纵轴画双对数曲线能清晰地分解出几类噪声小τ段斜率约-1/2的线段对应角度随机游走ARW或速度随机游走VRW中τ段曲线最低点的水平段对应零偏不稳定性bias instability大τ段斜率1/2甚至1的线段对应速率随机游走和速率斜坡。这些参数意义很大。工程上给EKF或者优化器设置过程噪声矩阵Q时初值不是拍脑袋定的就是用Allan方差结果换算过来的。同时它也是传感器选型时横向对比不同型号IMU的核心指标。常用工具有kalibr_allan、ROS生态里的imu_utils核心计算逻辑用几十行代码就能写出来def allan_variance(data, fs): N len(data) tau0 1.0 / fs taus [] vars_ [] for k in range(1, 12): m 2 ** k if m N // 2: break ref N // m clusters data[:ref * m].reshape(ref, m).mean(axis1) vars_.append(0.5 * np.mean((clusters[1:] - clusters[:-1]) ** 2)) taus.append(m * tau0) return taus, vars_注意Allan方差本身不能校准零偏和比例因子它只是把随机噪声底测出来。严格说它和转台标定是互补关系转台标出确定性参数的期望值Allan方差标出随机噪声的方差特性。两者共同构成完整的IMU内参标定。2.3 静态六面标定低成本快速估出初值很多小型团队和开发阶段的个人项目没有转台但也不想跳过内参标定这时候可以用静态六面法做低成本替代。思路是把重力方向当基准IMU某个轴朝上时理论比力就是1g朝下就是-1g。把六个方向各采集30到60秒取均值同样能联立方程组解出加速度计的bias、scale和交轴项。操作上需要一块比较平整的台面和一个正交夹具3D打印一个L型夹具就能用。陀螺仪这部分稍微弱一些静态法只能给出三个轴的零偏因为静止时没有已知角速度作为基准陀螺仪的比例因子和交轴误差在这个方案里不可观测。至于地球自转15度/小时这个量级对消费级MEMS来说早就淹没在噪声里了不要指望静态法能利用它。六面法标不出陀螺仪scale和misalignment意味着高动态场景下依旧可能出问题。但作为开发初期的粗略内参已经很值了十分钟采集加一堆脚本就能拿到一组不差的结果。2.4 三种内参手段怎么选一张表说清楚标定方案设备需求能标定参数精度等级时间成本适用场景转台温箱高精度转台、温箱零偏、比例因子、交轴误差、温漂曲线最高数小时到数天出厂、量产、高精度平台Allan方差隔振台面长时间静止ARW/VRW、bias instability等噪声参数高针对噪声2-8小时以上传感器选型、滤波器噪声初始化静态六面法水平台面、正交夹具加速度计bias/scale/misalign、陀螺bias中等1-2小时开发阶段快速验证、低成本平台实际项目里我通常用Allan方差加静态六面法先打底量产或者对精度要求高的场景再上转台温箱。别指望一个方案解决所有问题。3. 第二种方式外参标定——让IMU与其他传感器对齐坐标系3.1 kalibr相机-IMU联合标定视觉方案的首选提到相机和IMU联合标定kalibr几乎是绕不开的工具。它的思路是把相机的视觉位姿和IMU的角速度、加速度统一放进一个因子图里用B样条参数化运动轨迹同时优化相机-IMU外参、IMU内参、时间偏移以及重力方向。用kalibr之前要做三件事。第一相机内参单独标好生成camchain文件第二用Allan方差分析的结果生成imu.yaml里面要填陀螺仪和加速度计的噪声密度以及随机游走参数第三打印一块AprilGrid标定板贴在完全平整的刚性板上。采集数据是关键。灯光要足但不能过曝标定板尽量充满视野运动时要乱来——旋转、俯仰、滚转、平移交替进行让六个自由度都被充分激励不要一直匀速更不要长时间静止。录3到5分钟一般就够。时间同步尽量做好kalibr虽然能估计一个恒定的时间偏移但如果采集时时间戳抖动很大数据基本就废了。运行命令大致是kalibr_calibrate_imu_camera --target aprilgrid.yaml --cam camchain.yaml --imu imu.yaml --bag dataset.bag输出结果里重点看两个东西优化残差和参数方差。如果外参保数方差偏大基本可以断定采集的运动激励不足或者标定板观测质量差重新录数据比手动改参数靠谱。多说一句kalibr对Ubuntu各种版本的依赖兼容性并不完美环境配置属于经典老坑装的时候尽量别把全局Python环境搞乱。3.2 lidar-imu标定点云稀疏时的外参求解思路雷达IMU标定比相机IMU更麻烦。相机有标定板特征丰富、约束强雷达点云在室内环境里通常只有墙面、柱子和地面没有明显纹理直接套kalibr那套视觉方案不现实。相对主流的做法是让雷达扫描环境中显著的几何特征点云配准提供位姿约束IMU预积分提供相对运动约束两块误差一起联合优化。具体流程里有个很实用的粗对齐技巧先利用重力方向把IMU的姿态和雷达点云里的竖直结构对齐得到一个粗略的旋转外参在这个初值的基础上再做细粒度优化能显著降低陷入局部极值的概率。开源工具里已经有相对成熟的项目不再需要自己从头写优化器。我实际用下来的经验是选择标定场地时尽量找几何特征丰富、结构不过分对称的空间比如有角点、有明显墙角的房间避免长长的走廊或者大空地采集时让设备在场地里走S形路径涵盖旋转和平移保证旋转和平移自由度都被激发到。还有一个指标值得注意旋转外参的可观测性通常优于平移外参。纯旋转运动对平移外参的激励不足这是数学上的可观测性问题单纯延长采集时间解决不了必须配合明显的平移运动。如果看到平移参数方差很大先检查采集路径里有没有足够的直线位移。3.3 IMU与图像里程计的对应VIO里的外参角色有朋友在后台问imu和图像里程对应是什么意思这个词组其实揭示的是视觉惯性里程计VIO工作的核心图像特征点给出相机的运动轨迹IMU预积分给出自身的体运动两者要比较、融合就必须先把IMU的测量值通过外参变换到相机坐标系下同时还要对齐时间戳。拿VINS-Mono这类系统举例系统初始化阶段会联合估计重力方向、速度偏置和陀螺零偏外参此时是已知量。如果外参给错了视觉约束和惯性约束在状态更新时互相打架轻则VIO的轨迹周期性变小、变弯重则初始化直接失败。这也是为什么我一直建议新平台启动SLAM之前先花一天时间老老实实把外参标了而不是急着去调算法参数。3.4 时间戳同步外参标定里最容易翻车的变量外参标定有个经常被忽略的隐藏变量时间戳。IMU的消息和相机图像、雷达点云如果时间戳没对齐外参优化时就会用一个随时间变化的空间变换去拟合一个恒定外参结果自然是一团糟。某个层面上kalibr这类工具能估计恒定的时间偏移但时间戳如果抖动剧烈或者存在非线性漂移任何工具都补不回来。硬件上尽量用触发线或者高精度时间同步协议至少也要保证各传感器共享同一个时钟源。实践里我习惯先把录制好的bag里各传感器时间戳差值画出来看一眼如果是一条稳定直线说明同步做得好再跑标定。4. 标定完怎么验收量化指标与快速检测逻辑4.1 内参验收静止测试和Allan曲线复核标定完不是把参数写进yaml就完事了。内参这块我做三个检测。第一个是静止测试。把IMU放在隔振台上静止一小时记录输出看看零偏残差是否落在标定前量级附近标准差是否健康。如果残差远超一个数量级说明要么标定流程有误要么传感器有温度漂移。第二个是积分漂移测试。静止时对陀螺仪积分一分钟姿态角应该保持在很小的误差范围对加速度计积分后模长应该稳定在1g附近。这一步能直观量化标定效果。第三个是Allan曲线复核。对刚标定完的数据重新做Allan方差观察bias instability和ARW/VRW是否在合理范围。如果曲线形态异常比如大τ段斜率不对先怀疑采集过程有没有人员走动、空调吹风、桌面微振再怀疑IMU本身是否已经损坏。4.2 外参验收方差、残差、多次标定的一致性外参验收比内参更看重复性。同一个传感器组合间隔半天、在相同场地分别录两次数据各自跑标定得到的旋转和平移外参应该收敛在一个小范围里。如果两次外参差异大大概率是某次采集的激励程度不够。其次看标定器输出的方差。kalibr这类工具会给每个优化变量一个方差估计旋转外参的方差量级到1e-4 rad²以下、平移外参方差在1e-4 m²量级附近大体算健康。不过这只是一个参考下限不同场景、不同传感器精度会差很多重要的是差异不要夸张。最硬核的验收是把标定后的外参喂给VIO或SLAM跑一遍观察初始化是否顺利、轨迹有没有明显的系统性收缩或发散、回环误差是否在可接受范围。这一步是最直接的实战测试比任何指标都更能说明问题。4.3 5分钟快速IMU检测逻辑问题设备一眼看穿标定参数可能因为老化、温度变化而失效所以我建议在系统里常驻一套快速检测逻辑本质就是给IMU做一个健康检查。伪代码如下1. 静止3秒 - 加速度计模长与9.8偏差超过阈值 - 加速度计bias异常 - 陀螺仪输出均方根超过阈值 - 陀螺仪bias异常或存在强振动 2. 绕某轴旋转180度 - 积分角度与180度比较误差超过阈值 - scale或bias异常 3. 回到初始姿态 - 积分角度应回零残差过大 - 噪声或温度漂移过大这套逻辑可以直接做成一个节点每次上电先跑一遍异常就报警避免拿着一份已经失灵的标定参数跑整个任务。我踩过最深的一次坑就是IMU受温度影响零偏翻倍系统居然还能工作只是精度掉一半肉眼根本看不出来后来靠这套检测逻辑一眼就定位了。5. 实操中的坑与经验补充5.1 你以为的静止其实在微颤Allan方差分析和静态六面标定都要求绝对静止但现实不是这样。桌面上放着楼上有人走动、空调气流吹过、大楼本身在低频微振这些干扰都会被IMU记录下来。最明显的一次是我在办公楼里录了两小时静止数据Allan曲线在小τ段怎么都对不上后来挪到地下车库的隔振台数据一下就干净了。采集环境越安静越好最好选夜间、关掉空调、放在厚重的石头台面上。5.2 温度漂移标定时与运行时差一个温度等于白标MEMS IMU对温度极其敏感前面已经反复提到。开发环境25°C标定完机器夏天在40°C的室外跑零偏漂出去几倍完全正常。所以标定过程尽量覆盖实际工作温度量产阶段必须有温箱加转台的组合把bias和scale拟合为温度函数。开发阶段即使没有温箱也要至少保证标定环境温度和运行时不要差太多。5.3 开发阶段可以简化但别直接跳过内参有些做SLAM的朋友觉得反正滤波器里bias是状态量会被在线估计干脆跳过内参标定拿着出厂手册的参数就开始跑。短时间低速运动确实看不出问题但高动态下比例因子和交轴误差在线估计根本纠正不过来系统会表现出一种看起来稳定但就是不准的玄学状态。花一到两小时做一次静态六面加Allan方差后面能省下大量排查问题的时间。5.4 在线标定能取代离线标定吗我的看法现在很多紧耦合系统已经支持在线估计外参状态向量里带上外参和它的速度项运行中持续修正。这确实是个趋势尤其是长时间运行的设备外参会因为机械形变、热胀冷缩慢慢漂移在线标定能兜底。但它替代不了离线标定的角色因为没有可靠的初始外参在线优化很容易落入局部极小值尤其是旋转外参的初值偏差超过十几度时基本就拉不回来了。我的建议是离线标定负责开机即正确在线标定负责运行中不跑偏。两者做好分工系统才是稳健的。最后再分享一点个人经验。我现在拿到一套新传感器标准流程基本固定先上电烤半小时让温度稳定做Allan方差用静态六面法粗标bias接着按采集规范录数据用kalibr或者雷达标定工具求外参最后录一段验证路径跑一遍标定结果评审。整套流程一天能走完但对于刚入门的团队来说第一次踩坑可能就要花掉半个月。希望这篇能把那半个月帮你省下来。
返回列表