ORB-SLAM介绍(无源码版本)

  SLAM大致可分为激光SLAM和视觉SLAM,本篇就重点介绍一下一种经典的视觉SLAM——ORB SLAM。在2015年被首次提出,后续也有比较好的扩展性,应用很广泛。要想真正读懂ORB-SLAM肯定要从源码入手,网上也有很多教程去解读源码。但鉴于目前的需要,所以只是从结构上介绍下ORB-SLAM,不对代码进行任何的解读。如果你是和我一样的小白,不妨看一看,可能会有所收获~
  首先列举几种常见的视觉SLAM,这些大部分都是在ORB-SLAM之前。
ORB-SLAM介绍(无源码版本)_第1张图片

  内容参考:一文详解ORB-SLAM3

  下面对ORB-SLAM进行一些特点的介绍:
  ORB-SLAM基于PTAM架构,同样是基于关键帧(key fream based)在保证tracking和mapping线程分开基础上,又增加了地图初始化和闭环检测的功能,总共三个线程(tracking、local mapping、loop closing )。
  ORM-SLAM的适用范围:最开始基于单目,后来扩展到stereo和RGB上
  ORB-SLAM的实现是需要完全依托于ROS,对ORB-SLAM的评价是虽然完成了,但仅限于demo,所以基本只有后面的改进版本才能够广泛应用。
  ORB-SLAM的输入及输出:
    输入:摄像头采集的图像及时间码
    输出:轨迹(每帧图像对应的相机位姿)+地图(KF+MP)
ORB-SLAM介绍(无源码版本)_第2张图片

  上图是ORB-SLAM的架构图,也是流程图(简直清晰的一塌糊涂),把这个图读懂了,就完全明白ORB-SLAM的工作流程及原理了。见简单概括下:主要有5个模块,其中tracking,local mapping,loop closing是重点模块,完成了大部分内容。place recognition模块主要是配合上面三个重点模块,MAP只是一个数据结构的存储库(不作为介绍的重点)。下面我根据流程执行顺序依次介绍各个模块。

注:上文提到了,ORB-SLAM主要是由三个线程完成。所以第一步是三个线程的初始化,在此不再赘述。

1.TRACKING

  从架构图上可看出包含四个部分,包括了它所能完成的三个功能:(1)确定每帧的初始位姿 (2) 姿态优化 (3)确定KF给Local Mapping。完成三个具体功能之前,要做一些准备工作:
  准备工作1:从frame中提取ORB特征,如果你不知道啥是ORB,可以参考:ORB(Oriented FAST and Rotated BRIEF)
  准备工作2:初始化局部地图(这也是单目的局限性,第一时间必须多角度初始化建立局部地图),ORB-SLAM提供自动初始化方式。单目SLAM地图初始化的目标是构建初始的三维点云,初始化的常见方法有三种:
ORB-SLAM介绍(无源码版本)_第3张图片

  ORB SLAM作者提出一种基于统计的模型选择方法,该方法优先选择第三种方法,并期望在场景退化情形下自动选择第二种方法。如果选取的两帧不满足要求,放弃这两帧并重新初始化
  该模型方法的具体操作过程,参考:ORB-SLAM(三)地图初始化

  下面介绍tracking完成的具体三个功能:
  (1)确定每帧的初始位姿(pose)
  pose的确定是根据上一帧完成的,根据从上一帧提取出的特征(特征的对应关系是Frame 1对n匹配feature,feature 1对1匹配MP,后续处理都以帧为单位)。

注:相机位姿:位姿即位置和姿态,相机的位姿可以看做相机从原始位置到当前位置的变换,包含一个平移变换和一个旋转变换
参考:视觉SLAM中相机位姿的多种描述

  估计当前位姿的过程有两个:1)跟踪 2)计算位姿
  1)跟踪(跟踪局部地图前要先构建局部地图,也就是初始化),跟踪的目的是找到MP和当前帧特征之间的对应关系。原理是当前帧和参考关键帧匹配,通过MP建立联系(3D→2D的过程)。帧是2D特征,MP是3D点
跟踪的的具体操作流程是:
  根据上一帧的位姿加上两帧MP之间的关系,将上一帧的MP投影到当前帧。在投影点和当前帧原有点间寻找匹配,建立当前帧和MP之间的新关系。

  2)计算位姿,跟踪后,通过PnP对当前帧的位姿进行求解
姿态优化的原因:影响ORB SLAM精度的影响因素:帧与帧之间的位姿优化是否准确

  (2)位姿优化
  主要思路是在当前帧和(局部)地图之间寻找尽可能多的对应关系,来优化当前帧的位姿
  进行位姿优化的原因:得到的位姿是相对位姿,通过优化来保障精度。
  优化位姿的方式:局部/全局位姿优化,闭环检测优化

  (3)确定关键帧
  通过参考帧就可以决定当前帧是不是关键帧
  关键帧要求:
    1.不要太稠密(两相邻关键帧有一定时间距离)
    2.当前帧确定为关键帧至少要匹配到50个MP
    3.当前帧匹配MP不能超过参考帧的90%,否则认为是冗余关键帧,不需要创建
  添加关键帧时间:局部地图优化的空闲时间
  要选出关键帧的原因就是减少帧的数量,便于后面的BA

