ORB-SLAM2的安装与运行

2023-05-16

0 背景简介

ORB-SLAM是西班牙Zaragoza大学的Raul Mur-Artal编写的视觉SLAM系统。他的论文“ORB-SLAM: a versatile andaccurate monocular SLAM system"发表在2015年的IEEE Trans. on Robotics上。开源代码包括前期的ORB-SLAM和后期的ORB-SLAM2。第一个版本主要用于单目SLAM,而第二个版本支持单目、双目和RGBD三种接口。

特点

ORB-SLAM是一个完整的SLAM系统,包括视觉里程计、跟踪、回环检测。它是一种完全基于稀疏特征点的单目SLAM系统,其核心是使用ORB(Orinted FAST and BRIEF)作为整个视觉SLAM中的核心特征。具体体现在几个方面:

  • 提取和跟踪的特征点使用ORB。ORB特征的提取过程非常快,适合用于实时性强的系统。
  • 回环检测使用词袋模型,其字典是一个大型的ORB字典。
  • 接口丰富,支持单目、双目、RGBD多种传感器输入,编译时ROS可选,使得其应用十分轻便。代价是为了支持各种接 口,代码逻辑稍为复杂。
  • 在PC机以30ms/帧的速度进行实时计算,但在嵌入式平台上表现不佳。

原理

ORB-SLAM整体流程如下图所示。

它主要有三个线程组成:跟踪、Local Mapping(又称小图)、Loop Closing(又称大图)。

跟踪

跟踪线程相当于一个视觉里程计,流程如下:

  • 首先,对原始图像提取ORB特征并计算描述子。
  • 根据特征描述,在图像间进行特征匹配。
  • 根据匹配特征点估计相机运动。
  • 根据关键帧判别准则,判断当前帧是否为关键帧。

相比于多数视觉SLAM中利用帧间运动大小来取关键帧的做法,ORB_SLAM的关键帧判别准则较为复杂。

1 实验目的

(1)配置ORB-SLAM环境并在真实环境运行
(2)了解工程实现的流程和框架
(3)熟悉在Ubuntu和ROS系统下的开发

2 实验环境

2.1 硬件

(1)惠普笔记本电脑,配置如下:
处理器:Intel® Core™ i5-7300HQ CPU @ 2.50GHz × 4
内存:8 GB
(2)传感器为罗技(Logitech)C170 网络摄像头,参数如下:
像素:130万;捕获幅面:1024*768;接口:USB 2.0

2.2 软件

(1)操作系统:Ubuntu 14.04
(2)软件平台:ROS indigo

3 实验步骤

3.1 首先安装必要的依赖

(1)更新apt库,更新软件列表

$ sudo apt-get update

(2)安装git,用于从Github上克隆项目到本地

$ sudo apt-get install git

(3)安装cmake,用于程序的编译

$ sudo apt-get install cmake

(4)安装Pangolin 作为可视化和用户界面
a. 安装依赖项

$ sudo apt-get install libglew-dev libpython2.7-dev

b. 从Github将项目下载到本地

$ git clone https://github.com/stevenlovegrove/Pangolin.git

c. 编译安装

$ cd Pangolin
$ mkdir build
$ cd build
$ cmake ..
$ make –j
$ sudo make install

(5)安装OpenCV ,用于处理图像和特征
要求版本最低为2.4.3,并在OpenCV 2.4.11和OpenCV 3.2上做了测试。
注意:这里的版本问题非常重要,不同的版本号可能会不兼容,会出现各种错误,只能重新编译,对没有经验的开发者还会花费大量的时间寻找错误和解决问题。
在本次实验中,我首次使用的OpenCV 3.2,但是最后出现了错误,改用OpenCV 2.4.11后成功。
a. 安装依赖项
[compiler]

sudo apt-get install build-essential

[required]

sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev

[optional]

sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

