转载请注明出处,谢谢

原创作者:MingruiYU

原创链接:https://www.cnblogs.com/MingruiYu/p/12286752.html


ORB-SLAM2作为目前应用最广泛的视觉SLAM系统,其经典和重要程度毋庸置疑。ORB-SLAM2的github文档中,提供了详尽的ORB-SLAM2配置教程,上手应该是比较容易的。本文将跟随其github文档中的配置教程,对ORB-SLAM2系统进行安装和测试。

本文要点包括:

  • ORB-SLAM2的初次配置安装(包括相关依赖)
  • ORB-SLAM2运行TUM fr1/desk视频序列的单目SLAM和RGB-D SLAM示例
  • 解决ORB-SLAM2编译过程中报错:error: usleep is not declared this scope
  • 解决ORB-SLAM2运行示例过程中提示Failed to load module "canberra-gtk-module"

ORB-SLAM2 简介

ORB-SLAM是15年Raul等人提出的一个单目SLAM系统,其在单目SLAM领域影响广泛。详情可见论文:[Monocular] Raúl Mur-Artal, J. M. M. Montiel and Juan D. Tardós. ORB-SLAM: A Versatile and Accurate Monocular SLAM System. IEEE Transactions on Robotics, vol. 31, no. 5, pp. 1147-1163, 2015. (2015 IEEE Transactions on Robotics Best Paper Award). PDF.

在单目ORB-SLAM的基础上,17年Raul等人又提出了ORB-SLAM2,增加了对于双目相机和RGB相机的支持。详情可见论文:[Stereo and RGB-D] Raúl Mur-Artal and Juan D. Tardós. ORB-SLAM2: an Open-Source SLAM System for Monocular, Stereo and RGB-D Cameras. IEEE Transactions on Robotics, vol. 33, no. 5, pp. 1255-1262, 2017. PDF.

ORB-SLAM2是一个开源系统,其完整源码可见Github: raulmur/ORB_SLAM2.该开源库具备以下特征:

  • 支持单目,双目,RGB相机
  • 实时计算相机位姿和稀疏的三维重建,可进行回环检测和相机重定位
  • 提供运行示例:配置安装好后,可直接在KITTI, TUM, EuRoC数据集中的视频序列下运行
  • 可在ROS中编译,也可以不在ROS中编译:如果只是在数据集上运行,则不需要ROS;如果需要与真实摄像头连接,在真实场景下实时运行,则需要ROS。

安装相关依赖

在了解了ORB-SLAM2的概况后,我们开始对其进行配置安装。raulmur/ORB_SLAM2/README中提供了详尽的介绍和配置教程,建议大家尽可能去看原版,这样不容易因第三方转述而产生误解。本文在其配置教程的基础上,记录了一些自己遇到的其他情况和问题。本文暂没有使用ROS。

官方教程中提到他们测试了在Ubuntu12.04/14.04/16.04下的编译配置,而本文中,我是在Ubuntu18.04下进行编译配置的,经测试应该没有问题。在安装ORB-SLAM2之前,首先要安装相关的依赖。

C++11

使用Ubuntu18.04不需要额外配置。

Pangolin

