视觉 SLAM 十四讲 —— 第十三讲 建图
视觉 SLAM 十四讲 —— 第十三讲 建图
在前端和后端中,我们重点关注同时估计相机运动轨迹与特征点空间位置的问题。然而,在实际使用 SLAM 时,除了对相机本体进行定位之外,还存在许多其他的需求。例如,考虑放在机器人上的 SLAM,那么我们会希望地图能够用于定位、导航、避障和交互,特征点地图显然不能满足所有的这些需求。所以,本章我们将更详细地讨论各种形式的地图,并指出目前视觉 SLAM 地图中存在着的缺陷。
概述
在视觉 SLAM 看来,“建图”是服务于“定位”的;但是在应用层面看来,“建图”明显还带有许多其他的需求。关于地图的用处,我们大致归纳如下
- 定位。定位是地图的一个基本功能。在前面的视觉里程计章节,我们讨论了如何利用局部地图来实现定位。或者,在回环检测章节,我们也看到,只要有全局的描述子信息,我们也能通过回环检测确定机器人的位置。更进一步,我们还希望能够把地图保
存下来,让机器人在下次开机后依然能在地图中定位,这样只需对地图进行一次建模,而不是每次启动机器人都重新做一次完整的 SLAM。 - 导航。导航是指机器人能够在地图中进行路径规划,从任意两个地图点间寻找路径,然后控制自己运动到目标点的过程。该过程中,我们至少需要知道地图中哪些地方不可通过,而哪些地方是可以通过的。这就超出了稀疏特征点地图的能力范围,我们必
须有另外的地图形式。稍后我们会说,这至少得是一种稠密的地图。 - 避障。避障也是机器人经常碰到的一个问题。它与导航类似,但更注重局部的、动态的障碍物的处理。同样的,仅有特征点,我们无法判断某个特征点是否为障碍物,所以我们将需要稠密地图。
- 重建。有时候,我们希望利用 SLAM 获得周围环境的重建效果,并把它展示给其他人看。这种地图主要用于向人展示,所以我们希望它看上去比较舒服、美观。或者,我们也可以把该地图用于通讯,使其他人能够远程地观看我们重建得到的三维物体
或场景——例如三维的视频通话或者网上购物等等。这种地图亦是稠密的,并且我们还对它的外观有一些要求。我们可能不满足于稠密点云重建,更希望能够构建带纹理的平面,就像电子游戏中的三维场景那样。 - 交互。交互主要指人与地图之间的互动。例如,在增强现实中,我们会在房间里放置虚拟的物体,并与这些虚拟物体之间有一些互动——比方说我会点击墙面上放着的虚拟网页浏览器来观看视频,或者向墙面投掷物体,希望它们有(虚拟的)物理碰撞。
另一方面,机器人应用中也会有与人、与地图之间的交互。例如机器人可能会收到命令“取桌子上的报纸”,那么,除了有环境地图之外,机器人还需要知道哪一块地图是“桌子”,什么叫做“之上”,什么又叫做“报纸”。这需要机器人对地图有更高级层面的认知——亦称为语义地图。
单目稠密重建
立体视觉
那么,在稠密深度图估计中,不同之处在于,我们无法把每个像素都当作特征点,计算描述子。因此,稠密深度估计问题中,匹配就成为很重要的一环:如何确定第一张图的某像素,出现在其他图里的位置呢?这需要用到极线搜索和块匹配技术。然后,当我们
知道了某个像素在各个图中的位置,就能像特征点那样,利用三角测量确定它的深度。不过不同的是,在这里我们要使用很多次三角测量让深度估计收敛,而不仅是一次。我们希望深度估计,能够随着测量的增加,从一个非常不确定的量,逐渐收敛到一个稳定值。这就是深度滤波器技术。所以,下面的内容将主要围绕这个主题展开。
极线搜索与块匹配
左边的相机观测到了某个像素 。由于这是一个单目相机,我们无从知道它的深度,所以假设这个深度可能在某个区域之内,不妨说是某最小值到无穷远之间:
。因此,该像素对应的空间点就分布在某条线段(本例中是射线)上。在另一个视角(右侧相机)看来,这条线段的投影也形成图像平面上的一条线,我们知道这称为极线。当我们知道两个相机间的运动时,这条极线也是能够确定的。
在直接法的讨论中我们也知道,比较单个像素的亮度值并不一定稳定可靠。一种直观的想法是:既然单个像素的亮度没有区分性,那是否可以比较像素块呢?我们在 周围取一个大小为
的小块,然后在极线上也取很多同样大小的小块进行比较,就可以一定程度上提高区分性。这就是所谓的块匹配。
常用的块匹配方法包括:
- SAD(Sum of Absolute Difference)
- SSD(Sum of Squared Distance)
- NCC(Normalized Cross Correlation)
和我们遇到过的许多情形一样,这些计算方式往往存在一个精度——效率之间的矛盾。精度好的方法往往需要复杂的计算,而简单的快速算法又往往效果不佳。这需要我们在实际工程中进行取舍。另外,除了这些简单版本之外,我们可以先把每个小块的均值去掉,称为去均值的 SSD、去均值的 NCC 等等。去掉均值之后,我们允许像“小块 B 比 A 整体上亮一些,但仍然很相似”这样的情况,因此比之前的更加可靠一些。
在搜索距离较长的情况下,我们通常会得到一个非凸函数:这个分布存在着许多峰值,然而真实的对应点必定只有一个。在这种情况下,我们会倾向于使用概率分布来描述深度值,而非用某个单一个的数值来描述深度。于是,我们的问题就转到了,在不断对不同图像进行极线搜索时,我们估计的深度分布将发生怎样的变化——这就是所谓的深度滤波器。
高斯分布的深度滤波器
对像素点深度的估计,本身亦可建模为一个状态估计问题,于是就自然存在滤波器与非线性优化两种求解思路。虽然非线性优化效果较好,但是在 SLAM 这种实时性要求较强的场合,考虑到前端已经占据了不少的计算量,建图方面则通常采用计算量较少的滤波器
方式了。
对深度的分布假设存在着若干种不同的做法。首先,在比较简单的假设条件下,我们可以假设深度值服从高斯分布,得到一种类卡尔曼式的方法(我们稍后会看到)。而另一方面,在某些工作中,亦采用了均匀——高斯混合分布的假设,推导了另一种形式更
为复杂的深度滤波器。
对于简单的高斯分布假设,可得融合后的高斯分布的均值和方差为
对于量测不确定性的估计,可以根据如下几何关系求得。
综上所述,我们给出了估计稠密深度的一个完整的过程:
- 假设所有像素的深度满足某个初始的高斯分布;
- 当新数据产生时,通过极线搜索和块匹配确定投影点位置;
- 根据几何关系计算三角化后的深度以及不确定性;
- 将当前观测融合进上一次的估计中。若收敛则停止计算,否则返回 2。
实验分析与讨论