目录

1、仿真环境

2、安装功能包及其依赖

3、功能演示


ORB_SLAM是基于特征点的实时单目slam功能包,发布于2015年。翌年,作者又发布了支持Monocular(单目)、RGB-D(深度)、Stereo(双目)摄像头的ORB_SLAM2功能包。接下来演示功能包中的mono和rgbd两个算法的运行过程和效果,其中mono算法采用基于官方数据包的方式来运行,rgbd算法采用基于机器人仿真环境的方式运行。

1、仿真环境

下面先介绍本文使用的仿真环境。笔者是从github下载的由中科院软件所孵化的北京中科重德智能科技有限公司提供的机器人仿真环境,配置方法如下:

克隆包到工作空间

$ cd ~/catkin_ws/src
$ git clone https://github.com/DroidAITech/ROS-Academy-for-Beginners.git

安装依赖

$ cd ~/catkin_ws
$ rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y

编译并刷新环境

$ catkin_make
$ echo "source ~/catkin_ws/devel/setup.bash" >>	~/.bashrc
$ source ~/.bashrc

2、安装功能包及其依赖

安装ORB_SLAM2功能包,编译之前要为它安装eigen数学计算库以及对OpenGL进行封装的轻量级的OpenGL输入/输出和视频显示的Pangolin库。并且功能包需要OpenCV视觉库处理图像以及特征,不过OpenCV并不需要在编译ORB_SLAM2之前安装。(这些工具库没有必要放到工作空间中)

安装链接库

 $ sudo apt-get install libboost-all-dev libblas-dev liblapack-dev

下载ORB_SLAM2源码包

$ cd ~/catkin_ws/src
$ git clone https://github.com/raulmur/ORB_SLAM2.git

eigen官网手动下载并解压eigen3.2,然后进入目录编译安装

$ mkdir build 
$ cd build
$ cmake .. 
$ make
$ sudo make install

下载并安装Pangolin(用于可视化和用户接口,可以用于3D视觉和3D导航的视觉图)

$ git clone https://github.com/stevenlovegrove/Pangolin.git
$ sudo apt-get install libglew-dev #依赖库
$ cd Pangolin
$ mkdir build 
$ cd build
$ cmake -DCPP11_NO_BOOST=1 ..
$ make
$ sudo make install

OpenCV官网手动下载并解压安装OpenCV3.2(没有必要在ORB_SLAM2编译之前安装,ORB_SLAM2功能包的编译过程中并不依赖OpenCV)

更新系统(在安装前最好先更新一下系统,不然可能会安装失败。)

$ sudo apt-get update

安装依赖

$ sudo apt-get -y install libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip 

创建编译文件(cmake下载过程中可能会出现 ICV:DOWNLONDING ippicv_linux_20151201.tgz 一直下载不下来的情况,可以先自己下载ippicv_linux_20151201.tgz,然后把压缩包放到opencv-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e下,再cmake)

$ cd opencv-3.2.0
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..

编译和安装(make时间比较长)

$ make 
$ sudo make install

配置链接库路径及环境变量

$ sudo gedit /etc/ld.so.conf #末尾加一句/usr/local/lib
$ sudo ldconfig #使配置生效
$ sudo gedit /etc/bash.bashrc #修改环境变量,末尾添加以下两行(PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
                                                          #export PKG_CONFIG_PATH)

测试OpenCV是否安装成功

$ pkg-config --modversion opencv #如果显示3.2.0表示安装成功

编译ORB_SLAM2功能包

#修改环境变量,在本窗口临时生效
$ export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/catkin_ws/src/ORB_SLAM2/Examples/ROS
$ cd ORB_SLAM2
$ chmod +x build.sh
$ ./build.sh
$ chmod +x build_ros.sh
$ ./build_ros.sh
 
$ cd 
$ gedit .bashrc
#在文件末尾加上:(始终生效)
$ export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:~/catkin_ws/src/ORB_SLAM2/Examples/ROS

./build.sh编译过程中,可能会出现以下报错信息

这是因为源文件中缺少库函数usleep()头文件的声明,解决方法是在下列源文件中添加头文件#include<unistd.h>

./build_ros.sh编译过程中,会出现以下报错

意思是“包含未定义的引用”,原因是系统编译的时候找不到boost的链接库,解决方法是修改/ORB_SLAM2/Examples/ROS/ORB_SLAM2/CmakeLists.txt,添加一句-lboost_system,如下图

接下来再重新编译即可编译成功

3、功能演示

(1) 基于数据包回放的单目slam

首先下载数据包rgbd_dataset_freiburg1_desk.bag ,然后启动rosmaster,打开新的终端进入ORB_SLAM2目录下启动Mono算法

$ rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/Asus.yaml

我们可以看到开启的等待数据的可视化建图界面,然后打开新的终端进入数据包所在目录下播放数据

$ rosbag play rgbd_dataset_freiburg1_desk.bag /camera/rgb/image_color:=/camera/image_raw

其中的/camera/image_raw表示播放的数据要发布的话题名称,此时可以在界面中看到建图的效果

(2) 仿真环境下的RGB-D slam

同样先启动rosmaster,启动ORB_SLAM2功能之前要修改一下ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/ros_rgbd.cc源文件,因为我们仿真环境中的机器人发布的话题名称和算法订阅的话题名称是不相同的,我们要将ros_rgbd.cc源文件当中订阅的话题名称修改为机器人发布的名称(注意RGB-D摄像头会同时发布彩色图像和深度图像两个话题),然后重新编译ORB_SLAM2功能包。

接下来打开新的终端,启动ORB_SLAM功能节点

$ roslaunch orbslam2_demo ros_orbslam2.launch

之后再打开新的终端启动gazebo仿真环境

$ roslaunch robot_sim_demo robot_spawn.launch

最后打开键盘控制节点,通过按键控制机器人四处移动,完成建图

$ rosrun robot_sim_demo robot_keyboard_teleop.py

最终构建的是一个三维点云形态的地图,效果如下