学习笔记之——ORB-SLAM1、2、3

82 篇文章 116 订阅

本博文是本人学习ROBSLAM的学习笔记,笔记分为两部分,第一部分为原理的学习,第二部分则是基于ROS开源的ORBSLAM功能包来实现建图

附上一个链接(汇总-VIO_激光SLAM相关论文分类集锦):https://download.csdn.net/download/gwplovekimi/16262695?spm=1001.2014.3001.5501

 

目录

前言

VSLAM技术框架

传感器数据

前端

VO特征点提取

特征点匹配

运动估计

离群点移除——随机采样一致算法(RANdom SAmple Consensus,RANSAC)

后端

图优化及G2O

Bundle Adjustment优化

回环检测

建立地图

什么是点云

ORB特征点

特征提取

FAST(Features fromaccelerated segment test)

BRIEF特征描述子

特征点四叉树均匀化分配策略

ORB-SLAM的概述

ORB-SLAM2的概述

ORB-SLAM3的概述

基于ROS的ORB SLAM功能包的实验

参考资料


 

前言

SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and Localization), 即时定位与地图构建,或并发建图与定位。这一个问题可以描述为:将一个机器人放入未知环境中的未知位置,是否有办法让机器人一边逐步描绘出此环境完全的地图,同时一边知道机器人真实的位置呢?

在这里,通俗地讲一下这里关于视觉slam的流程(借鉴网上的例子):

当你来到一个陌生的环境时,为了迅速熟悉环境并完成自己的任务(比如找饭馆,找旅馆),你应当做以下事情:
a.用眼睛观察周围地标如建筑、大树、花坛等,并记住他们的特征(特征提取)
b.在自己的脑海中,根据双目获得的信息,把特征地标在三维地图中重建出来(三维重建)
c.当自己在行走时,不断获取新的特征地标,并且校正自己头脑中的地图模型(bundle adjustment,BA优化 or EKF)
d.根据自己前一段时间行走获得的特征地标,确定自己的位置(trajectory)
e.当无意中走了很长一段路的时候,和脑海中的以往地标进行匹配,看一看是否走回了原路(loop-closure detection)。实际这一步可有可无。

图片

SLAM主要分为两类:激光雷达SLAM与VSLAM。目前以激光雷达作为主传感器的SLAM技术比较稳定、可靠,仍然是主流的技术方案。但随着最近几年计算机视觉技术的快速发展,SLAM技术越来越多的应用于家用机器人、无人机、AR设备,基于视觉的Visual SLAM(简称VSLAM)逐渐开始崭露头角。

 

VSLAM技术框架

VSLAM的技术框架如下,主要包括传感器数据预处理、前端、后端、回环检测、建图。

传感器数据

传感器数据预处理。这里的传感器包括摄像头、惯性测量单元(Inertial measurement unit,简称IMU)等,涉及传感器选型、标定、多传感器数据同步等技术。

前端

又称为视觉里程计(visual odometry,简称VO)。主要是研究如何根据相邻帧图像定量估算帧间相机的运动通过把相邻帧的运动轨迹串起来,就构成了相机载体(如机器人)的运动轨迹,解决了定位的问题。然后根据估算的每个时刻相机的位置,计算出各像素的空间点的位置,就得到了地图。

典型做法一般是:首先提取每帧图像特征点,对相邻帧进行特征点粗匹配,然后利用RANSAC(随机抽样一致)算法去除不合理的匹配对,然后得到位置和姿态信息。整个过程涉及到特征提取、特征匹配、对极几何、PnP、刚体运动、李代数等多视图几何知识。

视觉里程计只计算相邻帧的运动,进行局部估计,这会不可避免的出现累积漂移,这是因为每次估计两个图像间的运动时都有一定的误差,经过相邻帧多次传递,前面的误差会逐渐累积,轨迹漂移(drift)的越来越厉害。解决轨迹漂移的方法有两个:后端优化、回环检测。

视觉里程计

视觉里程计是通过移动物体(如车辆、人、机器人)上搭载的单个或多个相机拍摄的连续图像作为输入,从而增量式地估计物体自身的运动状态。

视觉里程计貌似和车轮里程计的功能差不多,都是估计运动物体的状态信息,只是传感器不同而已,那么为什么还需要视觉里程计呢,或者说它有什么优势呢?

