@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
-lboost_system
)
改成
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_ros.sh