ORB-SLAM2原理框图,如下:
1 DBoW2(词袋)
DBoW2(视觉词袋)算法主要用于重定位或闭环检测(place recognition 或 loop closure),该算法使用ORB特征即结合了FAST特征和BRIEF描述子的特征。闭环检测的目的是为了比较两张图像之间的相似度,将特征点的描述子(description)空间离散化即将一幅图像上提取的特征转换为单词表示:
,
由于视觉单词是固定的,所以一幅图像可以用向量表示:
然后,我们对比词袋向量,就可以计算两幅图像的相似度。
上述所提到的单词来源于何处?我们通过DBoW2在大量的图像中提取特征,利用K-Means方法聚类出个单词,利用K叉树,在每一层都采用K-Means方法聚类成
类,树(该树也可称为词汇树)的叶子节点就是单词。深度为
的K叉树的节点数(生成的单词数)为
,如下图所示。
image database由一个多级的词包(hierarchical bag of words)由一棵词汇树(vocabulary tree)、直接索引(direct index)和逆向索引(inverse index)构成。
DBoW2中默认 ,可形成100000个单词,使用K叉树有什么好处呢?主要是加速:
1、可以加速判断某一个特征属于哪个单词。若不使用K叉树,判断时需要将这个特征与每个单词进行比较,需要比较次,利用K叉树的快速查找特性,只需要比较
次。
2、 DBoW中存储了Direct Index(直接索引),每一个Direct Index存储了图像的特征及K叉树上某一层上与这些特征相关的节点,在进行两帧间特征匹配时,只针对每一个节点进行匹配,大大缩小了匹配空间,加速了匹配速度(不懂。。。)。
3、 DBoW中存储了Inverse Index(间接索引),每一个Inverse Index包含有此单词的所有图像的 Index及对应权重,加快了闭环搜索过程。
DBoW2如何计算相似性?
每幅图像都被转换成一个词袋向量,两个词袋向量的相似性可用score表示,计算方式为:
2 闭环检测
2.1 搜索闭环候选帧
ORB-SLAM2维护了一个数据库,里面保存了每个单词都能看到的关键帧。
要求闭环与闭环之间必须超过10帧,计算当前帧与共视图中帧的相似分数,取得分最小的那个作为minscore,以最小相似度minscore作为基准,若大于该基准才可能是闭环帧。从数据库中查找闭环候选帧,通过Inverse Index,可以快速找到与当前帧有共同单词的关键帧,含有共同单词最多的那个关键帧称为maxcommonwords,,删除小于mincommons的候选关键帧,而minscore已经剔除掉了一些关键帧,再加上候选帧不能出现在当前帧的共视图中,我们把在剩下的候选帧中,将相连的候选帧归为一组,每个组计算一个分数,得分最高的为bestAccScore,
,根据这个阈值剔除掉一些孤立的闭环候选帧,剩下的则为闭环候选帧。最后进行连续性检测,闭环不仅仅是单帧对单帧的匹配,好的闭环应该是多帧对多帧的闭环,如下图所示。
至此得到若干个可靠的候选关键帧(mvpEnoughConsistentCandidates),SLAM中要求闭环的准确率达到100%。
2.2 几何校验,Sim3优化
找到一个闭环帧,计算每一个候选帧与闭环帧之间的Sim3变换
2.3 闭环融合
调整关键帧的位姿,更新共视图
把当前帧的局部地图和闭环帧的局部地图进行融合
2.4 本质图优化
先进行本质图优化,再进行全局BA