最近在做xsens IMU的标定工作,网上资源很多很杂,打算按自己的操作过程、细节及遇到的问题记录一下,里面有参考的博文都附了链接。主体可参考此博文:VIO 中 IMU 的标定流程 (1/3) - imu_utils 使用备忘_勤能补拙的编程备忘录-CSDN博客_imu_utils标定
目录
IMU的驱动
bag录制
imu_utils标定工具
其他:
注:以下1、2、3、4步可以在一个终端中完成。
1.驱动安装:
$ sudo apt-get install ros-melodic-xsens-driver
驱动安装好之后输入命令:
$ roscd xsens_driver/launch/
$ ls
launch
目录下有一个文件xsens_driver.launch
,打开查看文件内容,输入命令:
$ sudo gedit xsens_driver.launch
如下,可以适当将timeout default
改大一点,给传感器预留更多的启动时间。
2.接入xsens传感器,先查看端口号(我使用的是ttyUSB0,如果使用的是其他的端口则修改为对应的端口号就可以了):
$ ls /dev/ttyUSB0
然后会输出 /dev/ttyUSB0
,则表示连接正确,串口已被识别。
3.修改访问MTi设备的权限,若USB状态权限不够,否则无法读取传感器的信息:
$ sudo chmod 777 /dev/ttyUSB0
注意:每次重启或者重新连接IMU都需要配置,否则无法识别到IMU。或者可以将此端口号改为默认执行
4.启动xsens传感器:
$ roslaunch xsens_driver xsens_driver.launch
不知道是不是依赖没装好,运行上面命令时会报以下错误:
查找资料,有博主说Fatal: could not find proper MT device 是因为没有给端口设置权限,如果我是先执行了前面第2、3步的话,按道理来说不会有这个问题。后面找到了一篇博文:ROS kinetic Xsens传感器(MTI-G-710)驱动安装_qq_34911636的博客-CSDN博客
---------------------------------------------------------------------------------------------------------------------------
补充:
有可能是没有加入组的问题,但是当时由于没有设备进行验证,所以也没有尝试上面的方法。后面跟同事修改频率跟波特率时也出现了上面的问题,所以也有可能是自己不小心修改了其中一个但是没有适配而导致的问题。
问题阐述:
1.could not find proper MT device,上位机配置的IMU的波特率与PC串口使用的波特率不一致
2.The device generates more data than the bus communication can handle(baud rate may be too low),输出的频率使用了太高的,导致数据量太大,虽然修改了波特率,但是一运行launch文件后又变成了默认的波特率(115200)
解决方案:先用MT Manager查看IMU的波特率,然后使用$ stty -a -F /dev/ttyUSB0 命令查看PC使用的波特率是否一致,不一致的话可以使用命令修改$ stty -F /dev/ttyUSB0 ispeed 921600 ospeed 921600 cs8。虽然两边都修改了波特率,但是还是会报第2个错误。后面找到了是launch文件中设备号也要设置为当前使用的端口号:
---------------------------------------------------------------------------------------------------------------------------
重新运行上面第4步:$ roslaunch xsens_driver xsens_driver.launch,可以获取到设备的数据。
传感器启动成功,暂时不要关掉当前的终端。
5.查看传感器启动后的主题,重新开启一个终端:
$ rostopic list
会输出以下主题:
然后输入以下命令,查看IMU输出的数据
$ rostopic echo /ium/data
以上两个终端可以暂时不用关闭
IMU驱动安装好之后,且能正常启动,可以先录制好bag为后面用imu_utils标定作准备。
在存放bag的路径下打开新的终端:(可根据自己需要命名bag名字,当前只录制/imu/data的数据即可,rosbag record命令的使用参考:ROS 中 rosbag 相关命令总结 - 简书)
$ rosbag record -o /imu/data test_imu
IMU静止不动,录制两个小时以上,录制完毕后ctrl + C
停止即可。录制两个小时跟imu_utils脚本的设置有关,官网也是建议最好录制两个小时以上。当前我自己录制的bag没有成功标定过,用网上下载的bag可以跑出数据。等后续用自己的数据标定成功再跟大家分享不成功的原因是什么。
--------------------------------------------------------------------------------------------------------------------------
后续:bag包需要录制xsens_driver.launch,如果录制了其他launch文件的,虽然也包含有imu/datade话题,但是可能数据格式不对也无法得出正确结果。我使用的是xsens_mti_driver display.launch录制的数据,所以无法得出标定结果
---------------------------------------------------------------------------------------------------------------------------
当前终端也可以先不关闭,后面还需要用来回放刚刚录制的数据。
至此,IMU的驱动已安装完毕且为后续用imu_utils标定录制了数据。
1.先安装依赖:
$ sudo apt-get install libdw-dev
2.全局安装ceres
由于code_utils 依赖 ceres,imu_utils依赖code_utils,所以先装ceres,可参考:Ubuntu:安装Ceres_SSS_369-CSDN博客_linux安装ceres 进行安装。里面步骤很详细,而且安装不会出什么问题,所以就不在此赘述了。
3.创建ros工作空间,并初始化工作空间:
可参考ROS学习--第3篇:ROS基础---创建工作空间_BIT王大东-CSDN博客_ros创建工作空间
$ mkdir -p ~/catkin_ws/src
3.下载code_utils
不要同时把 imu_utils 和 code_utils 一起放到src下进行编译。由于imu_utils 依赖 code_utils,所以先把 code_utils 放在工作空间的src下面,进行编译。
$ cd catkin_ws/src
# 进入到src目录
$ git clone https://github.com/gaowenliang/code_utils.git
# 修改code_utils功能包下sumpixel_test.cpp中 #include "backward.hpp"为 #include
$ cd ..
# 返回到catkin_ws目录
$ catkin_make
# 编译
注:在 code_utils下面找到 sumpixel_test.cpp,修改#include "backward.hpp"为 #include
4.下载imu_utils
$ cd catkin_vio/src
$ git clone https://github.com/gaowenliang/imu_utils.git
$ cd ..
$ catkin_make
5.查看imu_utils下的xsens.launch文件(也可以使用其他launch文件,但是话题要跟前面录制的的bag话题保持一致)
前面录制两个小时以上的数据就跟这个launch文件有关,需要注意标定的时长设置要小于bag的录制时长,即max_time_min的值。
6.开始标定
$ rosbag play -r 200 ~/Datasets/imu_xsens.bag
# 不能循环播放bag,imu_utils程序中有时间判断,200是回放的速率,数字越大,回放越快
# 先在录制bag的终端输入上述命令,暂不执行
$ roslaunch imu_utils xsens.launch
# 打开一个终端输入上述命令,执行此命令后尽快执行bag回放的命令
当bag
包加速回放完毕后,执行launch
的窗口仍然会显示wait for imu data.
,等待一段时间计算,计算完毕后会显示计算结果。显示done
之后,在catkin_ws/src/imu_utils/data
这个文件夹下会出现一系列的data
文件,查看xsens_imu_param.yaml
,会看到计算出来的噪声和零偏的系数值。
如果话题对不上或者录的数据包有问题,会一直卡在这里,无法得出标定的结果,xsens_imu_param
.yaml文件的值全是0。
如果标定成功,会得到本次标定的噪声和零偏的系数值(不为0)。
得到噪声值和零偏值,用测量值减去这个噪声和零偏就是理论上的真值了,可以减少后续计算的误差。
ROS运行roslaunch报错RLException: [turtlebot3_fake.launch] is neither a launch file in package [turtlebot3_fake] nor is [turtlebot3_fake] a launch file name
解决方案:错误原因为环境变量设置有问题,运行source后再运行roslaunch
$ source ~/catkin_ws/devel/setup.bash