ORB_SLAM軟件包的安裝及簡單測試

寫在前面

本博客是根據參考網站翻譯而來的,但原網站有些地方似乎存在少量瑕疵,本人針對具體的實施環境對於某些步驟略有修改。此外,鑑於個人英語水平有限,翻譯有不足的地方望各位指正。


安裝環境

  • 操作系統: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包,說白了就是一系列拍攝的圖片)的圖像,以及用於可視化(rvizimage_view 查看地圖和圖片幀)。原作者已經測試了 ORB_SLAMUbuntu 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 包使用了 DBow2DLib 庫中(參看: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
說明:對於上述所說的失效情況本人並沒有遇到過,也沒有進行驗證,僅進行了簡單的翻譯。


參考網站

網址連接:https://github.com/raulmur/ORB_SLAM.git

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章