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

(五)ORBSLAM关键帧的筛选和插入的更多相关文章

  1. WPF中的动画——(五)关键帧动画

    与 From/To/By 动画类似,关键帧动画以也可以以动画形式显示目标属性值. 和From/To/By 动画不同的是, From/To/By 动画只能控制在两个状态之间变化,而关键帧动画则可以在多个 ...

  2. (四)ORBSLAM运动估计

    ORBSLAM2的运动估计简介 ORBSLAM2中的运动估计核心方法就是3D-2D的PNP,而在跟踪过程主要分为三种类型: 无运动模型的跟踪,即基于参考帧的跟踪: 基于匀速运动模型的跟踪: 重定位: ...

  3. 模拟美萍加密狗--Rockey2虚拟狗(五)

    虚拟狗开源后很多网友询问有关使用方法的问题,其实看我前四篇文章就应该了解怎样使用了,但还是写篇教程吧 [一].安装DSF (驱动模拟环境): 运行DSFx86Runtime.msi 如需改变安装目录请 ...

  4. {MySQL完整性约束}一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业

    MySQL完整性约束 阅读目录 一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业 一 ...

  5. 表示层设计模式:Intercepting Filter(截取筛选器)模式

     上下文  问题  影响因素  解决方案  变体  示例  结果上下文  相关模式  致谢  上下文 对于任何一个曾经从头建立 Web 应用程序的人来说,他们都会有这样的体会:这项任务所需要的独立完成 ...

  6. ORB-SLAM3论文阅读:ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM

    简介 ORB-SLAM3是第一个能在单目.双目.RGBD鱼眼相机和针孔相机模型下运行视觉.视觉-惯导以及多地图SLAM的系统.其贡献主要包括两方面:提出了完全依赖于最大后验估计的紧耦合视觉-惯导SLA ...

  7. 十分钟玩转 jQuery、实例大全

    一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库.源码戳这 jQuery对象 jQuery产 ...

  8. jquery简介和实例

    一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库. 参考:http://www.php100 ...

  9. jquery基础知识汇总

    jquery基础知识汇总 一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库.源码戳这 jQu ...

随机推荐

  1. 通过 docker 搭建自用的 gitlab 服务

    前言 git 是当下如日中天的版本管理系统.现在如果不是工作在 git 版本管理系统之下,几乎都不好意思和人打招呼了.有很多现成的互联网的 git 服务提供给大家使用,例如号称程序员社交网络的 Git ...

  2. xcode10下,Build Phases下没有Embed Frameworks

    升级xcode10后发现,Build Phases下,找不到Embed Frameworks了,最后发现在General下,有一项“Embedded Binaries",可以在这里添加Fra ...

  3. windows安全更新程序(KB4093112) 安装失败 错误0x80070011

    解决办法:win + R → 输入regedi 将默认安装路径改回C盘的program files

  4. Spark报错

    1. Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at com.mysql.jdb ...

  5. git忽略文件不起作用时

    开始我是直接进到仓库建立了.gitignore文件,再从仓库进入到项目add时总是会添加不需要添加的文件, 后来明白应该是在哪里提交在哪里创建.gitignore文件 git忽略文件操作步骤如下: 1 ...

  6. CH1201 最大子序和

    http://contest-hunter.org:83/contest/0x10%E3%80%8C%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9 ...

  7. 前端知识之Ajax

    Asynchronous JavaScript and XML 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.是在不重新加载整个页面的情况下,与服务器交换数据并异步更新部分网页 ...

  8. C#进行回文检测,判断字符串是否是回文的代码

    下面代码内容是关于C#进行回文检测,判断字符串是否是回文的代码,应该是对各位朋友有些好处. Console.WriteLine("算法1:请输入一个字符串!");string st ...

  9. [2019.04.01]Linux 学习心得(2)-- tar 命令的理解

    这篇文章并不是发布最早的但是阅读量却每天都见长,很想知道各位大大是怎么找到这篇文章的.如果不忙,还请各位大大评论一下我看看,没准我可以为大家改进一下本文,提升一下质量. =============== ...

  10. Markdown基础语法小结

    一.前言 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. --摘自百度百科 没想到一向不太靠谱的百度百科这次竟有了如此精辟的解释. ...