首先,第一次安装的是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.
(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没问题了,下载.run文件,直接运行。包名称按照自己下载的补全。
chmod +x ZED_SDK_Linux_*.run
./ZED_SDK_Linux_*.run
安装完后,验证有没有安好。打开usr/local/zed/tools,如果能打开里面的工具,就说明ok了。
参考这位大哥的文章:
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下载后,有两条路,一是不用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
本来觉得一切都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)
编译后就可以正常运行了,参考这位大哥的文章:
ROS单目运行
可是真的是难受,编译通过后,本以为一切都结束了,可以开开心心运行了。结果没想到报错:
orbslam2.so:undefined symbol:…
通过 ldd -r xxx.so 命令查看so库链接状态和错误信息,c++filt symbol 定位undefined symbol。发现orbslam2.so连接的DBoW2库,连接到了我自己安装的DBoW库上了,只需要把我的DBoW2库彻底删除就可以了。这就是为什么前文我说了,一定不要自己手动安装DBOW2跟G2O库,否则他就自己乱连接。
这些内容参考这位大哥的文章:
undefined symbol 问题
之后就可以运行单目了。
最后就是用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
最终全部完成,基本每一步我都遇到坑,感觉是把该踩的都踩了,希望能够帮助自己日后回忆,帮助别的朋友。