SLAM大致可分为激光SLAM和视觉SLAM,本篇就重点介绍一下一种经典的视觉SLAM——ORB SLAM。在2015年被首次提出,后续也有比较好的扩展性,应用很广泛。要想真正读懂ORB-SLAM肯定要从源码入手,网上也有很多教程去解读源码。但鉴于目前的需要,所以只是从结构上介绍下ORB-SLAM,不对代码进行任何的解读。如果你是和我一样的小白,不妨看一看,可能会有所收获~
  首先列举几种常见的视觉SLAM,这些大部分都是在ORB-SLAM之前。

  内容参考:一文详解ORB-SLAM3

  下面对ORB-SLAM进行一些特点的介绍:
  ORB-SLAM基于PTAM架构,同样是基于关键帧(key fream based)在保证tracking和mapping线程分开基础上,又增加了地图初始化和闭环检测的功能,总共三个线程(tracking、local mapping、loop closing )。
  ORM-SLAM的适用范围:最开始基于单目,后来扩展到stereo和RGB上
  ORB-SLAM的实现是需要完全依托于ROS,对ORB-SLAM的评价是虽然完成了,但仅限于demo,所以基本只有后面的改进版本才能够广泛应用。
  ORB-SLAM的输入及输出:
    输入:摄像头采集的图像及时间码
    输出:轨迹(每帧图像对应的相机位姿)+地图(KF+MP)

  上图是ORB-SLAM的架构图,也是流程图(简直清晰的一塌糊涂),把这个图读懂了,就完全明白ORB-SLAM的工作流程及原理了。见简单概括下:主要有5个模块,其中tracking,local mapping,loop closing是重点模块,完成了大部分内容。place recognition模块主要是配合上面三个重点模块,MAP只是一个数据结构的存储库(不作为介绍的重点)。下面我根据流程执行顺序依次介绍各个模块。

注:上文提到了,ORB-SLAM主要是由三个线程完成。所以第一步是三个线程的初始化,在此不再赘述。

1.TRACKING

  从架构图上可看出包含四个部分,包括了它所能完成的三个功能:(1)确定每帧的初始位姿 (2) 姿态优化 (3)确定KF给Local Mapping。完成三个具体功能之前,要做一些准备工作:
  准备工作1:从frame中提取ORB特征,如果你不知道啥是ORB,可以参考:ORB(Oriented FAST and Rotated BRIEF)
  准备工作2:初始化局部地图(这也是单目的局限性,第一时间必须多角度初始化建立局部地图),ORB-SLAM提供自动初始化方式。单目SLAM地图初始化的目标是构建初始的三维点云,初始化的常见方法有三种:

  ORB SLAM作者提出一种基于统计的模型选择方法,该方法优先选择第三种方法,并期望在场景退化情形下自动选择第二种方法。如果选取的两帧不满足要求,放弃这两帧并重新初始化
  该模型方法的具体操作过程,参考:ORB-SLAM(三)地图初始化

  下面介绍tracking完成的具体三个功能:
  (1)确定每帧的初始位姿(pose)
  pose的确定是根据上一帧完成的,根据从上一帧提取出的特征(特征的对应关系是Frame 1对n匹配feature,feature 1对1匹配MP,后续处理都以帧为单位)。

注:相机位姿:位姿即位置和姿态,相机的位姿可以看做相机从原始位置到当前位置的变换,包含一个平移变换和一个旋转变换
参考:视觉SLAM中相机位姿的多种描述

  估计当前位姿的过程有两个:1)跟踪 2)计算位姿
  1)跟踪(跟踪局部地图前要先构建局部地图,也就是初始化),跟踪的目的是找到MP和当前帧特征之间的对应关系。原理是当前帧和参考关键帧匹配,通过MP建立联系(3D→2D的过程)。帧是2D特征,MP是3D点
