笔者是在Windows 10 的笔记本利用VMware 搭建虚拟机Ubuntu 20.04,在Ubuntu上配置ORB_SLAM2算法,耗时两天,记录一下自己心酸的历程(本人刚开始学习SLAM一个月,真正零基础教程,希望本文能帮到有需要的人)。
(1)神州笔记本电脑,配置如下:
处理器:Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz 2.59 GHz
机带RAM:16.0 GB
(2)虚拟机设置:
硬盘:80 G(强烈建议弄大一点,因为之后数据集动不动几个G,小了的话加起来很麻烦,本人就因为刚开始设小了,后面卸载重装了虚拟机 :-( )
内存: 8 G
处理器:8
https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.html
https://ubuntu.com/download/desktop
(18条消息) VMware虚拟机快速安装Ubuntu教程_liwu的博客-CSDN博客_ubuntu虚拟机安装教程
强力安利赵虚左老师的这个课【奥特学园】ROS机器人入门课程《ROS理论与实践》零基础教程_哔哩哔哩_bilibili 宝藏视频,讲解的很详细;
课程文档:http://www.autolabor.com.cn/book/ROSTutorials/
此过程借鉴了以下大神的博客:
(18条消息) ORB_SLAM2配置过程_Mr.Andy的博客-CSDN博客
(18条消息) Ubuntu16.04下配置ORB-SLAM2与运行单目实例_未见青山老。的博客-CSDN博客
在配置过程中需要cmake、gcc、g++和Git工具。可在终端通过以下命令下载。
sudo apt-get install cmake
sudo apt-get install git
sudo apt-get install gcc g++
Pangolin是对OpenGL进行封装的轻量级的OpenGL输入/输出和视频显示的库。可以用于3D视觉和3D导航的视觉图,可以输入各种类型的视频、并且可以保留视频和输入数据用于debug。
在安装Pangolin之前,先要安装必要的依赖项:
sudo apt-get install libglew-dev
sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt-get install libpython2.7-dev
安装完依赖项后可以通过以下命令安装Pangolin:
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build
cd build
cmake -DCPP11_NO_BOOSR=1 ..
make
备注:原博主漏了cd Pangolin;虚拟机性能不好,最好不使用 make -j 。
可以通过一下命令来安装Eigen库。
sudo apt-get install libeigen3-dev
ORB_SLAM2所要求的OpenCV版本大于2.4.3,但并不是版本越新越好,笔者一开始装的是最新的OpenCV-4.5.3但后面SLAM编译过程中会找不到OpenCV的包,后面看网上很多人用2.4.11成功了,但我本人也失败了,最后尝试3.4.1版本成功!
OpenCV 官方下载地址:https://opencv.org/releases/
英文好的可参考官方文档:OpenCV: Installation in Linux
也可借鉴此博客:(18条消息) ubuntu安装opencv的正确方法_陶陶name-CSDN博客_ubuntu安装opencv
看别人安装一帆风顺,自己是一波三折。执行下面这条语句时,问题很多。
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
第一个问题:错误:E: 无法定位软件包 libjasper-dev
解决方案:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
成功的解决了问题,其中libjasper1是libjasper-dev的依赖包。参考:(18条消息) ubuntu20.04安装opencv步骤及依赖报错:E: 无法定位软件包 libjasper-dev_BigData_Mining的博客-CSDN博客
第二个问题:Eigen/Eigenvalues: No such file or directory
出现如图报错,解决办法:在文件 OpenCV3.4.1/cmake/OpenCVDetectCXXCompiler.cmake中,将“dumpversion”更改为“dumpfullversion”。参考:(18条消息) ubuntu安装opencv3.10遇到的坑_qiqzhang的博客-CSDN博客
第三个问题:fatal error: stdlib.h: No such file or directory
解决方案:gcc 的弱微改动导致找不到,在cmake时,关闭cuda和预编译头文件即可。
sudo cmake ./ -DWITH_CUDA=OFF -DENABLE_PRECOMPILED_HEADERS=OFF
参考:(18条消息) Ubuntu 18.04 编译OpenCV 问题解决stdlib.h: No such file or directory_Mr_Yoky的博客-CSDN博客
第四个问题:make : ***[all] Error 2 (编译到97%失败了,吐血,忘记截图了)
解决方案:
sudo nano opencv-x.x.x/modules/python/src2/cv2.cpp
opencv-x.x.x是opencv路径(char *)PyString_AsString(obj);
参考:(18条消息) 【树莓派】安装opencv报错:make : *** [all] Error 2_newbee_man的博客-CSDN博客;
(18条消息) 树莓派安装opencv详细过程及遇到常见问题解析_山重水复疑无路@的博客-CSDN博客_树莓派opencv安装(这里还有一些在编译不同时间报错的解决方式,我没遇到,贴出来帮助有缘人了)
至此,OpenCV-3.4.1安装完毕。
选择放置ORB_SLAM2工程的文件夹(如果需要在ROS环境下运行ORB_SLAM,最好将工程放在catkin_ws/src文件夹下),在该文件夹中打开终端,执行一下命令:
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
cd ORB_SLAM2
chmod +x build.sh
./build.sh
然后不出所料,果然报错了。 :-( 第一个问题:error:'usleep' was not declared in this scope
解决方案:
在所有遇到错误的脚本中添加头文件:
#include
参考:(18条消息) compile error:usleep was not declared in this scope_hairuiJY-CSDN博客
第二个问题:error:static assertion failed:std::map must have the same value_type as its allocator
解决方案:
在ORB_SLAM2的安装路径下打开 /include 文件夹 在 LoopClosing.h 中修改(第49-50行):
// typedef map,
// Eigen::aligned_allocator > > KeyFrameAndPose;
typedef map,
Eigen::aligned_allocator > > KeyFrameAndPose;
参考:(18条消息) ORB_SLAM编译过程记录_qq_35604674的博客-CSDN博客
至此,ORB_SLAM2 算法编译完成。
如果需要在ROS环境下运行ORB_SLAM,则需要执行一下命令:
chmod +x build_ros.sh
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/catkin_ws/src/ORB_SLAM2/Examples/ROS
./build_ros.sh
如果机器性能较低,可以将build.sh文件和build_ros.sh文件中的命令:
make -j
全部改为:
make
然而编译失败了,笔者还没解决,解决后会再更新。
编译完成后会在ORB_SLAM2/Examples文件夹下生成各种可执行文件。我们以单目情况为例,展示如何运行ORB_SLAM2程序。
可以从这个网址下载Tum数据集:https://vision.in.tum.de/data/datasets/rgbd-dataset/download#
下载完成后解压缩,最好放到 ORB_SLAM2 的路径下。
官方建议第一次实验使用“xyz”系列,动作比较小,只覆盖办公桌,成功后可尝试“desk”数据集。本文采用的就是第一条数据集(如图)。
执行下边的命令。 把 TUMX.yaml
改成 TUM1.yaml,TUM2.yaml or TUM3.yaml 与 freiburg1, freiburg2 and freiburg3 对应起来. 把路径 PATH_TO_SEQUENCE_FOLDER
改为数据集文件夹路径
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml PATH_TO_SEQUENCE_FOLDER
例如:我下载的数据集是 单目的(Monocular),名称是 rgbd_dataset_freiburg1_xyz ,则我的路径为:
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml /home/lucas/ORB_SLAM2/data/rgbd_dataset_freiburg1_xyz
运行截图如下:
运行结果如图,会生成 KeyFrameTrajectory.txt 文件。
算法效果如下图:
参考:(18条消息) ORB_SLAM2跑TUM——单目和RGBD数据集_xyt723916的博客-CSDN博客
以上只完成了ORB_SLAM2的冰山一角,但对于小白的我已经甚感欣慰了,接下去试着在ROS中跑ORB_SLAM2,以及尝试用笔记本自带的摄像头进行实时计算。
— Lucas_ly 写于2021.8.5
For 诗