博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SLAM学习 | Ubuntu16.04 下从零开始配置环境并运行ORB-SLAM2(TUM, ROS+USB, 自制数据集)
阅读量:2054 次
发布时间:2019-04-28

本文共 9239 字,大约阅读时间需要 30 分钟。

SLAM学习 | Ubuntu16.04 下从零开始配置环境并运行ORB-SLAM2(TUM,ROS+USB,自制数据集)

概要:
对于一个SLAM新手来说,配环境是必须要经历的第一关,然而这个过程常常会遇到很多困难,以至于让人感到烦躁和痛苦,还没入门就放弃。本文介绍笔者从零开始安装运行ORB-SLAM2的一整个过程,整个过程中参考了很多网上的资料和博客,也遇到很多问题,因此在这里做一个简单的记录。(我会尽可能详细地列出参考资料,未能详尽之处还请见谅)一方面是一个分享,另一方面也为了防止以后遗忘。本文的主要内容有:1.在空白Ubuntu16.04系统下配置并安装ORB-SLAM2;2.下载TUM数据集并运行;3.自己制作数据集并运行;4.使用ROS和USB相机实时运行;5.对ORB-SLAM2运行结果的简要评估。
关键字:
ORB-SLAM2; 环境配置; TUM数据集; 自制数据集; USB相机; ROS; SLAM评价
 

1 Ubuntu16.04下配置安装ORB-SLAM2

1.1 ORB-SLAM2简介

   ORB-SLAM2是视觉SLAM领域内里程碑式的作品,与其前身ORB-SLAM同出自西班牙萨拉戈萨(Zaragoza)大学的Ra´ul Mur-Artal等人之手。ORB-SLAM2于2017年发表在机器人领域顶刊上,其前身ORB-SLAM也于2015年发表在该期刊上。ORB-SLAM2相较于第一版的主要改进在于不仅支持单目相机,同时也支持双目相机和RGBD相机,另外在细节上也有多出改进,此处不再赘述。

   两篇文章的谷歌学术链接在这里给出:与。

   引用如下:

   ORB-SLAM: Mur-Artal R, Montiel J M M, Tardos J D. ORB-SLAM: a versatile and accurate monocular SLAM system[J]. IEEE transactions on robotics, 2015, 31(5): 1147-1163.
   ORB-SLAM2: Mur-Artal R, Tardós J D. Orb-slam2: An open-source slam system for monocular, stereo, and rgb-d cameras[J]. IEEE Transactions on Robotics, 2017, 33(5): 1255-1262.

   两篇文章的github地址分别如下:

   ORB-SLAM: .
   ORB-SLAM2: .

   ORB-SLAM项目的官方page网页如下:

   ORB-SLAM: .

   关于ORB-SLAM和ORB-SLAM2就简单介绍到这里。

1.2 配置安装

   我在安装的时候主要参考了这篇文章:。防止遗忘,这里将关键部分摘录如下,注意其中有些部分和原博客是不一样的。

(1)更新apt库,更新软件列表:sudo apt-get update(2)安装git,用于从Github上克隆项目到本地:sudo apt-get install git(3)安装cmake,用于程序的编译:sudo apt-get install cmake(4)安装Pangolin 作为可视化和用户界面  (4.1)a. 安装依赖项:sudo apt-get install libglew-dev libpython2.7-dev  (4.2)b. 从Github将项目下载到本地:git clone https://github.com/stevenlovegrove/Pangolin.git  (4.2)c. 编译安装:cd Pangolin		mkdir build 		cd build		cmake ..		make –j		sudo make install(5)安装OpenCV,做图像处理  (5.1)a. 安装依赖项  	[编译器]: sudo apt-get install build-essential  	[必选项]: sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev  	[可选项]: sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev  (5.2)b. 在OpenCV官网(http://opencv.org)下载OpenCV相应版本的source版本,然后解压到本地  (5.3)c. 编译安装:cd ~/opencv		mkdir build		cd build		cmake -D CMAKE_BUILD_TYPE=Release –D CMAKE_INSTALL_PREFIX=/usr/local ..		make –j8		sudo make install(6)安装Eigen3,它是一个开源线性库,可进行矩阵运算:sudo apt-get install libeigen3-dev(7)安装DBoW2和g2o。DBoW2是DBow库的改进版本,DBow库是一个开源的C++库,用于索引图像并将其转换为单词表示形式。g2o是一个开源的C ++框架,用于优化基于图的非线性误差函数。这两个库在ORB-SLAM2项目的第三方文件夹中,在此不单独编译,后续统一编译。(8)安装ORB-SLAM2  (8.1)a. 克隆仓库:git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2  (8.2)b. 编译ORB-SLAM2以及第三方库中的DBoW2和g2o,并解压ORB词典:		cd ORB_SLAM2		chmod +x build.sh		./build.sh

   如果一切顺利的话,按照上述8个流程走下来ORB-SLAM2就已经成功安装在你的Ubuntu系统上了。然而从头到尾都顺利是比较罕见的,更常见的是中间会遇到一些列问题。我在这里举三个我遇到的问题。

   问题一:Anaconda和openCV的冲突问题

   解决:笔者之前的项目需要用到Anaconda,并且还安装了多个python版本,在编译openCV时遇到了问题。请教同学被告知Anaconda和openCV同时安装会有冲突,网上查阅了大量资料后无果,最后是将Ubuntu重装之后才解决了这一问题。因此建议拿到一个空白的Ubuntu系统,先安装openCV。顺便说一下,openCV的安装比较坑,很容易和其他各种包相冲突,最简单的办法就是首先安装openCV。

   问题二:安装openCV过程中卡在了下面这一步无法继续

