ORB_SLAM軟體包的安裝及簡單測試
寫在前面
本部落格是根據參考網站翻譯而來的,但原網站有些地方似乎存在少量瑕疵,本人針對具體的實施環境對於某些步驟略有修改。此外,鑑於個人英語水平有限,翻譯有不足的地方望各位指正。
安裝環境
- 作業系統:Ubuntu 14.04 LTS
- ROS版本:ROS Indigo Igloo(the full Desktop version)
先決條件
- Boost
需要使用 Boost
庫啟動 SLAM
系統的各種執行緒。
sudo apt-get install libboost-all-dev
提示:安裝時可能會有以下資訊顯示,表明已經安裝了 Boost
庫,
正在讀取軟體包列表... 完成
正在分析軟體包的依賴關係樹
正在讀取狀態資訊... 完成
libboost-all-dev 已經是最新的版本了。
- 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
- 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
提示:安裝這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
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
說明:對於上述命令,本人是將 ORB_SLAM
克隆在了主目錄下。原文中並沒有這條命令,但缺少應該會出現問題。
4 編譯 g2o
. 進入到 Thirdparty/g2o
目錄下,執行以下命令
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
5 編譯 DBoW2
. 進入 Thirdparty/DBoW2/
目錄下,執行以下命令
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make
6 編譯 ORB_SLAM
.進入 ORB_SLAM
根目錄下,執行以下命令
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make
使用
1 從終端啟動 ORB_SLAM
.(得預先將 roscore
啟動)
先將 ORB_SLAM/Data/ORBvoc.txt.tar.gz
解壓,以便更快地載入 ORBvoc.txt
檔案。進入到 ORB_SLAM/Data/
目錄下,執行以下命令:
tar -xzvf ORBvoc.txt.tar.gz
進入到 ORB_SLAM
目錄下,執行以下命令:
rosrun ORB_SLAM ORB_SLAM Data/ORBvoc.txt Data/Settings.yaml
說明:原文中提供的指令格式為:
rosrun ORB_SLAM ORB_SLAM PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE
並強調說必須提供 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
3 ORB_SLAM
節點處理得到的地圖被髮布到話題 /ORB_SLAM/Map
中,攝像機當前位姿(指的是相機拍照時所處的空間位置)和地圖全域性座標原點通過 /tf
功能包分別釋出到話題 /ORB_SLAM/Camera
和話題 /ORB_SLAM/World
中,通過執行 rviz
功能包來檢視地圖:
rosrun rviz rviz -d Data/rviz.rviz
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
或者直接執行(對目錄沒有要求)以下命令:
roslaunch ORB_SLAM ExampleGroovyOrNewer.launch
說明:ROS Groovy
以及更新的版本(包含Indigo
)都可以用以上方法進行,ROS Fuerte
執行的是 ExampleFuerte.launch
檔案
測試
原作者提供了一個完整的設定檔案(Data/Settings.yaml
後文將會進行說明)和由他們實驗室獲取到的一個rosbag(由一個影象記錄序列例樣生成).在這個測試序列中可以看見一個閉環檢測和兩次因視角改變而帶來的重定位。
1 下載 rosbag 檔案:
可選的其他連結:
解壓檔案。
2 給例樣序列啟動 ORB_SLAM
節點,需要先解壓詞彙表文件(啟動 ORB_SLAM
節點時需載入的一個檔案:/Data/ORBvoc.txt.tar.gz
),然後進入到 ORB_SLAM
目錄下,執行以下命令:
roslaunch ExampleGroovyOrNewer.launch
或者直執行以下命令:
roslaunch ORB_SLAM ExampleGroovyOrNewer.launch
3 當 ORB_SLAM
詞彙表被載入之後,進入到解壓後的 Example.bag
所在的父目錄下,執行 rosbag 功能包:
rosbag play --pause Example.bag
說明: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
說明:對於上述所說的失效情況本人並沒有遇到過,也沒有進行驗證,僅進行了簡單的翻譯。