Advertisement

(十一)ORBSLAM2在ROS下运行

阅读量:

ORBSLAM2运行ROS节点障碍

ORBSLAM2提供了与ROS集成的应用程序,并将其安置在独立的ROS文件夹内。同样地,它还提供了一组与ROS无关联的应用程序,但这些应用主要用于特定场景的研究和发展。然而,在实际操作中,默认情况下并未将其配置为ROS服务端模式,因为这需要额外的操作步骤较为复杂且不直观。由于笔者所使用的摄像头通过ROS接口提供了OpenNI2支持,因此在处理相机主题时,默认情况下ORBSLAM2即可接收到相应的图像数据。但在运行过程中遇到了一些挑战,因此在此对整个流程进行了详细总结

问题1:ROS路径设置的问题

问题2:cv_bridge的opencv版本冲突的问题;


ROS路径设置的问题

在ORBSLAM2中配置了rosbuild_init()函数,在进行编译操作之前,请确保已正确关联好工作区间的配置。然而,在ORBSLAM2提供的文档中,并未提供像ROS那样的package.xml或devel等常见文件。因此,在开始编译操作时遇到了诸多困惑与疑问。

直接编译会显示ORBSLAM2路径冲突之类的问题,具体错误是:

[rosbuild] rospack detected package 'ORB_SLAM2' at empty string, but the current directory is "/home/xiaoC/ORB_SLAM2/Examples/ROS/ORB_SLAM2"

显然,在此路径中放置了ORBSLAM2。出现的错误信息表明ROS环境配置失败了。

因此,笔者首先在~/.bashrc上设置了路径:

复制代码
 sudo vim ~/.bashrc

    
 export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/xiaoC/ORB_SLAM2/Examples/ROS
    
 source ~/.bashrc

注意,后面这个path是笔者的路径,不同用户路径不同。

理论上讲这个方案能正常工作。但令人惋惜的是,并非如此。如何判断是否能正常工作呢?通常情况下是可行的。

理论上讲这个方案能正常工作。但令人惋惜的是,并非如此。如何判断是否能正常工作呢?通常情况下是可行的。

复制代码

当终端呈现了笔者刚加入的路径信息时,则表明ROS路径配置已经完成;然而,并未达到预期的效果。

具体可以参考:https://github.com/raulmur/ORB_SLAM2/issues/url

后来

复制代码
    sudo vim setup.bash 
    export ROS_PACKAGE_PATHROS
    source setup.bash

同样地,在线服务系统中我们可以使用以下两种方法来验证用户权限配置是否正确其中一种则是通过调用相应的接口函数另一种则是在服务端设置相应的权限控制策略

复制代码

如果能进入这个文件夹,说明我们路径设置成功了。

具体可以参考:https://www.cnblogs.com/xy123001/p/6918334.html

于是,通过这个设置,笔者便把ROS编译这关通过了。


cv_bridge的opencv版本冲突的问题

接下来就是一个重大的挑战问题, 对我们来说确实是个难题. 整个下午的时间里一直没能解决它. 吃完晚饭后返回, 终于找到了解决办法. 由此可见, 当一个人的精神食粮较为贫乏时, 借助于通过实质性的食物摄入来激发创意灵感往往能够取得不错的效果.

这个问题主要出现的位置是,在笔者运行RGBD节点的时候:

复制代码

出现的问题主要是由于OpenCV版本冲突所导致。实际上,在进行编译时就已经给出了相关提示信息:

复制代码
    . . .
    [ 33100100objectros_stereo.cc.o
    Building CXX objectros_mono.cc.o
    Building CXX objectros_rgbd.cc.o
    Linking CXX executable ..Mono
    3.02.4
    [100] Built target Mono
    Linking CXX executable ..RGBD
    Linking CXX executable ..Stereo
    3.02.4
    [100] Built target RGBD
    3.02.4
    [100

对于笔者而言,并未给予过多关注与过多纠结便直接跳过了相关问题。尽管如此,在编程过程中认为编译顺利通过也大致上没有问题。毕竟从程序员的角度出发, warnings 并不足为奇, error 占据了主要位置才是让人真正需要重视的地方。

在深入探究原因后发现:用于编译ORBSLAM2的OpenCV版本为3.2.0版;而Ros Indigo内默认配置使用的是OpenCV 2.x系列版本。当启动ROS节点进行操作时,程序调用的是名为liborbslam2.so的动力学链接库文件;该动态链接库依赖于OpenCV 3.2.0模块;因此导致与cv_bridge(连接到Ros Indigo中的OpenCV 2.x模块)之间产生冲突的具体问题。具体出现的问题如下:

复制代码
    in2.48740
    terminate called after throwing an instance of 'cv::Exception'
    what(): 2.487405in function cvGetFileNodeByName
    
    Aborted (core dumped)

为了更好地看到问题是什么,笔者在RGBD所在节点下看了一下链接情况:

复制代码
     grep opencv
    libopencv_imgproc.so.2.42.40x00007f67d053f000)
    libopencv_highgui.so.2.42.40x00007f67d02f4000)
    libopencv_core.so.2.42.40x00007f67cfebc000)
    libopencv_core.so.3.23.20x00007f67ced2b000)
    libopencv_imgproc.so.3.23.20x00007f67cd4f7000)
    libopencv_contrib.so.2.42.40x00007f67cac9b000)
    libopencv_calib3d.so.3.23.20x00007f67c4db9000)
    libopencv_features2d.so.3.23.20x00007f67c4ae7000)
    libopencv_highgui.so.3.23.20x00007f67c48da000)
    libopencv_features2d.so.2.42.40x00007f67c24fd000)
    libopencv_calib3d.so.2.42.40x00007f67c2266000)
    libopencv_ml.so.2.42.40x00007f67c1fee000)
    libopencv_video.so.2.42.40x00007f67c1d9a000)
    libopencv_objdetect.so.2.42.40x00007f67c1b1f000)
    libopencv_flann.so.3.23.20x00007f67ba0c1000)
    libopencv_imgcodecs.so.3.23.20x00007f67b9e80000)
    libopencv_flann.so.2.42.40x00007f67b980b000

