ubuntu18.04安装编译运行PL-SLAM

作者开源的代码地址:https://github.com/rubengooj/pl-slam
我的环境:Ubuntu18.04,cmake3.10.2
在安装相关库和项目的过程中出现了不少问题,记录在此. 以下整体上按照代码内README.md的安装流程进行,其中由于stvo-pl的编译安装依赖于MRPT,故调整顺序.且程序运行需要wxWidgets,在MRPT前安装.

注意:
MRPT和stvo-pl解压至pl-slam同级文件夹下,否则需设置一些环境变量来引用两个项目文件的头文件等.

之前在实验室电脑(ubuntu20.04)上配了一下pl-slam运行的环境,但由于之前在实验室电脑上运行过orb-slam2、orb-slam3,导致在安装mrpt时一直报错,无法顺利安装,大概原因是一些库的版本冲突了。重新配一套pl-slam的环境比较麻烦,因此我在自己的电脑上配置pl-slam的环境,最后运行成功。过程非常曲折,出现很多错误,大部分也是一些库的版本冲突导致的,记录如下。

一、各种库的安装

1. OpenCV 3.x.x
作者在github主页上说OpenCV用3.x.x版本就行,但是我试了opencv3.1.0,最后在运行源代码的时候会出现:

/home/hlx/stvo-pl-master/src/matching.cpp:47:79: error: no matching function for call to ‘cv::BFMatcher::create(cv::NormTypes, bool)’
 r<cv::BFMatcher> bfm = cv::BFMatcher::create(cv::NORM_HAMMING, false); // cross

stvo中的matching的第47行会提示只需一个变量但提供俩,可改为下行代码:

cv::Ptr<cv::DescriptorMatcher> bfm = cv::BFMatcher::create("cv::NORM_HAMMING");

但随之的问题是:

