ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

IMU标定全解析:内参与外参的工程实践指南

IMU标定全解析:内参与外参的工程实践指南 很多人拿到IMU的第一反应是直接开始写姿态解算或者把数据喂给VIO/LIO系统。但用不了多久就会发现问题零偏随时间飘得离谱、加速度计读数跟实际重力方向对不上、融合出来的姿态在静止时都在缓慢旋转。这些问题大概率不是算法问题而是没做标定或者标定方式没选对。IMU标定这件事业内聊得很多但大部分资料偏重堆公式真正讲清楚“我到底该用哪种方式、每种方式解决什么问题”的不多。这篇文章我想把两种最常用的标定路径掰开揉碎讲一遍。一条是内参标定解决IMU自身精度问题另一条是外参标定解决IMU与其他传感器相机、激光雷达的坐标系对齐问题。两条路径的目的大不相同工具链和验收标准也完全不同很多新手在这上面栽跟头就是因为把两者混为一谈。这篇内容适合谁准备做SLAM、VIO、组合导航或者任何涉及IMU的多传感器融合项目的人不管你是学生还是刚入职的工程师都应该花点时间把这两种标定方式的逻辑彻底搞通。我会用实际工程中的数据和踩坑经历来讲而不是停留在理论层面。1. 为什么要标定IMU的误差从哪来在进入具体标定流程之前得先把IMU误差模型讲清楚。很多人在这一步跳过了导致后续看标定结果时一头雾水。1.1 确定性误差与随机误差的区分IMU的误差可以分为两大类确定性误差和随机误差。这个区分非常关键因为它们用完全不同的方法处理。确定性误差说白了就是“每次上电都在那儿、你可以预先测出来并补偿掉”的误差。主要包括三样东西零偏Bias静止时陀螺仪和加速度计理论上应该输出0和重力加速度但实际上会有固定偏移。这个偏移就是零偏单位通常是°/h陀螺和mg加速度计。尺度因子误差Scale Error理论上输入1°/s的角速度输出应该是1°/s但实际可能是1.002°/s。这个0.2%的比例偏差就是尺度因子误差。轴偏差MisalignmentIMU内部的三轴加速度计和陀螺仪理论上应该完美正交但制造工艺做不到X轴可能跟理想X轴偏了0.1度这种轴向不正交就是轴偏差。随机误差则是无法通过预先测量来完全消除的它随时间变化、随温度漂移。常见的有零偏不稳定性Bias Instability零偏不是固定值而是在某个范围内随机游走。这是IMU等级的重要指标。角度随机游走/速度随机游走Angle/Velocity Random Walk输出中的白噪声积分后导致的随机漂移Square root of PSD是衡量指标。有人会问既然随机误差没法完全消除那标定的意义在哪答案是标定能尽可能减小确定性误差并量化随机误差的边界。确定性误差补偿掉之后留在系统里的就是随机噪声而随机噪声的强度决定了你的系统在无外部修正的情况下能“撑”多久。1.2 为什么不能直接相信IMU芯片手册上的出厂参数市面上绝大多数IMU芯片出厂时是有一份校准参数的比如MPU6050、BMI088甚至更高端的ICM-20602。但如果你直接拿这些出厂参数去用在稍微要求精度一点的系统里基本会翻车。原因主要有三个第一出厂校准是在特定温度、特定电压下做的。你在实际板上用3.3V供电环境温度从开机时的25度升到运行稳定后的50度零偏和尺度因子都会变化。这种变化量便宜的MEMS IMU可能达到甚至超过出厂参数的残余误差。第二芯片焊接过程中的应力会改变内部机械结构。回流焊的高温会让MEMS传感器的内部支架产生微小的形变或应力残留从而影响零偏。这也是为什么同一批次的芯片在不同板卡上表现可能差异很大。第三芯片之间的离散性很大。出厂参数是“统计平均意义上的”你的这颗芯片恰好落在分布边缘误差可能是标称值的两到三倍。所以靠谱的做法是把你的IMU焊到板子上之后用你自己的供电、在你的工作环境温度下重新标定一遍。这一点怎么强调都不过分。1.3 两种标定方式面向的目标不同现在可以明确地讲两种标定方式分别解决什么问题了。内参标定有的地方叫“单目标定”或者“自标定”目标是让IMU的输出尽量逼近真实物理量。标定参数是零偏、尺度因子、轴偏差以及Allan方差分析得到的随机误差系数。内参标定不需要其他传感器配合你只需要让IMU做特定动作比如静止、翻转等。外参标定目标是确定IMU坐标系与另一个传感器坐标系相机、激光雷达之间的相对位姿变换包括旋转矩阵和平移向量。有了这个变换多传感器数据才能统一到同一个坐标系下进行融合。打个比方内参标定是“打磨尺子本身”让它测量更准外参标定是“确定两把尺子的刻度对齐关系”让它们测同一段距离时能对得上。这两个问题不解决后面所有算法都是空中楼阁。2. 内参标定从静止采样到Allan方差的完整链路内参标定在工程中最常见的做法是两步走第一步用多位置静止法估计确定性误差零偏、尺度因子、轴偏差第二步用长时间静止数据做Allan方差分析量化随机误差。我先说工具选型再讲具体步骤。2.1 工具选型imu_utils与Kalibr的适用边界提到内参标定开源社区最常用的有imu_utils、imu_tk还有Kalibr中的imu-camera标定里顺带做的IMU内参估计。这几个工具各有侧重。imu_utils是港科大秦通等人开源的工具基于Allan方差分析能估计陀螺和加速度计的随机误差系数包括角度随机游走、零偏不稳定性、速率随机游走等。它的输入是静止状态下IMU的长时间数据一般至少1到2小时配合rosbag录制。imu_utils在估计随机误差方面是社区标准之一。imu_tk是La Sapienza大学开源的工具用多位置法标定确定性误差可以估计零偏、尺度因子、轴偏差。它的操作比较直观采集数据时手持IMU做特定姿态算法自动优化。我的经验是两者结合使用。用imu_tk类的多位置法标定确定性误差用imu_utils类的方法做Allan方差分析。如果有ROS环境这两个工具的安装和使用都比较成熟。Kalibr虽然也内置了IMU内参标定功能但它主要是为外参标定服务的单独做内参标定不是它的强项。2.2 多位置静止法标定确定性误差实操步骤多位置静止法的原理不复杂加速度计静止时测量的就是重力加速度已知重力矢量的模长是g方向指向地心在IMU坐标系下变换通过让IMU处于多个不同姿态可以建立足够的方程来解决零偏、尺度因子和轴偏差。以imu_tk为例采集数据的基本要求是IMU固定在一个不会移动的平台上最好用夹具或三脚架。每个静止位置停留至少20到30秒保证噪声能平均掉。采集至少6到9个不同姿态最好覆盖X/Y/Z轴分别朝上和朝下的情况也就是“六面法”的扩展版。动作转换过程要平缓避免引入大的冲击。姿态设计很关键。最简单的一套是“六面法”IMU的X轴朝上、X轴朝下、Y轴朝上、Y轴朝下、Z轴朝上、Z轴朝下各停一次。这样做能让每个轴都能充分感受到正负1g的重力加速度有助于解耦零偏和尺度因子。我在实际项目中一般会再多加几个倾斜姿态比如45度斜放增加冗余观测让优化结果更稳健。imu_tk内部用ceres做非线性优化观测冗余够结果自然更稳定。标定完成之后会得到一组参数包括加速度计三轴零偏单位mg加速度计三轴尺度因子单位ppm或%加速度计三轴间的轴偏差角单位度陀螺仪三轴零偏单位°/h陀螺仪尺度因子和轴偏差把补偿参数写进驱动或算法之后一个简单的验证方式是静止放置IMU看加速度计输出的模长是不是稳定在9.8 m/s²附近抖动范围是否明显变小再把IMU水平旋转90度看陀螺积分的角度是否接近90度。2.3 Allan方差分析量化随机误差的关键指标Allan方差是一种时域分析方法最早用于原子钟的频率稳定度分析后来被推广到惯性传感器领域。思路很简单取一段长时间静止数据按不同的积分时间τ切分计算每一段的平均值再求相邻段平均值之差的方差最后画出“log(τ)-log(Allan标准差)”曲线。从这条曲线上可以读出几个关键指标角度随机游走曲线斜率约为-0.5的区段对应的值单位是°/√h或°/h/√Hz。零偏不稳定性曲线最低点对应的值代表IMU零偏随时间能稳定下来的极限水平单位是°/h。速率随机游走曲线斜率为0.5的区段说明存在长期漂移趋势。在imu_utils中流程基本是把IMU固定在静止环境中录制至少一个小时的rosbagrosbag中只包含IMU数据不要有别的干扰。使用imu_utils的launch文件设置好IMU topic、数据时长等参数。运行后会生成yaml文件里面就是Allan方差分析的结果。这里有一个容易忽略的细节Allan方差分析要求IMU的采样频率尽量稳定如果数据流有丢包或时间戳抖动分析结果会失真。建议录制时用实时内核或至少保证系统负载不高避免ROS在转发时频繁丢帧。2.4 温度补偿要不要做很多项目做到Allan方差分析就停了但如果你做的是高精度组合导航或者长时间运行的机器人温度补偿是绕不开的。MEMS IMU的零偏随温度变化非常显著这种变化不是线性的常常带迟滞也就是说升温到60度和降温到60度时零偏未必相同。工程上有两种处理思路简单方案做好温控把IMU放在恒温环境中或者让设备在固定温度区间内运行。很多工业级IMU模块内部自带温补代价是体积和成本。复杂方案在温箱中做全温测试建立温度-零偏查找表或多项式模型运行时根据温度读数实时补偿。对大部分机器人项目来说第一种思路更现实。你只要确保IMU脱离“冷启动”状态后再开始关键任务比如起飞、开始建图零偏漂移就能控制在一个可接受范围内。比如开机后等待5分钟让板子和IMU温度稳定下来再运行SLAM算法效果会明显不同。3. 外参标定让IMU和相机/LiDAR坐标系对齐内参标定做完IMU自身“准”了但多传感器融合系统还有一个关键问题IMU坐标系和相机坐标系/LiDAR坐标系的相对位姿外参是多少。这里的标定方式和内参完全不同因为你需要借助外部传感器来测量“相对关系”。3.1 旋转外参的可观测性与平移外参的不可观测性外参标定有一个非常重要的理论问题旋转外参在高精度下是可观测的但平移外参在很多条件下是弱可观测甚至不可观测的。先解释为什么。旋转外参意味着两个坐标系之间的轴向差异这个差异会直接影响加速度计读数在相机坐标系下的分解方向因此在激励充分的情况下比如IMU有较大角速度旋转外参能被很好地估计出来。但平移外参不一样。IMU的加速度测量只包含比力信息而比力是与位置无关的它只跟姿态有关。相机测量的是图像特征的方向信息方向来自光心光心位置的变化在远距离特征下几乎不可观。比如如果场景中的特征都在10米以外那么光心偏移1厘米对图像坐标的影响几乎是零你没法从图像上分辨出这1厘米到底来自平移还是来自轻微的旋转偏差。所以实践中你会发现Kalibr这类工具标出来的旋转外参往往比较可靠但平移外参的协方差可能很大。在VIO系统里平移外参误差如果不大比如1-2厘米以内对系统的影响通常远小于旋转外参误差因为旋转误差会直接导致加速度分解错误产生持续的加速度偏差。3.2 Kalibr标定流程与关键注意事项Kalibr是ETH Zurich开源的多传感器标定工具箱支持相机-IMU联合标定是目前社区里最主流的方案。步骤是先用棋盘格标定相机内参然后录制包含IMU数据和棋盘格图像的bag运行kalibr_calibrate_imu_camera得到外参。实际操作中有几个坑我需要单独拿出来说。第一个坑标定板的选择与相机内参预标定。Kalibr对标定板的识别要求比较高Aprilgrid比传统棋盘格checkerboard更抗遮挡推荐优先使用Aprilgrid。相机内参最好先用Kalibr单独标定不要连外参一起联合优化否则问题空间太大会导致结果不稳定。第二个坑数据采集时的激励设计。这是大部分人标定失败的最主要原因。Kalibr需要IMU充分“兴奋”起来才能估计旋转外参。推荐的采集模式是慢速平移加上多方向的旋转让图像特征保持在视野内同时IMU的三轴都经历明显的角速度和加速度变化。我见过很多人拿手机随手一滑录制数据结果标定结果崩得一塌糊涂。实际做法应该是把相机和IMU的组装体固定在手上或小型云台上从三个不同初始朝向开始每次持续约30到40秒动作包含平移、偏航、俯仰、翻滚幅度逐渐加大。整个过程总共大概2到3分钟数据量不用太长但要“有内容”。第三个坑同步精度。Kalibr要求IMU和相机的时间戳是同步的或者说至少知道它们的固定延迟。如果时间戳偏差超过10毫秒标定出来的外参会明显失真。在VIO里时间同步问题经常被错误归因到外参不准上排查起来非常痛苦。3.3 LiDAR-IMU外参标定的差异如果你做的是LiDAR-Inertial系统比如LIO-SAM、FAST-LIO外参标定的方法和相机IMU标定有所不同。LiDAR-IMU外参标定通常利用点云的几何信息。一种常见思路是让传感器组合静置或做缓慢运动利用LiDAR帧之间的配准结果帧间位姿变换来和IMU积分位姿做对齐然后解算外参。另一种是利用地面或平面特征让IMU和LiDAR同时观测到同一个平面求解约束方程。在LIO-SAM或FAST-LIO这类开源框架中一般会提供一个初始外参然后系统在运行时会在线微调。但前提是初始外参不能错得太离谱否则在线优化根本收敛不了。我的实操建议是在标定LiDAR-IMU外参前先做一次粗标定确保两个传感器之间的朝向大致正确平移量在可接受范围内比如10厘米以内。粗标定可以手工测量也可以利用点云和IMU数据的对齐效果来反复试凑。有了粗值之后再用点云-IMU联合优化精修。这里还想提一点LiDAR的扫描方式会影响外参标定的可观测性。机械式LiDAR和固态LiDAR的扫描几何不一样外参标定时的激励设计要求也略有区别。机械雷达对平移量的观测性相对好一些固态雷达尤其是非重复扫描则更需要旋转激励来激发旋转外参的收敛。3.4 在线标定与离线标定的取舍除了离线标定近年来在线标定也成了一个热门方向。所谓在线标定就是系统运行过程中利用状态估计器的残差实时修正外参。比如VINS-Mono就内置了在线外参校准功能可以将相机-IMU外参作为状态变量的一部分放在滑动窗口里优化。但在线标定不是万能的。它对初始值敏感如果初始外参误差太大在线优化很容易陷入局部最优。而且在线标定会增加计算量还会削弱系统的可观性。我的取舍原则是这样的初次部署时一定做离线标定把初始外参尽量做准。如果传感器是刚性固定且不会受大冲击离线标定一次就够后续不需要在线标定。如果设备经常拆装或者工作环境存在大幅度温度变化导致结构形变可以考虑开启轻量级的在线标定作为一种缓慢漂移的补偿机制。4. 实际工程中的避坑清单与验收建议这一部分我从个人项目里踩过的坑里挑几个典型的出来希望能帮你少走弯路。4.1 关于静态数据和动态数据的几个典型错误错误一用太短的数据做Allan方差分析。Allan方差分析需要覆盖较长时间尺度一般至少支持τ到1000秒以上如果只有几分钟的数据低频段的指标根本估计不出来绕零偏不稳定性就会严重失真。我的建议是最少一小时的静态数据如果条件允许两小时更稳妥。错误二采集过程中IMU被手扶着。手不是稳定的平台会有微小的抖动和体温传导这些都会污染静态数据。用夹具、三脚架或者直接把板子放在减震棉上才能算是“静态”。错误三外参标定时激励不足。相机IMU外参标定中如果动作只包含平移而没有充分的旋转旋转外参的激励不够标定结果可能会在某个局部方向上是准的整体上却是歪的。错误四忽略时间同步而只怪外参。前面说过时间戳错10毫秒以上外参结果会被带偏。在评估标定结果前先确认IMU和相机的时间戳偏差在什么量级。ROS下可以用topic的header时间戳对比也可以用官方的时间同步工具来对齐。4.2 标定结果的交叉验证方法标定做完不等于万事大吉还需要独立验证。我常用的验证手段有三个静止测试IMU静止放置10分钟用标定后的内参重新计算姿态观察姿态角的漂移是否符合Allan方差分析给出的零偏不稳定性量级。如果漂移远大于预期说明内参标定有问题或者温度影响太大。回环测试手持组装体从起点出发转一大圈再回到起点利用外参把IMU轨迹投影到相机/LiDAR坐标系下观察起点和终点的对齐误差。这个测试综合验证了内外参和时间同步的质量。SLAM残差测试直接跑一便VIO或LIO算法查看优化残差在运行过程中的分布。如果外参正确残差应该在零附近正态分布如果外参有偏残差会出现明显的结构性偏差。这个方法最直观也最接近真实使用场景。4.3 常见标定失败案例与定位思路我在帮别人排查标定问题时总结了一类反复出现的模式先列出来现象AAllan方差曲线在高频段没有下降趋势。说明数据中存在明显的量化噪声或时戳抖动不一定是IMU本身的问题可能是驱动层采集程序没用DMA或实时线程。现象B多位置标定结果在yaml文件里看着合理但静止时姿态还是会漂。这种情况首先要怀疑零偏补偿被重复施加了。比如驱动层已经做了零偏补偿你的算法里又减了一遍零偏加起来就是双重补偿姿态自然飘。现象CKalibr外参标定结果协方差巨大。大概率是激励不足或者标定板的观测不够图像特征太少。重新录制数据时注意让棋盘格在图像中尽量大一点占据图像面积的20%以上。现象DLIO系统跑起来平移方向有持续漂移。在确认外参没有大偏差之后检查一下LiDAR和IMU的时间同步。特别是雷达帧率变化剧烈的情况固定延迟模型可能不够要考虑做时间偏移的外参联合标定。4.4 标定频率多久做一次才算合理最后聊一个经常被忽略的问题标定频率。很多团队把标定当成“一次性工作”标完就再也不管。但实际上MEMS器件的状态会随着时间和环境发生变化。我的建议是内参标定每次硬件改版或更换IMU批次后必须重新标定。如果设备常年运行建议每6到12个月复测一次观察关键指标是否有明显劣化。外参标定只要传感器被拆装过、受到过大冲击比如摔落或者经过剧烈温变的环境就需要重新验证。如果结构是刚性固定的外参一般能保持很久但不代表不需要做定期抽检。在线标定可以作为系统里的“安全网”但不能替代主动的定期巡检。标定这件事本质上是“用一次性的麻烦换取后续长时间的高精度体验”。每次标定都不能图省时间因为标定结果的质量直接影响你后面所有算法模块的调试难度。我个人在这上面付出的时间从来没有亏过。
返回列表