(五)ORBSLAM关键帧的筛选和插入
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关键帧的筛选和插入的更多相关文章
- WPF中的动画——(五)关键帧动画
与 From/To/By 动画类似,关键帧动画以也可以以动画形式显示目标属性值. 和From/To/By 动画不同的是, From/To/By 动画只能控制在两个状态之间变化,而关键帧动画则可以在多个 ...
- (四)ORBSLAM运动估计
ORBSLAM2的运动估计简介 ORBSLAM2中的运动估计核心方法就是3D-2D的PNP,而在跟踪过程主要分为三种类型: 无运动模型的跟踪,即基于参考帧的跟踪: 基于匀速运动模型的跟踪: 重定位: ...
- 模拟美萍加密狗--Rockey2虚拟狗(五)
虚拟狗开源后很多网友询问有关使用方法的问题,其实看我前四篇文章就应该了解怎样使用了,但还是写篇教程吧 [一].安装DSF (驱动模拟环境): 运行DSFx86Runtime.msi 如需改变安装目录请 ...
- {MySQL完整性约束}一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业
MySQL完整性约束 阅读目录 一 介绍 二 not null与default 三 unique 四 primary key 五 auto_increment 六 foreign key 七 作业 一 ...
- 表示层设计模式:Intercepting Filter(截取筛选器)模式
上下文 问题 影响因素 解决方案 变体 示例 结果上下文 相关模式 致谢 上下文 对于任何一个曾经从头建立 Web 应用程序的人来说,他们都会有这样的体会:这项任务所需要的独立完成 ...
- ORB-SLAM3论文阅读:ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM
简介 ORB-SLAM3是第一个能在单目.双目.RGBD鱼眼相机和针孔相机模型下运行视觉.视觉-惯导以及多地图SLAM的系统.其贡献主要包括两方面:提出了完全依赖于最大后验估计的紧耦合视觉-惯导SLA ...
- 十分钟玩转 jQuery、实例大全
一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库.源码戳这 jQuery对象 jQuery产 ...
- jquery简介和实例
一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库. 参考:http://www.php100 ...
- jquery基础知识汇总
jquery基础知识汇总 一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库.源码戳这 jQu ...
随机推荐
- [LeetCode] 22. 括号生成
题目链接:https://leetcode-cn.com/problems/generate-parentheses/ 题目描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能 ...
- EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public?
前言 不知我们是否思考过一个问题,在关系映射中对于导航属性的访问修饰符是否一定必须为public呢?如果从未想过这个问题,那么我们接下来来探讨这个问题. EF 6.x和EF Core 何种情况下必须配 ...
- Jeecg-Boot前后端分离版
Jeecg-Boot前后端分离版http://www.jeecg.org/forum.php?gid=229 Jeecg-Boot 快速开发平台http://boot.jeecg.org/user/l ...
- Virtual DOM 系列三:Diff算法
DOM操作是昂贵的,为了减少DOM操作,才有了Virtual DOM.而Virtual DOM的关键就是通过对比新旧vnode,找出差异部分来更新节点.对比的关键算法就是Diff算法. 历史由来: d ...
- Azure DevOps to Azure AppServices
Azure DevOps is a complete solution for software development, from planning to building to deploymen ...
- Lua中ipairs和pairs的区别详解
迭代器for遍历table时,ipairs和pairs的区别: 区别一:ipairs遇到nil会停止,pairs会输出nil值然后继续下去 区别二: , b = , x = , y = , " ...
- Go语言中数组
数组是一个值类型 func ArrayTest1(){ var arryA [3]int = [3]int{1,2,3} //创建一个数组B,将B中第二个元素设置为200 arryB := arryA ...
- Xcode 打包(Shell)
1. xcodebuild 1.1 查当前可用的 sdk $xcodebuild -showsdks 1.2 查看所支持的target $xcodebuild -target 1.2 清空当前编译的a ...
- BZOJ2882工艺
题目描述 小敏和小燕是一对好朋友. 他们正在玩一种神奇的游戏,叫Minecraft. 他们现在要做一个由方块构成的长条工艺品.但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方 ...
- 命令级的python静态资源服务。
python -m SimpleHTTPServer 在当前目录起python静态资源服务.