由于电脑的两个硬盘都存着数据,没法腾出来一个安装双系统,所以无奈只能在虚拟机上跑SLAM。这两天边看高博的《SLAM十四讲》,边熟悉Ubuntu,遇到了许多问题,但也磕磕绊绊配置运行上了ORB-SLAM2。在此记录下配置过程和出现的一些错误,仅供参考。
在配置过程中需要cmake、gcc、g++和git工具,这是最基本的工具了,不安装后面要报错的。可以直接在桌面右击打开终端进行安装。git的安装需要一些额外的配置,比如生成SSH密钥,填写你的github账号等,网上有许多这里不再一一赘述。
sudo apt-get install cmake
sudo apt-get install git
sudo apt-get install gcc g++
Pangolin是对OpenGL进行封装的轻量级的OpenGL输入/输出和视频显示的库。可以用于3D视觉和3D导航的视觉图,可以输入各种类型的视频、并且可以保留视频和输入数据用于debug。也就是说Pangolin是一个可视化用户界面。
首先要安装一些Pangolin所需要的依赖库:
sudo apt-get install libglew-dev
sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt-get install libboost-all-dev
sudo apt-get install libpython2.7-dev
然后可以进行Pangolin的安装:
git clone https://github.com/stevenlovegrove/Pangolin.git
mkdir build
cd build
cmake -DCPP11_NO_BOOSR=1 ..
make -j
在这时如果出现“make:*** 没有指定目标并且找不到makefile. 停止”这样的错误,要看一下具体的错误文字指向哪个文件。我当时是指向xkbcommon。
于是安装这个库:
sudo apt-get install libxkbcommon-x11-dev
OpenCV最低版本为2.4.3,我下载的是OpenCV 3.1.0。首先还是安装依赖库:
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
然后在OpenCV的官网上下载好压缩包,解压,然后编译安装:
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=Release –D CMAKE_INSTALL_PREFIX=/usr/local ..
$ make
$ sudo make install
编译过程会花费较长时间。第四行的命令,电脑CPU性能较低的建议用make命令;CPU性能较高的可以使用make -jx,x代表线程,可加速编译。
安装依赖时有可能会出现错误,不过会提示解决方法,按提示更改一下命令就好了。另外需要一个额外的包:
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt install libjasper1 libjasper-dev
最后在CmakeLists里面,将这一行代码:
find_page(opencv 版本号)
#修改为
find_page(你自己的opencv 版本号)
Eigen库是一个对矩阵进行操作的库,封装了好多矩阵操作。
sudo apt-get install libeigen3-dev
一般的库由头文件和库文件组成。Eigen头文件的默认位置在 “usr/include/eigen3” 中。如果不确定,可以输入以下命令查找:
sudo updatedb
locate eigen3
相比于其他库,Eigen的神奇之处在于,它是一个纯用头文件搭起建起来的库。这意味着你只能找到它的头文件,而没有.so或.a那样的二进制文件。在使用时只需引入Eigen的头文件即可,不需要链接库文件(因为它没有库文件)。要使用Eigen库,需要在cmake工程中的CMakeLists.txt文件中指定Eigen的头文件目录:
#添加Eigen库头文件
include_directories("/usr/include/eigen3")
ORB-SLAM2可以去github上下载,或者是直接用git命令下载:
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
如果你的机器性能比较低的话(我就是),建议将build.sh文件和build_ros.sh文件中的命令“make -j”改为“make”,这样在编译时会只使用有限的线程,从而不会让虚拟机卡死,我当初就没改然后虚拟机卡死好多遍…
然后进入ORB-SLAM2的文件夹中打开终端,输入:
chmod +x build.sh
./build.sh
在编译时可能会出现这个错误:
CMakeFiles/RGBD.dir/build.make:119: recipe for target 'CMakeFiles/RGBD.dir/src/ros_rgbd.cc.o' failed
make[2]: *** [CMakeFiles/RGBD.dir/src/ros_rgbd.cc.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/RGBD.dir/all' failed
make[1]: *** [CMakeFiles/RGBD.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2
解决方法:打开Thirdparty/g2o/g2o/solvers/linear_solver_eigen.h,做如下修改:
#原代码
typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, SparseMatrix::Index> PermutationMatrix
#修改为
typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, int> PermutationMatrix
还可能会出现usleep错误:
error: ‘usleep’ was not declared in this scope usleep(3000);
解决方法:
在source文件的开头增加
#include
需要修改的source文件有:
Examples/Monocular/mono_euroc.cc
Examples/Monocular/mono_kitti.cc
Examples/Monocular/mono_tum.cc
Examples/RGB-D/rgbd_tum.cc
Examples/Stereo/stereo_euroc.cc
Examples/Stereo/stereo_kitti.cc
src/LocalMapping.cc
src/LoopClosing.cc
src/System.cc
src/Tracking.cc
src/Viewer.cc
在解决完错误之后就可以下载数据集使用ORB-SLAM2啦。
有TUM、KITTI、EuRoC三种数据集,我是使用的TUM数据集,从下面这个网址下载:http://vision.in.tum.de/data/datasets/rgbd-dataset/download
下载好之后解压出来是一个tar文件,可以使用如下命令解包:
# tar -xvf archive_name.tar.gz
然后进入ORB-SLAM2的文件夹打开终端,输入以下命令运行:
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml PATH_TO_SEQUENCE_FOLDER
注意其中PATH_TO_SEQUENCE_FOLDER为数据集的存储路径,并将tumx.yaml与下载的数据集对应,那个tumx的x代表数字。比如TUM1.yaml,TUM2.yaml 和TUM3.yaml 分别对应 freiburg1, freiburg2 和 freiburg3。
然后就运行成功啦!
本文、本次配置借鉴了下面的文章:
https://blog.csdn.net/learning_tortosie/article/details/79881165
https://blog.csdn.net/u014709760/article/details/85253525
https://blog.csdn.net/Xuesengxinyi/article/details/82113544