/home/fyh/PL_SLAM/stvo-pl-master/lib/libstvo.so:-1: error: undefined reference to `cv::ximgproc::createFastLineDetector(int, float, double, double, int, bool)'

解决方法就是安装opencv3.4.0+opencv_contrib-3.4.0(一定记得版本要对应),应该是opencv3.1.0版本导致的问题。
接下来安装opencv3.4.0:
opencv3.4.0源码地址:https://github.com/opencv/opencv/tree/3.4.0
opencv_contrib-3.4.0源码地址:https://github.com/opencv/opencv_contrib/tree/3.4.0
安装教程参考博客:http://t.csdn.cn/PVbyB

2. Eigen3(3.2.9或者3.2.10)
安装命令:

sudo apt-get install libeigen3-dev

3. Boost
安装命令:

sudo apt-get install libboost-dev

4.YAML(作者测试的版本为 0.5.2)
安装命令:

sudo apt-get install libyaml-cpp-dev

5. g2o
g2o不建议用最新的,因为pl-slam是使用低版本的头文件,新版本中,g2o的指针需要使用std::unique_ptr传递。
g2o的源代码地址:https://github.com/RainerKuemmerle/g2o.git,这里我安装的是20160424发布的版本。
安装依赖:

sudo apt-get install libeigen3-dev libsuitesparse-dev qtdeclarative5-dev qt5-qmake libqglviewer-dev

安装g2o:

cd g2o
mkdir build
cd build
cmake …/
make
sudo make install

6. wxWidgets
安装mrpt时需要依赖 wxWidgets,因此在安装mrpt前先安装 wxWidgets。
作者推荐的mrpt版本依赖的wxWidgets版本为2.8,但由于wxWidgets2.8年代过于久远,在ubuntu18.04中输入:

sudo add-apt-repository ppa:nilarimogard/webupd8 
sudo apt-get update
sudo apt-get install libwxgtk2.8-dev

会出现:

正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
E: 无法定位软件包 libwxgtk2.8-dev
E: 无法按照 glob ‘libwxgtk2.8-dev’ 找到任何软件包
E: 无法按照正则表达式 libwxgtk2.8-dev 找到任何软件包

无法安装成功。经测试,安装wxWidgets3.0版本也可正常安装mrpt并切也能运行pl-SLAM。
推荐使用命令行安装:

sudo apt install libwxgtk3.0-gtk3-dev

7. mrpt(一定要使用作者推荐的版本)
作者推荐版本的地址:https://github.com/MRPT/mrpt/tree/0c3d605c3cbf5f2ffb8137089e43ebdae5a55de3
安装依赖库:

//安装依赖库,其中有些库如果已经安装,不必重复安装. 
$ sudo apt-get install build-essential pkg-config libdc1394-22-dev libjpeg-dev libsuitesparse-dev libftdi-dev freeglut3-dev zlib1g-dev libusb-1.0-0-dev libudev-dev libfreenect-dev  libavformat-dev libswscale-dev libassimp-dev libgtest-dev libpcap-dev
//进入MRPT码包
$ mkdir build
$ cd build 
$ cmake ..
$ make -j12
$ sudo make install

如果安装了多个版本的opencv,建议使用cmake-gui ..命令,在cmake可视化界面修改opencv库文件的地址,使用opencv3.4.0版本,然后编译mrpt。

在安装MRPT的过程中出现如下错误:

CMake Error at cmakemodules/script_detect_gcc.cmake:16 (LIST):
  list GET given empty list
Call Stack (most recent call first):
  CMakeLists.txt:83 (include)


CMake Error at cmakemodules/script_detect_gcc.cmake:17 (LIST):
  list GET given empty list
Call Stack (most recent call first):
  CMakeLists.txt:83 (include)

究其原因是:因为GCC版本过高
所以操作:1.打开MRPT源文件中cmakemodules/script_detect_gcc.cmake的文件将其中的 “dumpversion” 替换为 “dumpfullversion”
参考链接:https://blog.csdn.net/qq_40679814/

在编译的时候遇到问题:

 /home/hlx/mrpt/apps/ReactiveNavigationDemo/reactive_navigator_demoMain.cpp:1042:102: error: ‘wxTE_AUTO_SCROLL’ was not declared in this scope

解决方法:

这是因为wxWeights高版本去掉了改定义,在头文件定义即可:
在reactive_navigator_demoMain.h文件中加入

#ifndef wxTE_AUTO_SCROLL
#define wxTE_AUTO_SCROLL 0
#endif

二、运行stvo-pl

stvo-pl源代码地址:https://github.com/rubengooj/stvo-pl
进入stvo-pl文件夹,执行:./build.sh,如果无操作权限,修改即可sudo chmod 777 build.sh

报错/usr/bin/ld: can not find -lg2o_ext_csparse 解决办法:

cd /usr/local/lib
sudo ln -sv libg2o_csparse_extension.so libg2o_ext_csparse.so

linux系统动态链接参考博客:https://blog.csdn.net/jc_benben/article/details/113945860

在执行系统的时候一直提示找不到g2o库,在确定已经安装g2o的情况下在CmakeList.txt文件中find_package(G2O REQUIRED) 之前添加以下俩条语句:

list( APPEND CMAKE_MODULE_PATH /home/xqs/3rdparty/g2o/cmake_modules ) 
set(G2O_ROOT /usr/local/include/g2o)

运行程序时候MRPT开启之后一段时间发生段错误退出界面,需要修改CmakeList.txt中:

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3 -mtune=native -march=native")
修改为
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3 -mtune=native")

如果出现段分割错误,需要按照下述要求在sceneRepresentation.cpp中修正。

I dig deeper and find that v_aux_ are always holding the same value
with v_aux, thus no need to differentiate them. Therefore, I replace
v_aux_ with v_aux and comment this line v_aux_ = v_aux; , so are the
other two variables v_auxgt_ and v_aux1_ .

ubuntu18.04安装编译运行PL-SLAM_第1张图片

三、运行pl-slam

pl-slam源代码地址:https://github.com/rubengooj/pl-slam
进入pl-slam文件夹,执行:./build.sh,如果无操作权限,修改即可sudo chmod 777 build.sh

若安装多个版本的opencv,记得在build文件夹下使用cmake-gui ..,在cmake 可视化界面修改opencv的文件路径,使用opencv3.4.0版本。

出现问题:

Invalid vocabulary for points

修改/config/config/config_kitti.yamlsrc/slamConfig.cpp文件中的 vocabulary_p 和vocabulary_l为自己电脑下的绝对地址。

# Loop closure
#vocabulary_p          : "/home/ruben/code/pl-slam-dev/vocabulary/mapir_orb.yml"
#vocabulary_l          : "/home/ruben/code/pl-slam-dev/vocabulary/mapir_lsd.yml"

vocabulary_p          : "/home/xqs/PL-SLAM/stvo-pl/vocabulary/mapir_orb.yml"
vocabulary_l          : "/home/xqs/PL-SLAM/stvo-pl/vocabulary/mapir_lsd.yml"

若运行kitti数据集00序列,在第1600帧处失败,并报错:

./plslam_dataset: symbol lookup error: /home/xqs/PL-SLAM/pl-slam/lib/libplslam.so: undefined symbol: _ZN3g2o30OptimizationAlgorithmLevenbergC1EPNS_6SolverE

经过网上检索相关博客,发现是由于ROS自带的g2o版本与本地按照的版本存在冲突,这个冲突问题可以通过linux自带的ldd命令检查出来,首先检测能运行成功的例子的依赖项。下图是能正常使用的g2o示例文件的依赖项:
ubuntu18.04安装编译运行PL-SLAM_第2张图片
报错文件的依赖项:
可以看到,不知何原因,这一个程序链接到了ROS自带的g2o库文件。
解决方法:将ros目录下的库文件移动到其他文件夹里,让系统检索不到它们,从而只链接到usr目录下的库文件。具体的操作步骤如下:
1、首先进入ros的目录下:cd /opt/ros/melodic
2、使用管理员权限创建备份目录:mkdir back_lib
3、在终端输入以下命令将库文件移动到备份目录下:sudo mv ./lib/libg2o*.* ./back_lib/
4、检查一下是否移动成功:ls back_lib
5、重新编译程序并检查其依赖项,可以看到程序链接到正确的库文件并正常执行。
参考博客链接:https://blog.csdn.net/mclinrv/article/details/120257414

四、运行数据集

1、kitti数据集:
1、 将数据集的保存路径添加到环境变量:

gedit ~/.bashrc
export DATASETS_DIR=/home/xqs/PL-SLAM/pl-slam/kitti
source ~/.bashrc

2、复制pl-slam/config/dataset_params/kitti00-02.yaml/sequences/00/,重命名 yaml 文件为dataset_params.yaml
3、编辑 pl-slam/config/config/config_kitti.yaml, 修改vocabulary_p vocabulary_l的路径。

# Loop closure
#vocabulary_p          : "/home/ruben/code/pl-slam-dev/vocabulary/mapir_orb.yml"
#vocabulary_l          : "/home/ruben/code/pl-slam-dev/vocabulary/mapir_lsd.yml"

vocabulary_p          : "/home/xqs/PL-SLAM/pl-slam/vocabulary/mapir_orb.yml"
vocabulary_l          : "/home/xqs/PL-SLAM/pl-slam/vocabulary/mapir_lsd.yml"

4、运行:

./plslam_dataset ../kitti/00 -c ../config/config/config_kitti.yaml -o 100 -s 1 -n 1000

或者:

./plslam_dataset ../kitti/00 -c ../config/config/config_kitti.yaml -o 100 -s 1

参考博客:https://blog.csdn.net/u011178262/article/details/86562125

2、EuRoC MH_01_easy
edit ~/.bashrc, and add export DATASETS_DIR=
copypl-slam/config/dataset_params/euroc_params.yamlto /mav0/,
rename the yaml file to dataset_params.yaml and change it if necessary
source ~/.bashrc
run ./imagesStVO ../MH_01_easy/mav0
参考链接:https://zhuanlan.zhihu.com/p/157900327

参考链接:

  1. https://blog.csdn.net/yanni0616/article/details/81017120
  2. https://blog.csdn.net/wyy13273181006/article/details/108807570
  3. https://blog.csdn.net/Wenyue_Wang/article/details/82318484
  4. https://blog.csdn.net/u011178262/article/details/86562125
  5. /usr/bin/ld: cannot find -l 基本原理解释与解决方法https://blog.csdn.net/boyhoodme/article/details/125097384

你可能感兴趣的:(c++,linux)