0%

ORB-SLAM2环境搭建与运行

本文主要参考该文章

1 Eigen3安装与卸载

1.1 安装

可通过apt命令安装,由于使用源码安装的方式在后续编译ORB-SLAM2 过程中可能会遇到一些问题,因此,本人建议使用apt命令进行安装

1
sudo apt install libeigen3-dev

也可在官网下载eigen3 源码,然后编译安装(本人不推荐该方法,后续会出现程序找不到eigen3的问题):

1
2
3
4
5
6
cd eigen-xxx
mkdir build
cd build
cmake ..
make
sudo make install

版本查看命令:

1
2
❯ pkg-config --modversion eigen3
3.4.0

1.2 卸载

通过apt 方式安装的采用以下方式进行卸载:

1
2
3
4
5
6
## 通过remove 卸载
sudo apt remove libeigen3-dev

## 可通过locate 进一步定位残余文件进行手动删除,并手动删除/usr/local/和/usr/include/目录下的eigen目录
sudo updatedb
locate eigen

通过源码安装的,需要手动删除/usr/local/include/等目录下的eigen3目录:

1
2
3
4
5
6
7
sudo updatedb
locate eigen3 # 查看eigen3的位置
sudo rm -rf /usr/include/eigen3
sudo rm -rf /usr/lib/cmake/eigen3
sudo rm -rf /usr/local//include/eigen3
sudo rm -rf /usr/share/doc/libeigen3-dev
sudo rm -rf /usr/local/share/pkgconfig/eigen3.pc /usr/share/pkgconfig/eigen3.pc /var/lib/dpkg/info/libeigen3-dev.list /var/lib/dpkg/info/libeigen3-dev.md5sums

2 Pangolin 安装与卸载

2.1 安装

首先安装依赖项:

1
2
3
4
5
6
7
sudo apt install libglew-dev
sudo apt install libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt install libboost-all-dev
sudo apt install libwayland-dev wayland-protocols
sudo apt install libxkbcommon-dev
sudo apt install libegl1-mesa-dev
sudo apt install ninja-build

然后下载源码,编译安装

1
2
3
4
5
6
7
8
9
git clone https://github.com/stevenlovegrove/Pangolin.git

## 编译安装
cd Pangolin
mkdir build
cd build
cmake ..
make
sudo make install

然后可在/usr/local/include/和/usr/local/lib/目录下找到pangolin相关的目录及库文件:

pangolin

安装完成后进行测试:

1
2
cd Pangolin/build/examples/HelloPangolin/
./HelloPangolin

出现以下界面说明安装成功:

pangolin success

2.2 卸载

Pangolin 的卸载需要手动删除相关文件:

1
2
3
4
sudo updatedb
locate pangolin
sudo rm -rf /usr/local/include/pangolin
sudo rm /usr/local/lib/libpango_*.so

3 opencv 安装与卸载

分别到opencvcontrib 开发库下载对应版本,注意,两个文件的版本需要保持一致。

3.0 pkg-config

3.0.1 介绍

opencv 多版本管理主要参考文章1文章2,该文章主要利用pkg-config 包管理工具来管理多版本的opencv。

一般用第三方库的时候,就少不了要使用到第三方的头文件库文件。我们在编译、链接的时候必须要指定这些头文件和库文件的位置。对于一个比较大的第三方库,其头文件和库文件的数量是比较多的,如果我们一个个手动地写,那将是相当的麻烦的。因此,pkg-config就应运而生了。pkg-config能够把这些头文件和库文件的位置指出来,给编译器使用。pkg-config主要提供了下面几个功能:

  • 检查库的版本号。 如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件
  • 获得编译预处理参数,如宏定义、头文件的位置
  • 获得链接参数,如库及依赖的其他库的位置,文件名及其他一些链接参数
  • 自动加入所依赖的其他库的设置

如以下命令:

1
gcc -o test test.c `pkg-config --libs --cflags glib-2.0`

其中,—libs 用于指定库文件,—cflags 用于指定头文件

pkg-config 命令基本用法如下:

1
pkg-config <options> <library-name>

3.0.2 配置环境变量

事实上,pkg-config只是一个工具,所以不是你安装了一个第三方库,pkg-config就能知道第三方库的头文件和库文件的位置的。为了让pkg-config可以得到一个库的信息,就要求库的提供者提供一个.pc 文件。例如,本人安装的opencv-4.6.0 中包含了对应的opencv4.pc 文件:

