本文仅用于记录自己学习IMU内参标定过程中的一些总结。
参考
关于IMU参数:
死磕陀螺仪之(一)陀螺仪参数意义以及工程转换
关于Allan方差:
多传感器融合定位理论基础(三):惯性器件误差分析
IMU噪声参数辨识-艾伦方差
代码:imu_utils
https://github.com/gaowenliang/imu_utils
使用方法:
1. 录制rosbag数据
启动imu的节点发布imu数据,并用rosbag进行录制。录制过程中保证IMU静止不动。
录制时间建议>2h,否则辨识的不准确。数据量还行,我100hz的IMU录制给2小时只有不到300M。
2. 下载代码并编译
按照imu_utils的文档,下载 imu_utils 和作者依赖的代码 codes_utils,并一同放在同一个workspace下,进行编译。
自己编译时,遇到了如下两个错误:
“backward.hpp” No such file…
解决方法:修改头文件 “backward.hpp” -> “code_utils/backward”。详见 issue11
/usr/lib/x86_64-linux-gnu/libapr-1.so.0: undefined reference to `uuid_generate@UUID_1.0’
解决方法:修改bashrc,不激活anaconda,然后删掉build路径,重新编译。详见:解决libapr-1.so.0:对‘uuid_generate@UUID_1.0’未定义的引用
3. 修改配置文件
修改任意一个launch文件,主要修改:1. imu topic的名称;2. 持续时间(可以看代码中这个变量是干什么的,具体是时间戳达到这个值(单位为分钟)后,把接收到的数据进行分析。所以如果设定的时间比实际录制的长,则无法进入后续分析部分)
4. 运行
首先打开标定launch,再播放录制的rosbag数据,可以用-r
参数加速;
rosbag play -r 200 xxx.bag
roslaunch imu_utils A3.launch
5. 输出结果
最终标定结果在命令行以及data/
路径生成yaml文件。
如果想绘制Allan曲线,可以运行scripts/draw_allan.m
这个matlab脚本,运行时将所有路径的文件名替换成launch配置文件的"imu_name"参数即可。输出结果如下:
小结
整个过程还算顺利,一天搞定。感觉并不难,所有工具都做的不错。
20231103更新
再看Allan方差含义与曲线:
今天按照:《IMU Error Modeling Tutorial - INS state estimation with real-time sensor calibration》一文学习,有对照了上面附的知乎的帖子:IMU噪声参数辨识-艾伦方差,收获颇多。
自己的一些心得体会:
从功率谱的角度去思考allan方差:由于可以将噪声项视作相互独立的噪声源,因此每个谱代表了不同源的影响。
量化误差Q,角度随机游走(即角速度noise)N,零偏不确定性B,角速度随机游走K,以及速率斜坡RR。论文中只讨论了NBK三个的影响。
由于绘制的allan曲线,横轴是log(\tau),根据斜率与
τ
=
1
\tau=1
τ=1 的交点,可以计算出NBK的具体值:
-1/2斜率与
τ
=
1
\tau=1
τ=1的交点是 N;
0斜率的值是(近似的)
2
/
3
B
2/3B
2/3B(论文是0.664B);
1/2斜率与
τ
=
1
\tau=1
τ=1的交点是
K
/
(
3
)
K/\sqrt(3)
K/(3),也是1/2斜率与
τ
=
3
\tau=3
τ=3的交点K。
对于噪声的状态空间,有不同的建模方式,例如只考虑NK的、考虑NBK的。但由于B,由于:
因此,对于B的不同建模(一阶/二阶),又有了Gauss-Markov模型,Cumulative模型等。