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


1. 经典框架

相机在场景中运动的过程,将得到一系列连续变化图像
视觉 SLAM 的目标,是通过这样的一些图像,进行定位和地图构建

但这件事情并没有想象的那么简单
它不是某种算法,只要输入数据,就可以往外不断地输出定位和地图信息了
SLAM需要一个完善的算法框架,而经过研究者们长期的研究工作,现有这个框架已经定型了
在这里插入图片描述

把整个视觉 SLAM 流程分为以下几步:

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

这个框架本身,以及它所包含的算法已经基本定型,并且在许多视觉程序库和机器人程序库中已经提供
依靠这些算法,能够构建一个视觉 SLAM 系统,使之在正常的工作环境里实时进行定位与建图

因此,如果把工作环境限定在静态、刚体,光照变化不明显、没有人为干扰的场景
那么,这个 SLAM 系统是相当成熟的了


2. 视觉里程计

视觉里程计关心相邻图像之间的相机运动,最简单的情况当然是两张图像之间的运动关系

在这里插入图片描述
例如,当看到上图时,会自然地反应出右图应该是左图向左旋转一定角度的结果
不妨思考一下:自己是怎么知道“向左旋转”这件事情的呢?
人类早已习惯于用眼睛探索世界,估计自己的位置,但又往往难以用理性的语言描述直觉
看到上图时,会自然地看到,这个场景中离得近的是吧台,远处是墙壁和黑板

当相机往左转动时,吧台离我们近的部分出现在视野中,而右侧远处的柜子则移出了视野
通过这些信息,判断相机应该是往左旋转了

但是,如果进一步问:能否确定旋转了多少度,平移了多少厘米?
这就很难给出一个确切的答案了
因为直觉对这些具体的数字并不敏感
但是,在计算机中,又必须精确地测量这段运动信息
所以,计算机是如何通过图像确定相机的运动呢

前面也提过,在计算机视觉领域,人类在直觉上看来十分自然的事情,在计算机视觉中却非常的困难
图像在计算机里只是一个数值矩阵
这个矩阵里表达着什么东西,计算机毫无概念(这也正是现在机器学习要解决的问题)
而视觉 SLAM 中,只能看到一个个像素,知道它们是某些空间点在相机的成像平面上投影的结果
所以,为了定量地估计相机运动,必须在了解 相机与空间点的几何关系 之后进行

要讲清这个几何关系以及 VO 的实现方法,需要铺垫一些背景知识
在这里对 VO 有直观的概念,理性的理解需要在背景知识铺垫完成之后才能深入讨论
所以,现在只需知道, VO 能够通过相邻帧间的图像估计相机运动,并恢复场景的空间结构

叫它为“里程计”是因为它和实际的里程计一样
只计算相邻时刻的运动,而和再往前的过去的信息没有关联

在这一点上, VO 就像一种只有很短时间记忆的物种一样
现在,假定已有了一个视觉里程计,估计了两张图像间的相机运动
那么,只要把相邻时刻的运动“串”起来,就构成了机器人的运动轨迹,从而解决了定位问题
另一方面,根据每个时刻的相机位置,计算出各像素对应的空间点的位置,就得到了地图
这么说来,有了 VO,是不是就解决了 SLAM 问题呢?

视觉里程计确实是 SLAM 的关键问题
然而,仅通过视觉里程计来估计轨迹,将不可避免地出现 累计漂移(Accumulating Drift)
这是由于视觉里程计(在最简单的情况下)只估计两个图像间运动造成

每次估计都带有一定的误差,而由于里程计的工作方式,先前时刻的误差将会传递到下一时刻
导致经过一段时间之后,估计的轨迹将不再准确
比方说,机器人先向左转 90 度,再向右转了 90 度
由于误差,把第一个 90 度估计成了 89 度
那就会尴尬地发现,向右转之后机器人的估计位置并没有回到原点
更糟糕的是,即使之后的估计再准确,与真实值相比,都会带上这-1 度的误差

这也就是所谓的漂移(Drift),它将导致我们无法建立一致的地图

在这里插入图片描述
会发现原本直的走廊变成了斜的,而原本 90 度的直角变成了歪的,脑壳疼!

为了解决漂移问题,还需要两种技术: 后端优化和回环检测
回环检测负责把“机器人回到原始位置”的事情检测出来
而后端优化则根据该信息,校正整个轨迹的形状


3. 后端优化

笼统地说,后端优化主要指处理 SLAM 过程中 噪声 的问题
虽然很希望所有的数据都是准确的,然而现实中,再精确的传感器也带有一定的噪声
便宜的传感器测量误差较大,昂贵的则较小,有的传感器还会受磁场、温度的影响
所以,除了解决“如何从图像估计出相机运动”之外,还要关心这个估计带有多大的噪声
这些噪声是如何从上一时刻传递到下一时刻的、而又对当前的估计有多大的自信

后端优化要考虑的问题,就是如何从这些带有噪声的数据中,估计整个系统的状态,以及这个状态估计的不确定性有多大——这称为 最大后验概率估计(Maximum-a-Posteriori, MAP)

这里的状态既包括机器人自身的轨迹,也包含地图
相对的,视觉里程计部分,有时被称为“前端”
在 SLAM 框架中,前端给后端提供待优化的数据,以及这些数据的初始值
而后端负责整体的优化过程,它往往面对的只有数据,不必关心这些数据到底来自什么传感器
在视觉 SLAM 中,前端 和 计算机视觉研究领域 更为相关,比如图像的特征提取与匹配等
后端则主要是 滤波非线性优化算法

