Ubuntu16.04+Ros+Usb摄像头跑ORB SLAM2

前言

最近,毕设做的是ORB SLAM2相关的,这里分享一下我搭建ORB SLAM2环境的过程。
实验环境:Ubuntu 16.04 + Ros Kinetic + Opencv3 + tb买的usb摄像头

Opencv安装

参考:Opencv安装
说明:搭建Ros不要用GTK3, 装GTK2就行,不然后面运行Mono,显示

(Mono:27720): Gtk-ERROR **: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported

还是要重装Opencv,还有所有的要重新编译一下,大坑。

Ros安装

参考:https://www.jianshu.com/p/68f88e377850
说明:这里面运行$ roscore命令的时候,如果你用的是非Bash终端,如Zsh,请$ exec bash,切换到Bash终端,才能正常运行。

ORB SLAM2安装

配置Ros环境
1
2
3
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws
$ catkin_make

在home目录找到隐藏文件.bashrc,在最下面添加

1
2
source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash

编译usb_cam
1
2
3
4
5
6
7
$ cd catkin_ws/src
$ git clone https://github.com/ros-drivers/usb_cam.git
$ cd usb_cam
$ mkdir build
$ cd build
$ cmake ..
$ make
编译ORB SLAM2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 安装 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
$ chmod +x build.sh
$ ./build.sh #如果运行电脑卡死的话,请修改build.sh文件中所有的make -j为make
$ ./build_ros.sh

如果./build_ros.sh遇到

Undefined reference to symbol ‘_ZN5boost6system15system_categoryEv’

请参考https://github.com/raulmur/ORB_SLAM2/issues/494

运行测试集
先下载测试数据集,选 fr1/desk,下载到Data文件下并解压

1
2
# 运行
$ ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml Data/rgbd_dataset_freiburg1_desk

相机标定

相机标定有很多方法,MATLAB,Opencv,Ros等,这里用Ros方法。
首先确保上面的测试集运行成功,摄像头能正常工作,然后打印一张A3的黑白方格的棋盘图片

1
2
3
4
5
6
# 第一个终端
$ roscore
# 第二个终端
$ roslaunch usb_cam usb_cam-test.launch #可以在.launch文件里修改要用的摄像头,比如笔记本的摄像头是/dev/video0,外接USB摄像头是/dev/video1
# 第三个终端
$ rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.035 image:=/usb_cam/image_raw camera:=/usb_cam #这里参数要与打印的模板一致

然后按照x(左右)、y(上下)、size(前后)、skew(倾斜)等方式移动棋盘,直到x,y,size,skew的进度条都变成绿色位置。
此时可以按下CALIBRATE按钮,等一段时间就可以完成标定。
完成后Commit,在终端后会有标定结果yaml文件地址.打开后,按照Asus.yaml的格式修改,命名为my.yaml,复制到/home/vgreen/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2目录下。
至此,标定完成。

运行

修改ros_mono.cc

进入catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/src 打开ros_mono.cc。

ros::Subscriber sub = nodeHandler.subscribe(“/camera/image_raw”, 1, &ImageGrabber::GrabImage,&igb);

中camera改为usb_cam

重新编译

$ ./build_ros.sh

启动
1
2
3
4
# 还是3个终端
$ roscore
$ roslaunch usb_cam usb_cam-test.launch
$ rosrun ORB_SLAM2 Mono /home/vgreen/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/vgreen/catkin_ws/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/my.yaml
效果图


参考

http://blog.csdn.net/Darlingqiang/article/details/78989544
http://www.cnblogs.com/li-yao7758258/p/5933651.html
http://www.cnblogs.com/shang-slam/p/6733322.html

----------本文完,感谢您的阅读----------