引言:通过前面的推送我们已经对SLAM有了个大体的认识。(初识视觉SLAM)下面来看经典的视觉SLAM框架,了解一下视觉SLAM究竟由哪几个模块组成。
本文选自《视觉SLAM十四讲:从理论到实践》。

  整体视觉SLAM流程图。
              

  整个视觉SLAM流程包括以下步骤。

  1. 传感器信息读取。在视觉SLAM中主要为相机图像信息的读取和预处理。如果是在机器人中,还可能有码盘、惯性传感器等信息的读取和同步。
  2. 视觉里程计(Visual Odometry,VO)。视觉里程计的任务是估算相邻图像间相机的运动,以及局部地图的样子。VO又称为前端(Front End)。
  3. 后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在VO之后,又称为后端(Back End)。
  4. 回环检测(Loop Closing)。回环检测判断机器人是否到达过先前的位置。如果检测到回环,它会把信息提供给后端进行处理。
  5. 建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。

经典的视觉SLAM框架是过去十几年的研究成果。这个框架本身及其所包含的算法已经基本定型,并且已经在许多视觉程序库和机器人程序库中提供。依靠这些算法,我们能够构建一个视觉SLAM系统,使之在正常的工作环境里实时定位与建图。因此,我们说,如果把工作环境限定在静态、刚体,光照变化不明显、没有人为干扰的场景,那么,这个SLAM系统是相当成熟的了。

  读者可能还没有理解上面几个模块的概念,下面就来详细介绍各个模块具体的任务。这里您只需对各模块有一个直观的、定性的理解即可。

视觉里程计

  视觉里程计关心的是相邻图像之间的相机运动,最简单的情况当然是两张图像之间的运动关系。例如,当看到下图时,我们会自然地反应出右图应该是左图向左旋转一定角度的结果(在视频情况下感觉会更加自然)。我们不妨思考一下:自己是怎么知道“向左旋转”这件事情的呢?人类早已习惯于用眼睛探索世界,估计自己的位置,但又往往难以用理性的语言描述我们的直觉。看到时,我们会自然地认为,这个场景中离我们近的是吧台,远处是墙壁和黑板。当相机向左转动时,吧台离我们近的部分出现在视野中,而右侧远处的柜子则移出了视野。通过这些信息,我们判断相机应该是向左旋转了。

        
                   相机拍摄到的图片与人眼反应的运动方向。

  但是,如果进一步问:能否确定旋转了多少度,平移了多少厘米?我们就很难给出一个确切的答案了。因为我们的直觉对这些具体的数字并不敏感。但是,在计算机中,又必须精确地测量这段运动信息。所以我们要问:计算机是如何通过图像确定相机的运动的呢?
  前面也提过,在计算机视觉领域,人类在直觉上看来十分自然的事情,在计算机视觉中却非常困难。图像在计算机里只是一个数值矩阵。这个矩阵里表达着什么东西,计算机毫无概念(这也正是现在机器学习要解决的问题)。而在视觉SLAM中,我们只能看到一个个像素,知道它们是某些空间点在相机的成像平面上投影的结果。所以,为了定量地估计相机运动,必须先了解相机与空间点的几何关系。
  要讲清这个几何关系以及VO的实现方法,需要铺垫一些背景知识。在这里我们先让读者对VO有个直观的概念。现在只需知道,VO能够通过相邻帧间的图像估计相机运动,并恢复场景的空间结构。称它为“里程计”是因为它和实际的里程计一样,只计算相邻时刻的运动,而和再往前的过去的信息没有关联。在这一点上,VO就像一种只有短时间记忆的物种。
  现在,假定我们已有了一个视觉里程计,估计了两张图像间的相机运动。那么,只要把相邻时刻的运动“串”起来,就构成了机器人的运动轨迹,从而解决了定位问题。另一方面,我们根据每个时刻的相机位置,计算出各像素对应的空间点的位置,就得到了地图。这么说来,有了VO,是不是就解决了SLAM问题呢?
  视觉里程计确实是SLAM的关键,我们也会花大量的篇幅来介绍它。然而,仅通过视觉里程计来估计轨迹,将不可避免地出现累积漂移(Accumulating Drift)。这是由于视觉里程计(在最简单的情况下)只估计两个图像间的运动造成的。我们知道,每次估计都带有一定的误差,而由于里程计的工作方式,先前时刻的误差将会传递到下一时刻,导致经过一段时间之后,估计的轨迹将不再准确。比方说,机器人先向左转,再向右转。由于误差,我们把第一个估计成了。那我们就会尴尬地发现,向右转之后机器人的估计位置并没有回到原点。更糟糕的是,即使之后的估计再准确,与真实值相比,都会带上这的误差。

              
                        累积误差与回环检测的校正结果。

  这也就是所谓的漂移(Drift)。它将导致我们无法建立一致的地图。你会发现原本直的走廊变成了斜的,而原本的直角变成了歪的——这实在是一件很难令人忍受的事情!为了解决漂移问题,我们还需要两种技术:后端优化(更多时候称为后端(Back End)。由于主要使用的是优化方法,故称为后端优化。)和回环检测。回环检测负责把“机器人回到原始位置”的事情检测出来,而后端优化则根据该信息,校正整个轨迹的形状。

