Ubuntu18.04+ROS melodic环境下 运行ORB-SLAM2(Mono与ZED相机)深度踩坑


事件发生过程:本来ROS下运行ORB-SLAM2是一件非常简单的事情,但是在亲自操作过程中,居然步步受阻,每一步都会有一些不知名的问题干扰你。第一次运行时,卡在CUDA驱动那里,因为卸载CUDA驱动失败,因此只好重新安装ubuntu。第二次配置中却蹦出来很多新的问题,找也找不到,最终只能从一些蛛丝马迹中层层分析,找到解决问题的办法,深刻体会到一个系统一个脾气。写篇文章,作为忘记时候的回忆,也希望帮助更多朋友。

CUDA 10安装问题及解决方案

首先,第一次安装的是CUDA 10.2,但是在安装ZED SDK3.1.2(CUDA10.2 Ubuntu18)时候,提示:libusb库冲突,意思是我的ros要用2.0.21版本但是ZED SDK3.1.2要用更低的版本好像是****17版,具体数字忘记了。网上给了很多方案,可能有效的是使用sudo sudo aptitude install xxxx命令,系统会给出降级处理方案。本来是挺好,但是运行后,发现系统给出方案要卸载我的ROS melodic,这当然不可以。这就导致我安装的ZED SDK3.1.2是不完全安装。但是我使用位于usr/local/zed/tools 里的ZED_Diagnostic工具,所有选项通过,证明usb依赖库是可以的。我苦思不得其解时,贴心的师兄告诉我,我们买的ZED是一年前买的,这个SDK更新了5 6几个小版本,一个大版本,建议我不要用CUDA10.2,最好用CUDA10。我觉得在理,便下载了ZED SDK3.1.2(CUDA10 Ubuntu18),以及cuda_10.0.130_410.48_linux.run安装包,准备重装CUDA。结果之前我的CUDA10.2是用网络版本deb格式安装的,没有卸载脚本,手动卸载后,残留痕迹,但之CUDA 10 无法安装,被逼无奈,选择重装系统。
安装ubuntu18.04 我借鉴的是这位大哥的文章:
Ubuntu18.04安装
一路顺风顺水,唯一不同的是空间给的都比较大,交换空间好像是20G,系统引导1G,/空间20G,usr划分35G的空间,剩余将近200G全部给home。因为第一次整个ubuntu才100G用了几个月明显不够。因此此次按照自己的习惯给的比较充裕。
CUDA10 下载cuda_10.0.130_410.48_linux.run,安装参考这位i大哥的文章:
CUDA10安装
跟别人不同的是,我遇到了很多人没遇到依赖库文件缺失问题,参考上面链接的操作补库即可。也遇到显卡驱动的问题,很多文章说都要禁用 nouveau驱动得加黑名单等一大堆操作。实际上Ubuntu18.04已经不需要这样做了。
具体流程如下:

(1)在软件与更新里,选择附加驱动,系统会自动识别与我们电脑相配的Nvidia驱动版本,注意CUDA10得大于410版本。我系统里推荐435,就选了435.
我在附加驱动选择NVIDIA 435(2)补库

sudo apt-get install freeglut3-dev libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev

(3)验证run文件是否可用

md5sum cuda_10.0.130_410.48_linux.run

(4)关闭再打开图形界面,我感觉不影响,但是还是跟着做了

sudo systemctl set-default multi-user.target
sudo reboot

sudo systemctl set-default graphical.target
sudo reboot

(5)运行.run
注意,ctrl+c跳过说明;accept接受;千万千万别安装NVIDIA410,一定要选 n

sudo sh cuda_10.0.130_410.48_linux.run

(6)安装环境变量

vim ~/.bashrc
在打开的文件里添加三行
export CUDA_HOME=/usr/local/cuda
export PATH=$PATH:$CUDA_HOME/bin
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

(7)使其生效

source ~/.bashrc

(8)看看生效没

cat /proc/driver/nvidia/version

(9)验证生效没

cd ~/NVIDIA_CUDA-10.0_Samples/1_Utilities/deviceQuery
sudo make
./deviceQuery

ZED SDK 3.1.2 for Ubuntu18 CUDA10

这次再安装ZED-SDK没问题了,下载.run文件,直接运行。包名称按照自己下载的补全。

chmod +x ZED_SDK_Linux_*.run
./ZED_SDK_Linux_*.run

安装完后,验证有没有安好。打开usr/local/zed/tools,如果能打开里面的工具,就说明ok了。

ROS melodic安装问题及解决方案

参考这位大哥的文章:
ROS melodic安装
安装ROS melodic一般没问题,但是我就是这么与众不同。全部安完到了 sudo rosdep init这一步,却告诉我找不到这个命令。我就纳了闷了,搜了半天找到一个命令输入后才好,原来是少安装了几个包。呢必须安排:

sudo apt-get install python-rosdep python-wstool ros-kinetic-ros 

