1.1 什么是SLAM

首先,按照技术名称缩写的尿性,SLAM必然是四个单词的缩写,展开来看,SLAM全称为Simultaneous Localization And Mapping,翻译成中文就是同时定位于地图构建。课本上的硬性定义是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动。如果这里的传感器主要为相机,那就称为视觉SLAM。
从硬性定义里提取关键字,不难发现关键点有三个:搭载特定传感器的主体、没有环境先验信息、运动过程中建立环境模型。说白了,就是人去了一个陌生的地方,一边走一边观察周围的地形。

2.1 一个SLAM的例子

为了方便理解SLAM的定义,课本上给出了一个机器人的例子,这里也继续采用小机器人的例子。
我们希望这个小机器人可以随叫随到,所以必然要让机器人可以移动,而移动除了运动能力,还有需要判断如何运动的能力,就好比人要走路,不仅要有腿来具体地行走,还需要有大脑来判断怎么走。换到机器人身上,移动能力就是电机和轮子,而判断能力指的就是SLAM。
具体来说机器人需要知道自己在哪里以及周围环境是怎么样的才可以移动,这就对应着定位和建图,这两个要素可以看作感知的内外之分,一方面要知道自己的状态(即位置),另一方面还要知道自己外在的环境(即地图)。

解决这两个问题有很多种方法,基本上都是需要借助传感器,区别在于传感器是在机器人身上还是安装在环境里。安装在机器人身上的包括相机、激光等,安装在环境里的包括信标、定位设备等,不难发现,安装在环境中的存在很大的缺陷,最直接的就是环境不满足的情况,这种情况下小机器人直接就成了瞎子,而SLAM的定义中又强调了没有环境先验信息的前提,所以这种对环境的严格要求必然是我们不希望出现的。从我个人的理解来看,我们更需要的是能够“独立”的传感器,所谓独立这里指的是能够单独完成任务而不需要交互,比如说相机,相机自己扫描环境然后处理,不需要别的设备的参与,而再看信标,只有机器人识别到了信标才能够判断,单独一方是没有用的。

所以视觉SLAM的重点放在了自身的传感器,也就是机器人的眼睛上面。这里的相机并没有现在手机、单反上的相机那么顶,往往更加简单,这种相机主要是以一定的速率拍摄周围的环境,形成一个连续的视频流。

按照相机的工作方式,将相机分为单目、双目和深度相机三类,从名字就可以看出,单目只有一个摄像头,双目有两个,深度相机就像苹果的原深感摄像头,能够测量出每个像素距离相机的距离。除此之外还有全景相机、EVENT相机等诸多种类,但是并没有成为主流应用。

下面分开来看一下各种相机的特点,为了方便理解,这里用手机摄像头的知识来举一下例子。
①单目相机
只用一个摄像头进行SLAM的做法称为单目SLAM,因为只用了一个摄像头,所以结构特别简单并且成本也很低,用单目相机拍摄得到的就是照片,是个人都见过照片,照片本质上是拍摄时候的场景在相机成像平面上留下的一个投影,是以二维的形式记录了三维的世界(降维打击),这种以低维记录高维的做法由于丢失了一个维度,所以无法通过单个图片来计算照片中物体距离拍摄者的距离,而缺失的距离在构建场景时是至关重要的一点。
拿油管博主巫师扎克的视频来解释这个缺失带来的影响,下面几张图是从他的视频里面截取出来的:


单独从第一张图来看,就是一张画着汽车的画,然而第二张图告诉观众实际上是一个框从恰好的角度对准了现实中的一辆车。这其实就是缺失的距离让我们无法判断大小导致的。人类由于见过大量的图像,对大多数场景都会形成一个距离感,能够帮助我们判断图像中物体的远近关系,但在一些特殊情况下,这种距离感会失效,从而无法判断真实的大小情况,解决方法就是像视频里这样,换一个角度观察真实的三维结构。

回到单目相机上来,单目相机拍摄出的二维投影,使得我们会存在无法判断三维信息的情况,所以如果要恢复三维结构,就必须要移动相机的视角,只有移动相机,才可以估计相机的运动,从而估计场景中物体的远近和大小,即三维结构。
移动过程中,实际的移动方向和画面里的物体移动方向是反向的,此外近处和远处的物体移动速度的快慢也是有差别的,于是物体在图像上的运动形成了视差,利用视差就可以定量判断物体的远近程度。

