从零开始跑ORB_SLAM2(一) 前期准备与环境配置

前期准备

工作环境:
PC:i5-8265U 8GRAM 核显 弟弟CPU
相机:Intel-Realsense D435
环境:Ubuntu16.04 LTS+ ROS Kinect

如何安装Ubuntu16.04:

可以参考下我自己整理的从零开始跑ORB_SLAM2(零) 安装Ubuntu16.04 LTS

在Ubuntu18.04下踩过的一些坑(废话太长不看)
  1. 安装pcl库一开始选择了官方预编译版本,报错后找了教程说需要修改source.list,但是普通用户下该文件是只读,在命令行中。先注册一个未列出账户获取root权限,在路径 /etc/apt/sources.list.d 中把文档内的bionic全部改为xenial或者干脆注释掉,并将后缀改为 .bak ,在软件更新里面把相关项全部被删除。但是重新编译的时候又冒出来了,所以放弃了官方预编译版本。
  2. PCL库下示例代码无法测试的原因是,根据Kdevelop报错提示是 /home/point/io 下某些头文件无法找到。解决办法:使用 sudo ln -sf 指令将缺少的对应路径的头文件镜像到pcl的次级目录下(类似与超链接)。
  3. g2o的部分代码需要改动(博客上有g2o的BUG集合)
  4. 最想吐槽自己的一点:安装完Ubuntu18.04后没有查看内核版本,结果安装了4.3.x的内核。跑SLAM需要 4.4.x/4.8.x/4.10.x/4.13.x/4.15.x 的内核版本,重新编译内核是做不到的了,所以选择把整个系统干掉,重新安装了16.04,这次是4.15.x的版本
    查看内核版本:uname -r
安装完应该做的事情

安装git

sudo apt-get install git

编译器:gcc7与g++7,你也可以自行安装4/5/6等版本
这里数值上的100是优先级,多版本gcc/g++共存的时候可以自行调整优先使用的版本。

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update 
sudo apt-get install gcc-7
sudo apt-get install g++-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
sudo update-alternatives --config gcc
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 100
sudo update-alternatives --config g++

查看安装版本:

gcc --version
g++ --version

安装cmake

sudo apt-get install cmake

安装IDE:Kdevelop4

sudo apt-get install kdevelop

不建议汉化,可能会出一些小问题。就当培养自己基本的英文阅读能力吧!

其他注意事项

1、make -j问题:在编译各种库的时候,安装指南可能会让你把make -j改成make,理由是不容易崩溃。事实上,make -j的j后面跟一个数字n,这个n的意思是同时调用n个编译指令进行编译的意思。这样可以显著加快编译的速度,一般这个数字是CPU核心数目的两倍为宜,再高就没有意义了。由于笔者是个脑残,曾经像智障一样用make -j32/j64甚至j128来看看会发生什么事情,但是速度上与j16几乎一样。现在为了稳定我一般使用的指令是make -j4。如果j后面不跟数字则不限制同时调用的数量,默认为最大值。
2、还是make -j的问题,可以预见的是,这样除了加快编译速度,也更大地占用了运行内存。请看一条很常见的报错:

c++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See  for instructions.
gmake[2]: *** [CMakeFiles/tdcore.dir/td/telegram/MessagesManager.cpp.o] Error 4
gmake[1]: *** [CMakeFiles/tdcore.dir/all] Error 2
gmake: *** [all] Error 2

这条报错的意思很明显,运行内存不够,溢出了。比如在编译库某个部分时需要9G的RAM,电脑只有8G,自然就崩溃了。这时候就需要虚拟内存来充当一部分RAM(注意这个内存的速度是相当慢的,尽量少用)。
Ctrl + Alt + T 新建一个命令行:
swapfile的大小是bs*count,这里分配了2G:

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048

创建交换空间文件:

sudo mkswap /swapfile

启动刚刚分配的交换空间(虚拟内存):

sudo swapon /swapfile

此时重新编译就不担心溢出了(我在编译pcl的时候把虚拟内存调整到了16G)
当编译完成后,停用这部分虚拟内存(或者调整得小一点):

sudo swapoff /swapfile

删除虚拟内存

sudo rm /swapfile

虚拟内存的更多参考资料:
ubuntu速度慢的原因之内存和swap分区
什么是Swap交换分区

3、sudo aptitude install

在接下来要介绍的许多库的安装过程中,一个常见的BUG是:

无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系

