ubuntu16.04安装运行PL-SLAM

 

开始之前将 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

ubuntu16.04安装运行PL-SLAM_第1张图片

 

测试的效果如下图所示:

ubuntu16.04安装运行PL-SLAM_第2张图片

 

注: 我在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的配置、安装及运行                                 

你可能感兴趣的:(Ubuntu,SLAM)