然而,就算知道远近,这依然是一个相对的值,最好的例子就是奥特曼这类特摄片,从画面上看以为是一个真实的城市,但实际上只是一个人造的环境。简单来说只要让相机的运动和场景大小同时变化相同的倍数,单目上看效果是一样的。这说明单目SLAM估计的轨迹和地图与真实情况相差一个因子,也就是一个尺度。单目SLAM无法确定图像的真实尺度,所以又称为尺度不确定性。

正因为尺度不确定性和移动才能计算深度的缺点,给单目SLAM造成了很大的麻烦。为了解决这一麻烦,人们又开始使用双目和深度相机。

②双目相机
从前面对单目相机的介绍不难看出,解决单目SLAM的关键在于想办法搞定深度。双目相机采用的就是和人眼类似的结构,人的双眼实际上就是一个双目相机,单独用左眼和单独用右眼看见的事物实际上是存在差别的,因为两只眼睛不在同一个位置上,二者存在一定的差别,大脑正是利用这个差别实现了距离的判断。双目相机也是如此,它利用两个相机之间的距离(也称为基线)来判断每个像素的空间位置。再次基础上继续增加相机数目就成了多目相机,但是本质上的原理是一样的。

双目相机也不是万能的,一方面判断远近的过程需要大量的计算,相比于人类会显得十分笨拙,另一方面双目相机测量到的深度范围与基线有关,基线距离越大测量的深度也就越远,这就意味着无人车上要想使用双目相机,这个双目相机必须是一个巨大的相机。所以现阶段对于双目或者多目相机,解决庞大的计算量才是关键。

③深度相机
对于深度相机,只要对苹果faceID有了解的都可以很好地理解。深度相机利用红外结构光或者TOF相机,通过发射光返回的光来测出物体距离相机的距离。区别于双目相机的软件计算,深度相机对距离的测量是物理手段的测量,光速乘以测量的往返时间除以二基本就是待测的距离,所以计算量并不是大问题。
但深度相机也存在缺点,测量范围窄、噪声大、视野小、容易受干扰、无法穿透等诸多问题都影响深度相机的实际应用,所以深度相机一般用于室内的SLAM,而在室外的SLAM则很难应用。

2.2 经典视觉SLAM框架

这部分介绍一下经典的视觉SLAM框架,传统的SLAM由以下的部分组成:

根据流程图可以简单叙述一下视觉SLAM的流程,首先传感器读取信息,这里的读取主要是相机图像信息的读取和预处理,之后进入视觉里程计的部分,这一部分的主要内容是估计相邻图像之间相机的运动以及局部地图的样子,又称为前端,前端送入后端,后端主要是接受不同时刻视觉里程计测量的相机位姿以及回环检测的信息,进行优化得到全局一致的轨迹和地图,回环检测是用于检测机器人是否到达过之前到达的位置,完成这一切之后就是建图步骤,根据估计的轨迹建立与任务对应的地图。
这样的一个框架经过了十几年的总结,在环境为静态、刚体,光照变化不明显,没有人为干扰的环境下是一个很成熟的框架,但是在实际使用场景下还有一定的不足。

下面具体展开介绍一下SLAM中的各个部分:
①视觉里程计(VO)
视觉里程计关注的是相邻图像之间的相机运动,这里的相机运动简单来说就是判断相机的移动情况。前面提到过,单目相机需要通过移动来感知三维空间,这里的相机运动就是单目相机的移动,简单来说,拍摄一组照片,拍摄下一张都向左侧移动一点,人看这一组照片自然可以明白拍摄位置的变化,而要让计算机get到这一点却不是那么容易,视觉里程计负责的就是这个部分。
不仅如此,人类的大脑最多感知方向的移动,但是要准确地说出移动的角度、移动的距离对于人类的大脑几乎是一个不可能完成的事情,计算机则需要精确地感知这一切。为了定量地估计相机运动,必须在了解相机与空间点的几何关系之后进行。
课本在这里一笔带过了这个几何关系,而是简单介绍了一下原理,在后面的深入中会逐步展开,VO能够通过逐帧估计相机运动,恢复场景的空间结构,它只计算相邻时刻的运动,而不去管之前的信息,相当于一个短时记忆的生物。
看到这里基本可以明白VO的任务,VO主要是计算连续图像中相邻两张的位置变化情况,包括角度、距离等因素的变化,为后续地图生成打下基础。但是仅仅依靠VO是不够的,主要是因为比较位置变化中容易出现的累计漂移问题。
用最简单的话来说,累计漂移问题就是误差的累加导致结果的大偏差,课本上的例子就很好理解,机器人来回偏90°,如果每次都偏差1°,那么最后的偏差将无法接受,这种错误的积累会导致无法建立统一的地图,表现为建立的地图越往后越离谱,此时就需要后端优化和回环检测来解决累计漂移,其中回环检测负责把“回到原来位置”检测出来,而后端优化则根据这个信息校正整个轨迹的形状。

