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)。
验证方法
- 数据充分性检查:录制的bag时长应≥2小时,且IMU保持静止(振动小于0.01g)。
- 曲线形状验证:打开生成的SVG图,Allan方差曲线应呈现典型“V”形——左侧斜率为-1/2段对应噪声密度,底部最低点对应零偏不稳定性,右侧斜率为+1/2段对应随机游走。
- 数值合理性验证:将标定结果与IMU数据手册标称值对比,同数量级即合理。例如BMI088陀螺仪噪声密度典型值约1.8e-03 rad/s/√Hz,若标定结果偏差超过10倍需检查数据质量。
- 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实际时长,节点会提前结束,需确保录制时长足够。