開源SLAM框架學習——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

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官方文檔
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章