基于imu_utils的IMU标定实战指南:从安装到结果分析

张开发
2026/4/18 7:26:22 15 分钟阅读

分享文章

基于imu_utils的IMU标定实战指南:从安装到结果分析
1. 为什么需要IMU标定IMU惯性测量单元是机器人、无人机和自动驾驶系统中不可或缺的传感器。它能够测量物体的角速度和加速度但原始数据往往存在各种误差。这些误差主要来自两个方面一是传感器本身的制造缺陷比如零偏bias和比例因子误差二是环境因素比如温度变化引起的漂移。我刚开始接触IMU时曾经直接使用原始数据做姿态估计结果发现误差大得离谱。后来才知道未经标定的IMU数据就像一把没有校准的尺子测量结果自然不可靠。imu_utils这个开源工具就是专门用来标定IMU的它能帮我们计算出几个关键参数加速度计的噪声acc_n和随机游走acc_w陀螺仪的噪声gyr_n和随机游走gyr_w。2. 环境准备与安装2.1 安装系统依赖在Ubuntu系统下首先需要安装一些基础依赖。打开终端执行以下命令sudo apt-get update sudo apt-get install libdw-dev这个libdw-dev库是后续编译code_utils所必需的。如果系统缺少这个库编译时会报找不到头文件的错误。2.2 安装Ceres Solverimu_utils依赖Ceres Solver这个非线性优化库。安装Ceres时我推荐参考高翔博士的《视觉SLAM十四讲》中的方法sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev然后从源码编译安装git clone https://ceres-solver.googlesource.com/ceres-solver mkdir ceres-build cd ceres-build cmake .. make -j4 sudo make install实测下来这个过程大概需要15-20分钟取决于你的电脑性能。记得make -j后面的数字不要超过你CPU的核心数否则容易卡死。2.3 创建工作空间并克隆代码接下来创建一个catkin工作空间mkdir -p ~/imu_calib_ws/src cd ~/imu_calib_ws/src catkin_init_workspace先克隆code_utils仓库这个库是imu_utils的基础依赖git clone https://github.com/gaowenliang/code_utils这里有个坑要注意code_utils必须先于imu_utils编译因为后者依赖前者的头文件。如果顺序反了编译肯定会失败。3. 编译imu_utils及常见问题解决3.1 编译code_utils进入工作空间目录开始编译cd ~/imu_calib_ws catkin_make第一次编译code_utils时很可能会遇到这个错误fatal error: backward.hpp: No such file or directory解决方法很简单找到报错的文件通常是sumpixel_test.cpp把#include backward.hpp改为#include code_utils/backward.hpp这个修改是因为头文件路径发生了变化新版本把backward.hpp放到了code_utils命名空间下。3.2 编译imu_utils现在可以克隆imu_utils的代码了cd ~/imu_calib_ws/src git clone https://github.com/gaowenliang/imu_utils cd ~/imu_calib_ws catkin_make编译时可能会遇到vector相关的错误提示找不到vector头文件。这是因为有些源文件忘记包含标准库头文件。解决方法是在报错的文件顶部添加#include vector4. 数据采集与标定流程4.1 录制IMU数据标定质量很大程度上取决于采集的数据。我建议使用rosbag录制IMU的原始数据rosbag record -O imu_calib /imu/data_raw这里有几个关键点录制时间至少2小时最好在IMU静止状态下进行确保IMU放置平稳避免任何人为移动环境温度保持稳定避免阳光直射我曾经为了省时间只录了30分钟结果标定出来的参数完全不能用。后来老老实实录满2小时效果就好多了。4.2 配置launch文件在imu_utils/launch目录下新建一个imu_calib.launch文件内容如下launch node pkgimu_utils typeimu_an nameimu_an outputscreen param nameimu_topic typestring value/imu/data_raw/ param nameimu_name typestring valuemy_imu/ param namedata_save_path typestring value$(find imu_utils)/data// param namemax_time_min typeint value120/ param namemax_cluster typeint value100/ /node /launch注意修改imu_topic参数确保它和你实际使用的IMU话题名称一致。max_time_min应该小于你实际录制的时间单位是分钟。4.3 运行标定程序首先启动imu_utils节点cd ~/imu_calib_ws source devel/setup.bash roslaunch imu_utils imu_calib.launch然后在新终端中回放之前录制的bag文件rosbag play -r 100 imu_calib.bag-r 100表示以100倍速播放这样可以加快标定过程。标定完成后程序会自动保存结果到imu_utils/data目录下。5. 结果分析与参数解读标定完成后你会得到一个YAML文件内容大致如下%YAML:1.0 --- type: IMU name: my_imu Gyr: unit: rad/s avg-axis: gyr_n: 1.123456789e-03 gyr_w: 9.876543210e-06 x-axis: gyr_n: 1.111111111e-03 gyr_w: 9.999999999e-06 y-axis: gyr_n: 1.222222222e-03 gyr_w: 8.888888888e-06 z-axis: gyr_n: 1.333333333e-03 gyr_w: 1.111111111e-05 Acc: unit: m/s^2 avg-axis: acc_n: 2.123456789e-03 acc_w: 1.987654321e-04 x-axis: acc_n: 2.111111111e-03 acc_w: 1.999999999e-04 y-axis: acc_n: 2.222222222e-03 acc_w: 1.888888888e-04 z-axis: acc_n: 2.333333333e-03 acc_w: 2.111111111e-04重点关注的参数是avg-axis下的四个值gyr_n陀螺仪的测量噪声单位rad/sgyr_w陀螺仪的随机游走噪声单位rad/s/sqrt(Hz)acc_n加速度计的测量噪声单位m/s²acc_w加速度计的随机游走噪声单位m/s²/sqrt(Hz)这些参数可以直接用在卡尔曼滤波等算法中。在我的项目中使用标定后的参数使定位精度提高了约40%。

更多文章