后端优化

  笼统地说,后端优化主要指处理SLAM过程中噪声的问题。虽然我们很希望所有的数据都是准确的,然而现实中,再精确的传感器也带有一定的噪声。便宜的传感器测量误差较大,昂贵的可能会小一些,有的传感器还会受磁场、温度的影响。所以,除了解决“如何从图像估计出相机运动”之外,我们还要关心这个估计带有多大的噪声,这些噪声是如何从上一时刻传递到下一时刻的,而我们又对当前的估计有多大的自信。后端优化要考虑的问题,就是如何从这些带有噪声的数据中估计整个系统的状态,以及这个状态估计的不确定性有多大——这称为最大后验概率估计(Maximum-a-Posteriori,MAP)。这里的状态既包括机器人自身的轨迹,也包含地图。
  相对地,视觉里程计部分有时被称为“前端”。在SLAM框架中,前端给后端提供待优化的数据,以及这些数据的初始值。而后端负责整体的优化过程,它往往面对的只有数据,不必关心这些数据到底来自什么传感器。在视觉SLAM中,前端和计算机视觉研究领域更为相关,比如图像的特征提取与匹配等,后端则主要是滤波与非线性优化算法。
  从历史意义上来说,现在我们称为后端优化的部分,很长一段时间直接被称为“SLAM研究”。早期的SLAM问题是一个状态估计问题——正是后端优化要解决的东西。在最早提出SLAM的一系列论文中,当时的人们称它为“空间状态不确定性的估计”(Spatial Uncertainty)。虽然有一些晦涩,但也确实反映出了SLAM问题的本质:对运动主体自身和周围环境空间不确定性的估计。为了解决SLAM问题,我们需要状态估计理论,把定位和建图的不确定性表达出来,然后采用滤波器或非线性优化,估计状态的均值和不确定性(方差)。状态估计与非线性优化的具体内容将在第6讲、第10讲和第11讲介绍。让我们暂时跳过它的原理说明,继续往下介绍。

回环检测

  回环检测,又称闭环检测(Loop Closure Detection),主要解决位置估计随时间漂移的问题。怎么解决呢?假设实际情况下机器人经过一段时间的运动后回到了原点,但是由于漂移,它的位置估计值却没有回到原点。怎么办呢?我们想,如果有某种手段,让机器人知道“回到了原点”这件事,或者把“原点”识别出来,我们再把位置估计值“拉”过去,就可以消除漂移了。这就是所谓的回环检测。
  回环检测与“定位”和“建图”二者都有密切的关系。事实上,我们认为,地图存在的主要意义是让机器人知晓自己到过的地方。为了实现回环检测,我们需要让机器人具有识别到过的场景的能力。它的实现手段有很多。例如像前面说的那样,我们可以在机器人下方设置一个标志物(如一张二维码图片)。它只要看到了这个标志,就知道自己回到了原点。但是,该标志物实质上是一种环境中的传感器,对应用环境做了限制(万一不能贴二维码怎么办?)。我们更希望机器人能使用携带的传感器——也就是图像本身,来完成这一任务。例如,可以判断图像间的相似性来完成回环检测。这一点和人是相似的。当我们看到两张相似的图片时,容易辨认它们来自同一个地方。如果回环检测成功,可以显著地减小累积误差。所以,视觉回环检测实质上是一种计算图像数据相似性的算法。由于图像的信息非常丰富,使得正确检测回环的难度降低了不少。
  在检测到回环之后,我们会把“A与B是同一个点”这样的信息告诉后端优化算法。然后,后端根据这些新的信息,把轨迹和地图调整到符合回环检测结果的样子。这样,如果我们有充分而且正确的回环检测,就可以消除累积误差,得到全局一致的轨迹和地图。