1、和车轮里程计相比,视觉里程计的优势是不受车轮在恶劣环境下(如不平整的路面、水面或沙漠)打滑的影响。

2、汽车拐弯时,左右车轮的拐弯半径是不同的,这会增加车轮里程计的误差。而视觉里程计可以提供更为精确的轨迹估计,相对位置误差范围为0.1%到2%

3、视觉里程计主要应用在自主移动机器人、无人机等领域。它可以作为车轮里程计、全球卫星定位系统(GPS),惯性测量单元(IMU),和激光雷达等很多设备的有效补充。

4、视觉里程计在某些特殊场景下是非常重要且必须的,如无法使用车轮里程计的环境(如无人机)下,在GPS失效的特殊环境(如水下、外太空)下。

VO与VSLAM

VO只关心轨迹的局部一致性。其工作方式是一个位姿接一个位姿地增量式地重构路径,只优化前面若干个路径位姿(称为windowed bundle adjustment)。

Visual SLAM(简称VSLAM)关心的是全局轨迹和地图的一致性。其最终目的是获得一个全局的、一致性的机器人运动路径估计。这要求机器人能够识别它之前去过的地方,该过程称为回环检测或闭环检测(loop closure)。当回环检测到后,这部分获得的信息可以用于减少地图和相机路径的漂移(称为global bundle adjustment)。

VO可以作为构建VSLAM算法的一个模块,用于重构相机的增量运动。但是完整的VSLAM一般需要回环检测、全局优化以获得精确一致的地图。但VSLAM增加的回环检测处理不好会降低鲁棒性,因为回环检测时混进的离群点可能严重影响地图一致性。

如果用户只对相机路径感兴趣,但不需要环境地图,而且对实时性要求较高,可以只使用VO来完成。因为VO不需要跟踪相机的所有历史信息,它牺牲了全局的一致性来获得实时的计算性能。

Structure from Motion简称SfM

Structure from Motion简称SfM,中文译为运动恢复结构。是指从一组相机图像(有序或者无序都可以)中恢复相机位置姿态和重建三维结构的一种通用方法。最终结构和相机位姿通过离线优化(比如Bundle Adjustment,译为光束法平叉、捆集调整)算法来进一步提升效果,它的计算时间随图像的数量增加而增长。

http://grail.cs.washington.edu/projects/rome/index.html

VO可以看做是SfM方法的一个特例。因为VO不能处理无序图像集,它只能根据序列化的连续图像来估计相机的三维运动。Bundle Adjustment也可以用来优化轨迹的局部估计,但不是必须的。VO可以做到实时处理,而SfM不行。

根据VO是否需要提取特征点,VO的具体实现方法可以分为基于特征点法的VO和直接法VO。特征点法VO是以提取图像中的特征点为基础,学术界有长久的研究,运行比较稳定、对光照变化和动态场景鲁棒性强,是比较成熟的VO实现方案。而直接法VO是为了克服特征点法VO的部分缺点(如计算量大,不适用于纹理缺乏场景等)而出现的,随着一些直接法VO开源项目的出现,正逐渐进入主流。

VO特征点提取

VO想要获得好的结果,需要哪些条件?

1、环境的光照强度比较合适,不能太暗或者太亮。较暗的场景(如下图左)相机成像不清晰而且有很多噪点,而光线太强(如下图右)容易引起相机过度曝光,这些对于特征点提取非常不利。

2、环境具有相对丰富的纹理。即使光照强度合适,VO的效果也和场景内容有关。具有丰富纹理的场景可以很容易提取出大量有效的特征点,而纹理单一的场景(比如极端的白墙等)缺乏可靠有效的特征点会使得VO性能大幅下降。如下图所示。

3、需要捕捉连续的图像,保证相邻图像帧的内容有足够的重叠区域。因为需要对相邻图像重叠区域内的特征点进行匹配,所以重叠区域不能太小,否则可以匹配的特征点非常少,容易产生错误。

4、最好是静态场景下运行。而在有运动物体的动态场景下效果会变差。这是因为上述第3点需要在相邻帧间进行特征点匹配,如果场景中出现快速运动物体,比如人行走时的手臂快速摆动,在相邻帧间相同的特征点位置是突变的,而静止物体的特征点位置是连续小幅变化的,这样在对特征点对进行一致性检验的时候会剔除突变的特征点对。(快速运动的人体很难做VO)

