老規矩之甩鍋:手敲有風險,copy需謹慎!理解咯~~
環境 Ubuntu14.04,虛擬機內存 4G,核心數 2,ROS 版本 Indigo
原作者網頁。
1、下載源碼
有的小伙伴要說了,要不要建工作空間呢?畢竟是用 ROS 運行的。之前查了很多資料,大部分都沒有建立工作空間,甚至都沒有提過這事兒。在這里,我以親身實踐說明一下,這個不需要建立工作空間,不用建 src,不用 catkin_make。
工作空間不用建,那總要建立個文件夾用來放源碼,對吧(如果非要把這個文件夾叫做工作空間,那,,你開心就好。。。)
我是在 Home 下建立的,文件夾名稱任意,所以
cd ~/
mkdir orb-slam_ws
cd orb-slam_ws
下載源碼
git clone https://github.com/raulmur/ORB_SLAM.git ORB_SLAM
安安靜靜等完代碼下完,,雖然很慢很慢……
然后下載數據包,我用的是作者提到的 Example,在原作者網頁可以找到,這里給出下載鏈接。
然后將數據包移到 ~/orb-slam_ws,實際上你可以放在任何地方,我這里為了方便就這樣了。
2、安裝依賴
sudo apt-get install libboost-all-dev
sudo apt-get install libblas-dev
sudo apt-get install liblapack-dev
sudo apt-get install libeigen3-dev
然后添加環境變量(不知道對以后的ros工程有沒有影響,這個以后出了問題再說,現在先把這個跑通。。)
sudo gedit ~/.bashrc
在最后面添加:
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/orb-slam_ws
實際上,這個路徑是你下載的 ORB_SLAM 的路徑。
然后保存退出,執行:
source ~/.bashrc
說句題外話,新打開的 terminal 中才真正的更新了環境變量,這個窗口中保存的是更改前的。
3、編譯 opencv
由於這個代碼用到了opencv2.4 版本,所以我們要下載對版本。之前一直編譯不同,以為是下載的版本有問題,我下載了 2.4.9、2.4.13、2.4.13.5,最后用 2.4.13版本跑通了,當然我不是說 2.4.9、2.4.13.5 等其他 2.4 版本不能跑通。為什么這么說呢?因為我之前之所以出問題編譯出錯是因為我之前裝了 3.1.0的版本,所以不行。所以,你可以試一試,我覺得只要是 2.4. 的版本應該都可以。
這里我簡單交代一下我曲折的編譯之路。。。然后再給出正確方法。
首先說一下 opencv 版本的問題,之前跑另一個程序需要opencv3,,那時候沒玩過這,也不懂,就按默認路徑安裝了 opencv3.1.0,然后它自己就裝到了 usr/local/include、usr/local/lib,還有share什么的,好多個文件夾,導致我卸載都很麻煩,要卸載它,你就得手動刪掉它所有安裝的路徑下的相關文件,這些安裝信息在安裝時保存在了一個什么 install 文件中,具體我忘了(反正我是運行 unintall 不行,所以才手動一個一個刪的)。
就這樣,刪掉了opencv3.1.0版本,結果還是編譯出錯,說是找不到一些opencv里的程序,其實是程序找不到opencv在哪里(因為我沒有安裝到默認路徑,這個一會再說)。試了很多方法,最后發現,不光要設置環境變量,還要設置 CMakeLists 文件告訴程序 opencv 的路徑。
那我為什么要改變安裝路徑,而不是按默認安裝到 usr 呢?當然是為了方便管理。如同你在 Windows 中安裝軟件,誰會默認安裝到 C 盤啊?是吧,都是安裝到別的盤,這樣方便管理,還不會影響系統,重裝時也不會丟失。linux下也是一樣,改變了安裝路徑,就可以同時安裝多個版本的 opencv,以應對不同程序的需求。切換opencv版本有很多文檔,百度一下就行。切換時只需要改變環境變量和 CMakeLists 文件中的設置就行。我下面安裝 opencv 的方法就是這種。
好了,言歸正傳,首先到官網下載 opencv2.4.13
將下載好的壓縮包解壓到你方便的位置,這里我是專門建了一個用來放 opencv 源碼的文件夾(我把opencv2.4.9、2.4.13、3.1.0版本源碼都放在這里了):
cd ~/
mkdir opencv_src
然后建立一個用於安裝 opencv 的文件夾,這個也是自己看着辦,我同樣是在 Home 下,然后每個opencv版本各占一個文件夾:
cd ~/
mkdir opencv-2.4.13
所以最后我的格局是這樣的:
然后進入解壓后的 opencv-2.4.13,建立 build 文件夾並進入
mkdir build
cd build
執行:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=~/opencv-2.4.13 ..
注意不要丟掉最后的兩個點!它狠重要!!
然后執行:
make
sudo make install
如果虛擬機配了雙核,為了加快速度可以 make -j2 和 sudo make install -j2
安裝后會發現在安裝文件夾 opencv-2.4.13 中的 lib、bin等文件上面有小鎖子標志,如果要消除這個小鎖子,需要更改權限:
cd ~/
sudo chmod 777 opencv-2.4.13 -R
就可以了
然后配置 opencv 變量,編輯文件 /etc/ld.so.conf.d/opencv.conf(如果沒有就會自動創建):
sudo gedit /etc/ld.so.conf.d/opencv.conf
然后添加 opencv2.4.13 的 lib 路徑:
~/opencv-2.4.13/lib
保存退出,執行:
sudo ldconfig
編輯 ~/.bashrc ,最后添加:
#opencv-2.4.13
export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:~/opencv-2.4.13/lib/pkgconfig
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:~/opencv-2.4.13/lib
保存退出,執行:
source ~/.bashrc
查看當前 opencv 版本,新開窗口執行:
pkg-config --modversion opencv
如果顯示 2.4.13,說明當前opencv版本正是剛安裝的 2.4.13
4、編譯g2o
進入 g2o 文件夾:
cd ~/orb-slam_ws/ORB_SLAM/Thirdparty/g2o
創建 build 文件夾:
mkdir build
cd build
編譯:
cmake .. -DCMAKE_BUILD_TYPE=Release
如圖:
make
如圖:
5、編譯DBoW2
前面的前面說的要在 CMakeLists 文件中添加 opencv 路徑,說的就是這里了,因為編譯 DBoW2 時需要使用 opencv 庫。還有就是如果安裝了錯誤的 opencv 版本導致編譯失敗,那么在安裝了正確的版本后,需要重新編譯 ORB_SLAM(下一步會講),並且需要重新編譯 DBoW2,這個很重要,否則即使opencv版本正確,程序仍編譯不成功!重新編譯的時候刪掉 build 里的所有東西,然后重新 cmake 加參數和 make 就好了。
進入 DBoW2 文件夾:
cd ~/orb-slam_ws/ORB_SLAM/Thirdparty/DBoW2
創建 build 文件夾:
mkdir build
編輯 Thirdparty/DBoW2 下的 CMakeLists.txt 文件,在第4行左右,添加設置(正是opencv安裝的路徑):
set(OpenCV_DIR ~/opencv-2.4.13/share/OpenCV)
保存退出
然后進入 build 文件夾開始編譯:
cd build
編譯:
cmake .. -DROS_BUILD_TYPE=Release
如圖:
make
如圖:
6、編譯 ORB_SLAM
終於要開始編譯真正的程序源碼了,之前的都是編譯了需要用到的庫。
首先,因為我的 ROS 版本是 Indigo,所以需要將 ORB_SLAM 下 manifest.xml 中的 opencv2 那一行注釋掉,右鍵用 gedit 打開 manifest.xml,12行左右修改為:
<!-- <depend package="opencv2"/> -->
保存退出(這里我是注釋掉了,事實上可以直接刪掉這一句)
同時,由於同樣用到了 opencv,所以這里也需要在 CMakeLists 文件中添加opencv路徑:
編輯 ORB_SLAM 下的 CMakeLists.txt 文件,12行左右添加設置:
set(OpenCV_DIR ~/opencv-2.4.13/share/OpenCV)
保存退出
在 ORB_SLAM 下建立 build 文件夾,然后進入:
mkdir build
cd build
開始編譯:
cmake .. -DROS_BUILD_TYPE=Release
如圖:
make
如圖:
7、運行
然后呢,當然是開始跑程序啦~~老司機發車~~~~~~~wuwuwu~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
新開窗口啟動 ROS:
roscore
新開窗口,在 ~/orb-slam_ws/ORB_SLAM 下執行:
roslaunch ExampleGroovyOrNewer.launch
這里因為是 Indigo 版本,所以運行這個程序,如果是別的版本,就需要運行不同的指令,詳見原作者網頁。
這時,就會看到 Rviz 自動運行,同時出現一個黑色沒有顯示的窗口,這時因為沒有數據輸入。
然后新開窗口運行數據包(先進入數據包所在文件夾):
cd ~/orb-slam_ws
rosbag play --pause Example.bag
然后在這個窗口中通過 空格鍵 來控制數據包的運行與暫停,運行效果如下:
春節只有兩星期假,還要調程序,心里那個不情願啊aaaaa……假期算是沒跑通,各種錯誤,國內外的帖子翻了好幾遍,這不昨天剛弄出來
山重水復疑無路,柳暗花明又一村!
千萬別放棄,絕處逢生是最有成就感的!!