从历史意义上来说,现在称之为后端优化的部分,很长一段时间直接被称为“SLAM 研究”
早期的 SLAM 问题是一个状态估计问题——正是后端优化要解决的东西

在最早提出 SLAM 的一系列论文中
当时的人们称它为“空间状态不确定性的估计”(Spatial Uncertainty)
虽然有一些晦涩,但也确实反映出了 SLAM 问题的本质:
对运动主体自身和周围环境空间不确定性的估计

为了解决 SLAM,需要状态估计理论,把定位和建图的不确定性表达出来,然后采用滤波器或非线性优化,去估计状态的均值和不确定性(方差)

这些后续再慢慢谈


4. 回环检测

回环检测,又称闭环检测(Loop Closure Detection)
主要:解决位置估计随时间漂移的问题

假设实际情况下,机器人经过一段时间运动后回到了原点
但是由于漂移,它的位置估计值却没有回到原点

如果有某种手段
让机器人知道“回到了原点”这件事,或者把“原点”识别出来,再把位置估计值“拉”过去,就可以消除漂移了
这就是所谓的回环检测

回环检测与“定位”和“建图”二者都有密切的关系
事实上认为,地图存在的主要意义,是为了让机器人知晓自己到达过的地方

为了实现回环检测,需要让机器人具有识别曾到达过的场景的能力
它的实现手段有很多,例如像前面说的那样,可以在机器人下方设置一个标志物(如一张二维码图片)
只要它看到了这个标志,就知道自己回到了原点

但是,该标志物实质上是一种环境中的传感器,对应用环境提出了限制(比如不给贴二维码)
更希望机器人能使用携带的传感器——也就是图像本身,来完成这一任务
例如,可以判断图像间的相似性,来完成回环检测

这一点和人是相似的,当看到两张相似图片时,容易辨认它们来自同一个地方
如果回环检测成功,可以显著地减小累积误差
所以视觉回环检测,实质上是一种计算图像数据相似性的算法
由于图像的信息非常丰富,使得正确检测回环的难度也降低了不少

在检测到回环之后,会把“A 与 B 是同一个点”这样的信息告诉后端优化算法
然后,后端根据这些新的信息,把轨迹和地图调整到符合回环检测结果的样子
这样,如果有充分而且正确的回环检测,就可以消除累积误差,得到全局一致的轨迹和地图


5. 建图

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

在这里插入图片描述

对于家用扫地机器人来说,这种主要在低矮平面里运动的机器人
只需要一个二维的地图,标记哪里可以通过,哪里存在障碍物,就够它在一定范围内导航了
有些时候,想要一个漂亮的三维重建结果,不仅是一组空间点,还需要带纹理的三角面片
另一些时候,我们又不关心地图的样子,只需要知道“A 点到 B 点可通过,而 B 到 C 不行”这样的事情
甚至有时不需要地图,或者地图可以由其他人提供,例如行驶的车辆往往可以得到已经绘制好的当地地图

对于地图,有太多的想法和需求
因此,相比于前面提到的视觉里程计、回环检测和后端优化,建图并没有一个固定的形式和算法
一组空间点的集合也可以称为地图,一个漂亮的 3D 模型亦是地图,一个标记着城市、村庄、铁路、河道的图片亦是地图

大体上讲,它们可以分为

  • 度量地图
  • 拓扑地图

5.1. 度量地图

度量地图(Metric Map)强调 精确地表示地图中物体的位置关系
通常我们用稀疏(Sparse)与稠密(Dense)对它们进行分类
稀疏地图进行了一定程度的抽象,并不需要表达所有的物体
在这里插入图片描述
例如,选择一部分具有代表意义的东西,称之为路标(Landmark)
那么一张稀疏地图就是由路标组成的地图,而不是路标的部分就可以忽略掉
相对的,稠密地图着重于建模所有看到的东西
对于定位来说,稀疏路标地图就足够了

而用于导航时,往往需要稠密的地图
稠密地图通常按照某种分辨率,由许多个小块组成
二维度量地图是许多个小格子(Grid),三维则是许多小方块(Voxel)
一般地,一个小块含有占据、空闲、未知三种状态,以表达该格内是否有物体
当查询某个空间位置时,地图能够给出该位置是否可以通过的信息
这样的地图可以用于各种导航算法,如 A*,D*等等,为机器人研究者们所重视

但是也看到,这种地图需要存储每一个格点的状态,耗费大量的存储空间,而且多数情况下地图的许多细节部分是无用的
另一方面,大规模度量地图有时会出现一致性问题
很小的一点转向误差,可能会导致两间屋子的墙出现重叠,使得地图失效


5.2. 拓扑地图

相比于度量地图的精确性,拓扑地图(Topological Map)则更强调 地图元素之间的关系

拓扑地图是一个图(Graph),由节点和边组成,只考虑节点间的连通性
例如 A, B 点是连通的,而不考虑如何从 A 点到达 B 点的过程
在这里插入图片描述
它放松了地图对精确位置的需要,去掉地图的细节问题,是一种更为紧凑的表达方式
然而,拓扑地图不擅长表达具有复杂结构的地图
如何对地图进行分割形成结点与边,又如何使用拓扑地图进行导航与路径规划
仍是有待研究的问题


参考:

《视觉SLAM十四讲》


相关推荐:

视觉SLAM笔记(2) 相机
视觉SLAM笔记(1) 初识SLAM


谢谢!

发布了217 篇原创文章 · 获赞 294 · 访问量 289万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie

分享到微信朋友圈

×

扫一扫,手机浏览