特征点法VO的算法流程如下图所示:

特征点直观的理解就是图像中(一般是灰度图)中那些具有代表性的特殊的点。我们知道灰度值很容易受到光照、物体形变、图像拍摄角度等因素的影响,所以特征点的选择和设计非常重要。优秀的特征点应该具有以下特征:

  • 1、高辨识度。能够和周围的像素进行明显的区分,具有极强的代表性。

  • 2、可重复性强。相同的特征点可以在下一幅图像中被再次检测到,这样才能进行特征点匹配。

  • 3、高鲁棒性。在光照变化、几何变化(旋转、缩放,透视变形)时能够保持没有明显变化,在图像中存在噪声,压缩损伤,模糊等情况下仍然能够检测到。

  • 4、计算效率高。设计规则简单,占用内存少,有利于实时应用。但通常计算效率和鲁棒性成反比。

常见的比较知名的特征点有:

SIFT(Scale-invariant feature transform)

优点:不同光照下性能稳定、尺度不变,旋转不变,鲁棒性好;缺点:匹配成功数目少,速度较慢,有专利保护。目前在普通台式机上还无法实时计算SIFT特征,所以在对实时性要求较高的SLAM系统中用的很少。2006年提出了加速版,称为SURF。

FAST(Features from Accelerated Segment Test) 

ORB (Oriented FAST and Rotated BRIEF)2011年提出。是对FAST的改进,可以指定最终需要提取的特征点数量,具有旋转不变性和尺度不变性。采用速度极快的二进制描述子,速度仅为SURF的1/15。ORB在特征点质量和性能之间取得了较好的折中,在实时SLAM中非常受欢迎。

特征点匹配

根据上述的特征检测方法,我们可以分别得到相邻两张图中各自的特征点集合。特征匹配的目的就是把两张图中相同的特征点一一对应起来,如下图所示。

通常检测到的特征点都是成百上千个,那么这么多特征点如何进行匹配呢?

暴力匹配

最容易想到的办法就是对左图中的每一个特征点,计算它和右图所有特征点的相似程度(特征描述子的距离),然后按照相似程度进行排序,取最相似的那个作为匹配点,这称为暴力匹配。

暴力匹配虽然思想直观,但是有很明显的缺点:

  • 1、计算复杂度是特征点数目的二次方。由于特征点一般数量巨大,所以该方法的计算量无法接受。

  • 2、误匹配率高。由于特征点都是基于局部区域的特征,所以当场景中出现大量重复纹理(很常见)的时候很容易出现错误的匹配对。

由于上述原因,暴力匹配很少有人使用。

握手匹配

是对上述暴力匹配的改进。暴力匹配是左图的每个特征点和右图所有的特征点进行匹配,建立了多个匹配对(在此称为匹配对网);然后握手匹配在这基础上又用右图每个特征点和左图的所有特征点进行匹配,也建立了新的匹配对网。这两个匹配对网的交集就是相互认为对方是最优选的匹配对应。我们称之为握手匹配。

握手匹配虽然减少了错误匹配的数量,但是计算复杂度至少是暴力匹配的2倍,仍然不实用。

快速近似最近邻匹配

快速近似最近邻匹配(FLANN)是一种适合于特征点数量极多情况下的方法,该方法比较成熟,且已经集成到OPENCV(开源计算机视觉库)中了,调用很方便。

匹配后的特征对可能包含一些错误匹配对,我们可以人为的设定一些筛选条件,剔除异常的匹配对。比如剔除距离(欧氏距离或者汉明距离)超过中值距离3倍以外的匹配对。

虽然经过了筛选,但是我们也不能保证每一个匹配对都是完全正确的,这其中仍然会存在错误的匹配。在后面的运动估计中,还需要去除错误匹配的方法RANSAC(随机采样一致性)

 

运动估计

其实这个跟博文《ROS实验笔记之——基于ArUco Marker来估算camera的位姿》是有点像的。

确定了特征匹配对,下一步就是根据这些特征匹配对估计相机的运动。根据特征匹配对的不同维度(2D或3D),运动估计分为三种方法:

1、2D-2D

一般是单目RGB相机拍摄的相邻两帧图片,当我们得到了2D像素坐标的特征点匹配对,目标就是根据两组2D特征点对来估计相机的运动。该问题用对极约束(极线约束)来解决。