建图

建图(Mapping)是指构建地图的过程。地图是对环境的描述,但这个描述并不是固定的,需要视SLAM的应用而定。

            
                       形形色色的地图

  对于家用扫地机器人来说,这种主要在低矮平面里运动的机器人,只需要一个二维的地图,标记哪里可以通过,哪里存在障碍物,就够它在一定范围内导航了。而对于一个相机,它有6自由度的运动,我们至少需要一张三维的地图。有些时候,我们想要一个漂亮的重建结果,不仅是一组空间点,还需要带纹理的三角面片。另一些时候,我们又不关心地图的样子,只需要知道“A点到B点可通过,而B点到C点不行”这样的事情。甚至,有时不需要地图,或者地图可以由其他人提供,例如,行驶的车辆往往可以得到已绘制好的当地地图。
  对于地图,我们有太多的想法和需求。因此,相比于前面提到的视觉里程计、回环检测和后端优化,建图并没有一个固定的形式和算法。一组空间点的集合也可以称为地图,一个漂亮的3D模型亦是地图,一个标记着城市、村庄、铁路、河道的图片还是地图。地图的形式随SLAM的应用场合而定。大体上讲,可以分为度量地图与拓扑地图两种。

度量地图(Metric Map)

  度量地图强调精确地表示地图中物体的位置关系,通常用稀疏(Sparse)与稠密(Dense)对其分类。稀疏地图进行了一定程度的抽象,并不需要表达所有的物体。例如,我们选择一部分具有代表意义的东西,称之为路标(Landmark),那么一张稀疏地图就是由路标组成的地图,而不是路标的部分就可以忽略掉。相对地,稠密地图着重于建模所有看到的东西。对于定位来说,稀疏路标地图就足够了。而用于导航时,则往往需要稠密的地图(否则撞上两个路标之间的墙怎么办?)。稠密地图通常按照某种分辨率,由许多个小块组成。对于二维度量地图是许多个小格子(Grid),而对于三维度量地图则是许多小方块(Voxel)。一般地,一个小块含有占据、空闲、未知三种状态,以表达该格内是否有物体。当查询某个空间位置时,地图能够给出该位置是否可以通过的信息。这样的地图可以用于各种导航算法,如A*、D*等,为机器人研究者所重视。但是我们也看到,这种地图需要存储每一个格点的状态,会耗费大量的存储空间,而且多数情况下地图的许多细节部分是无用的。另一方面,大规模度量地图有时会出现一致性问题。很小的一点转向误差,可能会导致两间屋子的墙出现重叠,使地图失效。

拓扑地图(Topological Map)

  相比于度量地图的精确性,拓扑地图则更强调地图元素之间的关系。拓扑地图是一个图(Graph),由节点和边组成,只考虑节点间的连通性,例如A、B点是连通的,而不考虑如何从A点到达B点。它放松了地图对精确位置的需要,去掉了地图的细节问题,是一种更为紧凑的表达方式。然而,拓扑地图不擅长表达具有复杂结构的地图。如何对地图进行分割形成结点与边,又如何使用拓扑地图进行导航与路径规划,仍是有待研究的问题。
  本文选自《视觉SLAM十四讲:从理论到实践》,点此链接可在博文视点官网查看此书。
                    

