2021年11月15更新:OpenVSlam的仓库目前已经关闭,幸运的是我fork了,如果需要的话可以去我的github仓库下载:openvslam

最近刚好有机会需要学习一下OpenVSLAM,在此记录一下我的学习过程,一方面可以加强自己的记忆和理解,另一方面可以帮助一下有需要的同学。

我打算通过介绍算法原理和解析对应代码的方式,将OpenVSLAM完整地学习一遍。通过这种方式我觉得我可以向你分享特征点视觉SLAM的一些常用算法,帮助你理解一套完整的视觉SLAM系统是怎么运行起来的。

今天就先开始第一节吧!

1. OpenVSLAM

1.1 介绍

论文链接: 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。

1.2 主要贡献

  • (1)它与各种类型的相机型号兼容,并可针对可选的相机型号进行定制;
  • (2)可以对特征点地图进行存储和加载,然后可以使用预先创建的地图进行重定位;
  • (3)为了方便用户,提供了在Web浏览器上运行的跨平台查看器。

说句公道话,这篇论文对于学术理论的贡献真不大,但是代码对于学习和使用视觉SLAM的贡献远大于论文本身。

可以通过下表进一步直观地看一下OpenVSLAM的主要优势。它不但支持透视相机模型,还支持鱼眼和等矩阵相机模型,对于广角和360视角的相机模型,可以很大程度上提高视觉SLAM系统的稳定性。

在这里插入图片描述

1.3 实验结果

论文中的实验还是很简单的,主要就是对比了OpenVSLAM与ORB-SLAM2的精度和速度。

  • EuRoC MAV数据集,作者主要是对比了轨迹的绝对精度和每一帧的运行用时:
    在这里插入图片描述
    在这里插入图片描述

  • KITTI数据集
    在这里插入图片描述

  • 另外作者还做了360相机下的实验,不过大家看看效果就行了,也没什么好说的。作者提供了自己录的数据集,安装好OpenVSLAM之后,按照要求运行一下,就能看到效果了。

1.4 小结

OpenVSLAM作为一个学习基于特征点的视觉SLAM,还是一个不错的选择。可以支持任意相机的这个优点还是值得学习的。建议初学者可以好好学习一下OpenVSLAM的源代码。

2. 安装

安装和运行OpenVSLAM门槛还是挺低的,主要是作者提供了比较完整的文档。文档的地址:OpenVSLAM

大致流程如下:(以下流程是我从官方文档中摘取出来的,过程适合Ubuntu16.04和Ubuntu18.04,更完整的过程可以参考官方文档)

按照我这种方法安装完成之后,至少支持Ubuntu16.04和Ubuntu18.04使用Pangolin查看SLAM的建图和定位,

2.1 克隆源代码:

# 该仓库已经被关闭,请勿克隆!
git clone https://github.com/xdspacelab/openvslam

# 上面这个仓库已经做作业给关闭了,请使用以下仓库克隆,这个代码只是加了注释:
git clone https://github.com/zm0612/openvslam-comments

2.2 安装依赖库

主要依赖以下库:
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.
  • 安装Ubuntu系统依赖
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
  • 安装Eigen矩阵库
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
  • 安装OpenCV库
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
  • 安装DBoW2
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
  • 安装g2o
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
  • 安装Pangolin库
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

2.3 编译源码

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

2.4 运行

由于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,可以参照这个官方文档

2.5 小结

作者的文档还是很详细的,不过有一些细节你在自己电脑上运行时可能需要修改一下,不然不能成功。可以试一下运行效果,我实验了EuRoC的一个比较困难数据集,效果还不错,在几乎快要纯黑的环境中还能有不错的表现。

后续我会写代码的解析笔记,尽请期待!

参考资料:

  1. Shinya Sumikura, Mikiya Shibuya, and Ken Sakurada. 2019. OpenVSLAM: A Versatile Visual SLAM Framework. In Proceedings of the 27th ACM International Conference on Multimedia (MM ’19). Association for Computing Machinery, New York, NY, USA, 2292–2295. DOI:https://doi.org/10.1145/3343031.3350539
  2. OpenVSLAM官方文档
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