如图所示,空间点X和两个相机中心点Ck-1、Ck形成了3D空间中的一个平面,称为极平面(epipolar plane)。极平面和两幅图像相交于两条直线,这两条直线称为对极线(epipolar line)。从图中看如果已知了正确的特征点匹配对p,p',那么可以推断出三维点X的空间位置,以及相机的运动。

具体求解过程:根据匹配好的2D点求出本征矩阵E或者基础矩阵F(一般使用八点法来求解);然后根据E或者F求出旋转矩阵R和平移矩阵t,就得到了相机的位姿估计。

2D-2D的对极几何方法通常需要8个或8个以上的点对,且需要初始化(不能是纯旋转,必须有一定程度的平移)来解决尺度的不确定性。

3D-3D

双目相机或者RGB-D相机可以得到图像点的三维空间位置,这时匹配好的特征点对就是两组3D点,这种情况下通过迭代最近点(iterative closest point, ICP)来估计相机的运动。

ICP(Iterative Closest Point)

ICP全称Iterative Closest Point,翻译过来就是迭代最近点。ICP在点云配准领域应用的非常广泛,因此基于深度相机、激光雷达的算法使用ICP的频率比较高。

假设我们在三维空间中有两组点集,我们分别称之为P1, P2好了,P1, P2中都有几千个点,那么可以分为两种情况:

1、我们完全不知道P1, P2中每个点是如何对应的。这样的情况很常见,比如我用只有depth的深度相机或者激光雷达在两个不同的位置对着一只兔儿分别拍摄一张深度图并转化为点云图,也不知道哪个点和哪个点对应,但是我们想把这两个点云“融合”(专业词汇叫做registration,有些地方翻译为注册,有点让人不知所云,我建议翻译为配准)在一起,变成一个更完整的兔儿。

2、我们已经知道P1, P2中哪个点对应的哪个点。比如我们使用RGB-D相机分别在两个不同位置拍摄一张 RGB彩色图 + 深度图,而且彩色图和深度图是对齐好的。因为有彩色图我们就可以做特征点匹配了,因为每个特征点都对应一个深度图上的深度值,所以我们能够得到两组对应好的三维点。

接下来看看ICP的过程。为了方便,用一个二维的例子来说明,初始是两个不同角度下的笑脸(深红色和绿色),下面是红色笑脸如何通过ICP过程和绿色笑脸重合的:

图片

ICP算法流程

  1. 首先对于一幅点云中的每个点,在另一幅点云中计算匹配点(最近点)

  2. 极小化匹配点间的匹配误差,计算位姿

  3. 然后将计算的位姿作用于点云

  4. 再重新计算匹配点

  5. 如此迭代,直到迭代次数达到阈值,或者极小化的能量函数变化量小于设定阈值

下面是用三维点云进行ICP的一个效果

图片

 

3D-2D

当知道3D空间点及其在图像上的2D投影位置时,可以用PnP(perspective-n-point)来估计相机的位姿。至少需要3个点对(需要至少一个额外点验证结果)就可以估计相机的运动。

特征点的3D位置可以通过三角化或者RGB-D相机深度图确定,因此在双目或者RGB-D的VO中,可以直接使用PnP估计相机运动。而单目VO必须先初始化,才能使用PnP。3D-2D方法不需要使用对极约束,又可以在很少的匹配点中获得较好的运动估计,是最重要的一种姿态估计方法。

离群点移除——随机采样一致算法(RANdom SAmple Consensus,RANSAC)

图像是现实三维世界的投影,在成像的过程中受到光照变化、视角变化、运动模糊等多种因素的影响,相邻图像可能呈现较大的差异。此时,匹配好的点对仍会夹杂不少错误的匹配,我们称之为离群点,这会造成错误的数据关联。如果需要相机运动准确地估计,那么移除离群点就非常重要。

最常用的离群点去除方法就是随机采样一致算法(RANdom SAmple Consensus,RANSAC),该方法对包含较多离群点的情况仍然适用。RANSAC的核心思想是多次随机提取数据点计算假设模型,再在其他数据点中验证这个假设。如果其他数据都一致验证通过这个假设模型,就认为该模型是真实的模型。

其流程如下:

下图是RANSAC的一个示例,左边是所有的数据点,右边是RANSAC后的结果。

 

后端

