ORB-SLAM论文学习

梳理了一下ORB-SLAM论文

一、系统架构

1、ORB特征

整个SLAM系统使用改进后的ORB特征(256维二进制描述符的带方向的多尺度FAST角点)

2、三个线程

A、TRACKING跟踪线程:主要负责对每帧图像的相机位置进行定位和关键帧的插入

B、LOCAL MAPPING局部地图构建模块:处理关键帧并对周围相机位姿进行局部BA

C、LOOP DETECTION回环检测: 对每个关键帧进行闭环检测,利用相似性约束对位姿图进行优化

3、地图点云与关键帧

A、地图点云包括信息:3D坐标、视图方向、ORB描述子、可观测点云的最大最小距离

B、关键帧包括信息:相机位姿、所有的ORB特征、相机内参

4、Covisibility Graph和Essential Graph

A、每个关键帧为一个节点,共同观测到15个点云则连一条边构成一张图Covisibility Graph

B、进行全局位姿优化加快优化速度,构建一张Essential Graph,其包含所有关键帧,但边缘更少

5、使用DBoW2执行闭环检测

二、详细流程

1、地图初始化

A、提取ORB并匹配双视图

B、并行计算H、F矩阵

C、模型选择:场景近平面或存在低视差使用H矩阵求解;非平面场景与足够视差情况下使用F矩阵求解;

D、运动到结构:H矩阵提取八种运动假设并测试出有效解;F矩阵使用K矩阵转化为E矩阵,然后分解出4个解;测试解的正确性,若没有一个优胜解则从头执行地图初始化

E、全局BA,优化点云地图

2、跟踪

A、特征提取

B、根据前一张关键帧估计位姿:利用匹配点及对应的地图点估计位姿,若没有足够的匹配点则在点云点附近搜索其他点找匹配点

C、全局重定位:全局选取相似关键帧轮流PnP找到最优的位姿

D、追踪局部地图:当前帧相关的其他关键帧K1和K1相关的K2中点云投影到当前帧进行匹配,最后对当前帧位姿优化

E、判断是否为关键帧

3、局部地图构建

A、关键帧插入:更新Covisibility Graph,生成新的地图云点

B、地图点云筛选:三个关键帧观测到

C、创建新地图点云

D、局部BA

E、局部关键帧筛选:90%的点可以在其他至少三个关键帧中同时观测到,则删除

4、闭环检测

A、候选关键帧

B、计算相似变换

C、回环检测

D、Essential Graph优化

 

二、第三方库

1、DBoW2与词袋模型

利用DBoW2库,图像可以方便地转化为一个低维的向量表示。比较两个图像的相似度也就转化为比较两个向量的相似度。它本质上是一个信息压缩的过程。

词袋模型利用视觉词典(vocabulary)来把图像转化为向量。视觉词典有多种组织方式,对应于不同的搜索复杂度。DBoW2库采用树状结构存储词袋,搜索复杂度一般在log(N),有点像决策树。词典的生成过程如下图。

词典建立好后,就能将图像转换为一个数值向量,根据这个向量就能计算两张影像之间的相似度了。

所以视觉词袋模型通俗点来说就是 首先建立一本词典(visual vocabulary,视觉词袋),假使这本词典内有K个单词(word,特征点聚类),对一篇文章(图像)而言,统计这篇文章内词典中这个K单词每个出现的次数,就可以用这K维向量来描述着篇文章。

对于DBoW2库有两个概念:

       正向索引:相对于图像而言,保存一幅图像中每个特征的索引和它在字典中所属的单词索引。意义在于当对两幅图像做涉及到特征点的匹配计算时,可以利用“属于同一单词索引的特征更有可能匹配“的设定规则,来加速匹配。

       逆向索引:相对于字典中的单词而言,保存该单词出现过的图像的图像索引,和该单词在图像中的权重。意义在于加速在OrbDatabase中根据相似度寻找相似图像的计算。
 

二、g2o与图优化

图的节点:位姿(x,y,z,ω,φ,κ)

图的边:两个节点之间的关系(观测方程:实际测量出的数据计算的比如两个pose之间的变换)

你可能感兴趣的:(slam)