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. 1 Openwrt无线中继设置并访问外网

    https://www.cnblogs.com/wsine/p/5238465.html 配置目标 主路由器使用AP模式发射Wifi 从路由器使用Client模式接受Wifi 从路由器使用Master ...

  2. Ubuntu16.04安装和配置RabbitMQ

    1.RabbitMQ安装前需要erlang环境 apt-get install erlang-nox # 安装erlang erl # 查看relang语言版本,成功执行则说明relang安装成功 2 ...

  3. Linux安装Sqlite

    下载SQLite源代码sqlite-3.6.23.1.tar.gz 复制sqlite-3.6.23.1.tar.gz到linux上的/usr/src目录 解压源代码 tar -xvzf sqlite- ...

  4. pytorch识别CIFAR10:训练ResNet-34(自定义transform,动态调整学习率,准确率提升到94.33%)

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 前面通过数据增强,ResNet-34残差网络识别CIFAR10,准确率达到了92.6. 这里对训练过程 ...

  5. jsonp原理详解

    1.一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面.动态网页.web服务.WCF,只要是跨域请求,一律不准. 2.不过我们又发现,Web页面上调用js文件时则不 ...

  6. 如何规避“Flash中国特供版”

    如何规避“Flash中国特供版” 来源  http://blog.sina.com.cn/s/blog_4e1bc3e90102xn0k.html 浏览国内网站,尤其是一些很重要或者很常用,但是很落后 ...

  7. awk 计算某一列的和

    awk 计算某一列的和 我需要通过nova list 显示所有虚拟机的cpu总和,即用awk计算某一列的综合 [root@control01 ~]# nla | awk -F '|' 'BEGIN{s ...

  8. 【WebSocket】WebSocket介绍

    1.背景 在WebSocket出现之前客户端向服务器发出请求是通过http协议实现的,而http协议有个特点是通行请求只能由客户端发起,然后服务端响应查询结果,HTTP 协议没法让服务器主动向客户端推 ...

  9. babel7-按需加载polyfill

    babel7 babel7发布了. 在升级到 Babel 7 时需要注意几个重大变化: 移除对 Node.js 6 之前版本的支持: 使用带有作用域的 @babel 命名空间,以防止与官方 Babel ...

  10. python之路day11--装饰器形成的过程、作用、装饰器的固定模式

    装饰器形成的过程# 装饰器的作用# 原则:开放封闭原则#装饰器的固定模式 import time # print(time.time()) #1551251400.416998 当前时间() #让程序 ...