主要是对前端的结果进行优化,得到最优的位姿估计。主要有两种方法:

  • 一种是基于滤波理论的优化,主要有 EKF, PF, RBPF, UKF等方法,其中EKF(扩展卡尔曼滤波)在早期是主流的方法。它的思路是将状态估计模型线性化,并用高斯分布近似其噪声,然后按照卡尔曼滤波进行预测来更新。但是实际上,这种对噪声的高斯分布大部分情况下是不成立的,此外,线性化过程中丢失了高阶项。

  • 另一种就是非线性优化(图优化)。它的基本思想是将优化的变量作为图的节点,误差项作为图的边,在给定初值后,就可以迭代优化更新。由于图优化的稀疏性,可以在保证精度的同时,降低计算量。

后端优化涉及到的数学知识比较多,具有较高的难度。总的来说,从状态估计的角度来讲,SLAM是一个非线性非高斯系统。因此传统的滤波理论已经逐渐被抛弃,而图优化已经成为主流方法。

图优化及G2O

在视觉SLAM中,虽然包含大量特征点和相机位姿,但其实BA是稀疏的,稀疏的就好办了,就可以加速了。而且计算机硬件发展也很快,因此基于图优化的视觉SLAM也可以实时了。

图优化里的图就是数据结构里的图,一个图由若干个顶点(vertex),以及连接这些顶点的边(edge)组成。

比如一个机器人在房屋里移动,它在某个时刻 t 的位姿(pose)就是一个顶点,这个也是待优化的变量。而位姿之间的关系就构成了一个边,比如时刻 t 和时刻 t+1 之间的相对位姿变换矩阵就是边,边通常表示误差项。

在SLAM里,图优化一般分解为两个任务:

1、构建图。机器人位姿作为顶点,位姿间关系作为边。

2、优化图。调整机器人的位姿(顶点)来尽量满足边的约束,使得误差最小。

下面就是一个直观的例子。我们根据机器人位姿来作为图的顶点,这个位姿可以来自机器人的编码器,也可以是ICP匹配得到的,图的边就是位姿之间的关系。由于误差的存在,实际上机器人建立的地图是不准的,如下图左。我们通过设置边的约束,使得图优化向着满足边约束的方向优化,最后得到了一个优化后的地图(如下图中所示),它和真正的地图(下图右)非常接近。

在SLAM领域,基于图优化的一个用的非常广泛的库就是g2o,它是General Graphic Optimization 的简称,是一个用来优化非线性误差函数的c++框架。

源码在:https://github.com/RainerKuemmerle/g2o

g2o的基本框架结构如下图所示:

SparseOptimizer是整个图的核心,我们注意右上角的 is-a 实心箭头,这个SparseOptimizer它是一个Optimizable Graph,从而也是一个超图(HyperGraph)

 

Bundle Adjustment优化

Bundle Adjustment(BA)中文有多种翻译法:光束法平叉、束调整、捆集调整、捆绑调整等。BA的本质是一个优化模型,其目的是最小化重投影误差。什么是重投影误差呢?

如下图所示,空间物体通过相机在图像平面所成像就称之为投影。下图中红色的qij特征点就是空间三维立方体(不是图上方的那个立方体,图中未画出)在图像平面的投影。然后我们利用前面所述的运动估计方法可以估计qij对应的可能的三维空间点位置(Xj点,不一定是真实的位置)。然后我们利用估计的三维空间点Xj和计算的相机参数Ci(不一定是真值)重新进行投影,此时投影到图像中的位置为P(Ci,Xj),由于估计位姿和相机参数时存在一定的误差,所以重投影点P(Ci,Xj)和第一次的投影qij有一定的偏差,就称为重投影误差。目标函数就是最小化这个重投影误差。

而通常使用的是窗口BA,它将当前图像和之前的n-1幅图像帧作为一个窗口进行优化,这样不仅可以跟踪前一个相机位姿还可以跟踪更之前的相机位姿,保证当前和前n-1个相机位姿一致。因此,窗口BA可以减小漂移。窗口大小n的选择决定了计算复杂度,选择较小的窗口数量可以限制优化的参数的数量,使得实时BA成为可能。

 

回环检测

主要目的是让机器人能够认识自己曾经去过的地方,从而解决位置随时间漂移的问题。视觉回环检测一般通过判断图像之间的相似性完成,这和我们人类用眼睛来判断两个相同的地点是一样的道理。因为图像信息丰富,因此VSLAM在回环检测中具有很大的优势。