跟踪的的具体操作流程是:
  根据上一帧的位姿加上两帧MP之间的关系,将上一帧的MP投影到当前帧。在投影点和当前帧原有点间寻找匹配,建立当前帧和MP之间的新关系。

  2)计算位姿,跟踪后,通过PnP对当前帧的位姿进行求解
姿态优化的原因:影响ORB SLAM精度的影响因素:帧与帧之间的位姿优化是否准确

  (2)位姿优化
  主要思路是在当前帧和(局部)地图之间寻找尽可能多的对应关系,来优化当前帧的位姿
  进行位姿优化的原因:得到的位姿是相对位姿,通过优化来保障精度。
  优化位姿的方式:局部/全局位姿优化,闭环检测优化

  (3)确定关键帧
  通过参考帧就可以决定当前帧是不是关键帧
  关键帧要求:
    1.不要太稠密(两相邻关键帧有一定时间距离)
    2.当前帧确定为关键帧至少要匹配到50个MP
    3.当前帧匹配MP不能超过参考帧的90%,否则认为是冗余关键帧,不需要创建
  添加关键帧时间:局部地图优化的空闲时间
  要选出关键帧的原因就是减少帧的数量,便于后面的BA

2.Local Mapping

  整个模块的功能是更新局部地图(由关键帧的联系组成),将新关键帧加入,建立关键帧之间的联系对关键帧位姿和map point点位置进行修正
  从架构图上看,Local Mapping具体完成5部分功能:(1)关键帧的插入 (2)MP的剔除 (3)MP的创建 (4)local BA (5)KF的剔除
  (1)关键帧的插入
  添加关键帧步骤:
    确定当前帧的邻接关键帧和二级邻接关键帧(确定方法同上,只不过发起者变成邻接关键帧),将当前帧的MP投影至一级/二级,若出现新匹配特征,曾更加该关键帧与MP的联系,未出现新的,但出现匹配更多的也修改MP与该帧的匹配联系。若匹配MP的数量达到阈值,即认定为关键帧。

  (2)Map Point的剔除
  MP的剔除是选择与关键帧联系较少,少于某一个指定阈值(原文中应该是3)。认定其为坏点,将其剔除。减少MP的数量,有利于优化速度。剔除的检查步骤发生在MP新加入时

  (3)Map Point的创建
  MP创建原则:
    当前关键帧在covisibility graph中邻接的一些关键帧(设定共同MP个数,达到要求算邻接)。对邻接的关键帧进行遍历,在极线上进行搜索并三角化。根据匹配点对,通过三角化计算3d点。再确定MP的相关属性(平均观测方向、观测距离、最佳描述子)
注:MP和KF变了之后,covisibility和spantree都要变。添加进入约束后要进行局部BA

  (4)局部优化(local BA)
  目的:这个不用输,就是提高局部地图精度
  局部优化的参与者:当前关键帧A、与A直接相连的关键帧B,与B关联的关键帧C、A对应的MP,B对应的MP(不包括与A共同的)

注:全局优化的参与者:除第一帧外所有关键帧及所有MP

  (5)局部KF的剔除
  根据covisibility确定局部关键帧,若关键帧A对应的MP能被其他至少三个关键帧观测到90%以上,认为其冗余,去除。也是为优化增加便利

以上完成VO过程