安装完我自以为一切完美,结果,sudo rosdep init却提示错误。换了热点,换网都不行。搜索一大圈,一位外网大哥指出明路。sudo rosdep init 这两个命令运行后,会连接一个网站:raw.githubusercontent.com ,发现我们打不开网页,呢根本不可能下载了。这是因为这个网页被墙了需要添加网页的IP地址再尝试,多尝试几次。

#打开hosts文件
sudo gedit /etc/hosts
#在文件末尾添加
151.101.84.133  raw.githubusercontent.com
#保存后退出再尝试

再运行

sudo rm /etc/ros/rosdep/sources.list.d/20-default.list 
sudo rosdep init
rosdep update

最后终于好了。

ORB-SLAM2编译问题及解决方案

ORB-SLAM2下载后,有两条路,一是不用ROS,二是用ROS。不用ROS很容易。安装库,安完执行bash build.sh。刚开始我不知道,就自己手动安装了DBoW2,g2o库,其实千万别安装他们俩。

在ROS环境下,正常情况下,不是什么难事情,参考这位大哥:
ROS 编译 ORB-SLAM2
可是,我真的就是万里挑一的鬼才,所有问题都能碰到。ROS里编译时候,我直接一上来就执行 ./build_ros.sh。发现没通过,报错内容是:
CMakeFiles/Makefile2:430: recipe for target ‘CMakeFiles/Mono.dir/all’ failed

没有规则可制作目标

我去,我搜了很多网页发现没人遇到这个傻逼问题,我很纳闷,解决不了之际,突然想到,要不要先把非ROS版本编译以下,通过后再编译ROS版本。
所以我执行了./build.sh,编译了非ROS版本。

结果发现,报错一大堆,都是usleep函数没有找到头文件的错误:
error: ‘usleep’ was not declared in this scope
非常多,我赶紧把 #include <unistd.h>都一一加在报错的文件中。

本来觉得一切都ok了,继续执行./build_ros.sh。又双没通过,
报错:DSO missing from command line
解决办法:在Examples/ROS/ORB_SLAM2/Cmakelist.txt 的文件后面加入两句话:
target_link_libraries(Stereo boost_system boost_filesystem)
target_link_libraries(RGBD boost_system boost_filesystem)

ORB-SLAM2的Mono运行问题及解决方案

编译后就可以正常运行了,参考这位大哥的文章:
ROS单目运行
可是真的是难受,编译通过后,本以为一切都结束了,可以开开心心运行了。结果没想到报错:
orbslam2.so:undefined symbol:…
通过 ldd -r xxx.so 命令查看so库链接状态和错误信息,c++filt symbol 定位undefined symbol。发现orbslam2.so连接的DBoW2库,连接到了我自己安装的DBoW库上了,只需要把我的DBoW2库彻底删除就可以了。这就是为什么前文我说了,一定不要自己手动安装DBOW2跟G2O库,否则他就自己乱连接。
这些内容参考这位大哥的文章:
undefined symbol 问题
之后就可以运行单目了。

ORB-SLAM2的Stereo(ZED)运行问题及解决方案

最后就是用ZED相机运行双目slam。正常情况下参考这位大哥:
ORB-SLAM2的运行
可是我的电脑就是这么有个性,继续出错。在运行了

rosrun ORB_SLAM2 Stereo Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml true

后,提示 double free or corruption (out)段错误。因为之前运行过非ROS版本的双目。所以问题一定出在ROS/stereo.cc文件上。这个文件主要是订阅,发布话题,还有矫正图像。发现上面这位大哥命令里有一个true,这个意思是需要矫正图像。实际上ZED提供矫正后的图。所以我把true改为false,即调用:

rosrun ORB_SLAM2 Stereo Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml false

结果就好了。段错误一般都是野指针呀,内存泄漏呀这些问题。估计是作者在这里没有处理好指针什么的吧。后面再研究吧。

下来就是安装 zed-ros-wrapper,调用ZED相机,参考官网:
ZED ROS GETTING START

==然后调用完后,本以为就正常了,结果发现,程序正常了,但是ORB-SLAM2没有图像输入。那么问题一定在话题上,结果打开rqt,发现ZED的话题并不是:/zed/left/image_raw_color,而是:/zed/zed_node/left… 所以重新修改话题名称,打开ROS/stereo.cc

message_filters::Subscriber<sensor_msgs::Image> left_sub(nh, "/zed/zed_node/left/image_rect_color", 1);
message_filters::Subscriber<sensor_msgs::Image> right_sub(nh, "/zed/zed_node/right/image_rect_color", 1);

因为不要矫正,所以选择ZED矫正后的图像话题,再次调用stereo:

rosrun ORB_SLAM2 Stereo Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml false

最终全部完成,基本每一步我都遇到坑,感觉是把该踩的都踩了,希望能够帮助自己日后回忆,帮助别的朋友。

  • 10
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值