视觉SLAM_1_初识SLAM

前言:

博客中会有大部分的内容和高翔博士的《视觉SLAM十四讲》相同,实际上就是从那上面摘抄的。正在学习《视觉SLAM十四讲》,博客内容作为学习笔记,请勿转载。

1、SLAM是干嘛的?

从高翔博士的小萝卜的例子,可以很来的体会SLAM到底是干嘛用的。下面来做一个简单的介绍。

假设我们组装了一台叫做“小萝卜”的机器人,大概的样子如下图所示:

视觉SLAM_1_初识SLAM

既然是机器人,我们当然希望它有自主运动能力。为了能够自主的进行运动,它至少需要知道两件事情:(1)定位 --- 知道自己在哪儿;(2)建图 --- 知道周围的环境是什么样。

为了实现小萝卜的自主运动,需要在上面搭载一些传感器。可以将这些传感器分为两类:(1)安装在外界环境中的传感器,比如说可以安装运动导轨,让小萝卜沿着导轨运动,从而实现自主运动。但是这样有个问题:限制了小萝卜的运动范围。(2)将传感器搭载在机器人本体上。显然第二种方法可以更好的适应位置环境。特别地,在讨论视觉SLAM的时候,我们主要是指如何使用相机解决定位和建图问题。

2、经典视觉SLAM框架

经典的视觉SLAM框架如下图所示,从中可以看到SLAM究竟是由哪儿几个模块组成的。

视觉SLAM_1_初识SLAM

整个视觉视觉SLAM包括以下步骤:

1、传感器数据读取

在视觉SLAM中主要为相机图像的读取和预处理。

2、视觉里程计(Visual Odometry)

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

视觉里程计关心的是 相邻图像 之间的相机运动,最简单的情况当然是两张图像之间的运动关系。现在只需要对VO有个感性的认识即可。我们知道,VO能够通过相邻帧间的图像估计相机的运动,并恢复场景的空间结构。称它为“里程计”是因为它和实际的里程计一样,只计算相邻时刻的运动,而和再往前的信息没有关联

现在,假设我们已经做好了视觉里程计,并且通过它可以估计两张图像间的相机运动。(1)只要把相邻时刻的运动“串”起来,就构成了机器人的运动轨迹,这样就解决了定位问题;(2)我们根据每个时刻的相机位置,计算出各像素对应的空间点的位置,就得到了地图。这样来看,有了VO,就解决了定位和建图这两个问题,那么是不是有了VO就解决了SLAM问题呢?答案是否定的。

仅仅通过视觉里程计来估计轨迹,将会不可避免的出现累计漂移(Accumulating Drift)。累计漂移是由于视觉里程计(在最简单的情况下)只估计两个图像间的运动造成的。我们知道每次估计都会带有一定的误差,而由于里程计的工作方式,先前时刻的误差将会传递到下一时刻,导致经过一段时间之后,误差累计到一起,估计的轨迹就不再准确了。

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

3、后端优化

笼统的说,后端优化主要指处理SLAM过程中噪声的问题。

后端优化要考虑的问题,就是如何从这些带有噪声的数据中估计整个系统的状态,以及这个状态估计的不确定性有多大---这称为最大后验概率估计。这里的状态包括机器人自身的轨迹,也包含地图。

在SLAM框架中,前端向后端提供待优化的数据,以及这些数据的初始值。而后端负责整体的优化过程,它往往面对的只有数据,不必关心这些数据到底分别来自什么传感器。在视觉SLAM中,前端和计算机视觉研究领域更为相关,比如图像的特征提取与匹配等,后端则主要是滤波与非线性优化算法。

4、回环检测

回环检测,也称为闭环检测,主要解决位置估计随时间漂移的问题。

怎么解决呢?

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

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

为了实现回环检测,我们需要让机器人具有识别到过的场景的能力。这同样有两种思路:(1)在机器人下方设置一个标志物(比如一张二维码),它只要看到了这个标志,就知道自己回到了原点。弊端:标志物是安装在外界环境中的传感器,对应用环境做了限制(万一不允许在环境中设置标志,那机器人就成了瞎子了);(2)使用机器人本体携带的传感器 --- 相机来完成这一任务。例如:我们可以通过判断相机拍摄的图像间的相似性来完成回环检测,这一点和人相似。

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