3.Loop Closing

  模块整体作用:解决累计误差,尺度漂移问题
  步骤:确定候选闭环帧→确定闭环帧
  具体过程:ORB-SLAM采用改进的DBoW2的方式解决环路检测问题。改进点就在于原来是寻找一个,现在返回多个可能匹配值。

  为了解DBoW2,介绍词袋模型(bag of words),词袋模型是以特征描述作为元素的词典。本文就是ORB特征了。词典元素可以通过数据训练出来(可离线训练,增强实时性)。从图像中提取特征描述(多用多维向量表示),将特征描述分类(可用聚类中各种机器学习算法)。就组成了词袋模型。为了便于搜索再使用树状结构组织,就形成DBoW2。简而言之DBoW2可以判断两张图片是否有相似性,改进后输出与属于输入有相似性的一组图片。

  确定候选闭环帧:确定局部关键帧,计算局部关键帧的词袋向量和所有局部关键帧的词袋向量相似度。关键帧库中寻找不小于最小相似度的作为备选回环关键帧。再检查剩下的一致性确定闭环帧(连续三次的关键帧对应相同的候选闭环帧)
  确定闭环帧(回环验证):从候选的回环帧中确定真的回环帧。遍历每个回环帧,匹配和当前帧的MP,用MP去求一个相似变换(通过RANSAC)。如果回环帧对应的矩阵有足够多内点,做Sim3优化,过程循环一下。最终发现足够多内点,接受该回环帧。
  闭环融合:回环帧信息融合到当前帧中(因误差累计更信任之前的信息)
  优化Essential Graph也是优化的一种,操作对象是covisibility graph,为后续局部优化、全局优化减少工作量。

4.place recognition模块

  功能是路径识别,即判断两帧是否存在大范围的相似。应用场景是回环检测和重定位(因阻挡、模糊等情况丢失后重新匹配关键帧)

  以上就是ORB-SLAM的整个操作流程,只有清楚上面这些操作,才能更好的理解后面的ORB-SLAM2和ORB-SLAM3哈~

补充说明内容:
1.covisibility graph、essential graph到底是什么?
  图的思想贯穿了ORB-SLAM,优化也是选取的图优化。不能说covisibility graph就是全局地图,我觉得叫位姿地图吧。covisibility graph的每个顶点是相机的pose(位姿),边是pose和pose之间的变换关系。边建立的基础和帧、MP组成的图有关系,也就是相机看到相似点时就会产生联系,边的权值就是联系的可信程度。我觉得还是不要把这个和帧,MP联系在一起了,单纯当成姿态关系图就行了。
  而essential graph是对covisibility graph的一个简化(ORB-SLAM自己提的),减少边的数量(保持连通性,最小生成树),目的是在全局回环的时候减少计算量。
参考:Covisibility Graph - 心田居士 - 博客园 (cnblogs.com) 这篇文章的作者主要内容也是参考高博在知乎的一个回答

2.三角化创建MP点什么意思?
  文中说通过三角化的方式就可以创建MP点,三角化指根据在两个图片中的点和变换矩阵就能确定3D点坐标。具体的我也不是很明白(数学过程没看~),把其理解为根据一组匹配点确定特征点(MP)的过程吧。
参考:slam 三角化 - 知乎

3.局部地图、全局地图到底指什么?
  这个问题困惑了我很久,这里的地图不是指看得到那种地图。其实是特征点信息,局部是当前临近,全局就是所有。这些特征点可以配合当前帧去求位姿信息,也就实现了定位的功能。至于SLAM最后建的图其实就是无数个特征点,特征点分布就可以反应环境的轮廓。

参考资料:
orb-slam的简单讲解-冯兵_腾讯视频
SLAM - 标签 - 路游侠 - 博客园
下面这篇对ORB-SLAM的特点把握的比较好:
ORB-SLAM2详解(一)

