關於ORB-SLAM2
- 機器人所研究SLAM的學長介紹,ORB-SLAM2是雙目SLAM的很成熟的一個算法
- 由於項目需要雙目攝像頭測的距離來調節攝像頭焦距,以及后期的實景AR加入,所以從雙目視頻流,得到每一幀圖像上每一點,對應實際的攝像頭到實際物體間的空間距離,和攝像頭所在實景的三維空間數據,是項目采用ORB-SLAM2算法的原因
- 相關博客會記錄,ORB-SLAM2環境搭建,ORB-SLAM2代碼原理和實際測試,雙目SLAM測出距離對應焦距調節(后兩個,之后完成補上鏈接)
環境搭建
- 環境搭建總體參考上節中GitHub鏈接,以及ORB-SLAM2搭建詳細過程
- 記錄如下原因,
- 一是為針對本項目需要(雙目視頻流實時測距)的環境搭建提供提醒和參考
- 二是第一次接觸CV工程化代碼,希望自己除了乖乖的聽話的搭建環境之外,了解工程化代碼的依賴、鏈接...等關系,也為之后項目系統搭建、降低時延優化,夯實基礎。
- 三是雖然環境搭建已經有前車之鑒,但是在計算機學院的諸多環境配置中,博客總結終究紙上得來,無法應對復雜的環境變化;而且博客上的方法,很多還是不如官方庫、GitHub - Readme中的方法,下文完全遵循各GitHub - Readme,加之自己bug的補充,或許能提供更舒適的用戶體驗~
已有環境
- 沒有如下軟件或環境,最好先行安裝;檢查是否有該環境的最好方式應該是查看
--version
了~- Ubuntu16.04
- apt 1.2.29 (amd64)
- git 2.7.4
- gcc 5.4.0
- python 2.7.12
創建環境
新建項目目錄
- 目錄
SLAM
(我取的項目名,隨意即可~)
安裝Pangolin
- GitHub for Pangolin,在Readme中已經有一個安裝說明,補充一個參考ubuntu Pangolin 從源碼安裝
- What is pangolin? 穿山甲hhh~從CV角度,閱讀過上小段中GitHub -
Readme
中的簡介,概述可以說是加快3D可視化和UI交互的OpenGL庫 - Pangolin
git clone
之后,安裝Pangolin必須的依賴- OpenGL
sudo apt install libgl1-mesa-dev
- Glew
sudo apt install libglew-dev
,也是OpenGL的庫 - CMake
sudo apt install cmake
,CMake就要好好介紹介紹了~在openCV下載與MacOS系統下的cLion配置一文中,我已經粗淺的接觸到C與C++編譯環境的配置,此處又涉及而且剛剛結束的一學期OS課程中粗淺地學習了鏈接等知識,故而在CMake & Make——鏈接初探一文中看看CMake & Make~
- OpenGL
- Pangolin推薦的和選擇性的依賴,下面我會逐一將探索得到的相關軟件信息記錄,並判斷是否有利於項目,決定是否安裝
- Wayland
sudo apt install pkg-config
&sudo apt install pkg-config
按照wiki上的說明,"Wayland是一個通信協議,規定了顯示服務器與其客戶機之間的通信方式。窗口管理器簡化成顯示管理服務,專門負責渲染那些屏幕上的程序。這比X Window System中的窗口管理器要更簡單、高效。"考慮項目可能涉及階段性的窗口視頻顯示來代替VR HMD顯示,所以下載 - FFMPEG (For video decoding and image rescaling)
sudo apt install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libavdevice-dev
項目涉及硬件及軟件編解碼,FFMPEG也是編解碼常用的平台,故下載 - DC1394 (For firewire input)
sudo apt install libdc1394-22-dev libraw1394-dev
適用於firewire camera,項目僅涉及視頻流層面,但為未涉及攝像頭層面,故未下載 - libuvc (For cross-platform webcam video input via libusb)
git://github.com/ktossell/libuvc.git
項目確實采用的是UVC camera,相關介紹可見libuvc與webcam的開發(一) - UVC協議,但是我么購買的是商家集成封裝好的直接USB3.0接口導出視頻流的攝像機,故此處不需。 - libjpeg, libpng, libtiff, libopenexr (For reading still-image sequences)
sudo apt install libjpeg-dev libpng12-dev libtiff5-dev libopenexr-dev
...GitHub上還有一些,但沒有仔細介紹,而且和項目無關,故不寫
- Wayland
- 搭環境(以下關於
cmake
指令在“CMake & Make——鏈接初探“一文中也有介紹)- 在搭環境之前,對pangolin源碼做一點修改,避免之后出現bug
- vim打開
Pangolin/src/display/device/display_x11.cpp
,改變第110行的GLX_DOUBLEBUFFER , glx_doublebuffer ? True : False,
為GLX_DOUBLEBUFFER , glx_doublebuffer ? False : False,
- 搭環境:
// under the directory of SLAM (the dir of my project)
cd Pangolin
mkdir build
cd build
cmake ..
cmake --build .
sudo make install # can not find in the Readme.md of Pangolin GitHub, but it is necessary to install in /usr/local/bin/
-
生成了一堆
.o
可執行文件,pangolin配置完成
-
測試安裝是否成功,可以在
/usr/local/bin/include
目錄下查找。
安裝OpenCV 3.2
- 在之前的視頻流拼接學習中,發現OpenCV是一款好用的視頻圖像處理軟件,應該也是入門Computer vision的路徑之一,只是版本較多更新也很多,網上的源碼openCV2、3都有,我之前下載最新版本4.1,無奈網站上的大多數源碼都通不過編譯,而剛剛入門openCV的本咸魚還不很了解OpenCV,代碼運行常有一籌莫展
- 所以,我的建議是,在熟練OpenCV之前,版本盡量和源碼保持一致,此處GitHub顯示ORB-SLAM2支持
2.4.3
&2.4.11
&3.2
- 下面說安裝搭建OpenCV 3.2環境,部分參考ubuntu 16.04 OpenCV3.2.0完全編譯安裝(下文和這篇博客有不同的命令行使用習慣,建議完全按照一篇,勿混用)
- 下載OpenCV 3.2的.tar.gz版本到項目
SLAM
目錄下 - 解壓
tar -zxvf [filename.tar.gz]
(Linux下的打包解壓,隨意搜索即得,至於tar
之后參數的意義倒是非常好奇) - 安裝一些官網上沒說,但之后發現ORB - SLAM2必須要的依賴,安裝libgtk2.0-dev
sudo adt-get install libgtk2.0-dev
和 pkg-configsudo apt-get install pkg-config
- CMake將分散的程序構建為可執行文件
- 下載OpenCV 3.2的.tar.gz版本到項目
cd opencv-3.2.0/
mkdir build
cd build
cmake ..
make # wait for several minutes
# a lot of guidance of this instruction is `make -j4`
# but i do not find out the meaning of parameter -j4, so i give up to use it
sudo make install # after compiling, install it to /usr/local/bin, so "sudo" higher permission is needed.
- 測試安裝是否成功,也可以直接跑一個openCV的程序
- 輸入
pkg-config --modversion opencv
- 得到版本號
3.2.0
- 輸入
- 初步認為安裝成功
安裝Eigen
- Eigen官網," is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms."
- 官網下載3.3.7版本到項目SLAM目錄下
- 解壓
tar -jxvf [filename.tar.bz2]
- CMake & Make,同上面幾個幾乎一樣的步驟
- 代碼如下
cd [eigen] # file name of eigen dir
mkdir build
cd build
cmake ..
make
sudo make install
-
但在進行了第三行cmake時
-
發現有很多相關庫沒有裝(有點困惑),所以嘗試裝了
Boost
BLAS
LAPACK
,一個基礎庫,兩個和線性代數相關的庫
sudo apt-get update
sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt-get install libblas-dev
sudo apt-get install liblapack-dev
-
然后再進行
cmake ..
及其之后的指令操作 -
這種方法,最終可用
/usr/local/include/eigen3/Eigen/src/Core/util$ vim Macros.h
查看版本3.3.7
,認為安裝成功 -
安裝Eigen的另一種簡單方法,在進行到第一次cmake之后,我在網上查了安裝Eigen的步驟,ubuntu16.04+eigen3安裝,但是上一種方法比較知根知底...
-
發現
sudo apt-get install libeigen3-dev
,一條指令即可完成安裝,之后cd /usr/include/eigen3/Eigen/src/Core/util/
目錄下的Macros.h
查看版本號為3.2.92
符合版本要求
DBoW2 and g2o (Included in Thirdparty folder)
- 最初以為這兩個庫也需要安裝,但發現在下載的ORB-SLAM2的 GitHub中的
Thirdparty
中有,而且build.sh
文件里面也有想過安裝,故不需要自己安裝。
嘗試運行
- 在項目目錄SLAM下
cd ORB_SLAM2-master/
- 一系列cmake & make:給權限
chomd +x build.sh
,運行./build.sh
- 點評一二,為什么此處的cmake和make,跟上面見到的諸多cmake make不同呢~個人以為這是非常優秀的工程化開發習慣。
- 輸入
vim build.sh
查看shell文件,發現在此文件中運行環境已經全部配置好 - 提醒,有說法
make -j
使用多編譯器,容易崩,本機運行也崩了一次,在vim中將所有make -j
改為make
echo "Configuring and building Thirdparty/DBoW2 ..."
cd Thirdparty/DBoW2
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j
cd ../../g2o
echo "Configuring and building Thirdparty/g2o ..."
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j
cd ../../../
echo "Uncompress vocabulary ..."
cd Vocabulary
tar -xf ORBvoc.txt.tar.gz
cd ..
echo "Configuring and building ORB_SLAM2 ..."
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j
- Debug(回憶起了OS vim 干de bug的心酸經歷...不過目前碰到的幾個bug相對課上任務來說非常容易)
error: usleep is not declared in this scope
,加入下面的頭文件:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
-
這條error出現的非常頻繁,我猜測可能是Ubuntu16.4和14.4環境不同的原因,假如搭建過程中Ubuntu14.4中沒出現這個問題,那我的猜測才可能有幾分道理。
-
也思考過把這三條頭文件加入某個庫函數比如
system.h
但是未找到,故尚未實施 -
最終得到可執行的“ libORB_SLAM2.so at lib folder and the executables mono_tum, mono_kitti, rgbd_tum, stereo_kitti, mono_euroc and stereo_euroc in Examples folder."
測試環境搭建是否成功
嘗試數據集
- 下載Vicon Room 1 01到項目SLAM文件夾下,在ORB...文件夾下輸入
/ORB_SLAM2-master$ ./Examples/Stereo/stereo_euroc Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml ../mav0/cam0/data ../mav0/cam1/data ./Examples/Stereo/EuRoC_TimeStamps/V101.txt
出現一系列新bug
- 提醒:下文中所有的bug,均已在上文過程中修復🙏
- 新bug1 :
terminate called after throwing an instance of 'std::runtime_error' what(): Pangolin X11: Unable to retrieve framebuffer options Aborted (core dumped)
- 新bug2:
/parallels/Desktop/slam/opencv-3.2.0/modules/highgui/src/window.cpp:565: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvNamedWindow
- 按照要求,乖乖的install libgtk2.0-dev
sudo adt-get install libgtk2.0-dev
and pkg-configsudo apt-get install pkg-config
,然后re-run
- 按照要求,乖乖的install libgtk2.0-dev
成功運行雙目數據集
下一步
- 基於項目需求,分析SLAM算法,或融入或提取出項目需要的部分
- 雙目視頻流導入
- 實時求出每幾幀視頻圖像上點陣對應實物到攝像頭的距離
上述內容如有問題,懇請指正