开始之前将 pl-slam, stvo-pl, MRPT三个库的源码放在同一级目录下,不然需要添加环境变量
1. 运行pl-slam文件下的 build.sh 文件,出现 找不到 libstvo.so
1.1需要先编译安装stvo-pl (stvo-pl地址)
1.1.1按照上面的提示依次安装eigen3, boost, MRPT等库
a. eigen3 之前安装了,没什么错误
b. boost 我按照命令行安装的,但是后面会出现问题,比如我 的出现
error: ‘next’ is not a member of ‘boost’
经排查是它默认搜索的是ros目录下安装的boost, 所以将ros下的boost库卸载后重新用命令行安装,
关于boost库如何卸载的可以参考: 如何安装和卸载boost库
方法如下
# 查看已安装的boost库的版本
$ dpkg -S /usr/include/boost/version.hpp
#比如我的返回 libboost1.58-dev:amd64: /usr/include/boost/version.hpp
#然后卸载
$ sudo apt-get autoremove libboost1.58-dev
#卸载之后重新命令行安装
$ sudo apt-get install libboost-dev
c. 下面安装YAML, 按照提示安装:
$ sudo apt install libyaml-cpp-dev
安装时没问题,编译 stvo-pl时提示,
yaml-cpp/build/libyaml-cpp.a: error adding symbols: Bad value
这是因为 stvo-pl 调用了yaml-cpp的共享库(也有叫动态库的,即libyaml-cpp.so这个文件,一般安装
在/usr/local/lib/下),而我只有yaml-cpp的静态库(即libyaml-cpp.a这个文件)。
原因在于我在编译yaml-cpp时没有选择编译共享库,其默认编译是生成静态库。参考其README文件,使用-
DBUILD_SHARED_LIBS=ON 参数来编译。
所以修改编译方式后重新编译:
$ cd [build path of yaml-cpp]
$ cmake -DBUILD_SHARED_LIBS=ON ..
$ make
$ sudo make install
参考:【ros_problems】编译velodyne_poiontcloud提示yaml-cpp出错解决办法
这个yaml就安装好了
d. 然后安装MRPT, 源码主页上提示说最好安装制定版本,就下载指定版本然后安装,下载地址: MRPT
安装方法可以参考MRPT主页
e. 安装line_descriptor, 这个不用单独安装,执行 build.sh脚本时就会自己安装了。
f. 然后进入stvo-pl 源码目录 执行 build.sh 还是报错,提示 ximage_proc.so 找不到。
经检查,发现是stvo-pl 依赖的是 opencv3 和 opencv_contrib. 因此需要重新下载opencv_contrib模块,和opencv3
重新联合编译。
参考: Ubuntu16.04 安装Opencv3.4.0 + Opencv_contrib3.4.0
源码编译opencv时可能出现 ippicv 和 face_landmark_model.dat 下载不下来的问题,可以参考:
ubuntu16.04 安装opencv IPPICV 和 face_landmark_model.dat下载不下来的问题解决
g. 安装好opencv 和 opencv_contrib模块后就可以编译了。
再次在stvo-pl源码目录下执行build.sh 就可以编译成功了。
2. 现在再回到pl-slam源码目录下, 执行 build.sh
a. 提示cmake 找不到g2o.cmake
Could not find a package configuration file provided by "G2O" with any of th
因此需要再pl-slam源码目录下的 CMakeLists.txt 中修改一下配置,在第七行添加如下内容。
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/3rdparty/g2o/cmake_modules")
b. 重新编译,g2o能找到了,又提示,找不到CHOLMOD,在usr/local/inlcude 确实没有,错误提示如下:
/pl-slam/include/mapHandler.h:40:55: fatal error:
g2o/solvers/cholmod/linear_solver_cholmod.h: No such file or directory
其实cholmod本来在安装g2o时应该被装到/usr/local/include/g2o/solvers/cholmod里面的,但是点进去发现缺少这个玩
意,发现自己只是想当然直接再g2o包里cmake+make+make install 就可以了,也怪安装的时候它不报错,原因就是没
有老老实实安装g2o github官网里给明的依赖项,G2O-github
$ sudo apt-get install cmake libeigen3-dev libsuitesparse-dev libqt4-dev qt4-qmake libqglviewer-dev
先安装如上依赖,再重新编译安装g2o,安装完后 这个目录下 /usr/local/include/g2o/solvers/cholmod 就有
linear_solver_cholmod.h这个文件了,就可以了。
参考: 安装g2o注意的问题 找不到CHOLMOD
c. 重新编译提示,找不到slamConfig.h ,需要修改如下目录下对应配置文件的目录
~/src/slamConfig.cpp内vocabulary_p和vocabulary_l 地址修改.
~/config/config/config_kitti.yamlvocabulary_p和vocabulary_l 地址修改.
d. 提示如下错误:
mapHandler.cpp:3968:101: error: no matching function for call to
‘g2o::OptimizationAlgorithmLevenberg::OptimizationAlgorithmLevenberg(
g2o::BlockSolver_6_3*&)’
打开对应的文件,修改
//g2o::BlockSolver_6_3::LinearSolverType* linearSolver;
//linearSolver = new g2o::LinearSolverCholmod();
//g2o::BlockSolver_6_3* solver_ptr = new g2o::BlockSolver_6_3(linearSolver);
//g2o::OptimizationAlgorithmLevenberg* solver = g2o::OptimizationAlgorithmLevenberg(solver_ptr);
std::unique_ptr linearSolver(
new g2o::LinearSolverCholmod());
std::unique_ptr solver_ptr(
new g2o::BlockSolver_6_3(std::move(linearSolver)));
g2o::OptimizationAlgorithmLevenberg* solver =
new g2o::OptimizationAlgorithmLevenberg(std::move(solver_ptr));
将上面四行注释,修改为下面的,此处为了方便看,中间添加了回车,复制粘贴的时候需要注意。,此错误需要修改两处,分别为:
pl-slam/src/mapHandler.cpp:3968:101:
pl-slam/src/mapHandler.cpp:4193:77:
修改完后就可以编译成功了。
3. 下载数据集测试
下载的数据集较大,可以到网盘下载:链接: https://pan.baidu.com/s/1eEct4XnnoNJfJzHQhp5REA 提取码: 35mw
下载其中的 data_odometry_gray/sequence/00 的数据集
将数据集的保存路径添加到环境变量
如保存的路径为: home/KITTI
gedit ~/.bashrc
export DATASETS_DIR=~/KITTI
source ~/.bashrc
然后转到pl-slam的可执行文件目录下 ,执行
./plslam_dataset KITTI/00
如果编译MRPT时没有安装wxWidgets的话会出现:
Initializing PL-SLAM....terminate called after throwing an instance of 'std::logic_error'
what():
=============== MRPT EXCEPTION =============
void mrpt::gui::CBaseGUIWindow::createWxWindow(unsigned int, unsigned int), line 95:
MRPT compiled without wxWidgets!
void mrpt::gui::CBaseGUIWindow::createWxWindow(unsigned int, unsigned int), line 97:
Aborted
需要下载安装wxWidgets, 然后重新编译安装MRPT
下载 wxWidgets https://github.com/wxWidgets/wxWidgets (3.1也没问题,需要再后面修改一下)
下载后,进入源代码目录下
./configure --with-opengl --enable-debug --enable-unicode && make && make install
另: 在安装完wxWidgets 时 提示 需要运行 ldconfig
这时候需要运行一下ldconfig
sudo ldconfig
参考: Ubuntu 16.04.4 编译PL-SLAM (stereo)
安装完成后修改MRPT源文件中 的 头文件,添加一个定义: (不添加会出现如下错误)
/home/usrname/mrpt/apps/ReactiveNavigationDemo/reactive_navigator_demoMain.cpp:
1042:102: error: ‘wxTE_AUTO_SCROLL’ was not declared in this scope
//在reactive_navigator_demoMain.h文件中加入
#ifndef wxTE_AUTO_SCROLL
#define wxTE_AUTO_SCROLL 0
#endif
参考: ubuntu16.04 下配置運行 PL-SLAM
添加后重新编译 MRPT,编译成功后,再次运行
./plslam_dataset KITTI/00
就可以开始测试了。
注: 如果是在clion下运行的话,需要在run 选项里配置一下输入参数和环境变量, 如下图所示,就可以直接在clion下运行了。
run->Edit configrations
测试的效果如下图所示:
注: 我在CmakeList.txt 做了如下修改
SET(BUILD_SHARED_LIBS ON)
SET(CMAKE_MODULE_PATH $ENV{CMAKE_MODULE_PATH})
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3 -mtune=native -march=native")
修改了编译选项,将第四行修改为第三行。具体编译选项的含义参考如下链接:
http://blog.sina.com.cn/s/blog_b4ef897e0102vdqa.html
if(HAS_MRPT)
set(MRPT_DONT_USE_DBG_LIBS 1) #use release libraries for linking even if "Debug" CMake build
FIND_PACKAGE(MRPT REQUIRED base opengl gui hwdrivers)
add_definitions(-DHAS_MRPT)
endif(HAS_MRPT)
把set 那一行换到了FIND_PACKAGE上面一行
至此,环境就配置好了,并且测试结果也有了。
参考: PL-SLAM的配置、安装及运行