ORB-SLAM介绍(无源码版本)相关推荐

  1. 那些年干过的事(六)—无源码修改版本号

    背景: 本文是<那些年干过的事(五)--无源码程序反编译修改文字>的续集,那个旧版本程序提供自动在线升级功能,但编译后的程序保留了旧的版本号,导致不能自动升级,需要修改程序版本号,使其可以 ...

  2. Smalidea+IntelliJ IDEA/Android Studio无源码调试

    smalidea是一个IntelliJ IDEA/Android Studio smali语言插件,可实现动态调试smali代码. github地址:https://github.com/JesusF ...

  3. spring之基本介绍以及老版本框架的下载地址

    spring之基本介绍以及老版本框架的下载地址 第一:为什么要学习spring?学习spring能为我们在工作中的日常开发带来什么好处? 首先来了解一下spring:spring是一种开源的分层的相对 ...

  4. 采用Reflector的VS.net插件断点调试无源码DLL 分类:

    .Net的编程利器Reflector可以反编译基于.net开发的应用程序和DLL,其功能强大不用多说.今天想试验一把利用VS.net的插件断点调试外部无源码的DLL(只要是程序集都可以,所以exe也行 ...

  5. 介绍各个PHP版本一些特性知识点

    本系列主要介绍各个PHP版本一些特性知识点 PHP各个版本的官网: PHP文档 PHP5.2特性 支持json PHP5.3特性 新增魔术方法.命名空间.const.三元运算符 添加了命名空间的支持 ...

  6. HTML5期末大作业:个人毕设网站设计——李小龙武打明星人物介绍网站英文版本(9页) HTML+CSS+JavaScript...

    常见网页设计作业题材有 ​​个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. 动漫. 明星. 服装. 体育. 化妆品. 物流. 环保. 书籍. 婚纱. 军 ...

  7. Spring5源码分析系列(二)Spring源码版本命名规则及下载安装

    Tom老师视频讲解第二章,这章主要是科普篇,介绍了下spring版本的命名规则及源码下载,文章参考自Tom老师视频. Spring源码版本命名规则 (1)首先看看某些常见软件的版本号: LinuxKe ...

  8. mysql odbc 源码安装_26.1.7. 在Unix平台上从源码版本安装MyODBC

    26.1.7. 在Unix平台上从源码版本安装MyODBC 26.1.7.1. 要求 ·MySQL客户端库以及MySQL 4.0.0或更高版本的包含文件.(最好是MySQL 4.0.16或更高版本). ...

  9. Linux nginx 基础介绍与安装版本选择

    Linux nginx 基础介绍与安装版本选择 Nginx 版本类型 Nginx yum 安装 了解 Nginx 配置文件 Nginx 编译参数详解(源码编译安装时使用) Nginx 基本配置 创建N ...

最新文章

  1. mysql教程日志_mysql日志文件的详细说明
  2. 关于Strut2内置Json插件的使用
  3. mysql-事务隔离级别
  4. GeneralUpdate 2021.08.14更新公告
  5. pycharm下打开、执行并调试scrapy爬虫程序
  6. 洛谷4014最大/小费用最大流
  7. 我不断收到“ Uncaught SyntaxError:意外令牌o”
  8. VC、VB、Delphi …… 你该学哪个?
  9. [译]ASP.NET 5 Configuration
  10. 雷电9模拟器安装magisk和lsposed
  11. 实施(运维)工程师 笔试选择题
  12. 1+x 云计算平台运维与开发测试题
  13. 【面试题】计算机网络 -- 常见面试题总结
  14. Emoji 映射编码
  15. 怎么把多个图片转成一个文字版的Word呢
  16. Win11-GTX3060-配置Pytorch GPU
  17. 个人永久性免费-Excel催化剂功能第60波-数据有效性验证增强版,补足Excel天生不足...
  18. LightWave 3D 2019 for Mac(三维动画制作软件)
  19. 深度学习的不确定性(Uncertainty/confidence score)与校准(Calibration)
  20. win10的c语言程序闪退,win10内置应用出现闪退怎么回事? win10打开应用总闪退的解决方法...

热门文章

  1. “单细胞”前瞻 |新型微滴反应筛选技术ATAC-seq数据分析新篇章
  2. java中选择排序和冒泡排序_Java选择排序就是比冒泡排序牛「具体详情,请看此文」...
  3. NOI入门级数学: 数及其运算 数的进制之二进制
  4. P1425 小鱼的游泳时间(python3实现)
  5. 第67课 选择排序 例67.1 《小学生C++编程入门》
  6. 1.5 编程基础之循环控制 44 第n小的质数
  7. java单引号转义_Java基础入门——Java语言基础(上)
  8. 电商扣减库存_电商平台仓库管理系统究竟有何功能?
  9. RTX5 | 内存池01 - 内存池的使用
  10. python同时注释多行代码_python怎么同时对多行代码进行注释