ARTICLE DETAIL

资讯详情

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

IMU标定全攻略:内参标定与外参标定的区别与实操指南

IMU标定全攻略:内参标定与外参标定的区别与实操指南 聊聊两种 IMU 标定方式内参标定和外参标定做机器人、自动驾驶或者任何涉及定位和姿态估计的项目IMU惯性测量单元就是那个测加速度和角速度的小盒子都是绕不开的传感器。但绝大多数人把它接入系统跑起来之后都会遇到一个尴尬的问题数据飘。静止放着加速度计有偏置转动起来陀螺仪有温漂这玩意儿直接决定了你后续姿态解算、融合定位的天花板。我以前也踩过这个坑以为买了个高精度模块就能直接吃数据结果跑 VIO视觉惯性里程计的时候轨迹直接飞了。后来才明白问题不在传感器本身而在标定。说到 IMU 标定圈子里常说的“两种方式”其实分两个维度理解一种是标 IMU 自身的内部参数叫内参标定另一种是标 IMU 和其他传感器之间的相对位姿关系叫外参标定。这俩完全是两码事但很多人混着叫导致调参的时候一头雾水。这篇就把这两种方式从头到尾拆开讲清楚什么时候该做哪个、各自需要什么工具和操作步骤、会踩哪些坑以及我用这些方法下来的一些真实体感。如果你是刚接触 SLAM、多传感器融合或者在调自己的机器人平台却被 IMU 数据折磨得头皮发麻那这篇应该能帮你把思路理顺少走不少弯路。1. 先把概念掰正内参和外参到底标的是什么1.1 内参标定让 IMU 自己“说真话”内参标定简单说就是搞清楚 IMU 本身出厂时留下的那些“坏毛病”。比如加速度计的零偏静止时输出不为 0、尺度误差测到的加速度和真实加速度的比值有偏差、安装误差三个轴的敏感方向不是严格正交以及陀螺仪的零偏、尺度误差等等。此外还有随机游走噪声、零偏稳定性这些统计特性也属于内参范畴。这些参数如果不去管它最直接的影响就是积分出来的速度和姿态漂移得飞快。举个例子一个零偏为 0.01 m/s² 的加速度计积分 10 秒就会带来大约 0.5 m/s 的速度误差再积一次分位置误差就更夸张了。所以做任何基于 IMU 积分或者状态估计的项目内参标定是第一步没得商量。常用的做法是利用 Allan 方差分析法来提取噪声特性再用优化的方法把零偏和尺度误差估计出来。经典的工具链是imu_utils配合kalibr或者直接用kalibr的 imu 标定模块来做。后面我会把操作细节补上。1.2 外参标定告诉系统 IMU 装在哪、朝哪看外参标定则是解决“IMU 和另一个传感器之间的相对位置和姿态是什么”的问题。你想想系统里通常不止一个传感器——摄像头、激光雷达、轮式里程计、机械臂关节角传感器——它们各自测量的是自己坐标系下的物理量要融合到一起就必须知道坐标系之间的变换关系通常是一个 4x4 的刚体变换矩阵包含 3 轴平移 和 3 轴旋转。比如视觉惯性系统里相机拍了张图IMU 测了角速度和加速度算法要把图像特征和 IMU 数据放到同一个坐标系下处理这时候就需要“相机到 IMU”的外参。再比如机械臂上加了一个 IMU想让 IMU 的数据能够表达工具末端的姿态变化就需要知道“工具坐标系到 IMU”的外参。这个外参一旦标错整个系统内部就是扭曲的融合再多传感器也没用反而互相打架。外参标定通常依靠“运动激励”——让设备动起来采集传感器数据然后通过手眼标定或者目标函数优化的思路求解。不同传感器组合用的工具也不同后面详细说。1.3 为什么说这两种是“两种方式”而不是“两种工具”其实从操作和原理上讲内参和外参的求解思路差异非常大。内参标定的核心是让 IMU 静止或多个已知姿态下采集数据通过对比“期望的物理量”和“IMU 测到的量”来估计误差模型中的参数而外参标定需要运动激励通过观测同一次运动中各个传感器输出的变化寻找它们之间的几何变换关系。所以别再问“标定 IMU 用哪套软件”这种笼统的问题了先判断你要内参还是外参。如果 IMU 数据本身就飘得离谱你标外部参数是没意义的——拿一把不准的尺子去量桌子量出来的桌子尺寸再准也没用尺子的问题必须先解决。2. 内参标定实操让 IMU 的数据回归可信2.1 采集数据前的准备工作和环境要求内参标定对数据采集环境要求很高核心就是两个字静置。把 IMU 固定在一个稳定的平面上周围不要有人走动、不要开振动源比如空调压缩机近距离不行、不要有风吹到设备因为这些都会引入额外的加速度噪声。最好放在地下室或者桌面隔振垫上实测下来效果差异挺明显的。需要采集多长时间看你要识别多慢的偏差。Allan 方差分析需要覆盖足够长的采样时间一般建议至少采集 2 小时以上。不过如果你只想标零偏和尺度误差不做太细致的噪声分析30 分钟到 1 小时也能凑合但结果置信度会低一些。采集时需要注意保持 IMU 水平放置吗其实不用特别水平。理论上讲只要静止加速度计的模长就应该等于当地重力加速度这个信息本身就足以用来估计零偏和尺度误差。不过如果偏差太大比如安装歪了那你需要分多个姿态采集才能更好地区分“偏差项”和“安装误差”不然无法完全可观。2.2 基于 imu_utils 的标定流程imu_utils是 ETH 那边开源的一套 IMU 内参标定工具原理上是利用 Allan 方差来估计噪声密度、零偏稳定性和随机游走。用起来不算复杂但有几个细节要注意。先建一个 ROS 工作空间把imu_utils和code_utils它依赖这个包拉下来编译。然后把 IMU 的 ROS 驱动跑起来确保话题topic发布的是原始数据通常是sensor_msgs/Imu格式不要经过任何滤波或者融合。用rosbag record记录话题数据录完 2 小时左右停止。然后写一个 launch 文件配置三个关键参数imu_topic你的 IMU 话题名、imu_name输出文件名前缀、max_time_min要分析的最大分钟数一般设个 120但实际取决于你录了多久。运行标定节点后它会读取 rosbag截取不同时间长度的数据段做 Allan 方差分析最终生成 yaml 文件里面包含gyr_noise_density陀螺仪噪声密度单位deg/h/√Hz 或者 rad/s/√Hzgyr_random_walk陀螺仪随机游走单位deg/√hacc_noise_density加速度计噪声密度acc_random_walk加速度计随机游走以及零偏bias的估计值有几点要提醒你第一imu_utils分析的是静止数据如果你的 rosbag 里混入了运动段结果会严重失真。录制时务必把 IMU 固定死别去碰它。第二输出 yaml 里的 bias 是参考给定采样时间和温度条件下的值实际使用中温度变化会让零偏漂移。所以对精度要求高的场景可以考虑做温度补偿但那是更后面的工程问题了。第三如果你用的是kalibr来标内参它也能做但更常用于外参标定。内参我一般习惯用imu_utils因为它对 Allan 方差的处理更直接而且生成的参数格式能直接被 VINS-Mono 这类系统加载。2.3 结果怎么解读、怎么用拿到 yaml 文件之后你会看到类似这样的内容以 VINS-Mono 的配置文件为例# 加速度计 acc_n: 0.043 # 噪声密度 (m/s^2 / sqrt(Hz)) acc_w: 0.0004 # 随机游走 (m/s^2 / sqrt(h)) # 陀螺仪 gyr_n: 0.0035 # 噪声密度 (rad/s / sqrt(Hz)) gyr_w: 0.00004 # 随机游走 (rad/s / sqrt(h)) # 零偏 gyr_bias_init: 0.01 acc_bias_init: 0.05这些参数在后续滤波器里是直接参与计算的。比如 VINS-Mono 里面acc_n和gyr_n会被作为测量噪声协方差矩阵的值acc_w和gyr_w会被当成 IMU 动力学模型里的过程噪声参数。如果这几个数给得离谱整个优化问题就病态了估计出来的轨迹和姿态都会出问题。我第一次做这一步时踩了个坑直接用出厂手册给的典型值当内参没自己标。结果在室内小范围场景跑 VINS前 10 秒还好后来位置慢慢漂了几十厘米轨迹的环也闭合不上。重新做内参标定之后同样的数据跑出来的误差直接小了一个数量级。这里面的差距就是内参的威力。3. 外参标定实操打通传感器之间的坐标变换3.1 相机与 IMU 的联合外参标定kalibr说到相机和 IMU 的外参标定最主流的工具还是kalibr。它能同时标定相机内参、IMU 内参支持以及相机到 IMU 的外参变换矩阵。核心思路是让相机和 IMU 一起运动用 Aprilgrid 或 Checkerboard 作为视觉观测目标通过视觉特征的重投影误差以及 IMU 预积分误差的联合优化把外参求解出来。标定板要选好Aprilgrid 比传统棋盘格好用因为它是编码标记即使部分遮挡也能估计出角点对应的全局 ID而且在快速运动和模糊的情况下也能提取。打印的时候尺寸要准打印后最好用尺子量一下实际格子边长在配置里填实际值不要完全信任打印机标称比例。采集数据的动作要尽量包含六个自由度的运动平移三个方向和旋转三个轴。不要只做匀速直线运动那样视觉和惯性之间的关联太弱。实际采集时我一般让相机和 IMU 在标定板前做类似“画 8 字”“绕 X/Y/Z 轴晃动”的动作过程中保持标定板在视野里同时避免运动过快导致图像模糊。录 1~3 分钟就够了太长的数据反而会让优化耗时变长。运行标定时命令大致长这样ROS 1 环境下kalibr_calibrate_imu_camera \ --target april_6x6.yaml \ --cam camchain.yaml \ --imu imu.yaml \ --bag dataset.bag \ --time-calibration其中camchain.yaml是相机内参可以用 kalibr 先做相机内参标定得到imu.yaml是 IMU 的噪声特性和话题信息。--time-calibration选项非常关键它会在优化外参的同时估计传感器之间的时间延迟时间戳偏移这个时间偏移对于视觉惯性系统来说也极其重要。实测下来不加时间校准的外参标定结果往往在优化轨迹时会出现周期性的漂移就是因为数据之间的时间对不齐。3.2 激光雷达与 IMU 标定lidar-IMU 外参标定随着激光雷达和 IMU 融合的方案越来越多lidar-IMU 外参标定也成了刚需。解决思路和相机-IMU 类似让传感器组合运动采集点云和 IMU 数据通过点云配准得到的位姿变化和 IMU 积分得到的姿态变化做联合优化。工具上可以选择lidar_imu_calib基于 hand-eye 标定思路的点云匹配方法direct_visual_lidar_calibration同时标相机、雷达和 IMU或者自己写一个基于 NDT/ICP 配准的标定脚本需要注意的是激光雷达的观测是三维点云对特征稀疏的环境比如空旷走廊很难收敛。标定时的环境尽量选在有明显几何特征的地方比如墙角、立柱、桌椅区域。动作同样要包含旋转和平移的多样性。另外如果你的雷达是多线激光雷达比如 Velodyne、Ouster 这种旋转式的在标定前最好确认雷达的内参每根线的水平/垂直角度偏移本身是准的不然标定结果会把雷达的内参误差也混到外参里去。3.3 手眼标定机械臂和 IMU 的外参标定在机械臂场景下最常见的需求是标定“工具坐标系到相机或 IMU”的外参也就是经典的 hand-eye 问题。方程形式是 AX XBA 是机械臂末端位姿的变化B 是传感器IMU 或相机位姿的变化X 就是我们要标的外参。对于 IMU 而言B 可以通过积分 IMU 的姿态增量得到。需要强调的是这个标定过程对 IMU 的姿态解算精度要求较高所以建议先做内参标定再用卡尔曼滤波或者互补滤波解算姿态不然 B 本身就是错的AX XB 解出来全是噪声。实操步骤一般是控制机械臂运动到一系列不同的位姿每个位姿停留 2~3 秒让 IMU 数据稳定。记录机械臂末端位姿来自关节编码器正解和 IMU 的角速度/加速度数据。在离线阶段用机械臂的位姿序列构造 A用 IMU 积分构造 B。用 Tsai-Lenz 或 Park-Martin 算法解算 AX XB。我自己用下来如果只是标姿态旋转矩阵用 Tsai 方法就够了如果还要标平移那需要注意机械臂末端坐标系原点到 IMU 测量中心之间的杆臂效应旋转中心与 IMU 参考点不一致会导致平移部分耦合误差。这种情况下需要额外采集多个姿态让优化问题可解。4. 常见问题排查与实操避坑心得4.1 标定结果反复变化怎么定位问题如果你连续标了两次得到的参数差异很大先别急着怀疑工具。常见原因按优先级排查数据采集条件不一致有没有保证静止环境有没有振动温度有没有明显变化运动激励不充分外参标定如果运动幅度太小或者总是一个方向很多自由度不可观结果必然不稳定。时间戳对齐问题不同传感器的时间戳如果来自不同时钟源并且没有被同步标定结果的误差会很大。确认你用的驱动是否统一发送了时间戳或者做好时间同步。数据质量问题视觉标定时如果标定板图像模糊角点提取误差大那优化出来的外参也不会好。录完数据后先检查一下图像是否清晰。4.2 标定结果能在不同场景间复用吗理论上内参标定结果换环境也能用前提是温度相近但外参标定结果是不能轻易复用的——只要设备被重新安装、固定结构变形、或者螺丝松动外参就变了。尤其是无人机上桨叶电机振动会导致 IMU 安装座的微小形变这也会在长时间尺度上影响外参。有个比较实际的建议在设备的日常运维中加入快速在线外参校验的环节。比如 VINS-Fusion 这类系统支持在线估计外参的某些维度或者你可以定期做一个简单的 1 分钟标定只做姿态部分检查外参是否发生了明显漂移。这个方法能帮你在系统性能下降的早期发现问题避免在错误参数下盲目调参。4.3 用标定后的参数启动系统还是发飘怎么办如果确认内参和外参都标过了系统性能还是不好那问题大概率出在时间同步和原始测量噪声模型上。具体来说确认各传感器的时间戳是否同步到同一时钟。ROS 中可以用tf2的时间同步来做近似但更可靠的是用硬件同步比如 PPS 同步或触发线。检查 IMU 的原始数据是否被驱动做了滤波。某些 IMU 驱动默认开启低通滤波这会改变数据的频率特性导致你的噪声模型完全失效。检查你的估计器VINS、LIO 等用的参数文件里的噪声参数是不是真的来自你的标定结果还是残留了模板默认值。这个问题我见过太多次标定和被不两回事标定完了不配置进去等于白标。4.4 标定平台搭建的额外建议做多传感器标定最好有个固定的工作台下面几个东西能极大提升效率一台可靠的便携式采集主机确保磁盘空间足够2 小时 bag 可能要几十 GB并且系统时间稳定可以用 NTP 同步一次。一块足够大的标定板或者带漫反射面的标靶。Aprilgrid 的话建议打印在平整的铝塑板上不要用普通纸贴在墙上——起泡和褶皱会直接毁掉标定数据。一个可调高度的三脚架或者夹具保证标定过程中传感器组不会被碰歪。如果你要频繁标定多组传感器还可以做一个带刻度标记的固定平台这样能快速复现相似的采集姿态。5. 把标定这件事真正纳入你的项目流程我自己的习惯是每到一个新平台第一步不是写算法而是先花半天到一天时间把内参外参完整标一遍然后把标定结果和采集数据存档。哪怕是同一个型号的 IMU每颗芯片的零偏和噪声特性都有个体差异不要迷信“同批次一致性很好”这种话。有个小技巧可以分享标定完外参之后做一个一致性验证——把设备对着已知特征比如标定板静止 10 秒然后手动转几圈把 IMU 和视觉/雷达的输出在统一坐标系下可视化对比。如果两条轨迹的重合度很好那说明标定基本靠谱如果差得很明显回到前面的排查清单。这样做虽然多花几分钟但能省下后面调试的好几天。最后如果你用的是 VINS-Mono、VINS-Fusion、LIO-SAM 这套开源系统它们读取的 IMU 参数格式各有差异建议你把标定结果整理成一个同意的 yaml 模板把噪声密度、随机游走、零偏初值、外参变换矩阵这些字段统一管理起来。长期维护多个设备时这个习惯简直是救命的。
返回列表