作者开源的代码地址: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源代码地址: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_ .
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.yaml
和src/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示例文件的依赖项:
报错文件的依赖项:
可以看到,不知何原因,这一个程序链接到了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
到
,重命名 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.yaml
to
,
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