SLAM小白视角最详细讲解——ORB-SLAM :A Versatile and Accurate Monocular SLAM System
文章目录
- 一.前言
- 二.情境存储结构——地图
-
- 1.MapPoin(地图点) { p i } \\{p_i\\} {pi}
- 2.KeyFrames(关键帧) { K i } \\{K_i\\} {Ki}
- 3.Covisibility Graph(共视图)
-
- 3.1.Essential Graph(本质图)
- 4.Spanning Tree(生成树)
- 三.特征存储结构——Bags of Words Place Recognition
- 四.工作流程
-
- 1.地图初始化
- 2.Tracking(跟踪)
- 3.Local Mapping(局部建图)
- 4.Loop Closing(回环检测与校正)
一.前言
刚进组之前也没有上过相关的课程,图形学基础约等于0,传统SLAM闻所未闻。然后组里的学长列出了一份论文清单,本文赫然在列。点开一看,我嘞个。闻所未闻的专业术语,非常抽象的配图,及其复杂的流程,着实让我头痛欲裂。遍阅各家讲解,寻访人工智能,看过都感觉对于新手来说过于差点意思。于是用我浅薄的理解,没有的知识,来试图顺一遍文章的思路,就当是帮自己理清了。
二.情境存储结构——地图
地图是整个系统的核心部分,包含以下元素:
1.MapPoin(地图点) { p i } \\{p_i\\} {pi}
在三维空间中重建的特征点。这个点存储着:
(1)真实世界的坐标 X w , i X_{w,i} Xw,i(是这个地图点或者说特征点的位置,一开始我会困惑一个图像帧是怎么只用一个3维坐标表示位置的,后来发现这个地图点其实是对应图像帧上出现的特征点,因此坐标描述的是这个特征点的位置)
(2)视角方向 n i n_i ni(每个地图点,通常会被多个相机关键帧(KeyFrames)看到。每当相机看到一个地图点,可以画一条“从相机光心到地图点”的射线(ray)。这条射线的方向就是当前视角下,这个点的观察方向。系统把所有看到该点的关键帧的观察方向(这些射线的方向向量)都取出来然后求平均(mean);最后归一化(变成单位向量)。这样就得到了 ni —— 一个描述“这个点大概朝着哪里看”的平均方向)
(3)代表性ORB描述子 D i D_i Di(同一个特点可能在不同关键帧中ORB描述子会有所差别,我们选择这样一个在多个图像帧中都被观察到的特征,选择一个和别的所有描述子差别最小的描述子作为此处的代表性描述子)
(4)能观察到这个点的最远距离 d m a x d_{max} dmax和最近距离 d m i n d_{min} dmin
2.KeyFrames(关键帧) { K i } \\{K_i\\} {Ki}
系统中保留下来的“重要”帧。区别于上面的一个点,这个是一张图像。
(1)相机位姿 T i , w T_{i,w} Ti,w
(2)相机内参 I i I_i Ii
(3)这一帧提取到的所有ORB特征
3.Covisibility Graph(共视图)
展示哪些关键帧看到了相同的地图点,帮助构建局部关系。
(1)node节点:关键帧 K i K_i Ki
(2)edge边:描述两个关键帧有多少个共有的地图点MapPoint,用权重 θ \\theta θ表示
不难发现共视图的信息量非常地大,我们需要一种更加简洁高效地存储方式来描述关键帧之间的关系:
3.1.Essential Graph(本质图)
包含所有的顶点,但是不包含所有的边。
(1)Spanning Tree 下面有介绍
(2)共视图中高共视性的边( θ m i n >100 \\theta_{min}>100 θmin>100)
(3)loop closure边(当系统检测到闭环时,当前位置”实际上是你曾经去过的“老地方”,只不过两者在地图上相隔很远,为这两个相距很远的关键帧添加一条新边;这条边就叫 闭环边 loop closure edge,表示这两个关键帧之间有强关联)
4.Spanning Tree(生成树)
是共视图的边最少的连通子图。每次加入新的关键帧时,只选择一个与它权重 θ \\theta θ最大的节点建立边。
现在我们来看文中的这张配图,(a)就是一系列关键帧,可以把它们看做蓝色的节点。(b)一开始我是完全没看懂,为什么会有这么宽的绿色带子?实际上是因为不同的关键帧之间几乎都有边,因为边太密了所以看起来像一片,这也反映出共视图高额的存储代价。(c)是Spanning Tree,因为上面讲到的插入规则一个新节点只与特征最相近的节点相连,所以图像看起来就是一个线圈,这很合理。(d)Essential Graph包含的边比spanning tree要多一些,还有一些高共视性的边。
三.特征存储结构——Bags of Words Place Recognition
词袋(Bag of Words,BoW)最早应用场景是自然语言处理领域,其中的Word就表示文本里的单词。后来的研究者把词袋用在视觉SLAM领域,这时候的Word表示的是图像里的局部信息,比如特征点。
- 特征编码:在系统运行时,将新捕获的图像的ORB描述子映射到视觉词典中的词汇,形成词袋向量。
- 数据库检索:将生成的词袋向量与数据库中已存储的关键帧进行比较,计算相似度,识别出回环或重定位位置。
四.工作流程
本篇论文技术细节对于新手来说真是及其多,所以我们从整体上的视角,利用流程图把握这个ORB-SLAM是什么样子的。
这张图是 ORB-SLAM 系统的完整流程图,分成了几个主要模块(或者叫线程),每个模块都有不同的工作。SLAM 的意思是“同步定位与地图构建”,也就是说:你用一个摄像头,一边走路一边建地图,同时还知道自己走到哪里了。ORB-SLAM系统分为 4 个主要部分:
- Tracking 跟踪
- Local Mapping 局部建图
- Loop Closing 回环检测与校正
- Place Recognition 场所识别
但是在此之前,我们需要先初始化地图才能开始后续的步骤
1.地图初始化
对于单目相机,ORB-SLAM 采用了一种自动化的初始化策略,无需人工选择具有较大视差的帧。系统会针对平面场景(planar scene)和非平面场景(non-planar scene),同时计算单应矩阵(Homography)和基础矩阵(Fundamental Matrix) 两种几何模型,然后根据启发式信息选择最合适的模型。
(1) 特征点提取与匹配 在两帧图像中提取 ORB 特征点,并进行特征匹配。
(2)计算几何模型 利用匹配的特征点,分别计算单应矩阵和基础矩阵。
(3) 模型选择 根据内点数量和得分,选择最适合的模型。 通常情况下:
- 如果内点比例较高且场景为平面,选择 单应矩阵;
- 如果是一般非平面场景,选择 基础矩阵。
(4)相对位姿估计与三角化 根据选定的模型,估计两帧之间的相对位姿,并通过三角化恢复初始的三维点云,建立初始地图。
(5) 全局优化 对初始地图和位姿进行全局优化(如全局捆绑调整,Bundle Adjustment),以提高精度。
这种初始化方法使 ORB-SLAM 能够在单目相机下实现自动、高效的地图初始化,无需人工干预。
2.Tracking(跟踪)
负责实时估计相机当前的位置和朝向(位姿)。
- Frame(图像帧)
接收到相机采集的一帧图像。 - Extract ORB(提取 ORB 特征)
提取图像中的 ORB 特征点(角点、纹理点),用于后续匹配。 - Initial Pose Estimation(初始位姿估计)
基于上一帧或通过重定位(Relocalisation)估计当前相机的位置与姿态。 - Track Local Map(跟踪局部地图)
将当前图像的特征与局部地图中的特征点进行匹配。(这个操作的目的是为了实时估计当前相机的准确位置和朝向(位姿),让 SLAM 系统知道“我现在在哪里”。如果我发现新图像帧的特征 { f i } \\{f_i\\} {fi}和之前某个图的特征 { f i ∗ } \\{f^*_i\\} {fi∗}有许多是相同的,那么我们就合理的认为拍摄新图像的位置和之前那张图的拍摄位置是比较接近的,从而实现定位) - New KeyFrame Decision(新关键帧判断)
判断是否需要将当前帧保存为关键帧,以丰富地图信息。(如果你发现这张图和上一张图基本上没什么变化,那么这张图肯定犯不着专门记录一次)
3.Local Mapping(局部建图)
上一部分的最后一步挑选出的关键帧会参与到map的建立中来,负责维护和优化局部地图。
流程:
- KeyFrame Insertion(插入关键帧)
将新关键帧加入地图。计算新的关键帧的特征点的词袋。 - Recent MapPoints Culling(最近地图点剔除)
删除跟踪效果差或冗余的地图点。 - New Points Creation(新点创建)
通过新旧关键帧间的三角测量生成新的地图点。 - Local BA(局部捆绑调整)
优化当前局部地图的相机位姿和地图点位置(BA = Bundle Adjustment)。 - Local KeyFrames Culling(局部关键帧剔除)
删除冗余的关键帧,保持地图精简。
4.Loop Closing(回环检测与校正)
用于检测和处理回环,减少系统的累计误差。
流程:
- Candidates Detection(候选帧检测)
检查是否回到曾经到过的地方,找出可能的回环候选关键帧。 - Compute Sim3(计算 Sim3 变换)
计算当前关键帧与历史关键帧之间的尺度、旋转和平移变换。 - Loop Fusion(地图融合)
如果确认回环,将当前地图与历史地图融合。 - Optimize Essential Graph(全局图优化)
基于回环结果,全局优化关键帧和地图点位置。
当然流程中的种种判断在文中都有比较严谨的规定和量化,这里处于入门知识对其进行了意思上的概述,如果需要的话请查看论文原文。
如果发现问题请大家不吝赐教,谢谢!