寫在前面
本博客是根據參考網站翻譯而來的,但原網站有些地方似乎存在少量瑕疵,本人針對具體的實施環境對於某些步驟略有修改。此外,鑑於個人英語水平有限,翻譯有不足的地方望各位指正。
安裝環境
- 操作系統:Ubuntu 14.04 LTS
- ROS版本:ROS Indigo Igloo(the full Desktop version)
先決條件
- Boost
需要使用 Boost
庫啓動 SLAM
系統的各種線程。
sudo apt-get install libboost-all-dev
- 1
提示:安裝時可能會有以下信息顯示,表明已經安裝了 Boost
庫,
正在讀取軟件包列表... 完成
正在分析軟件包的依賴關係樹
正在讀取狀態信息... 完成
libboost-all-dev 已經是最新的版本了。
- 1
- 2
- 3
- 4
- ROS
需要使用 ROS
來接收來自相機或者記錄序列(ros包,說白了就是一系列拍攝的圖片)的圖像,以及用於可視化(rviz
,image_view
查看地圖和圖片幀)。原作者已經測試了
ORB_SLAM
在 Ubuntu 12.04+ROS Fuerte(Groovy、Hydro)
以及
Ubuntu14.04+ROS Indigo
環境下的可用性。使用 ROS Indigo
版本需要移除
manifest.xml
文件(ORB_SLAM
目錄下的一個文件)中的 opencv2
依賴項。
- OpenCV
需要使用 OpenCV
來處理圖像特徵。ROS Indigo
或者之前的版本已經預裝在了 ROS
的發行版本上,如果是更新的版本,需要自行安裝。ROS Indigo
自帶的
OpenCV
版本爲2.4.8,可通過以下命令來查看,
pkg-config --modversion opencv
- 1
- g2o
使用修改過的 g2o
版本(原始版本參看:https://github.com/RainerKuemmerle/g2o)來實現最優化。在編譯
g2o
之前,必須預裝 BLAS
, LAPACK
以及 Eigen3
(至少3.1.0版本)。
sudo apt-get install libblas-dev
sudo apt-get install liblapack-dev
sudo apt-get install libeigen3-dev
- 1
- 2
- 3
提示:安裝這3個庫的時候也可能出現和安裝 Boost
庫類似的提示。
- DBoW2
ORB_SLAM
包使用了 DBow2
和 DLib
庫中(參看:https://github.com/dorian3d/DBoW2)的部分內容來實現位置識別和特徵匹配,不過並不需要額外的依賴項來編譯
DBow2
.
安裝
1 明確已經安裝了 ROS
以及所有的庫依賴項(boost
, eigen3
,
opencv
, blas
, lapack
).
2 克隆下面的庫,
git clone https://github.com/raulmur/ORB_SLAM.git ORB_SLAM
- 1
3 將 ORB_SLAM
軟件包克隆所在的路徑添加到 ROS_PACKAGE_PATH
環境變量中去。可在
.bashrc
文件的最後添加下面內容來實現,
export PATH_TO_PARENT_OF_ORB_SLAM=~
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:$PATH_TO_PARENT_OF_ORB_SLAM
- 1
- 2
說明:對於上述命令,本人是將 ORB_SLAM
克隆在了主目錄下。原文中並沒有這條命令,但缺少應該會出現問題。
4 編譯 g2o
. 進入到 Thirdparty/g2o
目錄下,執行以下命令
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
- 1
- 2
- 3
- 4
5 編譯 DBoW2
. 進入 Thirdparty/DBoW2/
目錄下,執行以下命令
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
- 1
- 2
- 3
- 4
6 編譯 ORB_SLAM
.進入 ORB_SLAM
根目錄下,執行以下命令
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make
- 1
- 2
- 3
- 4
使用
1 從終端啓動 ORB_SLAM
.(得預先將 roscore
啓動)
先將 ORB_SLAM/Data/ORBvoc.txt.tar.gz
解壓,以便更快地加載 ORBvoc.txt
文件。進入到
ORB_SLAM/Data/
目錄下,執行以下命令:
tar -xzvf ORBvoc.txt.tar.gz
- 1
進入到 ORB_SLAM
目錄下,運行以下命令:
rosrun ORB_SLAM ORB_SLAM Data/ORBvoc.txt Data/Settings.yaml
- 1
說明:原文中提供的指令格式爲:
rosrun ORB_SLAM ORB_SLAM PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE
- 1
並強調說必須提供 ORB
詞彙表文件(包中的ORB_SLAM/Data/ORBvoc.txt.tar.gz
)和設置文件(包中的ORB_SLAMData/Settings.yaml
)的絕對路徑或者相對路徑。所以,如果你並非在
ORB_SLAM
目錄下的話,指令的格式會有所不同。
2 被 ORB_SLALM
節點處理後的圖像幀被髮布到話題 ORB_SLAM/Frame
中,可以通過使用
image_view
功能包來查看:
rosrun image_view image_view image:=/ORB_SLAM/Frame _autosize:=true
- 1
3 ORB_SLAM
節點處理得到的地圖被髮布到話題 /ORB_SLAM/Map
中,攝像機當前位姿(指的是相機拍照時所處的空間位置)和地圖全局座標原點通過
/tf
功能包分別發佈到話題 /ORB_SLAM/Camera
和話題 /ORB_SLAM/World
中,通過運行
rviz
功能包來查看地圖:
rosrun rviz rviz -d Data/rviz.rviz
- 1
4 ORB_SLAM
節點會訂閱話題 /camera/image_raw
(需要將rosbag記錄的圖像序列或者攝像頭捕獲的原始圖像發佈到此話題上,以供
ORB_SLAM
節點進行處理),現在可以運行 rosbag(由一個圖像序列生成) 或者攝像頭節點(可以是自己寫好的(可參考此人博客:http://blog.csdn.net/github_30605157/article/details/50990493 以及
http://blog.csdn.net/github_30605157/article/details/51020375)或者是安裝別人寫好的軟件包(本人使用的是
ROS Indigo
發行版本自帶的 usb_cam
軟件包(這個需要根據自己的攝像頭類型來決定))來驅動電腦的攝像頭。如果已經有一個圖像序列文件,可將它生成一個包,可使用下面這個工具來生成:https://github.com/raulmur/BagFromImages.
另一種使用方式:可以通過使用 roslaunch
(注意要先將 ORB_SLAM/Data/ORBvoc.txt.tar.gz
解壓)來啓動
ORB_SLAM
, image_view
, rviz
,效果完全等同於上面的一系列命令的執行。進入到
ORB_SLAM
目錄下,運行以下命令:
roslaunch ExampleGroovyOrNewer.launch
- 1
或者直接執行(對目錄沒有要求)以下命令:
roslaunch ORB_SLAM ExampleGroovyOrNewer.launch
- 1
說明:ROS Groovy
以及更新的版本(包含Indigo
)都可以用以上方法進行,ROS Fuerte
運行的是
ExampleFuerte.launch
文件
測試
原作者提供了一個完整的設置文件(Data/Settings.yaml
後文將會進行說明)和由他們實驗室獲取到的一個rosbag(由一個圖像記錄序列例樣生成).在這個測試序列中可以看見一個閉環檢測和兩次因視角改變而帶來的重定位。
1 下載 rosbag 文件:
http://webdiis.unizar.es/~raulmur/orbslam/downloads/Example.bag.tar.gz.
可選的其他鏈接:
https://drive.google.com/file/d/0B8Qa2__-sGYgRmozQ21oRHhUZWM/view?usp=sharing
解壓文件。
2 給例樣序列啓動 ORB_SLAM
節點,需要先解壓詞彙表文件(啓動 ORB_SLAM
節點時需加載的一個文件:/Data/ORBvoc.txt.tar.gz
),然後進入到
ORB_SLAM
目錄下,執行以下命令:
roslaunch ExampleGroovyOrNewer.launch
- 1
或者直執行以下命令:
roslaunch ORB_SLAM ExampleGroovyOrNewer.launch
- 1
3 當 ORB_SLAM
詞彙表被加載之後,進入到解壓後的 Example.bag
所在的父目錄下,運行 rosbag 功能包:
rosbag play --pause Example.bag
- 1
說明:rosbag play
命令的使用請自行查找。
Settings.yaml文件說明
ORB_SLAM
軟件包已經提供了相機標定的功能,它運行的時候會自動從一個 YAML
文件(ORB_SLAM
中爲Data/Settings.yaml
)中讀取相機標定的設置參數。在這個文件中我們可以找出相機標定所需的參數以及相關的描述信息。我們在使用
ORB_SLAM
軟件包的時候需要將此文件中對應的參數設置成自己攝像頭的的參數值。相機標定所需要的文件可由ROS wiki
上軟件包集提供的
camera_calibration
軟件包產生(或者其它什麼方式),詳細過程此處就不進行細說了,需要的朋友可自行了解。這個相機標定模型來自於
OpenCV
.
測試失效模式說明
由上述提供的測試樣例在絕大部分情況下在相機運動(指的應該是相機拍攝時的實時位姿)和紋理方面都可以期望達到和原作者提供的論文中提到的效果(參看:http://webdiis.unizar.es/~raulmur/MurMontielTardosTRO15.pdf)。但是這個單目
SLAM
解決方案在下面一些情況可能不奏效:
- 在系統初始化的時候沒有平移運動,或者太多的旋轉。
- 相機純粹地以旋轉運動採集環境信息。
- 環境中紋理特徵比較淺。
- 太多運動的物體或者運動的物體太大,尤其是當它們的運動的速度很慢時。
系統能夠在平面化或者非平面化的場景中進行初始化。但在平面化場景中,將取決於相機運動和平面的關係,也存在系統不進行初始化的情況,詳細描述參看原作者論文:http://webdiis.unizar.es/~raulmur/MurMontielTardosTRO15.pdf
說明:對於上述所說的失效情況本人並沒有遇到過,也沒有進行驗證,僅進行了簡單的翻譯。