②后端优化
笼统地讲,后端优化主要处理SLAM过程中的噪声问题。前端提供给后端待优化的数据以及数据的初始值,后端就只负责处理这些数据。要展开这部分需要很多的知识铺垫,这一部分会在后面的章节中详细介绍。

③回环检测
也称为闭环检测,主要是解决位置估计随着时间漂移的问题,具体的内容课本上放在了后面的章节介绍,这里简单说了一下,主要是利用图像之间的相似性,来让机器人获得识别曾经到达过的场景的能力。这样在检测到回环之后,后端就会根据同一个点这一信息,将轨迹和地图调整为符合条件的样子,从而消除累积的误差,进而得到全局一致的轨迹和地图。

④建图
没什么好说的了,根据处理完的信息构建环境的地图,地图的形式也是不固定的,大体上分为度量地图和拓扑地图两类。
度量地图强调精确地表示地图中物体的具体位置,一般用稀疏和稠密来进行区分,稀疏地图进行了一定程度的抽象,不需要表达所有物体,可以是一个只有路标的地图。相对地稠密地图则注重于构建看到的所有东西,稠密地图一般按照一定的分辨率,划分为许多个小块,通过标记小块的状态,来表示格子内部是否有物体,这样要查询某个空间位置时,地图就可以直接给出该位置是否可以通过的信息了,显然这种方式会占据大量的存储空间,且很多信息是无用的。二者度量地图各有千秋,一般对于定位来说稀疏地图已经足够了,但是对于导航而言稠密地图更加适用。
拓扑地图更强调地图元素之间的关系,与其说是地图,不如说是一个完全图,只考虑节点之间的连通性,而不考虑如何到达。拓扑地图放松了地图对精确位置的需要,忽略了一些细节问题,是一种更加紧凑的表达方式,但是不擅长表达具有复杂结构的地图。

2.3 SLAM问题的数学表述

这一部分则主要讲SLAM的直观印象转换为了数学语言,通过数学语言来描述算法,方便进行运算。
首先确定一下设定,用x表示机器人的自身位置,用y表示地图的路标点。这样的设定中,机器人带着传感器运动主要由下面的两件事来表述:运动和观测。前者需要考虑相邻两个时刻,机器人的位置x是如何变化的,后者则需要考虑机器人在某时刻在位置x探测到了一个路标y这个事情用数学语言是如何描述的。

对于运动,机器人都会携带一个能够测量自身运动的传感器,能够直接读出与运动相关的数据(加速度、角速度等),这里我们使用一个抽象的模型来表示:xk=f(xk-1,uk,wk),其中xk-1是上一个时刻的位置,uk是运动传感器的读数,wk为噪声,这样我们就可以用一个一般函数来描述这个过程,这个通用的方程称为运动方程。
与之相对还有一个观测方程,描述的是机器人在位置xk上观测到路标点yk并且产生了数据zkj,采用同样的方式表述得到:zkj=h(yj,xk,vkj),其中vkj指的是这次观测里面的噪声。
至此,SLAM可以抽象为两个基本方程:

具体关于这个方程的知识会在后面的章节展开介绍。

2.4 编程示例

这一部分课本上主要是介绍了一下Ubuntu环境下的编程基础,由于在OS实验课上已经体验过一些了,这里只记录一下其中的cmake部分。
理论上来说任意一个C++程序都可以使用g++来编译,但是程序规模越来越大时,输入的编译命令也会越来越长,这样只依靠g++就会十分的繁琐,为了解决这个问题,使用cmake是一个很好的选择。