经典视觉SLAM框架相关推荐

  1. 视觉SLAM笔记(3) 视觉SLAM框架

    视觉SLAM笔记(3) 视觉SLAM框架 1. 经典框架 2. 视觉里程计 3. 后端优化 4. 回环检测 5. 建图 5.1. 度量地图 5.2. 拓扑地图 1. 经典框架 相机在场景中运动的过程, ...

  2. 视觉SLAM(一)——视觉SLAM框架

    1.简介及说明 SLAM(Simultaneous Localization And Mapping)--同时定位与地图构建.因此SLAM是研究"定位"和"地图构建&qu ...

  3. OpenVSLAM:日本先进工业科技研究所新开源视觉SLAM框架

    点击我爱计算机视觉标星,更快获取CVML新技术 很多人说深度学习和SLAM是计算机视觉目前最火的应用方向.深度学习自不必说,SLAM则已经悄悄走入我们的生活(扫地机器人.无人机.增强现实游戏等). 5 ...

  4. 视觉slam框架:StructSLAM

    StructSLAM: Visual SLAM With Building Structure Lines StructSLAM:具有建筑结构线的视觉 SLAM 摘要: 我们提出了一种基于人造建筑环境 ...

  5. 视觉SLAM十四讲(2):初识SLAM

    这一讲主要介绍视觉SLAM的结构,并完成第一个SLAM程序:HelloSLAM. 目录 2.1 小萝卜的例子 单目相机 双目相机 深度相机 2.2 经典视觉SLAM框架 2.3 SLAM问题的数学表述 ...

  6. 通俗易懂!视觉slam第一部分——slam简介与相机介绍

    首先是定义: SLAM 是 Simultaneous Localization and Mapping 的缩写,中文译作"同时定位与地图构建".它是指搭载特定传感器的主体,在没有环 ...

  7. 视觉SLAM开源方案汇总及设备选型建议

    作者I Mega_Li 编辑I 3D视觉开发者社区 文章目录 一.SLAM的引入 1.1定义 1.2开发背景 二.视觉SLAM 2.1 经典视觉SLAM框架 2.2视觉SLAM方案的分类 2.3 开源 ...

  8. 视觉SLAM学习路线

    导师让我了解SLAM,SLAM原本是比较小众的方向,最近自动驾驶火起来,做这个SLAM的人也多了,反过来也会推动机器人感知的发展.希望未来学成的时候,能赶上机器人大规模普及,就业一片蓝海. 关于视觉S ...

  9. 视觉SLAM方案整理及摄像头选型调研(他首推ZED)

    他首推ZED,让我想起李ji也是用的ZED 摘自:https://mp.weixin.qq.com/s/BHFxSbGab_TVr_PxG17VaA 视觉SLAM方案整理及硬件选型调研 新机器视觉 7 ...

  10. 《视觉SLAM十四讲》笔记——初识SLAM

    自主运动能力 1.我在什么地方 -- 定位 2.周围环境是什么样子的 -- 建图 两类传感器 1.携带于机器人本体上的:例如轮式编码器,相机,激光等等. 2.安装于环境中的:例如导轨,二维码标志等等. ...

最新文章

  1. codevs——1220 数字三角形(棋盘DP)
  2. EmEditor Professional(文本编辑) 下载地址
  3. mongodb 按配置文件mongodb.conf启动
  4. SDK 和 API 的区别是什么
  5. 关于「无人驾驶」的学习路线...
  6. 关于初始化C++类成员
  7. 具有GlassFish和一致性的高性能JPA –第2部分
  8. SSH整合方案二(不带hibernate.cfg.xml)
  9. const修饰指针和引用的用法【转贴】
  10. teststand调用python模块_NI TestStand 2019下载-测试管理软件NI TestStand 2019下载v19.0.1 官方版-西西软件下载...
  11. github怎么自动更新被人更新过的项目_win10老是自动更新怎么办?如何完全禁止win10自动更新?...
  12. 最新发布!《统计学习方法》第二版无监督学习视频课上线了!
  13. 【机器学习】Softmax Regression算法原理与java实现
  14. 宝鸡市二检理科数学跟踪训练题
  15. RGB 与 RGBA 与 16进制 与 HSL 之间的简单转换
  16. html5 几何酷站,10个值得学习的HTML5+CSS3视觉特效酷站欣赏
  17. (一)轨迹规划:贝塞尔曲线的python实现
  18. 身份证号码正则表达式 阿星小栈
  19. 论文笔记:FILLING THE G AP S: MULTIVARIATE TIME SERIES IMPUTATION BY GRAPH NEURAL NETWORKS
  20. springboot企业人力资源管理系统毕业设计源码291816

热门文章

  1. VS Code 的插件位置更改
  2. TCP半连接队列和全连接
  3. HDU 1698 Just a Hook(线段树:区间更新)
  4. Unity下载文件一(www协程下载)
  5. linux回到上次目录与历史命令查找快捷方式
  6. 浅复制和深复制的区别?//浅拷贝和深拷贝
  7. 二分图匹配匈牙利算法BFS实现
  8. MOSS中删除绑定到List上的Eventhandler
  9. IOCP 下行为投递的关键点
  10. Redis入门指南--五种类型及其基本指令