4. IMU内参标定实战:使用imu_utils或Allan方差工具进行IMU内参标定、结果解读与验证

好,咱们进入实操环节。

前面讲了那么多理论,说白了,IMU内参标定就是回答三个问题:噪声有多大?零偏稳不稳?刻度准不准?

我个人习惯用 imu_utils 配合 Allan方差 来做这件事。为什么?因为这套工具成熟、开源、社区验证充分。我在项目里踩过不少坑,今天一并分享给你。

4.1 准备工作:数据采集是标定的命门

先别急着跑工具。数据采不好,后面全是白搭。

我见过太多人,拿个IMU往桌上一放,录两分钟就开始标定。结果出来的Allan方差曲线跟心电图似的——根本没法看。

⚠️ 数据采集黄金法则:
  • 静止时长 ≥ 2小时:消费级IMU至少1小时,工业级建议2小时以上
  • 固定牢固:用双面胶或夹具固定,别用手扶着
  • 远离振动源:空调、电机、甚至有人走动都会引入噪声
  • 温度稳定:提前开机预热10分钟,让IMU温度稳定下来

我曾经有一次,在实验室采集数据,旁边正好有人在调试无人机。结果Allan方差曲线在100秒处出现一个诡异的"鼓包"——后来才发现是无人机桨叶旋转引起的低频振动。嗯,从那以后我采集数据都会先看看周围环境。

4.2 工具链安装:imu_utils + code_utils

这套工具依赖ROS,我假设你已经装好了ROS(Melodic或Noetic都行)。

# 创建工作空间
mkdir -p ~/imu_calib_ws/src
cd ~/imu_calib_ws/src

# 克隆代码
git clone https://github.com/gaowenliang/imu_utils.git
git clone https://github.com/gaowenliang/code_utils.git

# 编译
cd ~/imu_calib_ws
catkin_make
source devel/setup.bash
💡 小提示:如果编译报错找不到 backward.hpp,手动把 code_utils 里的 backward.hpp 复制到系统include路径下就行。这个坑我当年折腾了半小时。

4.3 启动标定:录制bag + 运行工具

数据采集和标定是两步,但可以串起来做。

步骤1:录制静止数据

# 启动IMU驱动(以Realsense D435i为例)
roslaunch realsense2_camera rs_camera.launch

# 录制bag,建议时长2小时
rosbag record /camera/imu -O imu_static.bag

录的时候别闲着。你可以去做别的事,但记得别碰设备。我一般会在终端里开一个 rostopic echo /camera/imu 看一眼数据有没有正常输出——确认没问题就让它自己跑着。

步骤2:编写launch文件

imu_utils 的launch目录下新建一个文件,比如 imu_calib.launch

<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" value="/camera/imu" />
        <param name="imu_name" value="d435i_imu" />
        <param name="data_save_path" value="$(find imu_utils)/data/" />
        <param name="max_time_min" value="120" />
        <param name="max_cluster" value="100" />
    </node>
</launch>
🔑 关键参数说明:
  • max_time_min:标定使用的数据时长(分钟),建议设为录制时长
  • max_cluster:Allan方差计算的聚类数,100够用
  • imu_name:输出文件的前缀名,方便区分不同IMU

步骤3:运行标定

# 播放bag数据
rosbag play imu_static.bag -r 200

# 新开终端,运行标定节点
roslaunch imu_utils imu_calib.launch

这里有个技巧:-r 200 表示200倍速播放。2小时的bag,36秒就能播完。但要注意,如果你的电脑性能不够,可能会丢数据。我建议先试 -r 100,稳定了再提速。

4.4 结果解读:Allan方差曲线与参数提取

标定完成后,会在 imu_utils/data/ 目录下生成几个文件:

  • d435i_imu_imu_param.yaml:最终标定结果
  • d435i_imu_allan方差曲线.svg:可视化结果

咱们先看yaml文件:

%YAML:1.0
---
type: IMU
name: d435i_imu
gyroscope:
  unit: "rad/s"
  avg-axis:
    gyr_n: 1.568e-03    # 角度随机游走 (rad/s/√Hz)
    gyr_w: 2.345e-05    # 零偏不稳定性 (rad/s)
  x-axis:
    gyr_n: 1.521e-03
    gyr_w: 2.198e-05
  y-axis:
    gyr_n: 1.612e-03
    gyr_w: 2.467e-05
  z-axis:
    gyr_n: 1.571e-03
    gyr_w: 2.370e-05