图片

当回环检测成功后,就会建立现在的图像和过去曾经见过图像的对应关系,后端优化算法可以根据这些信息来重新调整轨迹和地图,从而最大限度地消除累积误差。

闭环检测算法指的是通过检测算法检测出之前访问过的场景。如图1所示,当机器人在移动过程中,特别是在探索大面积的场景时,由于模型的不确定性以及设备的噪声,不确定性会逐渐增长。通过引入闭环检测技术,识别出历史访问过的场景以增加位姿之间的约束,可以很好的减少这种不确定性。

闭环检测方法有:

 一、最简单的闭环检测算法是将新检测出来的关键帧和过去所有的关键帧一一进行比较,虽然这种方法能比较好的检测出当前场景是否在之前出现过,但是在大规模场景下,机器人往往有成千上万个关键帧,这种方法检测效率及其底下,不能再实际场景中使用。

二、通过将图像中的特征和整个地图中的路标对应起来,然后建立一个所有路标的数据库,通过使用路标分类器来加快场景识别速度。比如讲所有路标构建成一棵KD-Tree,当新添加一帧关键帧时,将关键帧在KD-Tree中进行检索,从中检索之前出现过的场景。

三、基于视觉词袋的闭环检测方法,这种方法通过将特征描述子抽象成词汇,通过TF-IDF方法识别出现过的场景。使用视觉词袋的方法效率很高,可用在大规模地图的创建上。

 

建立地图

SLAM根据不同的传感器类型和应用需求建立不同的地图。常见的有2D栅格地图、2D拓扑地图、3D点云地图等。关于栅格地图之前的博文也有介绍了,这里就不多描述了。

2D拓扑地图更强调地图元素之间的连通关系,而对精确的位置要求不高,去掉了大量地图的细节,是一种非常紧凑的地图表达方式。如下所示:

图片

3D点云地图在VSLAM中用的比较多,主要用于真实场景的视觉重建,重建的地图非常直观漂亮。但是点云地图通常规模很大,比如一张VGA分辨率(640 x 480)的点云图像,就会产生30万个空间点,这会占据非常大的存储空间,而且存在很多冗余信息。

图片

 

什么是点云

点云在编程实现的时候是一种数据结构,用来表达多维空间中点的集合,这个多维空间一般对我们来说是三维空间。

 

 

 

ORB特征点

特征提取

对于特征提取,首先利用图像金字塔来实现,这是对一个图像帧执行的操作。

图像金字塔,也就是对图像进行依次的缩放操作,得到相应的图像按照大小比例得到的排列。

通过对图像进行缩放操作。当金字塔的层数越高的时候,图像的面积越小,能提取到的特征数量也越小。相应地,在每一层上的分布的特征点也会随之减小,因此,这里可以通过一个等比数列,来计算总的特征点数,在对特征点数进行均分到每一层上。

其次,便是对特征点的求取问题。一张图像上可能有很多个特征点,但是能被提取出来作用的,相比之下便先得很小。而在这一些点里面,有一些点可以称之为关键点。关键点是指该特征点在图像里的位置,有些特征点还具有朝向、大小等信息。描述子通常是一个向量,按照某种人为设计的方式,描述了该关键点周围像素的信息。

 

 

之前博客《学习笔记之——vs2015+opencv2.4.13实现SIFT、SURF、ORB》也介绍过ORB特征算子了。这里复习一下。

ORB(Oriented FAST and Rotated BRIEF)是一种快速特征点提取和描述的算法。ORB算法分为两部分,分别是特征点提取和特征点描述。特征提取是由FAST(Features from Accelerated Segment Test)算法发展来的,特征点描述是根据BRIEF(Binary Robust IndependentElementary Features)特征描述算法改进的。ORB特征是将FAST特征点的检测方法与BRIEF特征描述子结合起来,并在它们原来的基础上做了改进与优化。据说,ORB算法的速度是sift的100倍,是surf的10倍。可用于实时性特征检测。

ORB算法主要分为以下两个步骤:特征点提取和特征点描述。特征点提取是根据FAST算法改进的,而特征点描述是根据BRIEF特征描述算法改进的。

FAST(Features fromaccelerated segment test)

