大家好,对于VSLAM研究人员当然要对最新的VSLAM的研究做下总结了,这次为大家介绍PL-SLAM。
上图就是PL-SLAM的框架,是不是感觉和ORBSLAM很像呢?比较典型打特征法+直接法的结合的关键帧的Vslam
跟ORBSLAM有三个主要线程:跟踪 、构图、回环检测
一、Tracking(估计相机的位置,根据约束条件,产生新的关键帧)
特征提取方面:ORB、lsd的线条像素特征
(其实我们一直关系的一个问题,如果面对一面白墙怎么办?)
初始化估计:同样包含两种了一种是ORBslam的初始化形式,另一种则是应该树通过极限搜索的方式跟lsdslam比较像
重定位:词袋模型,关系图(同lsd是一样的)
二、Local MAPING
剔除:点和线剔除
三角化:点和线
局部BA:点和线
关键帧剔除
三、loop clousing
只做了点特征的回环,主要线条回环计算太大。
四、效果
对比发现,精度有所提高!那么实时性怎么样呢?
作者测试的是20fps。
五、总结:
总体感觉是把ORBSLAM+LSDSLAM的比较优秀的前端策略加到一起,在关键帧的筛选上有些亮点,毕竟增加线条约束。亮点不多,主要现在还没有源码,没办法实际测试效果。作者也会在最近公开自己的源码。
---------------------
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中。使用相对路径时,分清工作目录。
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
解决。