三维重建学习(八)SLAM

图像的词袋表示,图像检索

给一张图片,转化为词频向量。相似的图像就是某个小图像比较高。也能分类。难在如何生成词典。

词典来自于特征提取与表示

把所有特征做成描述符,再做聚类。

给一个块,看跟那个块近,就认为他是哪个单词。将所有小区块变成了索引值。每个框框统计,就得到词袋描述。

相似性度量

给两个图像向量,进行相似性度量,算余弦距离即可。

TF-IDE 词频因子

对他进行改良,对向量进行加权,凸显了部分单词的重要性和抑制了部分单词。

倒排索引加速运算。重要性大的先比较。

捆绑调整

摄像机的内参数不优化。

生成树

SLAM介绍

扫地机器人的初始化步骤,就是走边房间进行建图与定位。绿色的是摄像机,黑色为点云。

传感器分类

传感器可分为俩个类:

  • 携带于机器人本体上的,例如机器人的轮式编码器、相机、激光等等。
  • 安装于环境中的,例如前面讲的导轨、二维码标志等等。

摄像机:单目、双目、深度相机。

SLAM开源方案

ORB-SLAM

核心就是三个线程:

  • 跟踪:确定当前帧位姿
  • 建图:完成局部地图构建
  • 回环修正:回环检测以及基于回环信息修正系统漂移。

不是每一种视频帧都会被建图(比如静止不动)。

1.数据结构与数据库

这个数据图词典由一个大规模数据集离线学习而得。

重排结果包含两张图象的特征点对应关系。

2.系统工作流程

2.1 跟踪

该线程的核心功能:

  • 确定当前帧位姿
  • 确定其是否将其作为关键帧

ORB特征提取:[ORB-SLAM2] ORB-SLAM中的ORB特征(提取) - 知乎 (zhihu.com)

地图初始化:构建初始的地图点云,第一个摄像机作为世界坐标系

  1. 计算特征点匹配,匹配数要大于预定义门限
  2. 同时计算基础矩阵F与单应矩阵H(注:匹配点可能来自于同一平面)
  3. 分别计算F和H的误差,选择最合理的矩阵
  4. 队F或者H进行分解,三角化重构出初始地图点;
  5. 使用GloablBA进行优化,即关键帧位姿与重构的地图点都参与优化。

初始位姿估计:

  1. 基于前一帧的估计
    1. 如果前一帧跟踪成功,利用上一帧的运动模型估计当前帧的摄像机位姿;
    2. 依据估计的R和T,将前一帧观测到的地图点投影到当前帧;
    3. 如果成功找到足够多的对应点,则依据2D-3D对应点计算摄像机位姿(EPnP);如果失败转到全局重定位。
  2. 重定位
    1. 计算当前帧词袋,在数据库检索,找到匹配度大于某个门限的候选参考关键帧(通常有多个候选帧);
    2. 对于每一个候选参考关键帧K:

pAZhbX6.png

位姿优化:找到更多的3D-2D对应点继续优化当前帧位姿。

  1. 寻找候选“局部地图点”
    1. 简历共视图与当前帧相连的关键帧集合K1以及与K1相连的关键帧几何K2
    2. K1+K2看到的全部地图点构成“局部地图点”集合
    3. K1中与当前帧相似度最高的设为KrefK_{ref}(后续会使用)
  2. 筛选地图点
    1. 无法映射到当前帧的地图点舍弃
    2. 当前点视图方向v和该地图点的平均观测方向n满足vn<cos(60度)舍弃
    3. 计算地图点到该帧摄像机中心的距离d,如果d[dmin,ddmax]d \notin [d_{min},d_{dmax}]则该地图点舍弃;
    4. 计算尺度d / dmin,在该帧中,对于所有未匹配的ORB特征描述子,检测在该尺度下,是否有3d点的投影与其匹配,若匹配则将该未匹配的特征描述子与3d点建立联系。
  3. 使用所有未被筛选掉的2D-3D点对应对当前帧进行位姿优化。

关键帧选取:满足以下全部条件则增加新的关键帧:

  1. 距离上次全局重定位经历了超过20帧(刚重定位的帧位姿可能不会太准)
  2. 局部地图(Local Mapping)线程空闲(繁忙时计算能力有限,无力分身)
  3. 或者距离上次关键帧插入超过20个帧(场景可能发生变化,赶紧增加关键帧)
  4. 当前帧至少有50个关键点(该帧可信度较高)
  5. 当前帧和KrefK_{ref}共视点相似比小于90%。(不要与数据库中的关键帧重叠太高)

2.2 建图

该线程的核心功能:

  • 完成局部地图构建

关键帧插入

  • 更新共视图,增加新的节点K,更新共视图链接关系
  • 更新生成树的节点关系
  • 计算该新增关键词的词袋表示,为新建地图点做准备

地图点剔除

最近增加的地图点必须通过如下测试,方可留在地图中:

  • 实际观测比例大于理论值的25%
  • 地图点被创建之后,再经过的三个关键帧都可以观测到它

通过测试的地图点,只在如下情况时会被删除:

  • 任何时间下观测它的关键帧个数小于3(通常发生在删除关键帧时)

新地图点生成

对于档期啊K中没有被匹配的特征点进行如下处理:

  • 在共视图中选取共视程度最高且基线宽度大于某阈值的关键帧进行特征点匹配于三角化,对重构结果进行尺度、重投影误差、视差不宜过小(地图点指向两个帧的夹角)、正向深度的检验。
  • 通过检验的点再投影到其他视图中,能匹配成功则建立“地图点-关键帧-特征点”的对应关系。

局部地图优化

  • 当前帧(位姿)与共视关键帧(位姿),及其他们看到的所有地图点(空间坐标),参与局部BA优化。
  • 所有能看到上述地图点但与当前关键帧没有共视关系的关键帧参与局部BA,但它们的位姿在优化过程中固定不变。

局部关键帧剔除

目标:场景不发生变化时,可控制关键帧的数量

方法:如果当前帧的90%的地图点都可以被至少其他三个关键帧在相同或者更精细的尺度观测到,则该关键帧被剔除。

2.3 回环修正

该线程核心功能:

  • 修正累积误差

回环候选帧检测

回环候选关键帧产生

  • 在共视图中计算K与所邻居的BOW向量相似性,保存最低分数记作smins_{min}
  • 分数低于smins_{min}的帧不做备选,与当前帧K直接相连的帧不做备选。

确认回环候选关键帧

计算Sim3变换

回环融合

  1. 位姿修正:基于相似性矩阵SaS_a修正当前帧K及其共视帧位姿;
  2. 特征点匹配与地图点融合:将回环帧K及其共视帧可见的地图点投影到当前帧K及其共视关键帧,寻找匹配并融合;
  3. 连接关系更新:融合过程中涉及到的关键帧的边均需要进行更新,包括回环边。

位姿优化