ORB_SLAM2概述

ORB_SLAM2概述_第1张图片

追踪线程

  1. 灰度化处理。
  2. 构建当前帧(提取每幅图像的特征点,并分配到网格中,这会极大的方便某一领域内的特征点的查找与匹配)。
  3. 单目相机初始化操作:通过特征点匹配,使用RANSAC+DLC计算H矩阵,并根据对称转移误差计算H的评分。使用RANSAC+八点法计算E 矩阵,并根据极线约束估计F评分。选择H/E后通过SVD分解获得最优的R/t。随后进行三角化测距,全局BA优化,优化初始地图的相机位姿和路标点坐标。
  4. 估计相机位姿并进行优化(位姿图优化)。追踪相机位姿的方法(主要的不同在于获得当前帧位姿的方式)包括:(1)恒速运动模型:根据前两帧的位姿变换估计当前帧的位姿,在领域内搜索特征点,随后进行位姿优化。(2)参考关键帧模型:以上一帧的位姿为当前位姿,搜索当前帧的参考关键帧(共视点最多的关键帧),使用词袋加速算法进行特征点匹配,随后优化位姿。(3)重定位模型:使用词袋加速算法获得当前帧的候选关键帧,使用EPNP估计当前帧位姿,进行BA优化。
  5. 追踪局部地图:将局部地图中的路标点投影到当前帧中,在当前帧中搜索与之匹配的特征点(每个路标点会有一个描述子),随后优化局部地图中的关键帧的位姿。
  6. 判断关键帧。

局部建图线程

  1. 插入关键帧:将关键帧插入到局部地图中。在这个过程中会进行一下操作:(1)计算当前关键帧的词袋,并更新关键帧数据库。(2)更新共视图(更新当前帧和与其有共视关系的关键帧间的权重)。
  2. 剔除错误的路标点:(1)路标点和关键帧中的特征点匹配,如果匹配成功的关键帧过少,则认为这个路标点是错误的。(2)路标点被3个以下的关键帧观测到。
  3. 建立新的路标点:寻找与当前帧共视程度最高的候选关键帧,使用词袋加速算法+极限约束寻找特征点匹配。使用三角化测距形成新的路标点。在这个过程中,可能存在特征点1本来与路标点1存在联系,三角化之后,特征点1与路标点2建立了联系。这个时候需要进行路标点的融合。
  4. 局部BA优化:优化局部地图中的关键帧位姿和路标点坐标。这里的关键帧指的是与当前帧的共视程度超过一定阈值的关键帧。对于小于阈值的共视关键帧,这提供约束,不会对其位姿进行优化。
  5. 删除冗余关键帧:如果一个关键帧的90%以上的路标点可以被3个以上的关键帧观测到,就会被删除。

回环检测

在局部建图线程中,处理完一个关键帧后会将其抛入回环检测线程中。

  1. 检测候选回环关键帧:与当前帧的共视路标点超过15个,且词袋相似度大于一个阈值的关键帧视为候选回环关键帧。
  2. 计算Sim3变换:由于单目相机存在尺度漂移现象,因此需要计算当前关键帧相对于回环关键帧以及世界坐标系的Sim3变换。
  3. 回环融合:根据当前帧相对于世界坐标的Sim3变换,优化当前帧的共视关键帧的位姿(这样就会减少误差传递过程,使得位姿估计准确)。
  4. 本质图优化:对本质图中的关键帧的位姿进行优化。
  5. 在回环检测之后还会有一个全局BA优化线程,对所有关键帧的位姿以及路标点的坐标进行优化。

视觉字典

事先训练好的,在执行程序的时候会进行加载。
主要采用聚类算法+四叉树形式存储。为特征点描述子的集合。属于同一类特征的特征点的描述子组成一个单词。
可以根据词典进行特征点的加速匹配(就是只对属于同一个单词的特征点进行匹配)。

关键帧数据库

数据格式为哈希表,其主要作用为:寻找格式为:
单词(1):关键帧1、关键帧2、关键帧3…
单词(2):关键帧2、关键帧3、关键帧5…
在回环检测、重定位时,会根据关键帧数据库查找当前帧的候选关键帧。

你可能感兴趣的:(#,ORB_SLAM2源码理解)