accelerometer:
  unit: "m/s^2"
  avg-axis:
    acc_n: 1.234e-02    # 速度随机游走 (m/s²/√Hz)
    acc_w: 3.456e-04    # 零偏不稳定性 (m/s²)
  x-axis:
    acc_n: 1.198e-02
    acc_w: 3.321e-04
  y-axis:
    acc_n: 1.267e-02
    acc_w: 3.567e-04
  z-axis:
    acc_n: 1.237e-02
    acc_w: 3.480e-04

怎么看这些数字?

我一般会关注三个核心指标:

参数 符号 物理含义 好IMU参考值
角度随机游走 gyr_n 陀螺噪声水平,越小越好 < 1e-3 rad/s/√Hz
陀螺零偏不稳定性 gyr_w 零偏随时间漂移的程度 < 1e-4 rad/s
速度随机游走 acc_n 加速度计噪声水平 < 1e-2 m/s²/√Hz
加速度零偏不稳定性 acc_w 加速度零偏漂移 < 1e-3 m/s²

你看上面D435i的结果,陀螺零偏不稳定性是2.345e-05 rad/s,换算成度大约是0.0013°/s。这个水平对于消费级IMU来说,相当不错了。

4.5 可视化验证:Allan方差曲线怎么看?

打开生成的SVG文件,你会看到类似这样的曲线:

我在这里用SVG画一张典型的Allan方差曲线图,帮你理解怎么看:

Allan方差曲线(陀螺仪X轴) 相关时间 τ (s) 10⁰ 10¹ 10² 10³ Allan方差 (rad²/s²) 10⁻⁶ 10⁻⁵ 10⁻⁴ 10⁻³ 斜率 = -1/2 角度随机游走 零偏不稳定性 σ = 2.198e-5 rad/s 斜率 = +1/2 速率随机游走 图例 Allan方差曲线 拟合线 特征点

这张图怎么看?我教你三个要点:

  1. 看曲线形状:标准的Allan方差曲线应该是"V"字形。左边下降段对应角度随机游走,底部对应零偏不稳定性,右边上升段对应速率随机游走。
  2. 看最低点:曲线最低点的纵坐标就是零偏不稳定性。这个值越小,说明IMU的零偏越稳定。
  3. 看平滑度:曲线越平滑,说明数据质量越好。如果曲线像锯齿一样,要么数据时长不够,要么采集过程中有干扰。
💡 实战经验:如果曲线在长相关时间(τ > 1000s)处出现上翘,说明IMU存在温度漂移。这时候可以考虑做温度补偿,或者缩短VIO系统的初始化时间。

4.6 验证标定结果:把参数喂给VIO系统

标定完不是终点,验证才是。

我一般会做两件事:

验证1:静态数据回放

把标定得到的噪声参数和零偏参数写进VIO配置,然后播放一段新的静止数据。观察VIO估计的位姿是否稳定——理想情况下,位置漂移应该很小。

验证2:动态数据测试

手持设备做几个简单的运动(平移、旋转),看看VIO的轨迹是否合理。如果轨迹出现明显的"飘移"或"扭曲",说明标定参数可能有问题。

⚠️ 常见问题排查:
  • 零偏参数过大:如果标定出的零偏比手册标称值大一个数量级,检查数据采集时是否真的静止
  • 噪声参数过小:可能是数据时长不够,Allan方差在短相关时间区域没收敛
  • 三轴不一致:如果某个轴的参数明显偏离其他两轴,检查IMU安装是否水平

我记得有一次,标定完D435i的IMU,发现Z轴加速度计的零偏特别大。排查了半天,才发现是桌子没放平——水平仪显示倾斜了0.5度。把桌子垫平后重新采集,参数就正常了。所以,采集前一定检查水平

4.7 小结:标定这件事,值得花时间

IMU内参标定,说白了就是给VIO系统打好地基。地基不稳,上面盖的楼再漂亮也没用。

我个人建议,每次拿到新的IMU设备,或者更换了安装位置,都重新做一次标定。标定数据保存好,方便后续对比。

好了,这一章的内容就到这。标定工具用起来其实不复杂,关键是理解背后的原理和知道怎么看结果。下一章咱们会讲IMU与相机的联合标定——那才是真正考验功夫的地方。


公众号:蓝海资料掘金营,微信deep3321