IPPICV: Download: ippicv_2017u3_lnx_intel64_general_20170822.tgz

   解决:这一问题可能是由于墙的原因,使得该压缩包下载超时,最终导致失败。解决的办法是先把这个压缩包下载了,然后编译的时候把获取方法由现场下载变为读取已存在的文件。具体操作如下:

   首先从别的途径下载好ippicv_2017u3_lnx_intel64_general_20170822.tgz并将其放置到某个路径中,例如就放置在/home/Downloads下,如图1所示:

图1 下载文件并放置在/home/Downloads路径下

 

   然后进入openCV的目录修改ippicv.cmake文件。我电脑中ippicv.cmake的路径是:

/home/chandler/opevcv-4.1.1/3rdparty/ippicv

   从中也可以看出我用的openCV版本是4.1.1,读者在寻找ippicv.cmake时注意需将chandler改成你自己的用户名。

   打开文件ippicv.cmake,找到第47行,将原来的一长串网页路径改成文件ippicv_2017u3_lnx_intel64_general_20170822.tgz的路径,如:

file:/home/chandler/Downloads/

   如图2所示:

图2 修改文件ippicv.cmake

 

   以上步骤都完成之后,重新编译:

cmake -D CMAKE_BUILD_TYPE=Release –D CMAKE_INSTALL_PREFIX=/usr/local ..

   一般情况下就可以解决问题。

   问题三:git clone失败,如图3所示

图3 git clone 失败报错

 

   原因有很多,最后发现是是所clone的内容过大,系统预留的缓存空间不够。因此解决方案就是增加缓存,例如下面这句话的意思就是设置缓存空间为2000000000字节,也就是2GB:

git config --global http.postBuffer 2000000000

   如图4所示,就可以解决问题:

图4 增加缓存空间 clone成功

2 下载TUM数据集并运行

   TUM数据集是做SLAM研究的经典数据集,由TUM(Technical University of Munich, 慕尼黑工业大学)收集制作并发布的一些列包括由单目、双目、RGBD相机采集的图像数据集,另外还包括一些视觉-IMU融合的数据集。我在这里下载的是其中的RGBD数据集。地址如下:

  

   注意,虽然下载的是RGBD数据集,但是也可以用这个数据及跑单目实验,只要不使用其中的rgbd文件即可。

   以其中任意一个数据集为例,其内部的文件构成如图5所示:

图5 增加缓存空间 clone成功

 

   其中depth文件夹和rgb文件夹中的分别是用深度相机和彩色相机拍摄得到的深度图和RGB彩图,accelerometer.txt文件内容是每一个时间戳下相机的三轴加速度,depth.txt文件内容是每一帧深度图像名及其时间戳,groundtunth.txt文件内容是相机正确位姿,rgb.txt文件内容是每一帧彩色图像名及其时间戳。

   运行过程如下:首先进入ORB-SLAM2文件夹,然后打开终端,最后输入运行命令。通用的命令格式是:

./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml PATH_TO_SEQUENCE_FOLDER

   注意,这个命令有4个参数,中间用空格符隔开。这四个参数依次是:起始代码文件所在路径,ORB词袋文件所在路径,相机的参数配置文件所在路径,数据集所在路径。上面命令中的TUMX.yaml中的X就是一个变量,表示对应的数据集是由不同种类的相机拍摄得到的,这些相机的参数各不相同,TUM1.yaml,TUM2.yaml 和TUM3.yaml分别对应freiburg1,freiburg2和freiburg3。以数据集fr1/xyz为例,使用的数据集是fr1路径下的,因此配置文件就是TUM1.yaml。上面命令中的PATH_TO_SEQUENCE_FOLDER指的就是数据集所在路径,我习惯把所有数据集都放到移动硬盘里,所以这个参数也会和大多数别的教程有所不同。因此,根据我的实际情况,运行命令是:

./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml /media/chandler/Phoenix/SLAM_Project/Dataset/TUM/rgbd_dataset_freiburg1_xyz

   运行结果如图6所示:

图6 ORB-SLAM2运行结果

 

   在图6中,左上侧窗口中的蓝色小方块就是提取的图像ORB特征;右上侧窗口显示了环境的稀疏地图(红玫离散点)和相机的运动轨迹,其中蓝色方框是历史关键帧,绿色方框表示相机当前的位姿;左下侧的是命令框。到这里,ORB-SLAM2就在TUM的一个数据集上跑通了。

3 自己制作数据集并运行

   这一节介绍如何自己制作数据集并运行。观察到ORB-SLAM2的输入应当是一系列有序的图片,因此需要将拍摄得到的视频解帧。我在视频解帧的过程中遇到一些坑,一一记录如下。

   第一步,视频解帧

   开始我用的是Potplayer软件的解帧功能,发现解出来的各帧在时间上没有均匀分布,后来自己写了一小段MATLAB代码完成了这个任务(相关代码已上传至我的,欢迎下载);
   第二步,图片命名
   2-开始我并没有对解出来的图片帧用时间戳命名,后来造成了很大的混淆,最后还是统一用了当前帧在整段视频中的时间戳为该帧命名,并且小数点后保留了6位数字;
   第三步,保存为txt文件
   把视频解帧为图片后,需要将所有图片的名字按行记录到一个txt文件中,这里注意多保留几个txt,分别对原图片序列进行不同程度的下采样(自制视频50fps的帧率过高,以至于帧间变化过小,给ORB-SLAM2的初始化带来困难)。

   制作完数据集后,还需要注意以下两点才能更好地运行:

   注意点1,相机标定

   需要对拍摄相机做标定,测定其内参矩阵和畸变系数(相机标定的内容参考我的这篇博客),更新上述运行命令中的第3个参数,也就是相机的参数配置文件;
   注意点2,更改特征点数量
   根据图像分辨率的不同适当增减每一帧提取的特征点的数量。例如,针对TUM的rgbd_dataset_freiburg1_xyz数据集,其每一帧图像的大小是640*480像素,TUM1.yaml中规定每一帧提取1000个ORB特征,即TUM1.yaml第22行:

ORBextractor.nFeatures: 1000

   而我用的相机拍摄的画面大小是1920*1080像素,就需要适当增加每一帧提取的特征数量,以便于更好地初始化,例如我就取特征数量为3000。

   做完这些之后应该就可以顺利地运行了。我拍摄的视频及ORB-SLAM2在该视频上的运行截图如图7和图8所示:

图7 拍摄的视频截图
图8 ORB-SLAM2在自制数据集上运行结果截图

4 使用ROS和USB相机实时运行

4.1 ROS简介

   ROS是机器人操作系统(Robot Operating System)的英文缩写,是用于编写机器人软件程序的一种具有高度灵活性的软件架构,在SLAM领域ROS几乎可以说是无处不在。别的不说,只要你需要在板上实时跑SLAM项目,基本都要用ROS。如果不求专精的话,ROS的学习和操作一般来说一二个星期就可以入门,但是如果要深入研究那将需要花费巨大的时间和精力。因此这里不去对ROS本身做详细解说,只是着眼于ORB-SLAM2的运行简单介绍ROS的相关基本操作。

   下面罗列一些ROS的学习参考资料:

   1-官网:

   2-CSDN专栏:
   3-简书博客:

4.2 安装ROS

   第一步,添加控制源

   直接在桌面打开一个命令窗口(Ctrl+Alt+T),输入如下指令:

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $ (lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

   设置秘钥:

sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 0xB01FA116

   第二步,下载并安装ROS

   更新系统软件:

sudo apt-get update

   下载完整版ROS:

sudo apt-get install ros-kinetic-desktop-full

   安装完成后,可以用下面的命令来查看可使用的包:

apt-cache search ros-kinetic

   查看结果如图9所示,这个列表很长,下图只能展示一小部分:

图9 ROS可用包

   第三步,初始化ROS

   首先需要初始化rosdep

sudo rosdep initrosdep update

   然后初始化环境变量:

echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrcsource ~/.bashrc

   最后安装一个插件:

sudo apt-get install python-rosinstall

   第四步,测试ROS

   测试ROS是否安装成功最简单的办法就是启动ROS,如果能够启动成功,就说明已安装成功。启动命令很简单:

roscore

   如果一切正常的话,命令行窗口的最后会显示如下一句话:

started core service [/rosout]

   如图10所示:

图10 测试显示ROS正常启动,安装成功

4.3 安装usb_cam

   这一部分的作用是安装并建立相机节点,使得USB相机可以在ROS下正常工作。

   第一步,创建工程

   在/home路径下创建一个名为catkin_ws的工程目录并进入:

mkdir -p ~/catkin_ws/srccd ~/catkin_ws/src

   第二步,下载usb_cam源代码并编译

   下载源码:

git clone https://github.com/bosch-ros-pkg/usb_cam.git

   进入工作空间目录并编译源代码:

cd ~/catkin_wscatkin_make

   将编译好的文件添加到环境变量:

source devel/setup.bash

   正常情况下到这一步USB就可以在ROS下工作了。

4.4 ROS下安装ORB-SLAM2

   如果要在ROS下实时运行ORB-SLAM2,就需要在ROS的工作空间中把ORB-SLAM2重新编译一遍。

   第一步,拷贝源代码

   将之前(编译之前)的ORB-SLAM2文件夹拷贝到catkin_ws/src路径下,如图11所示。

图11 ORB-SLAM2文件夹拷贝到catkin_ws/src路径

   第二步,添加环境变量

   打开命令行窗口,输入命令:

vim .bashrc

   在该文件的最后一行添加如下命令:

export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:*/ORB_SLAM2/Examples/ROS

   其中的*是指在ROS中需要实时运行的ORB-SLAM2所在的位置,本例中见图12:

图12 测试显示ROS正常启动,安装成功

   保存文件并关闭,再输入以下命令使之生效:

source .bashrc

   第三步,编译库

   下面分别编译四个内容:g2o库、DBoW2库、ORB-SLAM2和ROS的Example。方法都是先进入对应文件夹,新建build文件夹并进入,再输入以下两条指令分别进行预编译和编译。

cmake ..make

4.5 实时运行ORB-SLAM2

   实时运行ORB-SLAM2分三步,首先启动ROS系统,然后启动usb相机,最后启动ORB-SLAM2,因此需要开启三个Terminal。

   注意,运行之前需要根据当前USB相机的参数修改对应的XXX.yaml配置文件。相机标定的内容我在另一篇博客中有所介绍。

   运行过程及结果如图13和图14所示。

图13 实时运行ORB-SLAM2,正在初始化,尚未成功
图14 实时运行ORB-SLAM2,初始化成功,运行中

 

   在图13中,系统正在寻找关键帧间对应匹配的特征点,尝试初始化;在图14中,系统初始化成功,开始运行。

   图13和14中各有6个界面,其中:

   1-左上的Terminal用来开启ROS系统;
   2-左下的Terminal用来开启相机,这个Terminal运行成功后,中下的相机视图就可以显示出来了;
   3-中上的Terminal用来开启ORB-SLAM2,这个Terminal运行成功后,右上和右下两个界面就可以显示出来了;
   4-中下是USB相机的实时显示视图;
   5-右上是ORB-SLAM2的特征点视图,在系统刚刚开始运行时,图中会有大量长短不一方向各异绿色线条,表示系统正在尝试进行帧间特征点匹配,也就是初始化;当系统初始化成功后,图中出现的大量绿色方框表示检测出来的ORB特征;
   6-右下是ORB-SLAM2的关键帧视图,蓝色方框是历史关键帧,绿色方框是相机当前帧,各蓝色帧间的绿色线条表示帧间权重,以上元素共同构成了位姿图(Pose Graph);黑色和红色的离散点表示检测出来的特征点,也就是稀疏地图。

   一些关键命令和结果已经在图中用红色方框标出。

5 简要评价ORB-SLAM2

   根据近阶段做的一些实验和得到的结果,我对单目ORB-SLAM2有如下体会:

   1-在相机直线运动时追踪效果较好,但一遇到转弯效果立马变差。例如,当相机原地悬停转向时,ORB-SLAM2会认为相机有一个位移产生,相机原地抬高或降低时,ORB-SLAM2也会认为相机存在位移;

   2-在相机朝向和运动方向保持一致时追踪效果较好,但当相机朝向和运动方向之间存在角度时效果会变差。例如,当相机向正北方向直线运动但其朝向正西方向时,ORB-SLAM2会认为相机逐渐在向西北方向偏离;
   3-在相机朝向正下方时追踪效果很差;
   4-在相机以较高角速度转动时,ORB-SLAM2非常容易跟丢,根据我的经验,角速度应当控制在20度每秒以内为宜;
   5-ORB-SLAM2作为单目SLAM的实例,其最大的问题仍然是尺度不确定性
   6-……以后想到再补。

6 参考资料

[1].

[2].
[3].
[4].
[5].
[6].

转载地址:http://uqclf.baihongyu.com/

你可能感兴趣的文章