在一个cmake工程中,会使用cmake命令来生产一个makefile文件,利用这个文件的内容来编译整个工程,下图是一个简单的cmake项目的cmakelist文件实例:

cmakelist相当于一个说明书,告诉cmake我们要对这个目录下的文件做什么事情,第一个语句是声明的最低版本,第二个语句则是声明要创建的cmake工程的名字,最后一个语句则是向cmake工程中添加可执行程序,程序存放在本目录下。

采用这种方式,就不需要多次使用g++指令,只需要维护若干个比较直观的cmakelist文件就可以,从而降低了维护工程的难度。

第1-2讲 初识SLAM相关推荐

  1. 视觉SLAM十四讲 第1-2讲 初识SLAM

    视觉SLAM十四讲 第1-2讲 初识SLAM 1. slam 是什么 2. SLAM基本模块 3. 相机的种类 4. 视觉slam基本流程 5. 非/线性系统.非/高斯系统 6. CMake 1. s ...

  2. Slam十四讲之第一讲和第二讲 初识SLAM

    目录 1. slam是什么? 2. 初始SLAM 3. 视觉SLAM框架 3.1 视觉里程计(VO) 3.2 后端优化(Optimization) 3.3 回环检测 3.4 建图 4. SLAM问题的 ...

  3. 视觉SLAM十四讲学习笔记-第二讲-初识SLAM

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 "定位"和"建图",可以看成感知的"内外之分". ...

  4. 视觉SLAM笔记(1) 初识SLAM

    视觉SLAM笔记(1) 初识SLAM 1. 小萝卜的例子 2. 状态环境 3. 传感器比较 1. 小萝卜的例子 假设组装了一台叫做"小萝卜"的机器人,大概长的下图这个样子 作为机器 ...

  5. 初识SLAM到认识李群学习笔记

    本文为学习高翔.张涛等著的<视觉SLAM十四讲>的学习笔记,通过研究视觉SLAM,从三维空间刚体运动引出群论和李代数. 1. 初识SLAM 单目相机以二维的形式记录了三维的世界,缺少场景的 ...

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

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

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

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

  8. 视觉SLAM②--初识SLAM

    目录 2.0 本章主要内容 2.1 引子:小萝卜的例子 2.2 经典视觉SLAM框架 2.2.1 视觉里程计 2.2.2 后端优化 2.2.3 回环检测 2.2.4 建图 2.3 SLAM的数学问题描 ...

  9. 初识slam 即时定位与地图构建

    simultaneous localization and mapping 参考文章1:SLAM (同步定位与建图) 参考文章2:从零开始一起学习SLAM | 学习SLAM到底需要学什么?

最新文章

  1. tflearn 在每一个epoch完毕保存模型
  2. java和python的比较-java和python的比较
  3. Go Mysql Driver 集成 Seata-Golang 解决分布式事务问题
  4. ALV OO的栏位属性
  5. 什么是最重要的事情?来自长辈的教诲
  6. 20159206《网络攻防实践》第五周学习总结
  7. spring中使用注解代替xml配置
  8. [html] 如何关闭HTML页面在IOS下的键盘首字母自动大写?
  9. 3 View - 状态保持 session
  10. c语言链表贪吃蛇教程,编《贪吃蛇》最简单的算法,链表法
  11. 12.6 static类成员
  12. perment java_我对Java内存的认识(原创)
  13. 包无法安装_BiocManager无法安装R包
  14. WPF中TextBlock文本换行与行间距
  15. python新手入门到大师_GitHub - FainBleeze/Python-100-Days: Python - 100天从新手到大师
  16. 服务器系统怎么刻录光盘,怎么刻录Win7系统盘?Win7系统盘刻录教程
  17. 网易云音乐外链对比制作
  18. 这款安全好用的手机浏览器,真是一股清流,值得点赞
  19. python pyecharts绘制象形柱图Pictorialbar
  20. 转载 PVE 防火墙

热门文章

  1. tp中  M和 D的区别
  2. 如何关闭/删除vs2005的实时调试器?
  3. postman传递数组参数
  4. meterpreter持久后门
  5. (转)pycharm快捷键
  6. java代理模式与装饰者模式
  7. Myeclipse----Hibernate环境搭建
  8. Tomcat的8080、8005、8009端口
  9. 经典排序算法学习笔记七——堆排序
  10. 组态王和modbus协议