Ubuntu 16.04.4 编译PL-SLAM (stereo)

本文为复现一篇论文的开放源码。

《PL-SLAM: a Stereo SLAM System through the Combination of Points and Line Segments》

Gomez-Ojeda R, Zuñiga-Noël D, Moreno F A, et al. PL-SLAM: a Stereo SLAM System through the Combination of Points and Line Segments[J]. 2017.

开源代码地址:https://github.com/rubengooj/pl-slam/

作者的代码说明:https://github.com/rubengooj/pl-slam/blob/master/README.md

博客主页:https://blog.csdn.net/xs1102

文章地址:https://blog.csdn.net/xs1102/article/details/80757404

开始配置

一、配置环境

1、编译安装opencv3,参考文章:https://blog.csdn.net/xs1102/article/details/74729416

2、安装Suite Sparse

这个是为了解决找不到cholmod.h头文件的问题,Eigen/CholmodSupport头文件中会调用此文件,所以必须安装。Eigen和g2o都依赖此库,这个在官方文档中有说明。

但该库的编译依赖于OpenBLAS开源库。OpenBLAS是高性能多核BLAS库,是GotoBLAS2 1.13 BSD版本的衍生版。项目主页在:https://github.com/xianyi/OpenBLAS

OpenBLAS编译失败。。。。

cc    -O3 -fexceptions -fPIC -fopenmp   -o cholmod_simple -I../../include  cholmod_simple.c -L/home/root/src/SuiteSparse/lib -L../../lib -lcholmod -lamd -lcolamd -lsuitesparseconfig -lccolamd -lcamd -lmetis -llapack -lopenblas -lm -lrt -Wl,-rpath=/home/root/src/SuiteSparse/lib
./cholmod_demo < Matrix/bcsstk01.tri
Segmentation fault (core dumped)
Makefile:31: recipe for target 'all' failed

make[2]: *** [all] Error 139

投机取巧,将SuiteSparse的inlude文件放到pl-slam的CMakeLists.txt中所说的/usr/include/suitesparse文件夹中,cholmod.h的问题解决

其实也可以用apt安装,省事。

apt install libsuitesparse-dev

3、编译安装Eigen,官网,http://eigen.tuxfamily.org

mkdir build && cd build && cmake .. && make && make install 就可以了。

或者使用 apt-get install libeigen3-dev

如果编译时提示错误,可以cd到eigen3头文件夹所在路径,创建符号链接可以解决。

cd /usr/local/include
sudo ln -sf eigen3/Eigen Eigen
sudo ln -sf eigen3/unsupported unsupported

4、安装boost库

apt-get install libboost-dev

5、编译安装g2o

https://github.com/RainerKuemmerle/g2o

安装依赖:

apt-get install cmake libeigen3-dev libsuitesparse-dev libqt4-dev qt4-qmake libqglviewer-dev

g2o依赖于eigen,所以安装顺序不能错

g2o不建议用最新的,因为pl-slam是使用低版本的头文件,新版本中,g2o的指针需要使用std::unique_ptr传递。

6、安装YAML

apt-get install libyaml-cpp-dev

7、编译wxWeights

这个库为mrpt使用,是一个界面库,不安装该库,运行pl-slam时会报错:

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:

github地址:https://github.com/wxWidgets/wxWidgets

下载后,进入源代码目录下

./configure --with-opengl --enable-debug --enable-unicode && make && make install

8、下载配置stvo-pl和mrpt

这两个项目也是作者的工作,下载下来,放到pl-slam的同级目录下,pl-slam的CMakeLists.txt中可以配置stvo-pl的位置,mrpt需要将include和libs/base/include下的文件放到pl-slam的include中,mrpt

的config.h可需要拷贝到pl-slam的include/mrpt目录下。

mrpt新版涉及到重构的问题,所以作者推荐使用这个版本:https://github.com/MRPT/mrpt/tree/0c3d605c3cbf5f2ffb8137089e43ebdae5a55de3

如果编译时,提示wxTE_AUTO_SCROLL is not defined,这是因为wxWeights高版本去掉了改定义,在头文件定义即可:

#ifndef wxTE_AUTO_SCROLL
#define wxTE_AUTO_SCROLL 0
#endif

 

cmake && make && make install

cp -rf /usr/local/include/mrpt/opengl/include/mrpt/* /usr/local/include/mrpt/

cp /usr/local/include/mrpt/mrpt-config/mrpt/* /usr/local/include/mrpt/

这个安装并不好用,还是直接make不install,然后配置一个cmake_modules的FindMRPT.cmake文件,将头文件复制到mrpt项目的include目录下

set(MRPT_DIR
        /home/xxxx/workspace/mrpt-1.5.0
        )

set(MRPT_INCLUDE_DIRS
        ${MRPT_DIR}/include
        )

二、编译

运行build.sh脚本,自动编译程序,手动make也可以。

export DATASETS_DIR=/home/XXXX/workspace/dataset/
./plslam_dataset <数据集名,dataset目录下的某个子文件夹名> [options]

 

Usage: ./imgPLSLAM <dataset_name> [options]
Options:
-o Offset (number of frames to skip in the dataset directory
-n Number of frames to process the sequence
-s Parameter to skip s-1 frames (default 1)
-c Config file

将pl-slam/config/dataset_params/dataset_param.yaml复制到数据集文件夹下,并配置左右视图。

数据集名也就是datasets目录下的文件夹名,多级目录可以用/,数据集下配置一个dataset_params.yaml文件,该文件可以从config/datasets_params/文件夹下复制过去。

-c 指定配置文件config/config下,默认配置在src/slamConfig.cpp中。使用相对路径时,分清工作目录。

 

=============================================================================

2018.10.10:

g2o使用新版本时,需要使用智能指针,原来的T*都改为std::unique_ptr<T>,赋值使用std::move。

有一个/usr/bin/ld: cannot find -lg2o_ext_csparse的错误,是由于新版本的库改名导致的,

 cd /usr/local/lib/

 sudo ln -sv libg2o_csparse_extension.so libg2o_ext_csparse.so

解决。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页