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 为最大时间簇数量。
运行与验证
- 启动
roscore,播放静止采集的IMU数据包:rosbag play imu_static.bag - 运行标定节点:
roslaunch imu_utils calibrate_imu.launch(将上述launch保存为此文件名) - 等待数据播放完毕,标定节点自动退出
- 检查输出目录下生成的
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值,确保数据量覆盖足够长的时间簇