最近刚好有机会需要学习一下OpenVSLAM,在此记录一下我的学习过程,一方面可以加强自己的记忆和理解,另一方面可以帮助一下有需要的同学。
我打算通过介绍算法原理和解析对应代码的方式,将OpenVSLAM完整地学习一遍。通过这种方式我觉得我可以向你分享特征点视觉SLAM的一些常用算法,帮助你理解一套完整的视觉SLAM系统是怎么运行起来的。
今天就先开始第一节吧!
论文链接: OpenVSLAM: A Versatile Visual SLAM Framework
OpenVSLAM是一套单目、立体、RGB-D视觉SLAM系统。
OpenVSLAM是日本国立先进工业科学技术研究所(National Institute of Advanced Industrial Science and Technology)在2019年提出的一套基于特征点法的纯视觉SLAM系统,并于2019年5月20号在Github上进行了开源,没几周就达到几百Star(目前2400个Star),可见热度不一般。
ORB-SLAM2作为特征点视觉SLAM的巅峰之作,OpenVSLAM的工作和ORB-SLAM2的很多内容非常相似,继承了ORB-SLAM2很多成功的经验,并在其基础之上增加了一些功能。之前很多入门视觉SLAM的同学都会被推荐去学习ORB-SLAM2的源码,但是现在OpenVSLAM是另一个更不错的选择,它在代码规范和组织上更优于ORB-SLAM2,而且在系统的完整度上也优于ORB-SLAM2。由于OpenVSLAM的社区还没有ORB-SLAM2的大,如果你愿意挑战一下自己,可以去学习一下OpenVSLAM。
说句公道话,这篇论文对于学术理论的贡献真不大,但是代码对于学习和使用视觉SLAM的贡献远大于论文本身。
可以通过下表进一步直观地看一下OpenVSLAM的主要优势。它不但支持透视相机模型,还支持鱼眼和等矩阵相机模型,对于广角和360视角的相机模型,可以很大程度上提高视觉SLAM系统的稳定性。
论文中的实验还是很简单的,主要就是对比了OpenVSLAM与ORB-SLAM2的精度和速度。
另外作者还做了360相机下的实验,不过大家看看效果就行了,也没什么好说的。作者提供了自己录的数据集,安装好OpenVSLAM之后,按照要求运行一下,就能看到效果了。
OpenVSLAM作为一个学习基于特征点的视觉SLAM,还是一个不错的选择。可以支持任意相机的这个优点还是值得学习的。建议初学者可以好好学习一下OpenVSLAM的源代码。
安装和运行OpenVSLAM门槛还是挺低的,主要是作者提供了比较完整的文档。文档的地址:OpenVSLAM
大致流程如下:(以下流程是我从官方文档中摘取出来的,过程适合Ubuntu16.04和Ubuntu18.04,更完整的过程可以参考官方文档)
按照我这种方法安装完成之后,至少支持Ubuntu16.04和Ubuntu18.04使用Pangolin查看SLAM的建图和定位,
git clone https://github.com/xdspacelab/openvslam
主要依赖以下库:
Eigen : version 3.3.0 or later.
g2o : Please use the latest release. Tested on commit ID 9b41a4e.
SuiteSparse : Required by g2o.
DBoW2 : Please use the custom version of DBoW2 released in https://github.com/shinsumicco/DBoW2.
yaml-cpp : version 0.6.0 or later.
OpenCV : version 3.3.1 or later.
Pangolin : Please use the latest release. Tested on commit ID ad8b5f8.
sudo apt update -y
sudo apt upgrade -y --no-install-recommends
# basic dependencies
sudo apt install -y build-essential pkg-config cmake git wget curl unzip
# g2o dependencies
sudo apt install -y libatlas-base-dev libsuitesparse-dev
# OpenCV dependencies
sudo apt install -y libgtk-3-dev
sudo apt install -y ffmpeg
sudo apt install -y libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libavresample-dev
# eigen dependencies
sudo apt install -y gfortran
# other dependencies
sudo apt install -y libyaml-cpp-dev libgoogle-glog-dev libgflags-dev
# (if you plan on using PangolinViewer)
# Pangolin dependencies
sudo apt install -y libglew-dev
cd /path/to/working/dir
wget -q http://bitbucket.org/eigen/eigen/get/3.3.4.tar.bz2
tar xf 3.3.4.tar.bz2
rm -rf 3.3.4.tar.bz2
cd eigen-eigen-5a0156e40feb
mkdir -p build && cd build
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
..
make -j4
sudo make install
cd /path/to/working/dir
wget -q https://github.com/opencv/opencv/archive/3.4.0.zip
unzip -q 3.4.0.zip
rm -rf 3.4.0.zip
cd opencv-3.4.0
mkdir -p build && cd build
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DENABLE_CXX11=ON \
-DBUILD_DOCS=OFF \
-DBUILD_EXAMPLES=OFF \
-DBUILD_JASPER=OFF \
-DBUILD_OPENEXR=OFF \
-DBUILD_PERF_TESTS=OFF \
-DBUILD_TESTS=OFF \
-DWITH_EIGEN=ON \
-DWITH_FFMPEG=ON \
-DWITH_OPENMP=ON \
..
make -j4
sudo make install
cd /path/to/working/dir
git clone https://github.com/shinsumicco/DBoW2.git
cd DBoW2
mkdir build && cd build
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
..
make -j4
sudo make install
cd /path/to/working/dir
git clone https://github.com/RainerKuemmerle/g2o.git
cd g2o
git checkout 9b41a4ea5ade8e1250b9c1b279f3a9c098811b5a
mkdir build && cd build
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DCMAKE_CXX_FLAGS=-std=c++11 \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_UNITTESTS=OFF \
-DBUILD_WITH_MARCH_NATIVE=ON \
-DG2O_USE_CHOLMOD=OFF \
-DG2O_USE_CSPARSE=ON \
-DG2O_USE_OPENGL=OFF \
-DG2O_USE_OPENMP=ON \
..
make -j4
sudo make install
cd /path/to/working/dir
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
git checkout ad8b5f83222291c51b4800d5a5873b0e90a0cf81
mkdir build && cd build
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
..
make -j4
sudo make install
cd /path/to/openvslam
mkdir build && cd build
cmake \
-DBUILD_WITH_MARCH_NATIVE=ON \
-DUSE_PANGOLIN_VIEWER=ON \
-DUSE_SOCKET_PUBLISHER=OFF \
-DUSE_STACK_TRACE_LOGGER=ON \
-DBOW_FRAMEWORK=DBoW2 \
-DBUILD_TESTS=ON \
..
make -j4
由于OpenVSLAM支持的数据集比较多,我这里就简单地介绍一下,如何通过作者提供的在谷歌网盘中的360数据集运行(注意:使用作者的数据集需要你能科学上网)。如果你使用的别的数据集例如KITTI、EuRoC等等都可以参照如下方式很容易运行起来。
# 进入openslam的build文件夹
$ pwd
/path/to/openvslam/build/
$ ls
run_video_slam run_video_localization lib/ ...
#通过谷歌云盘下载ORB词袋
FILE_ID="1wUPb328th8bUqhOk-i8xllt5mgRW4n84"
curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=${FILE_ID}" > /dev/null
CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)"
curl -sLb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=${FILE_ID}" -o orb_vocab.zip
unzip orb_vocab.zip
# 通过谷歌云盘下载数据集
FILE_ID="1d8kADKWBptEqTF7jEVhKatBEdN7g0ikY"
curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=${FILE_ID}" > /dev/null
CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)"
curl -sLb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=${FILE_ID}" -o aist_living_lab_1.zip
unzip aist_living_lab_1.zip
# 通过谷歌云盘下载另外的数据集
FILE_ID="1TVf2D2QvMZPHsFoTb7HNxbXclPoFMGLX"
curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=${FILE_ID}" > /dev/null
CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)"
curl -sLb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=${FILE_ID}" -o aist_living_lab_2.zip
unzip aist_living_lab_2.zip
# 运行跟踪和建图程序
./run_video_slam -v ./orb_vocab/orb_vocab.dbow2 -m ./aist_living_lab_1/video.mp4 -c ./aist_living_lab_1/config.yaml --frame-skip 3 --no-sleep --map-db map.msg
# click the [Terminate] button to close the viewer
# you can find map.msg in the current directory
# r运行定位程序
./run_video_localization -v ./orb_vocab/orb_vocab.dbow2 -m ./aist_living_lab_2/video.mp4 -c ./aist_living_lab_2/config.yaml --frame-skip 3 --no-sleep --map-db map.msg
如果你想在公开数据集上运行OpenVSLAM,可以参照这个官方文档
作者的文档还是很详细的,不过有一些细节你在自己电脑上运行时可能需要修改一下,不然不能成功。可以试一下运行效果,我实验了EuRoC的一个比较困难数据集,效果还不错,在几乎快要纯黑的环境中还能有不错的表现。
后续我会写代码的解析笔记,尽请期待!