b. 在OpenCV官网(http://opencv.org)下载OpenCV 2.4.11的source版本,然后解压到本地
c. 编译安装

$ cd ~/opencv
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=Release –D CMAKE_INSTALL_PREFIX=/usr/local ..
$ make –j8
$ sudo make install

编译过程会花费较长时间,电脑CPU性能较低的建议不要使用make -j,容易卡死;CPU性能较高的可以使用make -jx,x代表线程,可加速编译。
(6)安装Eigen3,它是一个开源线性库,可进行矩阵运算

$ sudo apt-get install libeigen3-dev

(7)安装DBoW2和g2o
DBoW2是DBow库的改进版本,DBow库是一个开源的C++库,用于索引图像并将其转换为单词表示形式。
g2o是一个开源的C ++框架,用于优化基于图的非线性误差函数。
这两个库在ORB-SLAM2项目的第三方文件夹中,在此不单独编译,后续统一编译。
(8)安装ORB-SLAM2
a. 克隆仓库

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

b. 编译ORB-SLAM2,第三方库中的DBoW2和g2o,并解压ORB词典

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

3.2 单目例子

有TUM、KITTI、EuRoC三种数据集,本实验使用TUM数据集,从http://vision.in.tum.de/data/datasets/rgbd-dataset/download下载序列并解压缩。

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

其中PATH_TO_SEQUENCE_FOLDER为数据集的存储路径,并将tumx.yaml与下载的数据集对应,比如TUM1.yaml,TUM2.yaml 和TUM3.yaml 分别对应 freiburg1, freiburg2 和 freiburg3。
运行效果图如下所示,图中左侧窗口中的蓝色小方块为提取的图像ORB特征,右侧窗口显示了环境的稀疏地图和相机的运动轨迹。

公开数据集可以提供大量的数据,弥补数据的不足,即使没有RGB-D相机,也可以借助公开数据集的数据进行试验,当然工欲善其事必先利其器,不管做科研还是工程,硬件设备都是必须的;此外公开数据集还可作为算法性能对比的评价标准。

3.3 ROS例子

为了能够在线实时地运行ORB-SLAM2,需要借助ROS。关于ROS的安装,官网(http://wiki.ros.org/indigo/Installation/Ubuntu)有详细的安装教程,在此不再赘述。
本实验在上篇博客——摄像头图像信息的读取和显示的基础上进行开发,实现了摄像头数据的读取和显示,采集的图像数据可作为ORB-SLAM2系统的输入。
上篇博客创建了工作空间catkin_ws,将ORB-SLAM2项目移动到其子文件夹src下。
(1)将包含Examples/ROS/ORB_SLAM2的路径添加到ROS_PACKAGE_PATH环境变量中。打开.bashrc文件并在最后添加以下行。

export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM2/Examples/ROS

其中PATH为ORB-SLAM2项目所在路径,我的路径为/home/wb/catkin_ws/src。此外,还要在./bashrc文件写入

source /home/wb/catkin_ws/devel/setup.sh

最后在终端执行命令

source ./bashrc

(2)编译ROS下的ORB-SLAM2
ORB-SLAM默认订阅的话题为/camera/image_raw,而usb_cam节点发布的话题为/usb_cam/image_raw,因此需要在ros_mono.cc中修改订阅的话题,这点要特别注意。因为源文件的更改必须要重新编译,这非常耗时。

$ chmod +x build_ros.sh
$ ./build_ros.sh

(3)运行单目节点
运行单目节点前要先将摄像头接入电脑,然后启动usb_cam节点。

$ roslaunch usb_cam usb_cam-test.launc
$ rosrun ORB_SLAM2 Mono PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE

4 实验结果

启动单目节点后,首先要进行初始化,将相机左右平移直到图像提取出ORB特征点。然后手持相机在实验室空间中运动,ORB-SLAM2系统会以每秒30帧的速度对输入图像进行ORB特征提取,经过一系列运算,最后输出相机的运动轨迹和周围环境的稀疏地图。
注意

  1. 为了能够顺利地进行初始化,必须选择纹理丰富的场景,并使相机有一定的平移。
  2. 不能快速移动,最好保持匀速运动,保持当前帧与上一帧有足够数量的匹配的特征点,否则会跟踪失败。
  3. 跟踪失败后,应回到之前经过的场景,进行重定位。
  4. 电脑性能不能太低,保持电量充足。

我手持相机在实验室自己的工位附近运动了一段时间,最后运行效果图如下所示。

图中左侧窗口中的绿色小方块为提取的图像ORB特征,右侧窗口中的绿线代表相机的运动轨迹,蓝色方框代表相机运动过程中的空间位置(即关键帧),黑点和红点代表环境的稀疏地图(黑色代表历史路标,红色表示当前路标)。

5 总结

到这里,我可以编译运行诸如此类的开源项目了,虽然经历了各种报错的折磨,但是熟悉了Linux系统和ROS系统的操作、cmake、shell、OpenCV等等,为了能够自己进行开发,还需要更深入的学习。
作为初学者,从开源项目入手,学习其理论和工程实现,是入门的捷径,深入之后在其基础上做一定的改进。
然而工程实现只是科研的一部分,作为研究生,更重要的是抓住SLAM中的一个小问题,看看能否对现有的算法进行改进或者比较。所以还是要从论文出发,寻找灵感,去实现,并验证效果。
接下来还要很长的路要走,科研之路才刚刚开始。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ORB-SLAM2的安装与运行 的相关文章

随机推荐

  • Xsens Mti-g-710 IMU driver在Ubuntu18.04 ROS melodic中的安装使用

    Ubuntu18 04下安装的ROS melodic 如何使用Xsens Mti g 710 IMU driver xff1f 这里给出一个详细步骤说明 这里的IMU是USB接口 1安装 首先插入IMU的USB口 命令行运行 gt lsus
  • PYTHON -MYSQLDB安装遇到的问题和解决办法

    PYTHON MYSQLDB安装遇到的问题和解决办法 参考文章 xff1a xff08 1 xff09 PYTHON MYSQLDB安装遇到的问题和解决办法 xff08 2 xff09 https www cnblogs com gaosh
  • 位姿估计Robot_pose_efk的配置和使用

    Robot pose efk 用于融合里程计 xff0c 惯性测量单元和视觉里程计的传感器输出 xff0c 从而减少测量中的总体误差 了解ROS的robot pose ekf软件包中扩展卡尔曼滤波器的用法 xff1a robot pose
  • linux录屏和截图软件

    linux下的录屏和截图软件有很多 xff0c kazam集成了录屏和截图两个功能 xff0c 而且十分轻量级 xff0c 比较好用 如果是在VirtualBox虚拟机中跑linux的话 xff0c virtualbox本身就提供录屏和截图
  • APM 学习 6 --- ArduPilot 线程

    ArduPilot 学习之路 6 xff0c 线程 英文原文地址 xff1a https ardupilot org dev docs learning ardupilot threading html 理解 ArduPilot 线程 线程
  • nginx 配置多个vue,环境部署

    1 最近项目要上线 xff0c 需要通过nginx作为代理 xff0c 要发布2个VUE前端项目 xff0c 记录一下nginx conf配置文件 亲自验证 xff0c 特此记录一下 xff0c 希望能帮助向我一样 小白的人 user ro
  • freertos源码分析(1)--初始篇

    代码下载地址 xff1a https www freertos org 部分转载参考 FreeRTOS基础知识 xff1a RTOS全称为 xff1a Real Time OS xff0c 就是实时操作系统 xff0c 强调的是 xff1a
  • nginx服务占用百分之百

    一 当nginx达到100 时 xff0c 也就是服务器负载突然上升 1 利用top命令查看cpu使用率较高的php cgi进程 PID USER PR NI VIRT RES SHR S CPU MEM TIME 43 COMMAND 1
  • Gazebo教程(使用roslaunch 启动Gazebo,world以及urdf模型)

    Gazebo教程 xff08 使用roslaunch 启动Gazebo xff0c world以及urdf模型 xff09 关于如何学习ROS可以参考古月居的这篇文章 1 https www zhihu com question 35788
  • dispatch_queue_create---创建队列

    dispatch queue create span class hljs keyword const span span class hljs keyword char span label dispatch queue attr t a
  • Java多种方式解决生产者消费者问题(十分详细)

    一 问题描述 生产者消费者问题 xff08 Producer consumer problem xff09 xff0c 也称有限缓冲问题 xff08 Bounded buffer problem xff09 xff0c 是一个多线程同步问题
  • Http协议WWW-Authenticate

    HTTP协议有一个叫WWW Authenticate的头字段 xff0c 可以用于实现登录验证 它是在RFC 2617中定义的 当服务器接收到一个request xff0c 并在实现下面的代码 xff1a br http response
  • Android 运行时注解

    编译时注解点击此处 xff5e xff5e xff5e 运行时注解 以 64 BindView 为例 下面是实现步骤 新建一个 apt annotation 的 java library xff0c 然后在库中新建一个注解 xff0c 传入
  • 使用k-近邻算法识别手写数字。

    在之前的文章中介绍了k 近邻算法的原理知识并且用Python实现了一个分类器 xff0c 而且完成了一个简单的优化约会网站配对效果的实例 在 机器学习实战 中有关kNN的后一部分内容就是一个手写识别系统 xff0c 可以识别手写的0 9的数
  • 在Ubuntu14.04不能添加PPA源到apt源的问题解决方法

    在Ubuntu14 04使用apt get 更新Git 时 xff0c 需要更新apt源 xff0c 添加一个带有最新Git的源 xff0c 如下命令 xff1a sudo add apt repository ppa git core p
  • 单片机的操作本质【以STM32系列为例】

    单片机的操作本质 摘要寄存器的本质单片机的操作本质操作寄存器的方法 摘要 本文档是笔者学习野火F103视频 课时5 至 课时7 的总结 视频链接 xff1a https study 163 com course introduction 1
  • 《视觉SLAM进阶:从零开始手写VIO》第一讲作业

    目录 1 视觉与IMU融合之后有何优势 xff1f 2 有哪些常见的视觉 43 IMU融合方案 xff1f 有没有工业界应用的例子 xff1f 3 在学术界 xff0c VIO研究有哪些新进展 xff1f 有没有将学习方法应用到VIO的例子
  • GPS坐标与UTM坐标的转换

    1 简介 1 1 消息 gps common定义了两个通用消息 xff0c 供GPS驱动程序输出 xff1a gps common GPSFix和gps common GPSStatus 在大多数情况下 xff0c 这些消息应同时发布 xf
  • NVIDIA Jetson TX2使用笔记(一):开机设置

    0 写在前面 由于项目需要 xff0c 使用 NVIDIA Jetson TX2作为硬件开发平台 xff0c 在此记录使用方法和遇到的问题 NVIDIA Jetson TX2是英伟达的嵌入式开发套件 xff0c 可以进行视觉计算 xff0c
  • ORB-SLAM2的安装与运行

    0 背景简介 ORB SLAM是西班牙Zaragoza大学的Raul Mur Artal编写的视觉SLAM系统 他的论文 ORB SLAM a versatile andaccurate monocular SLAM system 34 发