经典视觉SLAM框架

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

  总体视觉SLAM流程图。
              【图1】算法

  整个视觉SLAM流程包括如下步骤。后端

  1. 传感器信息读取。在视觉SLAM中主要为相机图像信息的读取和预处理。若是是在机器人中,还可能有码盘、惯性传感器等信息的读取和同步。微信

  2. 视觉里程计(Visual Odometry,VO)。视觉里程计的任务是估算相邻图像间相机的运动,以及局部地图的样子。VO又称为前端(Front End)。app

  3. 后端优化(Optimization)。后端接受不一样时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,获得全局一致的轨迹和地图。因为接在VO以后,又称为后端(Back End)。框架

  4. 回环检测(Loop Closing)。回环检测判断机器人是否到达过先前的位置。若是检测到回环,它会把信息提供给后端进行处理。dom

  5. 建图(Mapping)。它根据估计的轨迹,创建与任务要求对应的地图。机器学习

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

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

视觉里程计

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

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

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

              【图3】
                        累积偏差与回环检测的校订结果。

  这也就是所谓的漂移(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十四讲:从理论到实践》,点此连接可在博文视点官网查看此书。
                    图片描述
  想及时得到更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                       图片描述

相关文章
相关标签/搜索