2.Local Mapping

  整个模块的功能是更新局部地图(由关键帧的联系组成),将新关键帧加入,建立关键帧之间的联系对关键帧位姿和map point点位置进行修正
  从架构图上看,Local Mapping具体完成5部分功能:(1)关键帧的插入 (2)MP的剔除 (3)MP的创建 (4)local BA (5)KF的剔除
  (1)关键帧的插入
  添加关键帧步骤:
    确定当前帧的邻接关键帧和二级邻接关键帧(确定方法同上,只不过发起者变成邻接关键帧),将当前帧的MP投影至一级/二级,若出现新匹配特征,曾更加该关键帧与MP的联系,未出现新的,但出现匹配更多的也修改MP与该帧的匹配联系。若匹配MP的数量达到阈值,即认定为关键帧。

  (2)Map Point的剔除
  MP的剔除是选择与关键帧联系较少,少于某一个指定阈值(原文中应该是3)。认定其为坏点,将其剔除。减少MP的数量,有利于优化速度。剔除的检查步骤发生在MP新加入时

  (3)Map Point的创建
  MP创建原则:
    当前关键帧在covisibility graph中邻接的一些关键帧(设定共同MP个数,达到要求算邻接)。对邻接的关键帧进行遍历,在极线上进行搜索并三角化。根据匹配点对,通过三角化计算3d点。再确定MP的相关属性(平均观测方向、观测距离、最佳描述子)
注:MP和KF变了之后,covisibility和spantree都要变。添加进入约束后要进行局部BA

  (4)局部优化(local BA)
  目的:这个不用输,就是提高局部地图精度
  局部优化的参与者:当前关键帧A、与A直接相连的关键帧B,与B关联的关键帧C、A对应的MP,B对应的MP(不包括与A共同的)

注:全局优化的参与者:除第一帧外所有关键帧及所有MP

  (5)局部KF的剔除
  根据covisibility确定局部关键帧,若关键帧A对应的MP能被其他至少三个关键帧观测到90%以上,认为其冗余,去除。也是为优化增加便利

以上完成VO过程

3.Loop Closing

  模块整体作用:解决累计误差,尺度漂移问题
  步骤:确定候选闭环帧→确定闭环帧
  具体过程:ORB-SLAM采用改进的DBoW2的方式解决环路检测问题。改进点就在于原来是寻找一个,现在返回多个可能匹配值。

  为了解DBoW2,介绍词袋模型(bag of words),词袋模型是以特征描述作为元素的词典。本文就是ORB特征了。词典元素可以通过数据训练出来(可离线训练,增强实时性)。从图像中提取特征描述(多用多维向量表示),将特征描述分类(可用聚类中各种机器学习算法)。就组成了词袋模型。为了便于搜索再使用树状结构组织,就形成DBoW2。简而言之DBoW2可以判断两张图片是否有相似性,改进后输出与属于输入有相似性的一组图片。

  确定候选闭环帧:确定局部关键帧,计算局部关键帧的词袋向量和所有局部关键帧的词袋向量相似度。关键帧库中寻找不小于最小相似度的作为备选回环关键帧。再检查剩下的一致性确定闭环帧(连续三次的关键帧对应相同的候选闭环帧)
  确定闭环帧(回环验证):从候选的回环帧中确定真的回环帧。遍历每个回环帧,匹配和当前帧的MP,用MP去求一个相似变换(通过RANSAC)。如果回环帧对应的矩阵有足够多内点,做Sim3优化,过程循环一下。最终发现足够多内点,接受该回环帧。
  闭环融合:回环帧信息融合到当前帧中(因误差累计更信任之前的信息)
  优化Essential Graph也是优化的一种,操作对象是covisibility graph,为后续局部优化、全局优化减少工作量。

4.place recognition模块

  功能是路径识别,即判断两帧是否存在大范围的相似。应用场景是回环检测和重定位(因阻挡、模糊等情况丢失后重新匹配关键帧)

  以上就是ORB-SLAM的整个操作流程,只有清楚上面这些操作,才能更好的理解后面的ORB-SLAM2和ORB-SLAM3哈~

补充说明内容:
1.covisibility graph、essential graph到底是什么?
  图的思想贯穿了ORB-SLAM,优化也是选取的图优化。不能说covisibility graph就是全局地图,我觉得叫位姿地图吧。covisibility graph的每个顶点是相机的pose(位姿),边是pose和pose之间的变换关系。边建立的基础和帧、MP组成的图有关系,也就是相机看到相似点时就会产生联系,边的权值就是联系的可信程度。我觉得还是不要把这个和帧,MP联系在一起了,单纯当成姿态关系图就行了。
  而essential graph是对covisibility graph的一个简化(ORB-SLAM自己提的),减少边的数量(保持连通性,最小生成树),目的是在全局回环的时候减少计算量。
参考:Covisibility Graph - 心田居士 - 博客园 (cnblogs.com) 这篇文章的作者主要内容也是参考高博在知乎的一个回答

2.三角化创建MP点什么意思?
  文中说通过三角化的方式就可以创建MP点,三角化指根据在两个图片中的点和变换矩阵就能确定3D点坐标。具体的我也不是很明白(数学过程没看~),把其理解为根据一组匹配点确定特征点(MP)的过程吧。
参考:slam 三角化 - 知乎

3.局部地图、全局地图到底指什么?
  这个问题困惑了我很久,这里的地图不是指看得到那种地图。其实是特征点信息,局部是当前临近,全局就是所有。这些特征点可以配合当前帧去求位姿信息,也就实现了定位的功能。至于SLAM最后建的图其实就是无数个特征点,特征点分布就可以反应环境的轮廓。

参考资料:
orb-slam的简单讲解-冯兵_腾讯视频
SLAM - 标签 - 路游侠 - 博客园
下面这篇对ORB-SLAM的特点把握的比较好:
ORB-SLAM2详解(一)

你可能感兴趣的:(SLAM,自动驾驶,计算机视觉,人工智能)