提示:和上一篇关于利用imu计算位移的文章相比,这篇我对imu的理解应该是更加深刻了。
目录
前言
一、imu调试
二、利用IMU计算旋转
1.引入库
2.读入数据
总结
前言
这次使用的imu和上一篇文章中所提到的imu是同一款,时隔几个月再一次使用的时候发现有点错误,所以前来记录一下,附上一张使用的imu的图片。
这次使用的时候出现了几个问题:
1、imu的数据采集频率过低,需要在上位机调整。
2、关于imu坐标系对采集的数据的影响。
3、在 ROS 中对数据附加时间戳的问题。
也有其他的一些小问题我会边写边说的。
一、imu调试
距离上次调试是在几个月前,直接导致这一次的忘记如何调试,一直在问售后,所以一定要记录下来防止下次再忘。
因为我使用的是100HZ的采样频率,但是上一次不知道为什么就改成了5HZ所以要改回来。如果你需要使用的是100HZ,那就可以不用修改因为这个imu默认的采样频率就是100HZ。
如果想要修改的话,按如下图的步骤添加设备。
修改相关的配置参数。这里的采样频率和波特率也是有关系的,我之前设置的波特率是115200,但是采样频率设置的是100HZ,就会出现报警,设备时而连接时而断开的现象。就是因为波特率和采样频率不匹配的原因。100HZ的采样频率至少对应的波特率是230400。所以不同的采样频率要对应不同的波特率,否则影响采样结果。这里我就是直接使用的默认值。
对应的launch文件中的波特率也要做修改:
二、利用IMU计算旋转
1.引入库
这里我使用了slam十四讲里提到的Sophus库、Eigen库,Eigen库是基于C++编写的矩阵库,Sophus是在Eigen的基础上编写的矩阵运算的库。非常好用!!
//安装Eigen
sudo apt-get install libeigen3-dev
Sophus可以去高博的slambook中搜索。
2.读入数据
要注意imu上的坐标系的标注,我见的多的坐标系都是Z轴向上的,这一款是Z轴向下的。所以在考虑重力的时候要格外注意一下。因为imu的加速度计的输出是 。因为重力是向下的并且该款imu的Z轴正方向也是向下的,所以g是正的。
还有就是关于imu数据的时间戳的附加,我一开始使用的是ros中的纳秒,解算出来的数据很大,然后就采用了ros中的秒的函数结果就正确了。后来一想是因为用纳秒的时候没有换算单位哎。
然后下面这个图就是我测试了一下代码的准确性,发现其旋转矩阵的计算精度还是比较可靠的。但是速度和位移就不是很好,目前我可以找到的原因有两个:其一是我没有进行Imu的内参标定也就是没有减去零偏,其二是Imu在求解速度和位移的时候都是要进行积分的,也就是说在这个过程中,误差也是会累计的,所以尽量不要用Imu来进行长距离的位移测量,误差会很大。
总结
简单记录了一下该款imu的使用以及在编写程序中遇到的一些小问题。欢迎大家一起讨论~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)