4. 相机-IMU标定(imu_utils)

任务目标

使用 imu_utils 工具包对IMU进行Allan方差分析,标定出陀螺仪和加速度计的噪声密度(noise density)与零偏随机游走(bias random walk),为VINS-Mono/Fusion提供准确的IMU参数。

环境依赖

  • Ubuntu 16.04/18.04 + ROS Kinetic/Melodic
  • code_utils(imu_utils的依赖,需先编译)
  • imu_utils 源码包

实现步骤

1. 创建工作空间并编译依赖包

mkdir -p ~/imu_calib_ws/src
cd ~/imu_calib_ws/src
# 克隆依赖包(需科学上网或使用镜像)
git clone https://github.com/gaowenliang/code_utils.git
git clone https://github.com/gaowenliang/imu_utils.git

# 编译(code_utils必须先于imu_utils编译)
cd ~/imu_calib_ws
catkin_make --pkg code_utils
catkin_make --pkg imu_utils
source devel/setup.bash

2. 录制静止IMU数据

将IMU(如Realsense D435i、DJI A3等)固定放置在水平静止平面上,预热5分钟后录制至少2小时(建议3小时以上以保证低频段Allan方差收敛)的ROS bag数据:

rosbag record /imu/data_raw -O imu_static.bag

确保话题名与后续launch文件中的一致,若不同需修改launch文件中的rostopic参数。

3. 编写Allan方差标定launch文件

在 imu_utils/launch 目录下创建 imu_calib.launch:

<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" type="string" value="/imu/data_raw"/>
        <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="int" value="120"/>
        <param name="max_cluster" type="int" value="100"/>
    </node>
</launch>

参数说明:imu_topic为IMU数据话题;imu_name为输出文件命名前缀;data_save_path为结果保存路径;max_time_min为分析的最大时间长度(分钟),需小于bag时长;max_cluster为Allan方差最大聚类数。

4. 执行标定

# 终端1:播放bag数据
rosbag play imu_static.bag

# 终端2:运行标定节点
roslaunch imu_utils imu_calib.launch

等待节点处理完所有数据(处理时间通常为bag时长的1~2倍),终端会输出各轴Allan方差拟合结果。

5. 查看标定结果

标定完成后,在 data_save_path 目录下生成以下文件:

  • my_imu_imu.yaml:VINS可直接读取的IMU参数文件
  • my_imu_gyroscope.txt / my_imu_accelerometer.txt:Allan方差数据点
  • my_imu_gyroscope.svg / my_imu_accelerometer.svg:Allan方差曲线图

打开生成的 my_imu_imu.yaml,内容格式如下:

%YAML:1.0
---
type: IMU
name: my_imu
Gyr:
   unit: " rad/s"
   avg-axis:
      gyr_n: 1.8234567890123456e-04
      gyr_w: 1.2345678901234567e-06
   x-axis:
      gyr_n: 1.8234567890123456e-04
      gyr_w: 1.2345678901234567e-06
   y-axis:
      gyr_n: 1.8234567890123456e-04
      gyr_w: 1.2345678901234567e-06
   z-axis:
      gyr_n: 1.8234567890123456e-04
      gyr_w: 1.2345678901234567e-06
Acc:
   unit: " m/s^2"
   avg-axis:
      acc_n: 1.8234567890123456e-03
      acc_w: 1.2345678901234567e-05
   x-axis:
      acc_n: 1.8234567890123456e-03
      acc_w: 1.2345678901234567e-05
   y-axis:
      acc_n: 1.8234567890123456e-03
      acc_w: 1.2345678901234567e-05
   z-axis:
      acc_n: 1.8234567890123456e-03
      acc_w: 1.2345678901234567e-05
---

其中 gyr_n 为陀螺仪噪声密度(单位:rad/s/√Hz),gyr_w 为零偏随机游走(单位:rad/s²/√Hz);acc_n 为加速度计噪声密度(单位:m/s²/√Hz),acc_w 为零偏随机游走(单位:m/s³/√Hz)。

验证方法

  1. 数据充分性检查:录制的bag时长应≥2小时,且IMU保持静止(振动小于0.01g)。
  2. 曲线形状验证:打开生成的SVG图,Allan方差曲线应呈现典型“V”形——左侧斜率为-1/2段对应噪声密度,底部最低点对应零偏不稳定性,右侧斜率为+1/2段对应随机游走。
  3. 数值合理性验证:将标定结果与IMU数据手册标称值对比,同数量级即合理。例如BMI088陀螺仪噪声密度典型值约1.8e-03 rad/s/√Hz,若标定结果偏差超过10倍需检查数据质量。
  4. VINS集成验证:将yaml文件中的参数填入VINS-Mono的IMU配置文件(如 realsense_d435i_config.yaml),运行VINS-Mono估计器,观察初始化阶段IMU方差收敛正常、VIO轨迹无异常漂移即通过。

常见问题

  • 编译错误:若 code_utils 编译报错找不到 backward,需在 code_utils/CMakeLists.txt 中注释掉 add_subdirectory(backward) 相关行。
  • 标定结果异常:若Allan方差曲线在短时间尺度上出现明显上翘,说明IMU静止不充分或存在振动干扰,需重新录制数据。
  • bag时长不足:若 max_time_min 设置大于bag实际时长,节点会提前结束,需确保录制时长足够。