@ORBSLAM 2 + Ubuntu 16.04 + ROS Kinetic 安裝全過程
ORBSLAM 2 + Ubuntu 16.04 + ROS Kinetic 安裝全過程
最近開始學習SLAM, 跑通整個過程還是麻煩的,在這裡記錄一下.
OpenCV 安裝
https://github.com/raulmur/ORB_SLAM2 這裡官網編譯使用3.2.0, 為了防止之後出現版本不相容問題,建議安裝 opencv3.2.0 安裝的時候cmake 標明 安裝位置,之後再在編譯前修改Cmakelist 尋找我們安裝的着一個版本的 opencv
git clone https://github.com/opencv/opencv/tree/3.2.0-rc opencv
cd opencv
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/lib
make -j
sudo make install
注意:如果之前安裝過opencv, 最好将上面的 /usr/local/lib 修改為自己建立或者已知的檔案夾, 并且記錄,防止之後出現版本不相容問題.
ROS Kinetic install
Ros安裝 參考:https://www.jianshu.com/p/68f88e377850
說明:
source /opt/ros/kinetic/setup.zsh
當你使用zsh 終端時, 同樣的,建立新的ros 環境 source setup.zsh, 使用 bash 當你用bash 終端.
ORB SLAM2 配置
這裡參考 https://www.jianshu.com/p/dbf39b9e4617 理論上在這裡不會有什麼問題 建立工作區:
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws
$ catkin_make
設定ros workspace :
source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash
USB CAM
$ cd catkin_ws/src
$ git clone https://github.com/ros-drivers/usb_cam.git
$ cd usb_cam
$ mkdir build
$ cd build
$ cmake ..
$ make
ORB_SLAM
# 安裝 g++
$ sudo apt-get install gcc g++
# 安裝 Pangolin
$ sudo apt-get install libglew-dev #安裝Glew
$ sudo apt-get install cmake #安裝CMake
$ sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev #安裝Boost
$ sudo apt-get install libpython2.7-dev #安裝Python2'Python3
$ git clone https://github.com/stevenlovegrove/Pangolin.git
$ cd Pangolin
$ mkdir build
$ cd build
$ cmake -DCPP11_NO_BOOST=1 ..
$ make
$ sudo make
# 安裝Opencv
$ sudo apt-get update
$ sudo apt-get install libcv-dev
# 安裝Eigen
$ sudo apt-get install libeigen3-dev
# 安裝BLAS,LAPACK
$ sudo apt-get install libblas-dev
$ sudo apt-get install liblapack-dev
# ORB SLAM2
$ cd catkin_ws/src
$ git clone https://github.com/raulmur/ORB_SLAM2.git
直到最後 編譯
cd ORB_SLAM2
##這裡也應該修改所需要的opencv 路徑, 打開CMakeLists, 參考本文最後,修改為find_package( OpenCV 3.2.0 EXACT PATHS /home//OpenCV-3.2.0
./build.sh
如果也沒有問題 可以嘗試下
./build_ros.sh
可以測試:
# 3個終端
$ roscore
$ roslaunch usb_cam usb_cam-test.launch
$ rosrun ORB_SLAM2 Mono src/ORB_SLAM2/Vocabulary/ORBvoc.txt src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/Asus.yaml

界面大概如此
到這裡成功的話,恭喜你, 天選之子. 編譯失敗的話可以參考下面的解決方式.包括opencv 以及部配置設定置問題
問題及解決方式
1 undefined reference to symbol '_ZN5boost6system15system_categoryEv
這裡是因為boost_system 沒有被包含
cd Examples/ROS/ORB_SLAM2/
vim CMakeLists.txt
找到
set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
)
改成
set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
-lboost_system
)
### 2 Cannot Lauch node image_view
這個比較好解決, 缺少這個node 安裝就可以了.
sudo apt-get install ros-kinetic-image-view
3 OpenCV 相關問題
Bad argument (Invalid pointer to file storage) in cvGetFileNodeByName
網上看了很多人都碰到這個問題了 Ros 和opencv 版本比對問題, 這個比較複雜. ROS 中使用cv_bridge 對opencv 和ros 進行連結, 出現問題有兩種可能:
- 安裝cv_bridge 時所連結的版本與實際我們ORB_SLAM 編譯時使用的 opencv 版本不一緻
- 二者所依賴的opencv 庫與 ORB_SLAM 不一緻. 解決方式 參考了https://www.cnblogs.com/cv-pr/p/5366764.html 我們在安裝ros 時候自帶安裝了 ros-kinetic-cv-bridge 需要強行解除安裝
sudo apt-get remove ros-indigo-cv-bridge
接着我們自己手動在這個 workspace 裡編譯 cv_bridge
cd catkin_ws/src #進入src
git clone https://github.com/ros-perception/vision_opencv.git # 下載下傳vision_opencv
cd vision_opencv/cv_bridge
打開 CMakeLists.txt 找到
- find_package(OpenCV 3 REQUIRED
- COMPONENTS
- opencv_core
- opencv_imgproc
- opencv_imgcodecs
- CONFIG
- )
+
-set(_opencv_version 3)
删除 , 并且添加
find_package( OpenCV 3.2.0 EXACT PATHS /home/OpenCV-3.2.0 )
這裡opencv3.2.0 所對應的path 是 /home/OpenCV-3.2.0,你應該修改成你需要的位置, 這裡強制讓cv_bridge 尋找到我們需要的version. 我們回到工作空間中
cd ../../..
catkin_make --pkg cv_bridge
對cv_bridge 進行編譯. 此時 ,我們ROS 中對應的opencv版本已經固定為3.2.0了. 我們接着編譯ORB_SLAM
cd src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/
同樣找到CMakeLists.txt 删除下面幾行
-find_package(OpenCV 3.0 QUIET)
-if(NOT OpenCV_FOUND)
- find_package(OpenCV 2.4.3 QUIET)
- if(NOT OpenCV_FOUND)
- message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
- endif()
-endif()
添加
find_package( OpenCV 3.2.0 EXACT PATHS /home/OpenCV-3.2.0 ) #與上一步一緻
這裡和上一步是一樣的,目的是為了我們編譯時使用同一個opencv
到這裡就結束了,可以回到
cd ORB_SLAM2
./build.sh
./build_ros.sh