提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
基于安卓手机的ORB-SLAM3的调试运行
前言
安卓手机集成了惯性与视觉信息,作为一个轻量化的平台能够作为ORB-SLAM3的载体进行运行,作为一个slam的初学者,本文仅作为一个学习过程中遇到的各种问题以及相应的处理经验记录,如果有更好的方法也欢迎进行交流。
一、手机与PC的链接
本人参考博文https://blog.csdn.net/h_372101/article/details/108235178中提供的第二个软件APP实现电脑与手机之间的连接。首先输入roscore启动ros,将手机与电脑处于同一个网络之下,利用命令ifconfig获取当前的IP地址,并将手机软件中的localhost删除,输入上一步获取的IP地址即可完成电脑与手机之间的连接。下图中标红的位置即位对应的IP地址。
二、topic转换
在完成手机与PC之间的连接之后,打开终端输入rostopic list查看当前的topic,其具体结果如下图
可以看出此时输出的话题为compressed即压缩格式,进行slam时需要将其还原为raw格式进行,此时输入以下代码进行转换(每个人的topic可能不同,需要根据情况进行调整)
rosrun image_transport republish compressed in:=/camera/image raw out:=/camera/image_raw
此时再使用rostopic list即可观察到多了一个/camera/image_raw.
三、相机标定
根据ORB-SLAM3的使用方法,当使用相机的时候需要输入对应的yaml文件,因此需要对其进行标定,方法很多比如matlab拍摄照片直接用matlab进行标定或者使用kalibr进行标定,此处本人参考https://blog.csdn.net/weixin_44401286/article/details/109641268中的内容对于手机相机进行标定,注意修改对应代码中对应的topic信息即可完成相机的标定。并利用标定的信息编写对应的yaml文件,我用的是mate20手机故命名为mate20.yaml。此处仅对相机进行了标定,若需运行惯性加视觉还需要对于手机惯性传感器进行标定。
四、ORB-SLAM3运行
根据手机集成的传感器,其可以进行Mono以及Mono-inertial的运行。以上两项的运行分别需要修改/Examples/ROS/ORB_SLAM3/src中的ros_mono.cc与ros_mono_inertial.cc中对于topic的订阅信息,如下图所示,将订阅的topic修改为/camera/image_raw
ros_mono.cc
ros_mono_inertial.cc
在完成以上修改后,记得在ORB_SLAM3-master文件夹下打开终端,输入./build_ros.sh进行ros的重新build。
完成以上的所有修改后,若运行单目则在orb文件夹下输入
rosrun ORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples/Monocular/mate20.yaml
若运行单目+惯性则输入
rosrun ORB_SLAM3 Mono_inertial Vocabulary/ORBvoc.txt Examples/Monocular/mate20.yaml
本来到这个地方都是比较顺利的,但是此时不幸的踏入了一个深深的坑,运行程序后屏幕上一直显示waiting for image没有图像显示,我本以为是图像的订阅问题,一方面检查orb-slam3中的订阅的topic是否有错,另一方面则是利用rviz查看对应topic的输出情况,但是奇怪的是在rviz中数据是能够正常的输出的,但是orb-slam3中仍然是黑屏waiting for images,接下来便是漫长的寻找问题所在的过程。
在经过漫长的原因寻找后,终于发现了问题所在
对于image_raw数据的带宽进行查询发现有60~90MB之间,怀疑数据带宽过大导致数据传输造成了一定的影响,毕竟输出的raw格式图片对于数据传输造成了极大的压力。
为了解决该问题,此处将相机输出的图片大小进行调节,查看低带宽的情况下数据传输是否堵塞。
由于本人属于小白,该问题也是困扰了一段时间才解决,最后参考博文http://gizmosmith.com/2018/09/24/configuring-video-cropping-and-resizing-with-ross-image_proc/中老哥的写法,运用image_proc/resize对于图片的分辨率进行调整以降低带宽的压力,以下为参考博文所写的launch文件
<!-- 对于图像大小进行缩放 -->
<launch>
<!-- Video resizing -->
<node pkg="nodelet" type="nodelet" args="standalone image_proc/resize" name="resize_img">
<!-- remap input topics -->
<remap from="image" to="camera/image_raw"/>
<remap from="camera_info" to="camera/camera_info"/>
<!-- remap output topics -->
<remap from="resize_image/image" to="camera_resize/image_raw"/>
<remap from="resize_image/camera_info" to="camera_resize/camera_info"/>
<!-- remap output topics -->
</node>
<node name="$(anon dynparam)" pkg="dynamic_reconfigure" type="dynparam" args="set_from_parameters resize_img">
<param name="use_scale" type="int" value="0" />
<param name="width" type="int" value="760" />
<param name="height" type="int" value="360" />
</node>
</launch>
原始的输出图像分辨率为1520760,我将其缩小的原始图像分辨率的1/2即760390,其对应的topic为resize_image/image,注意后文的topic修改。完成程序的编写后启动相应的节点,具体的输出情况利用rqt进行观察。
image_raw输出的原始图像
通过压缩过后的图像输出,可以看出此时输出图像大小受到了压缩。
值得注意的是到这步并不能够直接利用经过压缩后的图像进行orb-slam3的运行,由于resize之后相机的参数发生了变化,因此参考前文的做法对于相机进行再次标定。对ros_mono.cc与ros_mono_inertial.cc中对于topic的订阅信息进行修改并重新进行build。
在完成了以上所有的步骤后即可对于orb-slam3进行运行
大功告成(激动)。
总的来说利用手机运行orb-slam3是一个较为繁琐的过程,不过需要在测试过程中保持一定的耐心。文章来源:https://www.toymoban.com/news/detail-450159.html
总结
总的来说利用手机运行orb-slam3是一个较为繁琐的过程,网上参考别人的教程的时候很可能一个地方没写清楚就容易踏进一个大坑。不过需要在测试过程中保持一定的耐心最后总是能解决对应的问题的。文章来源地址https://www.toymoban.com/news/detail-450159.html
到了这里,关于基于安卓手机的ORB-SLAM3的调试运行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!