opencv4

首先,将.pc 文件拷贝至pkgconfig 路径下:

1
sudo cp ~/Softwares/opencv/opencv-4.6.0/lib/pkgconfig/opencv4.pc /usr/lib/pkgconfig/opencv4.pc

然后,添加链接库路径:

1
2
3
4
5
6
7
8
## 新建文件并编辑
sudo vi /etc/ld.so.conf.d/opencv4.conf

## 添加链接库路径
/home/echo/Softwares/opencv/opencv-4.6.0/lib/

## 刷新
sudo ldconfig

刷新之后,即可检验相应版本是否添加成功:

1
2
> pkg-config --modversion opencv4
4.6.0

opencv4

相应地,编译工程时即可使用如下命令:

1
g++ -o cv_test cv_test.cpp `pkg-config --libs --cflags opencv4`

3.1 opencv-4.6.0

3.1.1 编译与安装

编译命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/home/***/Softwares/opencv/opencv-4.6.0 \ ## 更换为相应位置
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D WITH_CUDA=ON \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D CUDA_ARCH_BIN=8.6 \ ## 一定更改为显卡对应的算力版本
-D WITH_CUBLAS=1 \
-D OPENCV_EXTRA_MODULES_PATH=/home/***/Softwares/opencv/opencv-4.6.0/opencv_contrib/modules \
-D BUILD_EXAMPLES=ON ..

因为要使用pkg-config 对不同版本的opencv 进行管理,但是opencv4默认将opencv.pc 的产生选项关闭了,查看CMakelist.txt 相关语句如下所示:

1
OCV_OPTION(OPENCV_GENERATE_PKGCONFIG "Generate .pc file for pkg-config build tool (deprecated)" OFF)

所以需将CMakelist.txt 中对应语句的参数改为ON

1
2
## 将对应命令更改如下:
OCV_OPTION(OPENCV_GENERATE_PKGCONFIG "Generate .pc file for pkg-config build tool (deprecated)" ON)

编译成功之后,make、安装:

1
2
make -j13 -w
sudo make install

值得注意的是,由于是安装到了自定义目录下,在利用CMakeLists.txt 进行编译前,需要进行以下操作:

1
2
3
4
5
6
## 将build文件夹中的OpenCVConfig.cmake、OpenCVModules.cmake移至share/opencv4中
sudo cp OpenCVConfig.cmake OpenCVModules.cmake ../../share/opencv4/

## 修改CMakeLists.txt 文件,设置搜寻路径
set(OpenCV_DIR /home/echo/Softwares/opencv/opencv-4.6.0/share/opencv4)
find_package(OpenCV)

3.1.2 多版本控制

按照pkgconfig 版本控制,使用opencv-4.6.0 对自带的示例进行测试,修改CMakeLists.txt 文件:

1
2
3
## 设置搜寻路径
set(OpenCV_DIR /home/echo/Softwares/opencv/opencv-4.6.0/share/opencv4)
find_package(OpenCV)

进行cmake编译并执行:

1
2
3
4
# cmake 过程中会出现相应的版本号、库文件等信息
cmake .
make
./opencv_example

得到如下输出结果,证明安装成功:

opencv-success

同样地,使用g++ 命令进行编译:

1
g++ -o opencv_example example.cpp `pkg-config --libs --cflags opencv4`

执行生成文件,得到与上图相同的结果证明安装成功。

3.2 opencv-3.4.11

编译命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/home/***/Softwares/opencv/opencv-3.4.11 \
-D INSTALL_C_EXAMPLES=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D WITH_CUDA=ON \
-D WITH_CUDNN=ON \
-D OPENCV_DNN_CUDA=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D CUDA_ARCH_BIN=8.6 \
-D WITH_CUBLAS=1 \
-D OPENCV_EXTRA_MODULES_PATH=/home/***/Softwares/opencv/opencv-3.4.11/opencv_contrib/modules \
-D BUILD_EXAMPLES=ON ..

该版本的opencv 会自动在share/OpenCV 文件夹下生成OpenCVConfig.cmake、OpenCVModules.cmake 等文件,所以无需从build 文件夹中进行复制。

其他使用pkg-config 进行多版本控制方法与opencv-4.6.0 一致,在此不做赘述。

