3. IMU标定

任务目标

使用 imu_utils 工具包,对IMU(惯性测量单元)进行离线标定,获取其噪声密度(noise density)和零偏随机游走(bias random walk)参数。这两个参数是VIO系统中IMU预积分和状态估计的关键输入,直接影响系统精度。

环境与依赖

  • Ubuntu 18.04/20.04 + ROS Melodic/Noetic
  • 安装 imu_utils 及其依赖 code_utils(编译顺序:先 code_utils 后 imu_utils)
  • IMU数据采集包(如 rosbag 录制的 /imu/data 话题)

实现原理

imu_utils 基于 Allan 方差分析法:将静止状态下采集的IMU数据按不同时间簇长度分组,计算各组的方差,绘制 Allan 曲线。曲线中斜率为 -0.5 的区段截距对应噪声密度,斜率为 +0.5 的区段截距对应零偏随机游走。标定过程要求IMU完全静止,通常采集 2 小时以上数据以保证低频段拟合精度。

关键完整代码

以下为标定启动文件(launch),配置IMU话题名与数据时长参数:

<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" type="string" value="/imu/data"/>
        <param name="imu_name" type="string" value="my_imu"/>
        <param name="data_save_path" type="string" value="$(find imu_utils)/data/"/>
        <param name="max_time_min" type="double" value="120"/>
        <param name="max_cluster" type="int" value="100"/>
    </node>
</launch>

参数说明:imu_topic 为录制的IMU数据话题;imu_name 为输出文件名标识;data_save_path 为结果保存目录;max_time_min 为参与标定的数据最大时长(分钟);max_cluster 为最大时间簇数量。

运行与验证

  1. 启动 roscore,播放静止采集的IMU数据包:rosbag play imu_static.bag
  2. 运行标定节点:roslaunch imu_utils calibrate_imu.launch(将上述launch保存为此文件名)
  3. 等待数据播放完毕,标定节点自动退出
  4. 检查输出目录下生成的 my_imu_imu.yaml 文件

通过判定标准:打开生成的YAML文件,应包含以下格式的参数:

%YAML:1.0
---
type: IMU
name: my_imu
gyr:
   noise_density: 1.8462819322698855e-03
   random_walk: 1.5487324567890123e-05
acc:
   noise_density: 1.2345678901234567e-03
   random_walk: 2.3456789012345678e-04
...

数值量级应与IMU芯片手册标称值接近(陀螺仪噪声密度通常在 1e-3~1e-4 量级,加速度计在 1e-3 量级)。若数值异常偏大或偏小,检查数据是否包含运动段、话题频率是否稳定(通常要求200Hz以上)、采集时长是否足够。

常见问题

  • 编译顺序错误:必须先编译 code_utils 再编译 imu_utils,否则报找不到头文件
  • 标定结果全为零:检查launch中 imu_topic 是否与实际bag话题名一致,可用 rostopic info 确认
  • Allan曲线拟合失败:增加 max_time_min 值,确保数据量覆盖足够长的时间簇