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方差曲线应该是"V"字形。左边下降段对应角度随机游走,底部对应零偏不稳定性,右边上升段对应速率随机游走。
- 看最低点:曲线最低点的纵坐标就是零偏不稳定性。这个值越小,说明IMU的零偏越稳定。
- 看平滑度:曲线越平滑,说明数据质量越好。如果曲线像锯齿一样,要么数据时长不够,要么采集过程中有干扰。
4.6 验证标定结果:把参数喂给VIO系统
标定完不是终点,验证才是。
我一般会做两件事:
验证1:静态数据回放
把标定得到的噪声参数和零偏参数写进VIO配置,然后播放一段新的静止数据。观察VIO估计的位姿是否稳定——理想情况下,位置漂移应该很小。
验证2:动态数据测试
手持设备做几个简单的运动(平移、旋转),看看VIO的轨迹是否合理。如果轨迹出现明显的"飘移"或"扭曲",说明标定参数可能有问题。
- 零偏参数过大:如果标定出的零偏比手册标称值大一个数量级,检查数据采集时是否真的静止
- 噪声参数过小:可能是数据时长不够,Allan方差在短相关时间区域没收敛
- 三轴不一致:如果某个轴的参数明显偏离其他两轴,检查IMU安装是否水平
我记得有一次,标定完D435i的IMU,发现Z轴加速度计的零偏特别大。排查了半天,才发现是桌子没放平——水平仪显示倾斜了0.5度。把桌子垫平后重新采集,参数就正常了。所以,采集前一定检查水平。
4.7 小结:标定这件事,值得花时间
IMU内参标定,说白了就是给VIO系统打好地基。地基不稳,上面盖的楼再漂亮也没用。
我个人建议,每次拿到新的IMU设备,或者更换了安装位置,都重新做一次标定。标定数据保存好,方便后续对比。
好了,这一章的内容就到这。标定工具用起来其实不复杂,关键是理解背后的原理和知道怎么看结果。下一章咱们会讲IMU与相机的联合标定——那才是真正考验功夫的地方。
公众号:蓝海资料掘金营,微信deep3321