在小觅相机深度版上运行VINS遇到的问题及对应的解决方法(含轨迹漂移解决办法)

2023-05-16

最近用小觅的深度版在跑Vins-mono的算法时遇到了各种问题,目前已经成功运行,下面对踩过的坑做一些记录和总结。希望这篇博客可以帮助那些和我一样的初学者尽快在自己的设备上跑起来算法。

首先在拿到小觅相机之后,大概看了一下官方的SDK手册,在github上都有,然后看到可以通过SDK带的函数get_imu_params和get_img_params来获取设备的参数,然后试了一下发现没有任何参数,想可能是出厂没有标定,鉴于小觅官方最近的状况,也没有技术支持,于是只能自己来做标定。

但是!在官方的技术手册上看到可以把自己标定的imu参数写进设备,同时git的SDK中带有一个imu.params的文件,类似于下面这个:

我以为这个是官方标定的该型号imu(BMI088)参数,应该大差不差,于是我就用写入的函数imu_params_writer将上述参数写入了设备(!!!这也是我之后一切噩梦的开始!!!!)

之后我用kalibr和imu_utils去标定imu的随机误差和cam_imu的外参数,在标定cam_imu的外参数时效果并不好,尤其是cam_imu的平移量显然不符合事实,但是并不知道原因,就用标定好的参数去写入到Vins-mono中,结果就是在初始化完成后会迅速飘飞。在网上找了很多资料,比如说平移量需要转换成米制单位啊,小觅的坐标系和vins-mono中的坐标系不统一啊等等,都没有解决我的问题,轨迹依然会很飘,期间也反复标定过多次,效果依然不行。

(之前跑过ORB-SLAM2,效果还不错,没什么问题,因此判断是imu的问题)

后来通过ROS发布的数据观察imu的输出结果,发现加计的输出比较正常,而陀螺的输出则在三轴上不成比例,感觉这就是出现问题的原因所在!

直接说结论吧:最开始写入设备的imu参数是会影响imu的输出结果的,并且在写入后需要插拔一次设备才会生效!(我开始以为往设备里写入imu的参数只是单纯的记录用,不会影响实际imu的输出结果,但其实是会影响的,而且需要重新插拔一次设备才会生效)。可以看到我最开始写入设备的参数中gyro的scale不是单位阵,这也解释了为什么我在ROS中观察gyro发布数据在三轴不成比例的原因。

其实在设备出厂后没有标定的情况下imu的参数应该是像下面这样的:

scale和assembly都是单位阵,其他元素都是0。把这个参数重新写入设备(记得写完后插拔一次),再观察imu发布的数据就是正常的了。在此基础上可以用github上的imu_tk去标定imu的确定性误差,贴上我标定后的结果:

加速度计的:

陀螺仪的:

可以看到assembly和scale都接近于单位阵,bias也不是很大。如果想要获得更高精度的结果,可以把标定后的结果重新写入设备(ps:需要注意的是,写入的参数影响的是imu底层的输出,可通过SDK中带的get_imu来获取,它与ROS中发布的imu信息差了一个gravity倍数的关系,这个可以在get_imu.cc的源码中进行查看,而imu_tk标定的是ROS中imu信息的bias等信息,因此如果想进行矫正的话需要先将imu_tk的标定结果进行一个换算,将换算后的结果写入到设备中即可完成bias和安装误差角等信息的矫正)。

我为了方便测试,没有对imu的确定性误差进行矫正,还是用的原始信息(第二张图片所示)。然后重新用kalibr标定cam_imu的外参,标定的结果就比较让人满意了,部分结果见图:

然后再把这些参数写入vins-mono的配置文件中,重新运行,就可以得到比较理想的效果了,没有发生轨迹无故漂移的现象。(ps:这里我在写入imu随机噪声的参数时用的是离散形式的结果,imu_utils标出来的随机噪声好像是连续形式的,需要自己做一个简单的换算)。

我想如果把标定的imu的确定性误差写入设备进行imu数据的矫正应该会获得更佳的效果吧,但是由于imu的精度较低,可能对结果影响不会很大,因为我没用矫正后的imu数据也获得了很不错的运行效果。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在小觅相机深度版上运行VINS遇到的问题及对应的解决方法(含轨迹漂移解决办法) 的相关文章

随机推荐