ORBSLAM2的关键帧简介
图像插入频率过高会导致信息冗余度快速增加,而这些冗余的信息对系统的精度却十分有限,甚至没有提高,反而消耗了更多的计算资源。这等于吃力不讨好。
关键帧的目的在于,适当地降低信息冗余度,减少计算机资源的损耗,保证系统的平稳运行。
ORBSLAM2也是沿袭PTAM的方案,将定位和建图分成两个线程,不过ORBSLAM2还增加了回环这个线程,在关键帧的问题上做了更灵活的处理,使得系统的跟踪更流畅和稳定。
接下来我们将按照ORBSLAM2源码中的方案将内容分成两个部分进行介绍:
1. 关键帧的筛选;
2. 关键帧的插入。
关键帧的筛选:
由于关键帧的筛选主要涉及一些判断条件,没有公式没有插图,读起来想必是十分枯燥的。因此笔者主要提炼大纲,让大家能够比较直观的看出,ORBSLAM2中所用的策略是什么,并根据笔者的拙见对原因进行分析,不当之处,敬请指正。
首先是直接不插入关键帧的条件,主要有三个:
1. 若当前处于定位模式,不插入关键帧;
原因:定位模式是只定位不建图,只利用已有的地图点对当前相机姿态进行估计,而不更新地图点,因此没有插入关键帧的必要。
2. 若局部地图处于全局闭环情况下,不插入关键帧;
原因:局部地图被占用,插入关键帧会影响全局闭环的优化。
3. 若距离上一次重定位较近,不插入关键帧;
原因:重定位时,当前帧通过与局部关键帧匹配并进行运动估计,能够很好地恢复其运动姿态。笔者认为,因为重定位时当前帧与重定位候选帧的信息冗余度较低,所以在重定位成功后,当前帧会作为关键帧插入地图中。而新来的一帧,由于重定位时刚刚插入关键帧,所以不需要频繁插入。
排除了上面三种情况,接下来就需要对关键帧进一步检测,才能确定是否真的需要插入关键帧。进一步检查包含一个必不可少的条件和另外三选一的条件。
必须满足的条件:
1. 内点数必须超过设定的最小阈值,并且重叠度不能太大;
原因:保证关键帧跟踪的质量,同时,避免引入过多的信息冗余。
三选一的条件:
2.1 距离上次插入关键帧已经过去MAX帧,MAX是ORBSLAM2预设的最大值;
原因:防止过去太多帧,跟踪丢失。
2.2 距离上次插入关键帧至少过去MIN帧,且局部建图线程处于空闲状态,MIN是ORBSLAM2预设的最小值;
原因:防止图像重叠度太高,并且局部建图线程有空闲处理新的关键帧。
2.3 局部建图线程中关键帧队列的关键帧数量不超过3个;
原因:主要也是考虑局部建图线程的处理能力,以及信息的冗余度问题吧。
插入关键帧的条件即是必须满足条件1以及满足2.1-2.3中任意一个条件。
关键帧的插入
确定了当前帧是关键帧,那么就需要将其输入局部建图模块以及回环检测模块。但是在输入这两个模块之前,需要将关键帧的观测信息进行更新。为了更加直观的表达关键帧插入的方法,笔者还是以列提纲的方式,为大家介绍这个过程:
1. 中断局部建图线程,即中断处理地图点、关键帧以及优化相机位姿;
原因:这是必须插入关键帧的情况,强制终止局部建图。
2. 更新当前关键帧的位姿,即从 $T$ 矩阵中取出旋转矩阵 $R$ 和位移矩阵 $t$ 以及相机中心 $O$;
原因:主要用于局部建图模块和回环检测模块中做重投影。
3. 将当前帧所对应的地图点按深度信息进行排序;
原因:筛除超出深度阈值的地图点。
4. 对当前关键帧中未关联的三维点,创建新的地图点,具体包括观测信息,更新地图点的描述子以及法向量和深度;
原因:非常平凡的创建地图点的过程。
5. 将所创建的地图点插入地图中,最后将更新后的关键帧也插入地图中。
原因:插入关键帧的过程最后一个步骤。
插入关键帧的流程大体如上面五个步骤所述。大家在设计关键帧插入流程时可以参考这几种方案,当然也可以根据实际需要设计更符合要求的方案。
总结:
终于又到了写总结的时候了,写一篇博客着实不易啊。
本文主要介绍了ORBSLAM2对待关键帧的策略,包括关键帧的筛选和插入。
不同的SLAM系统所采用的的关键帧策略有所不同,但是目的都是类似的:一是考虑计算资源的损耗,二是考虑信息的冗余度,最重要的是系统精度提高的可能性。在精度满足要求的前提下,寻求信息冗余度和计算资源损耗的折中。
至此,ORBSLAM2的跟踪线程我们已经全部介绍完了,接下来我们将进入局部建图线程。
下一讲,笔者将为大家介绍ORBSLAM地图的更新策略。
PS:
如果您觉得我的博客对您有所帮助,欢迎关注我的博客。此外,欢迎转载我的文章,但请注明出处链接。
对本文有任何问题可以在留言区进行评论,也可以在泡泡机器人论坛:http://paopaorobot.org/bbs/index.php?c=cate&fid=1中的SLAM技术交流模块发帖提问。
我的github链接是:https://github.com/yepeichu123/orbslam2_learn。