3.3 opencv 卸载

首先,到编译目录build 下执行卸载命令:

1
sudo make uninstall

然后,到opencv 的安装目录下,将bin、lib、share、include 等文件删除即可。若不再安装本版本,则将pkg-config 的相关配置清除掉。

4 ORB-SLAM2 编译与运行

4.1 前期准备

在此注明一下本人各个软件包的最终版本如下所示:

1
2
3
opencv: 3.4.11
eigen3: 3.4.0
pabgolin: 0.6

明确完软件包版本后,首先到ORB-SLAM2仓库下载,进入下载的文件夹后对以下文件进行更改:

1
2
3
4
5
6
7
## 对主目录及DBoW2下的CMakeLists.txt 文件中的opencv版本及搜寻路径进行相应修改
set(OpenCV_DIR /home/echo/Softwares/opencv/opencv-3.4.11/share/OpenCV)
find_package(OpenCV 3.4.11 QUIET)


## 对主目录下的CMakeLists.txt 文件中的eigen3 版本进行修改
find_package(Eigen3 3.4.0 REQUIRED)

4.2 编译

按照官方介绍进行编译:

1
2
chmod +x build.sh
./build.sh

正常编译成功的话会在lib 文件夹内生成libORB_SLAM2.so 函数库,在Examples 文件夹内生成对应的可执行文件:mono_tum, mono_kitti, rgbd_tum, stereo_kitti, mono_eurocstereo_euroc。但一般都会有各种报错,这里记录一下本人的报错及相应处理。

  • 首先是可能因为软件包版本问题报错:
1
2
3
4
5
6
## 报错内容:
Pangolin could not be found because dependency Eigen3 could not be found


## 解决方案:
根据网上找的资料,可能是Pangolin和Eigen3的版本问题;按照网上教程,卸载了Pangolin和Eigen3,由于要手动选取版本,所以这里Eigen3选择了源文件安装,但后续又出现了其他问题,故又卸载新安装的Eigen3,重新使用apt安装了Eigen3,所以最终情况是:Pangolin降级为v0.6,Eigen3仍是原来的3.4.0。至此,该问题得到解决
  • 再次编译可能会出现无法找到Eigen3 函数库的报错,此时根据报错内容,将Eigen3 的安装位置:/usr/include/目录下的eigen目录软链接到相应位置即可。
  • 过程中没有其他报错内容,DBoW2、g2o等均编译成功,但最终编译ORB-SLAM2 各个运行程序时会提示:
1
2
3
4
5
6
7
8
9
10
## 输出提示
make: *** No targets specified and no makefile found. Stop.


## 在ORB-SLAM2的issues中找到解决方案:
## 删掉build文件,直接执行build.sh中的最后一步
mkdir build
cd build
cmake ..
make
  • 出现usleep() 未声明的报错:
1
2
3
4
5
6
## 报错内容:
error: ‘usleep’ was not declared in this scope


## 解决方案:在system.h文件中加入
#include <unistd.h>
  • LoopClosing.h中的报错:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## 报错内容:
/usr/include/c++/9/bits/stl_map.h: In instantiation of ‘class std::map<ORB_SLAM2::KeyFrame*, g2o::Sim3, std::less<ORB_SLAM2::KeyFrame*>, Eigen::aligned_allocator<std::pair<const ORB_SLAM2::KeyFrame*, g2o::Sim3> > >’:
ORB_SLAM2/src/LoopClosing.cc:438:21: required from here
/usr/include/c++/9/bits/stl_map.h:122:71: error: static assertion failed: std::map must have the same value_type as its allocator
122 | static_assert(is_same<typename _Alloc::value_type, value_type>::value,


## 解决方案:
修改LoopClosing.h文件中的4950行:
修改前:
typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;
修改后:
typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
Eigen::aligned_allocator<std::pair<KeyFrame *const, g2o::Sim3> > > KeyFrameAndPose;

至此,安装成功,生成了相应的可执行文件。

4.3 运行测试

本处使用了TUM RGB-D 数据集进行测试,测试命令如下:

1
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml ~/datasets/TUM/rgbd_dataset_freiburg1_desk ~/datasets/TUM/rgbd_dataset_freiburg1_desk/associate.txt 

运行界面如下图所示:

orbslam2