可以看出,
这是一个让人感到棘手的链接库集合,
其中包含了OpenCV 3.2.0版本,
以及OpenCV 2.4.x版本。
笔者花了不少时间去研究和完善这个模块。

显然地,在GitHub上的问题仍然处于未解决的状态:https://github.com/raulmur/ORB_SLAM2/issues/118]

也有部分解决方案在这里:https://github.com/raulmur/ORB_SLAM2/issues/103

但是这种方案同样无法有效解决问题。但这种方案同样无法有效解决问题。然而这会带来诸多不便所以我决定放弃这一方案转而寻找更为可行的解决办法。此外重建系统同样不可行因为这意味着需要重新安装操作系统这对于已经习惯了现有配置的人来说实在是不小的压力舍近求远得不偿失因此继续探索其他可能的解决方案

有三个比较有参考价值的回答:

1. <>

2. https://github.com/introlab/rtabmap/issues/86

3. https://www.cnblogs.com/cv-pr/p/5366764.html

建议我们卸载原始的cv_bridge,然后重装新版本:

复制代码
    getbridge
    git clone https://github.com/ros-perception/vision_opencv.git

注意,上面是在ROS的工作区间中运行的。

于是,ORBSLAM2的ROS节点便可以运行了。


实际运行情况

1. RGBD

首先, 我使用的设备是华硕RT-Gen1 RGB-D相机. 主要依靠ROS提供的内部参数进行配置, 并在ORBSLAM2的配置文件中调整Asus.yaml中的相关参数设置. 值得注意的是, 标定深度相机的难度较大.

然后就是跑起来了,效果如下(由于没办法插入视频,笔者就只能放图片了):

该算法在实验中的表现非常出色。然而,在进一步测试中发现,在纯色背景下的快速运动场景下,并且面对部分遮挡以及明暗突变的情况时

白墙现象确实是个难题。这是因为ORBSLAM2采用了基于角点信息的方法,在缺乏纹理信息的情况下就难以提取足够的特征点。值得注意的是,在快速移动时从高密度纹理区域过渡到低密度区域也会导致丢失关键特征,并且必须往回走并依靠重新定位来恢复状态。

此快速运动之定义因情况而异,请依据自身具体情况实施测试。我的观点是,在本研究中将快运视为帧率以上的运动更为合理——即基本快运指超出帧率的速度水平,在这种情况下容易丢失其追踪目标(笔者观察到)。然而即使存在重叠区域,在速度减缓至一定程度仍可实现定位调整(这在实验结果中得到了印证)。

遮挡:笔者还试着用手去阻挡相机,在短暂的时间内ORBSLAM2依然能够实现定位成功;尽管如此但笔者只是进行了大约几秒钟的手动遮挡操作

光照变化:笔者于晚上的实验中,在开灯时完成了首次定位,在随后关闭灯光后发现ORBSLAM未能恢复定位(即ORBSLAM2一下就丢失了),但即便开灯后也能重新恢复定位(即重新定位成功)。从代码的角度看,在连续未达到定位要求的帧数时(即当连续未达到定位要求的帧数超过一定值时),ORBSLAM2就会判定当前位置丢失并启动重定位或重置初始化过程

2. AR

除了基于RGB-D的节点外(或者:除了基于RGB-D实现的节点之外),作者还进行了Mono-AR这一节点的测试(或者:对Mono-AR这一技术模块也进行了测试)。其中参数设置仍来源于Asus.yaml文件(或者:其中参数配置仍然参考自Asus.yaml文件)。在后续实验中,默认使用Xtion RGB相机作为数据采集设备(或者:在后续的数据采集过程中,默认采用了Xtion品牌的RGB相机)。深度数据并未被利用(或者:深度信息未被应用)。

跑起来的效果如下:

在启动初期感觉困惑不已,为何一直无法定位?原来是因为ORBSLAM2对单目相机进行Initialization的要求极其严格,只有在特定条件下才能完成这一过程,因此,在一个纹理丰富的区域停留片刻后,随后略微进行了轻微的平移操作,这才使相机完成了Initialization.接下来就是放置模型的过程了.

该AR系统在定位效果方面表现出色;同时指出上述RGBD方案也存在不足之处;因此无需过多赘述;我们期待各位读者能在现有基础上取得新的进展。

明白不再进行总结。基于这篇博客的内容来源于笔者昨天运行程序所做的笔记整理。旨在帮助读者更好地理解和学习。

PS:

如您所愿, 如果觉得我的博客对你有帮助, 也期待您的关注!另外, 如需转载文章, 烦请您注明出处: [链接]

对于本文中的任何问题,您可以在该论坛的留言区进行交流或询问.此外,在泡泡机器人论坛: http://paopaorobot.org/bbs/index.php?c=cate&fid=1的SLAM技术交流模块中,您也可以在此发布问题或参与讨论.

我的github链接是:https://github.com/yepeichu123/orbslam2_learn

转载于:https://www.cnblogs.com/yepeichu/p/10896201.html

全部评论 (0)

还没有任何评论哟~