Pangolin是一个用来可视化的库,ORB-SLAM2用它来进行可视化和人机交互。其下载和安装教程可见:(https://github.com/stevenlovegrove/Pangolin)。跟随该安装教程进行即可。其中,对于Pangolin的依赖项,我只安装了Required Dependencies和Recommended Dependencies。之后按照cmake工程编译的方法进行编译即可。

OpenCV

OpenCV肯定是必不可少的了。其下载和安装教程可见:(https://opencv.org/releases/)。找到需要的OpenCV版本,对于Linux系统,应点击其中Sources,下载一个压缩文件,下载完成后应对其进行解压。其安装教程可见:(https://docs.opencv.org/4.2.0/d7/d9f/tutorial_linux_install.html)。

注:官方文档中提到他们测试了OpenCV 2.4.11和OpenCV 3.2,我使用的是OpenCV3的最新版——OpenCV 3.4.9。

Eigen3

Eigen3作为矩阵运算库,当然也是必不可少的。其下载和安装教程可见:(http://eigen.tuxfamily.org)。在ubuntu中,可以直接使用 sudo apt-get install libeigen3-dev进行安装。

注:关于Eigen3的安装路径,如果出现程序include不到Eigen3的情况,可以参考 (https://www.cnblogs.com/newneul/p/8256803.html) 对Eigen3的位置进行调整。

DBoW2 & g2o(已包含在ORB-SLAM2库的第三方文件夹中)

ORB-SLAM2使用DBoW2库的改进版进行场景识别,使用g2o库来进行非线性优化。这俩都包含在ORB-SLAM2的第三方库中,不需要自己额外安装,它们的编译会和ORB-SLAM2库的编译一起进行。

安装ORB-SLAM2

在上述依赖全部安装完毕后(除了DBoW2 & g2o),可以开始进行ORB-SLAM2的配置安装。

clone该repo:

git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2

使用build.sh脚本安装ORB-SLAM2和第三方库:

cd ORB_SLAM2
chmod +x build.sh
./build.sh

注:在我编译ORB-SLAM2时,报错:error: usleep is not declared this scope。google后发现,在raulmur/ORB_SLAM2的Issues中,有很多人都遇到了这个问题(Issues/337)。其解决方法很简单,参照Acerlon的回答,只需在/include/System.h文件中添加头文件#include <unistd.h>即可。虽然不知道为什么源码中没有include该头文件……

运行示例

ORB-SLAM2提供了KITTI/TUM/EuRoC数据集下的运行示例。官方文档Monocular Examples Stereo Examples RGB-D Example提供了详细的在不同数据集上运行的教程。注意不同的相机类型对应着不同的数据集,也对应着不同的运行方法。

下面就举两个我运行了的示例,以TUM数据集中的fr1/desk视频序列为例。该数据集下载链接为(https://vision.in.tum.de/data/datasets/rgbd-dataset/download),找到其中fr1/desk序列,点击tgz下载压缩文件,之后进行解压。

单目示例

根据教程中所述,运行单目TUM示例的命令为

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

对应不同的具体视频序列需要对该命令进行调整:

  • 调整TUMX.yaml:如果视频序列是freiburg1(fr1)目录下的,则改为TUM1.yaml;如果视频序列是freiburg2(fr2)目录下的,则改为TUM2.yaml;如果视频序列是freiburg3(fr3)目录下的,则改为TUM3.yaml;
  • 调整PATH_TO_SEQUENCE_FOLDER:将其改为刚才解压后视频序列文件夹的路径。

所以,在我的机器上,TUM数据集fr1/desk序列对应的单目SLAM运行命令就是:在ORB_SLAM2文件夹下的终端中输入

./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml ../rgbd_dataset_freiburg1_desk

注:在我第一次运行的过程中,会有提示:Failed to load module "canberra-gtk-module",虽然感觉不影响运行,但还是解决了它为好。

解决方法:

sudo apt-get install libcanberra-gtk-module

运行效果如下:

RGB-D示例

根据教程中所述,运行单目TUM示例的命令为

# ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUMX.yaml PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE

对应不同的具体视频序列需要对该命令进行调整:

  • 调整TUMX.yaml:如果视频序列是freiburg1(fr1)目录下的,则改为TUM1.yaml;如果视频序列是freiburg2(fr2)目录下的,则改为TUM2.yaml;如果视频序列是freiburg3(fr3)目录下的,则改为TUM3.yaml;
  • 调整PATH_TO_SEQUENCE_FOLDER:将其改为刚才解压后视频序列文件夹的路径。
  • 调整PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE:将其改为该序列associations文件的路径。associations文件是用来将RGB图像和Depth图像一一对应起来的文件。ORB-SLAM2库Examples/RGB-D/associations/中提供了几个视频序列的associations文件,其中包含fr1/desk序列。所以此处就不需要自己生成了。

所以,在我的机器上,TUM数据集fr1/desk序列对应的RGB-D SLAM运行命令就是:在ORB_SLAM2文件夹下的终端中输入

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml ../rgbd_dataset_freiburg1_desk ./Examples/RGB-D/associations/fr1_desk.txt

运行效果如下:

最后,还是推荐大家尽可能地去阅读原始文档,这样最清晰也最不容易出错。如果遇到原始文档中没有提到的问题,再广泛查阅第三方资料为好。

ORB-SLAM2 系列博文

ORB-SLAM2 系列博文

ORB-SLAM2 初体验 —— 配置安装的更多相关文章

  1. Git:Git初体验——Git安装配置

    作为即将成为一个程序员的男人,一直在听别人说Git多好多好,之前也随便了解了一些,但是始终没有决心去学会.现在大四了,只有毕设和一门开学六七周只去过一次课的全员必修课外,也没有什么事情做,何不去做这些 ...

  2. Linux初体验--配置网络(CentOS7)

    在安装好虚拟机和操作系统后,一台合格的网络设备当然是要冲浪啊. 一.记下自己的网络配置 二.打开终端,输入命令 三.修改文件 保存后退出(wq). 四.重启网络服务 systemctl restart ...

  3. 【Android Studio】安卓开发初体验1——安装与试用

    安装 (安装预留硬盘(C盘)空余空间16G以上,8G以上内存) Intel用户: 安装Android Studio和AVD(安卓虚拟机 Android Virtual Device) 安装过程需要注意 ...

  4. 树莓派初体验,安装Ubuntu 14.04 LTS

    转载自:http://www.polarxiong.com/archives/%E6%A0%91%E8%8E%93%E6%B4%BE%E5%88%9D%E4%BD%93%E9%AA%8C-%E5%AE ...

  5. VUE初体验篇-安装

    现代前端框架大行其道,讲前端思想从操作dom的阶段,升级到操作数据的阶段.vue作为三大前端框架之一,其中平缓的学习曲线,让好多前端新手非常喜欢,应用也越来越广泛.虽然其他两个框架有facebook, ...

  6. 【Node.js】初体验之安装和HelloWorld

    听说Node.js是个蛮吊的东东.中午休息时间有限,暂时看了下知道怎么安装和初步使用了. 1.安装: 到Node.js官网下载就可以了,才5M多点,双击后按步骤安装就可以了. 2."Hell ...

  7. Kubernetes Python Client 初体验之安装授权

    最近想做一个基于flask的云平台管理服务器,利用python调用kubenetes提供的API来实现云平台的操作.笔者使用的是Windows,kubernetes集群安装在Ubuntu和Respbi ...

  8. 【Spark深入学习 -15】Spark Streaming前奏-Kafka初体验

    ----本节内容------- 1.Kafka基础概念 1.1 出世背景 1.2 基本原理 1.2.1.前置知识 1.2.2.架构和原理 1.2.3.基本概念 1.2.4.kafka特点 2.Kafk ...

  9. PyPy初体验

    PyPy初体验 PyPy安装 1.下载 下载地址:http://pypy.org/download.html(温馨提示:需要梯子) 下载PyPy3.6 64bit Ubuntu版本 解压 下载下来的文 ...

随机推荐

  1. Go网络编程

    概述 网络协议 从应用的角度出发,协议可理解为"规则",是数据传输和数据的解释的规则.假设,A.B双方欲传输文件.规定: 第一次,传输文件名,接收方接收到文件名,应答OK给传输方: ...

  2. Java手写数组栈

    public class ArrayStack{ private String[] items; //数组 private int count; //栈内元素 private int n; //栈大小 ...

  3. doc_values VS stored field

    doc_values 按列存储,按docId排序,在query阶段使用,直接根据docId获取具体field的value,用来排序,聚合等. stored field按文档存储,按docId排序,一条 ...

  4. Go Web 编程之 请求

    概述 前面我们学习了处理器和处理器函数,如何编写和注册处理器.本文我们将学习如何从请求中获取信息. 请求的结构 通过前面的学习,我们知道处理器函数需要符合下面的签名: func (w http.Res ...

  5. 搞定SpringBoot多数据源(1):多套源策略

    目录 1. 引言 2. 运行环境 3. 多套数据源 3.1 搭建 Spring Boot 工程 3.1.1 初始化 Spring Boot 工程 3.1.2 添加 MyBatis Plus 依赖 3. ...

  6. Scala实践2

    一.Scala基本类型和操作 1.1  基本类型 Scala的基本类型与Java基本类型相同,都是byte.short.int.long.char.string.float.double.boolea ...

  7. canal 基于Mysql数据库增量日志解析

    canal 基于Mysql数据库增量日志解析  1.前言  最近太多事情 工作的事情,以及终身大事等等 耽误更新,由于最近做项目需要同步监听 未来电视 mysql的变更了解到公司会用canal做增量监 ...

  8. python 生成器 yield语句

    生成器就是一个返回迭代器(iterator)的函数. 包含了 yield 的函数,就是一个生成器. 生成器每使用yield语句产生一个值,函数就会被冻结(暂停执行),被唤醒后(即再次调用)接着上次执行 ...

  9. 2019 牛客国庆集训day1 2019 点分治

    题目链接:https://ac.nowcoder.com/acm/contest/1099/I 点分治,计算路径数的时候,先将每个点到根的距离模2019,计算的时候就可以O(n)求出数目,对于模201 ...

  10. Activiti接受任务(receiveTask)

    Activiti接受任务(receiveTask) 作者:Jesai 前言: Activiti接受任务(receiveTask)其实和Activiti的手动任务是差不多的,不过手动任务是直接通过,而A ...