这种情况一般有三种方法来解决,第一种是直接在CSDN上搜,一般你遇到的问题有人已经解决了 ;或者你可以更换一个镜像源,但是大多数情况它并不管用;最后也是比较好用的方法是用aptitude命令安装,它会智能分析依赖项之间的关系树,并且给出几种可能的解决方案规避冲突供你选择。
首先安装aptitude:

sudo apt-get install aptitude

然后你就可以用aptitude指令代替apt-get:

sudo aptitude install ×××

aptitude 在处理依赖问题上更佳一些。举例来说,aptitude 在删除一个包时,会同时删除本身所依赖的包。这样,系统中不会残留无用的包,整个系统更为干净。
如果解决方案中仍然存在未解决的依赖,可以在界面选择 n,aptitude 会重新计算可行方案,包括对已存在的包进行降级等。

4、善于阅读官方的英文教程、包括GitHub上的Readme、以及后面的博客要介绍的D435相机的使用等等,由于CSDN上一部分问题上你抄我我抄你的现象还是比较普遍的,大家都不知道问题在哪,这时候只有官方文档是最靠得住的。虽然笔者英语实在是烂,但还是要建议大家敢于啃英文说明书、文档等,这样说不定能解决在CSDN教程上解决不了的许多BUG。
.

配置SLAM:安装需要的库与依赖项

对于库的描述参考了高翔的《视觉SLAM十四讲》

Eigen

Eigen是一个C++开源线性代数库。它提供了快速有关于矩阵的线性代数运算,还包括解方程等功能。许多上层的软件库也使用Eigen进行矩阵运算,包括g2o、Sophus等。Ctrl + Alt + T 新建一个命令行:

sudo apt-get install libeigen3-dev

Eigen3的神奇之处在于它是一个纯头文件搭建起来的库,所以使用的时候只需要声明,不需要链接库文件。
Eigen的版本最好是3.2.x,如果是3.3.x可能会造成ORB_SLAM编译不成功。如果sudo安装的不是3.2.x只能去官网下载。Eigen的安装路径默认是/usr/include/eigen3。
查看Eigen的安装路径:

locate eigen3

参考:查看Eigen安装版本

Sophus

Sophus库主要用于支持李代数操作,包括 SO(3)、SE(3)、SO(2)、SE(2),此外还有相似变换 Sim(3) 的内容。它是直接在Eigen基础上开发的,不需要安装额外的依赖项。Ctrl + Alt + T 新建一个命令行:

git clone https://github.com/strasdat/Sophus.git
cd Sophus
git checkout a621ff
mkdir build
cd build
cmake ..
make -j8
sudo make install

OpenCV

OpenCV提供了大量的开源图像算法,是计算机视觉中使用极广的图像处理算法库,在Ubuntu下使用从源代码安装的方式来安装,SLAM最低要求2.4.1版本,我们使用3系的。
我安装的是3.1.1版本,其他版本大致相仿,过程参考以下链接:
OpenCV3.1.1官方下载地址
OpenCV3.1.1官方文档介绍
安装过程可参考这篇文章,与3.1.1大同小异:(注意文中提到的依赖项)
OpenCV3.0.0官方安装指南
你也可以直接通过git+cd+mkdir+cmake+make+install的那一套来安装。
最后别忘了将OpenCV的库添加到路径:

sudo gedit /etc/ld.so.conf.d/opencv.conf 

在文件末尾添加:

/usr/local/lib 

PCL

相机拼接点云需要用到PCL库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。其代码更新非常活跃,至今在不到一年的时间内从1.0版本已经发布到1.7.0版本。
Ctrl + Alt + T 新建一个命令行:
安装一些依赖项:

sudo apt-get update  
sudo apt-get install git build-essential linux-libc-dev  
sudo apt-get install cmake cmake-gui   
sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev  
sudo apt-get install mpi-default-dev openmpi-bin openmpi-common    
sudo apt-get install libflann1.8 libflann-dev  
sudo apt-get install libeigen3-dev  
sudo apt-get install libboost-all-dev  
sudo apt-get install libvtk5.10-qt4 libvtk5.10 libvtk5-dev  
sudo apt-get install libqhull* libgtest-dev  
sudo apt-get install freeglut3-dev pkg-config  
sudo apt-get install libxmu-dev libxi-dev   
sudo apt-get install mono-complete  
sudo apt-get install qt-sdk openjdk-8-jdk openjdk-8-jre  
sudo apt-get install libopenni-dev 
sudo apt-get install libopenni2-dev

把源码git到本地,编译安装(cmake也可以只cmake ..)

git clone https://github.com/PointCloudLibrary/pcl
cmake -D CMAKE_BUILD_TYPE=None -D BUILD_GPU=ON -D BUILD_apps=ON -D BUILD_examples=ON 
make -j
sudo make install 

