ORB-SLAM: A Versatile and Accurate Monocular SLAM System 笔记(一)
ORB-SLAM: A Versatile and Accurate Monocular SLAM System
Abstract
这篇文章提出了 ORB-SLAM,一个基于特征的单目SLAM系统,这个系统在室内和室外同样适用。该系统对严重的运动杂波(motion clutter)很稳健,允许宽基线闭环和重定位,并且包含了全自动的初始化。基于近些年的优秀的算法,我们重新设计了一个新的系统:他对所有的任务都使用了相同的特征包括跟踪、映射、重定位和循环闭环。一种选取重建过程中点和关键帧的策略有着出色的稳健性,并且生成紧凑和可以跟踪的地图。我们对最流行的27个数据集进行了详尽的评估,ORB-SLAM在单目方法中达到了史无前例的性能。
Introduction
Bundle adjustment(BA) 是提供精确相机位置估计和稀疏几何重建的的著名方法,在很长时间内,这个方法对即时的系统来说是不可行的。视觉SLAM的目标是在重建环境的时候估计相机的轨迹。现在,我们知道要以非禁止的计算成本获得准确的结果,实时的SLAM算法必须为BA提供一下的条件:
- 在所选帧的自己中对场景特征进行相应的观察;
- 在复杂性随着关键帧的数量增加而增加的时候,它们的选择应该可以避免不必要的冗余;
- 关键点和关键帧的强大网络配置来产生准确的结果,即一组具有明显的视差和大量闭环匹配的关键帧和观察点;
- 一个非线性优化的关键帧和点位置的初始估计;
- A local map in exploration where optimization is focused to achieve scalability.
探索中的一个局部地图,其中优化是为了实现可伸缩性。 - 实现全局快速优化以实时闭环的能力。
PATM 技术能够在小规模的操作上提供对每个帧简单但高效的关键帧选取,特征匹配,三角点测量和相机定位,以及跟踪失败之后的重定位。然鹅,有几个因素限制了它的应用:缺少闭环和对遮挡的充分处理,对重定位的观点具有低不变性,以及需要人工干预地图。
文中提出的单目SLAM系统有如下的主要贡献:
- 对所有的任务使用相同的特征,系统更加高效,简单和可靠。使用ORB特征,能够在没有GPU的情况下实现实时的表现,同时为视点和光照的变化提供良好的不变性。
- 在大的环境中实现实时的操作,由于使用了covisibility graph,跟踪和映射都可以集中在本地可见的区域,从而与全局地图的大小无关。
- 基于姿态图优化的实时循环闭合,称为Essential Graph。它是由系统维护的生成树,循环闭包链接和Covisibility 图的强边构建的。
- 实时的相机重定位对视点和光照具有不变性,这使得从跟踪失败中恢复并且还增加了地图的重用。
- 基于模型选择的新的、自动的、稳健的初始化过程,允许创建平面和非平面的初始映射。
- 一系列技巧用于提高鲁棒性和去除冗余。
文中方法的相机定位精度比目前直接用像素强度的方法更加精确。
Related Work
A. 地点识别
由图片到图片的匹配在大环境中比地图到地图的匹配更容易扩展,DBoW~2~ 的用到了 BRIEF 描述符和 FAST 特征值,虽然它们的速度相比较很快,但是没有旋转和尺度不变性。作者提出了 ORB 特征,一种具有旋转和尺度不变性的二元特征,来做图片匹配和闭环检测。
B. 地图初始化
单目SLAM需要一个地图初始化的过程,因为深度信息不能从一张图片中获取。一个方法是在已知的结构中做初始化,在这种滤波的方法中,初始化的点的精度特别低,但是在后续的操作中会变高。一些半稠密的方法就是先用高方差的随机值来初始化这些像素点的深度。还有一种方案是假设初始化的场景是平面的,使用 homography 或 five-point algorithm 计算 essential matrix。这两种方案在低视差下约束性不好,并且当平面中所有的点更靠近摄像机中心时,就会遇到 twofold ambiguity solution。在非平面的场景中,可以通过 eight-point algorithm计算基本矩阵。
文中提出了一种启发式(heuristic)方法来选择模型,会对平面场景采用 homography 和对非平面的场景采用 fundamental matrix 。
C. 单目SLAM
单目SLAM由两种方案,一种是对全部的帧进行估计特征位置和相机姿态,这个方案计算量大,冗余度高还容易累计误差。还有一个方案是 keyframe-based 方法,仅使用关键帧可以允许使用开销大但是精确的BA优化,因为映射过程和帧率没有关系。
System Overview
A. 特征选择
一个主要的思想就是映射和跟踪使用的特征会用于地点识别来实现帧速率重定位和闭环检测(frame-rate relocalization and loop detection)。这个方案要求提取每张图片的时间小于33ms,并且为了获取普适的位置识别能力,要求位置不变性(rotation invariance)。
ORB 特征可以进行快速计算和匹配,同时具有视点不变性。利用ORB特征可以提升BA的精度。
B. 三个线程:跟踪、本地映射和闭环