FAST是一种角点检测方法,它可以用于特征点的提取。仅仅比较像素间亮度差,速度比较快。缺点:特征点数目庞大且不确定,不具备旋转不变性、尺度不变性。

同时,考虑到orb-slam中的原始的FAST关键点没有方向的问题(没有方向,会导致图像旋转后,brief描述子也会发生变化)导致的特征点对旋转不具有鲁棒性,在orb-slam2中还使用了灰度质心法来计算特征点的方向。简单如图所示

 

BRIEF特征描述子

 

 

 

特征点四叉树均匀化分配策略

特征点均匀化提取策略。参考资料:https://zhuanlan.zhihu.com/p/57235987

 

 

 

ORB-SLAM的概述

ORB-SLAM是一种基于ORB特征的三维定位与地图构建算法(SLAM)。ORB-SLAM构建的地图是稀疏的。

ORB-SLAM算法的一大特点是在所有步骤统一使用图像的ORB特征。ORB特征是一种非常快速的特征提取方法,具有旋转不变性,并可以利用金字塔构建出尺度不变性。使用统一的ORB特征有助于SLAM算法在特征提取与追踪、关键帧选取、三维重建、闭环检测等步骤具有内生的一致性。

ORB-SLAM的框架如下图所示。

(1)跟踪(Tracking)这一部分主要工作是从图像中提取ORB特征,根据上一帧进行姿态估计,或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新的关键帧。如果跟踪失败了则需要进行重定位。

(2)建图(LocalMapping)这一部分主要完成局部地图构建。包括对关键帧的插入,验证最近生成的地图点并进行筛选,然后生成新的地图点,使用局部捆集调整(Local BA),最后再对插入的关键帧进行筛选,去除多余的关键帧。

(3)闭环检测(LoopClosing)

这一部分主要分为两个过程,分别是闭环探测和闭环校正。闭环检测先使用WOB进行探测,搜索有没有对应的闭环关键帧(搜索到了跟当前关键帧长得很像的之前出现的关键帧,则说明传感器运动轨迹出现了闭环)。如果检测到了闭环,它就会进行一个图优化步骤,并且启动其后的“全局集束优化线程”。然后通过Sim3算法计算相似变换。闭环校正,主要是闭环融合和Essential Graph的图优化。

 

 

 

ORB-SLAM2的概述

不错的视频:https://search.bilibili.com/all?keyword=ORBSLAM2%E6%BA%90%E7%A0%81%E8%AE%B2%E8%A7%A3%E4%B8%93%E9%A2%98

ORB-SLAM2的源码:https://github.com/raulmur/ORB_SLAM2

带注释代码:https://github.com/electech6/ORB_SLAM2_detailed_comments

支持单目、双目和RGB-D相机的完整开源SLAM方案。能够实现地图重用、回环检测和重新定位的功能。

可以生成稀疏的三维重建地图。

代码框架:

 

ORB会对特征点进行均匀化

红色点表示局部地图点(用于当前的跟踪)
黑色点表示所有(其实剩下的)地图点

蓝色的是关键帧

 

 

 

 

ORB-SLAM3的概述

 

 

 

 

 

基于ROS的ORB SLAM功能包的实验

在博文《ROS实验笔记之——基于gazebo的ORB-SLAM2的仿真》中,实现了对ORB-SLAM2的仿真

 

 

 

 

参考资料

https://www.cnblogs.com/luyb/p/5215168.html

https://zhuanlan.zhihu.com/p/47451004

http://webdiis.unizar.es/~raulmur/orbslam/(ORB-SLAM项目地址)

https://mp.weixin.qq.com/s?__biz=MzIxOTczOTM4NA==&mid=2247484338&idx=1&sn=ba5db3dbe46728706b006a9554a6862a&chksm=97d7e625a0a06f3380c5c75c8501a2ba589d6288086268f0424e3d2091c72daaf0abbb0004f5&scene=178&cur_album_id=1361700104461467649#rd

(视觉里程计)https://mp.weixin.qq.com/s?__biz=MzIxOTczOTM4NA==&mid=2247484393&idx=1&sn=8b2ddf91d57cd53fe15a804d457f96cc&chksm=97d7e67ea0a06f68ede23bf24606333b56a0b2f07a674eb0b8d5009ccae64524d9fcbc79e9f0&scene=178&cur_album_id=1361700104461467649#rd

 

 

 

 

 

 

  • 8
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值