Ceres与g2o

Ceres-solver 是谷歌开发的一款用于非线性优化的库,官网上的文档非常详细地介绍了其具体使用方法。其面向通用的最小二乘问题的求解。
Ctrl + Alt + T 新建一个命令行:
安装一些依赖:

sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3.1.2 libgflags-dev 
sudo apt-get install libgoogle-glog-dev libgtest-dev

编译安装;

git clone https://github.com/ceres-solver/ceres-solver
mkdir build 
cd build
cmake ..
make -j
sudo make install

对于g2o,高博有一篇写得非常好的介绍:深入理解图优化与g2o
安装一些依赖:

sudo apt-get install libeigen3-dev libsuitesparse-dev qtdeclarative5-dev
sudo apt-get install qt4-dev  
sudo apt-get install qt4-qmake libcxsparse3.1.2 libcholmod-dev
sudo apt-get install libqglviewer-dev 

编译安装:

git clone https://github.com/RainerKuemmerle/g2o.git  
cd g2o  
mkdir build   
cd build    
cmake .. 
sudo make install   

Pangolin

Pangolin在普通环境和ORBSLAM2环境下安装的步骤有一定的区别,只需要看这几篇文章然后对照着安装就可以成功。在后期创造工作空间的时候可能还需要重新在该路径下下载编译一次,在此先放上参考链接。
Ubuntu16.04安装配置Pangolin
Ubuntu16.04下安装Pangolin
Ubuntu安装Pangolin 过程
ORB_SLAM2之Pangolin的安装与问题处理

glfw3

Ctrl + Alt + T 新建一个命令行:
安装一些依赖:

sudo apt-get install libxcursor-dev
sudo apt-get build-dep glfw
sudo apt-get install cmake xorg-dev libglu1-mesa-dev

GitHub官网下载地址
解压后编译安装:

cd glfw3  
mkdir build   
cd build    
cmake .. 
sudo make install  

DBoW3

Ctrl + Alt + T 新建一个命令行:
DBoW3是一个词袋,选用它的原因是因为其对OpenCV的兼容性较好,且编译和使用都较容易上手。与g2o一样,在后期使用改进版的ORBSLAM2时(with_pointcloud版本),下载的包自带了DBoW3。

git clone https://github.com/rmsalinas/DBow3  
cd  DBow3
mkdir build   
cd build    
cmake .. 
sudo make install   

DBoW3的GitHub官网:https://github.com/rmsalinas/DBow3

Octomap

相比较数据量庞大的点云,Octomap以八叉树的形式存储地图,在这里简单介绍一下:
点云地图有几个明显的缺陷:规模很大,一副640像素*480像素的图像会产生30万个空间点,即使经过滤波,依然需要很大的存储空间,而且这些点中包含了大量的冗余;点云无法处理运动物体。基于此,建图时使用Octomap八叉树地图则足够灵活、可压缩,而且可以随时更新。八叉树节省空间的关键在于:在八叉树中,我们在节点中存储的是它是否被占据的信息,而当某个方块的所有子节点都被占据或者都为空时,就没必要展开这个节点。例如一开始地图是空白的时候,我们只需要一个根节点,不需要完整的树,向地图中添加信息的时候,由于实际物体经常连在一起(比如空白的地方都连在一起),所以大多数八叉树的节点无须展开到叶子层面,所以说八叉树比点云节省了大量空间。
笔者在实现SLAM的时候,由于学校项目时间紧凑,没有认真研究Octomap,在直接跑ORBSLAM2的时候似乎并没有用到这个库,有懂行的朋友请在评论区指点,先谢过各位大神!
更详细的介绍请看:高翔:SLAM拾萃——Octomap

Ctrl + Alt + T 新建一个命令行:
安装一些依赖:

sudo apt-get install build-essential cmake doxygen libqt4-dev \
libqt4-opengl-dev libqglviewer-qt4-dev

Git源码到本地,编译安装:

git clone https://github.com/OctoMap/octomap
mkdir build
cd build
cmake ..
make

有兴趣的朋友可移步官网:Octompa-1.8.0
ROS下关于Octomap的使用官方文档:ROS Node API

至此SLAM环境的配置就基本完成了。

等有空继续补坑:

(二)配置ROS环境

(三)ORB_SLAM2稀疏点阵的实现

(四)ORB_SLAM2点云地图的实现(待实现)

(五)Vins-Mono 港科大开源方案的实现(待实现)

你可能感兴趣的:(从零开始跑ORB_SLAM2(一) 前期准备与环境配置)