tracking, local mapping, and loop closing 这三个进程是并行的。
Tracking 负责定位每个帧的相机位置和决定何时插入新的关键帧,首先对上一帧进行特征匹配同时使用BA估计相机的位姿。如果 tracking 丢失,位置识别模块将进行全局的重定位。一旦对相机位姿和特征匹配有了初始的估计,就会使用由系统维护的关键帧的 covisibility graph 来检索局部可见地图(local visible map)。然后,与局部地图点的匹配将使用重投影(reprojection)来检索,相机位姿也会针对所有的匹配来重新优化。最后,跟踪线程还需要决定是否需要插入新的关键帧。
Local mapping 产生新的关键帧和执行局部 BA 来在相机位姿周围实现最佳重建。通过covisibility graph 已建立连接的关键帧来检索在每个新的关键帧内未匹配的ORB,以对新点进行三角测量。在创建之后,通过结合之前tracking中的信息,会剔除一些低质量的点。Local mapping 也负责剔除的冗余的关键帧。
Loop closing 检测新的关键帧的环, 如果检测到了环,会计算一个相似变换?,然后,环的两侧会被对齐然后复制的点被融合,最后执行相似性约束的位姿估计实现全局一致性。
C. 点云和关键帧的选取
每个点云(map point)\(p_i\)包括:
- 在世界坐标系中的3-D坐标 \(\bf X_{w,i}\);
- 观察方向 \(n_i\);
- 一个 ORB 描述符 \(\text{D}_i\),和观察点的汉明距离最近的描述子;
- 可观测点的最远和最近距离 \(d_{max},d_{min}\)。
每个关键帧 \(K_i\) 包括:
- 相机位姿 \({\bf T}_{iw}\) 它是将世界坐标转到相机坐标的一种 rigid body transformation;
- 相机的内参:焦距和(principal point);
- 从帧中提取的所有 ORB 特征
点云和关键帧的产生较为宽松,但是剔除冗余的机制将会很严格。
D. Covisibility Graph and Essential Graph
Covisibility Graph:顶点是一个关键帧,顶点之间的权重就是两个帧中相同点的数目,权重的大小反映了关键帧之间的相似度。
Essential Graph:Covisibility Graph 中的边可能十分密集,Essential Graph 保留了所有的顶点,但是削减了edges。
E. DBoW~2~
系统嵌入了a bags of words place recognition 模块 ,执行闭环检测和重定位的任务。
首先离线创建了 vocabulary (字典),系统会逐步构建一个包括反转索引的数据库,这个反转索引包含了字典中的每个 visual word ,其中包含已经检查过的关键帧,这样数据库的查询变得十分高效。
使用 covisibility graph 对相邻帧进行组合。
计算两个集合ORB特征关联性的时候,通过字典树进行了暴力匹配。
ORB-SLAM: A Versatile and Accurate Monocular SLAM System 笔记(一)的更多相关文章
- ORB-SLAM: A Versatile and Accurate Monocular SLAM System 笔记(二)
4. 自动地图初始化 地图初始化的目标是两个帧之间相对位姿来三角化一系列的点云(riangulate an initial set of map points),这个操作是独立与场景且不需要人为的干预 ...
- SLAM: Inverse Depth Parametrization for Monocular SALM
首语: 此文实现客观的评测了使线性化的反转深度的效果.整篇只在表明反转可以线性化,解决距离增加带来的增长问题,有多少优势--%! 我的天呢!我竟然完整得翻译了一遍. 使用标记点地图构建SLAM的方法, ...
- 《SLAM for Dummies》中文版《SLAM初学者教程》
SLAM for Dummies SLAM初学者教程A Tutorial Approach to Simultaneous Localization and Mapping 一本关于实时定位及绘图 ...
- Semantic Monocular SLAM for Highly Dynamic Environments面向高动态环境的语义单目SLAM
一.摘要 当前单目SLAM系统能够实时稳定地在静态环境中运行,但是由于缺乏明显的动态异常处理能力,在动态场景变化与运动中往往会失败.作者为解决高度动态环境中的问题,提出一种语义单目SLAM架构,结合基 ...
- 转:SLAM算法解析:抓住视觉SLAM难点,了解技术发展大趋势
SLAM(Simultaneous Localization and Mapping)是业界公认视觉领域空间定位技术的前沿方向,中文译名为“同步定位与地图构建”,它主要用于解决机器人在未知环境运动时的 ...
- 【Hector slam】A Flexible and Scalable SLAM System with Full 3D Motion Estimation
作者总结了SLAM前端和后端的区别 While SLAM frontends are used to estimate robot movement online in real-time, the ...
- 当前的开源SLAM方案
开源方案 传感器形式 地址链接 MonoSLAM 单目 https://github.com/hanmekim/SceneLib2 PTAM 单目 http://www.robots.ox.ac. ...
- SLAM论文阅读笔记
[1]陈卫东, 张飞. 移动机器人的同步自定位与地图创建研究进展[J]. 控制理论与应用, 2005, 22(3):455-460. [2]Cadena C, Carlone L, Carrillo ...
- 视觉SLAM算法框架解析(2) ORB-SLAM
版权声明:本文为博主原创文章,未经博主允许不得转载. ORB-SLAM[1]完全继承了PTAM(http://www.cnblogs.com/zonghaochen/p/8442699.html)的衣 ...
随机推荐
- Unicode 字符串
Unicode 字符串 Python 中定义一个 Unicode 字符串和定义一个普通字符串一样简单:高佣联盟 www.cgewang.com >>> u'Hello World ! ...
- CF R 632 div2 1333D Challenges in school №41
LINK:Challenges in school №41 考试的时候读错题了+代码UB了 所以wa到自闭 然后放弃治疗. 赛后发现UB的原因是 scanf读int类型的时候 宏定义里面是lld的类型 ...
- Spark中直接操作HDFS
Spark作为一个基于内存的大数据计算框架,可以和hadoop生态的资源调度器和分布式文件存储系统无缝融合.Spark可以直接操作存储在HDFS上面的数据: 通过Hadoop方式操作已经存在的文件目录 ...
- 数据分析First week(7.15~7.21)
描述统计学 当我们面对大量信息的时候,经常会出现数据越多,事实越模糊的情况,因此我们需要对数据进行简化,描述统计学就是用几个关键的数字来描述数据集的整体情况. 1.集中趋势 1.1 众数 众数是样本观 ...
- Qt信号参数中使用QVariantList时编译问题
今天调试代码时遇到一个奇怪的问题,不过一般感觉比较奇怪的问题,最后查到原因时,原因都比较简单! 编译问题 先来看一下qt的编译错误,提示一堆错误: In file included from D:\Q ...
- CentOS7 安装 SonarQube
安装 SonarQube 环境 系统 CentOS 7 数据库 postgresql 10 系统配置 查看系统配置 sysctl vm.max_map_count sysctl fs.file-max ...
- three.js 着色器材质之变量(三)
这篇郭先生在练习一下着色器变量,在度娘上面或者官网上经常看到类似水波一样的效果,这篇就试着做一个这样的效果,顺便巩固一下顶点着色器和片元着色器,毕竟多多练习才能更好地掌握.效果如下图,在线案例请点击博 ...
- 比原链CTO James | Go语言成为区块链主流开发语言的四点理由
11月24日,比原链CTO James参加了Go中国举办的Gopher Meetup杭州站活动,与来自阿里.网易的技术专家带来Kubernetes.区块链.日志采集.云原生等话题的分享.James向大 ...
- XCTF-WEB-高手进阶区(1-4)笔记
1:baby_web 题目描述:想想初始页面是哪个 通过Dirsearch软件扫描发现Index.php被藏起来了,访问他便会指向1.php 于是通过Burp修改Get为index.php,然后放入R ...
- 用前端姿势玩docker【五】快速构建中类Unix系统与Windows系统的差异化处理
目录 用前端姿势玩docker[一]Docker通俗理解常用功能汇总与操作埋坑 用前端姿势玩docker[二]dockerfile定制镜像初体验 用前端姿势玩docker[三]基于nvm的前端环境构建 ...