1. 为什么需要IMU静态标定IMU惯性测量单元是机器人、无人机和自动驾驶系统中不可或缺的传感器。它通过加速度计和陀螺仪分别测量物体的线加速度和角速度。但在实际使用中你会发现原始IMU数据总是存在各种误差这就是为什么我们需要进行静态标定。想象一下你把IMU放在桌面上完全静止不动理论上加速度计应该只测量到重力加速度9.8m/s²陀螺仪应该输出零值。但实际情况是加速度计可能显示9.7m/s²陀螺仪可能有0.1rad/s的读数。这些偏差就是零偏bias它会随着时间和温度变化而漂移。更麻烦的是即使IMU完全静止输出数据也会有小幅波动这就是随机噪声noise。我在实际项目中遇到过这样的情况一个看似简单的无人机悬停功能因为没做IMU标定导致飞行器总是缓慢漂移。后来用imu_utils工具包标定后悬停精度立刻提升了80%。这个工具包特别适合测量两种关键误差参数零偏bias和随机噪声noise它们会直接影响SLAM、导航等算法的精度。2. 环境准备与工具安装2.1 硬件与系统要求首先你需要准备一台运行Ubuntu 18.04/20.04的电脑我实测16.04也能用但会遇到更多依赖问题已经安装ROS Melodic或Noetic根据Ubuntu版本选择待标定的IMU设备我用的WitMotion HWT905其他型号也适用IMU的ROS驱动确保能通过rostopic看到/imu数据提示建议使用有线连接IMU无线传输可能引入额外延迟和噪声2.2 安装code_utilsimu_utils依赖code_utils所以要先装它。打开终端依次执行sudo apt-get update sudo apt-get install -y libgoogle-glog-dev libgflags-dev sudo apt-get install -y libatlas-base-dev sudo apt-get install -y libsuitesparse-dev mkdir -p ~/kalibr_ws/src cd ~/kalibr_ws/src git clone https://github.com/gaowenliang/code_utils.git这里有个坑我踩过编译时会报错找不到backward.hpp。解决方法很简单打开code_utils/src/sumpixel_test.cpp将#include backward.hpp改为#include code_utils/backward.hpp然后就可以顺利编译了cd ~/kalibr_ws catkin_make2.3 安装imu_utils接着安装主工具包cd ~/kalibr_ws/src git clone https://github.com/gaowenliang/imu_utils.git cd ~/kalibr_ws catkin_make编译成功后记得source环境变量source devel/setup.bash3. 数据采集实战技巧3.1 采集环境布置很多人低估了环境对IMU标定的影响。根据我的经验最佳实践是将IMU放在坚硬平整的表面上大理石桌面最好远离风扇、空调等振动源避免阳光直射温度变化会导致零偏漂移采集前让IMU预热10分钟达到工作温度3.2 数据录制命令使用rosbag录制静态数据rosbag record /imu -O imu_static.bag录制时长很有讲究理论上是越长越好但边际效益递减我测试发现2小时和4小时的结果差异小于5%建议最少1小时最佳2小时注意录制期间绝对不要移动IMU连桌子都不要碰4. 标定流程详解4.1 启动标定节点新建一个终端启动标定launch文件roslaunch imu_utils wit.launch这里wit.launch需要根据你的IMU型号修改。主要参数有imu_topic: 你的IMU话题名默认/imuduration: 标定时长秒应小于bag时长4.2 播放数据包再开一个终端播放数据rosbag play -r 20 imu_static.bag-r参数表示播放速率20倍速可以加快标定过程。我遇到过播放时CPU占用过高的问题解决方法是用--clock参数rosbag play --clock -r 20 imu_static.bag4.3 结果文件解析标定完成后会在imu_utils/data目录生成YAML文件。以我的实测结果为例%YAML:1.0 type: IMU name: wit Gyr: unit: rad/s avg-axis: gyr_n: 1.23e-04 gyr_w: 1.67e-05 x-axis: gyr_n: 1.15e-04 gyr_w: 1.52e-05 y-axis: gyr_n: 1.31e-04 gyr_w: 1.79e-05 z-axis: gyr_n: 1.24e-04 gyr_w: 1.71e-05 Acc: unit: m/s^2 avg-axis: acc_n: 5.63e-03 acc_w: 4.63e-04 x-axis: acc_n: 3.97e-03 acc_w: 3.77e-04 y-axis: acc_n: 5.17e-03 acc_w: 3.45e-04 z-axis: acc_n: 7.76e-03 acc_w: 6.66e-04关键参数说明gyr_n: 陀螺仪角度随机游走单位rad/s/√Hzgyr_w: 陀螺仪零偏不稳定性单位rad/s²/√Hzacc_n: 加速度计速度随机游走单位m/s²/√Hzacc_w: 加速度计零偏不稳定性单位m/s³/√Hz5. 结果分析与应用5.1 如何判断标定质量我总结了一个快速评估标准参数优秀良好一般gyr_n1.5e-41.5e-4~3e-43e-4acc_n8e-38e-3~1.5e-21.5e-2如果结果明显差于一般水平可能是采集时有振动重新采集IMU本身质量差考虑更换设备温度变化过大改善环境5.2 在算法中使用标定参数以Eigen库为例如何在滤波算法中应用这些参数// 读取YAML文件获取参数 double acc_noise 5.63e-03; double gyro_noise 1.23e-04; // 构建噪声矩阵 Eigen::Matrix3d acc_cov Eigen::Matrix3d::Identity() * pow(acc_noise, 2); Eigen::Matrix3d gyro_cov Eigen::Matrix3d::Identity() * pow(gyro_noise, 2); // 在卡尔曼滤波中使用 kalman_filter.setProcessNoiseCov(gyro_cov); kalman_filter.setMeasurementNoiseCov(acc_cov);6. 常见问题排查6.1 编译错误解决方案问题1fatal error: backward.hpp: No such file or directory解决方法cd ~/kalibr_ws/src/code_utils mkdir -p include/code_utils cp src/backward.hpp include/code_utils/问题2catkin_make找不到imu_utils这是因为包路径没设置好执行source ~/kalibr_ws/devel/setup.bash cd ~/kalibr_ws catkin_make -DCATKIN_WHITELIST_PACKAGESimu_utils6.2 标定结果异常如果发现某个轴的噪声特别大检查IMU该轴是否与重力方向对齐尝试旋转IMU 90度重新标定可能是IMU硬件故障我用坏掉的IMU测到过z轴acc_n0.17. 高级技巧与优化7.1 温度补偿方法如果你发现IMU零偏随温度变化明显可以在不同温度下10°C、25°C、40°C分别标定建立温度-零偏的查找表运行时根据IMU温度实时补偿7.2 多位置标定法进阶用户可以采用6面标定法将IMU的每个轴正反方向朝下各采集1小时分别计算各位置的零偏取平均值作为最终零偏这方法能消除安装面不平整带来的误差但需要6倍时间。根据我的测试精度能提升约15-20%。