ORB-SLAM3关键帧选取策略

文章目录

  • 前言
  • 一、什么是关键帧?
  • 二、选取策略


前言

ORB-SLAM3使用关键帧来策略来进行跟踪建图,所以本文介绍关键帧的选取策略

一、什么是关键帧?

关键帧是目前是一种非常常用的方法,可以减少待优化的帧数,并且可以代表其附近的帧,关键帧相当于slam的骨架,是在局部一系列普通帧中选出一帧作为局部帧的代表,记录局部信息。如果摄像头放在原处不动,普通帧还是要记录的,但关键帧因为总看到原场景,所以不会增加。

可以简单理解为方阵里有10行10列,每一行的第一个人就是一个关键帧,他可以代表他所在一行的人的特征。但实际上并不是每一行第一个人,这就涉及到关键帧的选取策略了。

二、选取策略

本人结合源码及网上其他大佬的文章总结如下:

首先是三个不插入关键帧的判定(判定成功,直接返回false,不插入关键帧)

  1. 处于定位模式:不插入关键帧
    理由:定位模式是只定位不建图,只利用已有的地图点对当前相机姿态进行估计,而不更新地图点,因此没有插入关键帧的必要。
  2. 局部地图被回环线程占用:不插入关键帧
    理由:局部地图被占用,插入关键帧会影响全局闭环的优化。
  3. [关键帧数量>mMaxFrames]且[重定位后还没有过mMaxFrames个帧]:不插入关键帧
    解释: 关键帧数量够多且刚刚重定位,这是系统比较稳定,不用插入。mMaxFrames是源码中预设的最大值。

经过这三个判断后没有返回不插入,就继续判定下面的条件(三选一满足即可):

  1. c1a: 距上次插入关键帧后经过mMaxFrames帧,MAX是ORBSLAM2预设的最大值;
    原因:防止过去太多帧,丢失太多信息导致跟踪丢失。
  2. c1b: [距上次插入关键帧后经过mMinFrames个帧]&&[局部建图空闲]
    原因:防止图像重叠度太高,并且局部建图线程有空闲处理新的关键帧,mMinFrames是源码预设的最小值。
  3. c1c: 非单目&&[mnMatchesInliers 原因: 当前跟踪内点数少,跟踪丢失点较多,该插入关键帧,否则容易跟丢。

然后是必须满足的条件:
c2 : [mnMatchesInliers15]
解释:内点数必须超过设定的最小阈值,并且重叠度不能太大,保证关键帧跟踪的质量,同时,避免引入过多的信息冗余。

ORB-SLAM3添加了IMU模块,因此相比ORB-SLAM2多了两个IMU判定条件:
c3 : 单目/双目IMU 当前帧距离上一次添加关键帧过了0.5s
c4 : 单目IMU 和局部地图匹配点数在[15,75] || mState==RECENTLY_LOST (跟踪最近丢失)

判定策略:
if ((( c1a || c1b || c1c ) && c2 ) || c3 || c4 )
if 局部地图空闲,可以接受关键帧 return true;
else 非单目,地图不空闲,但关键帧等待插入队列中关键帧数<3, 也可以接受,return true;
解释:
非IMU模式,c2必须满足,c1a,b,c三个满足一个即可
IMU模式,只需要满足c3或者c4一个即可

以上只是本人的理解,如有错误,希望大佬们指教。
参考文章:
https://www.cnblogs.com/lihanwen/p/11344315.html
https://blog.csdn.net/Y_Dumpling/article/details/112256703

你可能感兴趣的:(自动驾驶,slam,c++)