第2讲 初识 SLAM
SLAM 是 Simultaneous Localization and Mapping 的缩写,中文译作“同时定位与地图构建”[1]。它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运[2]。如果这里的传感器主要为相机,那就称为 “视觉 SLAM”。
「https://github.com/gaoxiang12/slambook」
按照相机的工作方式,我们把相 机分为单目(Monocular)、双目(Stereo)和深度相机(RGB-D)三个大类
单目相机 只使用一个摄像头进行 SLAM 的做法称为单目 SLAM(Monocular SLAM)。 这种传感器结构特别的简单、成本特别的低。
单目相机只是三维空间的二维投影 。人类:对大部分场景都有一个直观的距离感(空间感) 估计场景中物体的远近和大小,不妨称之为结构(Structure)
近处的 物体移动快,远处的物体则运动缓慢。当相机移动时,这些物体在图像上的运动,形成了视差。
单目 SLAM 估计的轨迹和地图,将与真实的轨迹、地图,相差一个因子,也就是所谓的尺度(Scale)。由于单目 SLAM 无法仅凭图像确定这个真实尺度,所以又称为尺度 不确定性。
双目相机 (Stereo) 和深度相机 两个相机之 间的距离(称为基线(Baseline)是已知的。计算量是双目的主要问题之一。
深度相机(又称 RGB-D 相机 )它最大的特点是可以通过红外结构光或 Time-of-Flight(ToF)原 理,像激光传感器那样,通过主动向物体发射光并接收返回的光,测出物体离相机的距离。 通过物理的测量手段,所以相比于双目 可节省大量的计算量。目前常用的 RGB-D 相机包括 Kinect/Kinect V2、Xtion live pro、 Realsense 等。不过,现在多数 RGB-D 相机还存在测量范围窄、噪声大、视野小、易受日 光干扰、无法测量透射材质等诸多问题 。
如果把工作环境限定在静态、刚体,光照变化不明显、没有人为干 扰的场景,那么,这个 SLAM 系统是相当成熟的了
VO:叫它为“里程计”是因为它和实际的里程计一样,只计算相邻时刻的运动,而和再往前的 过去的信息没有关联。 估计了两张图像间的相机运动。那么,只要 把相邻时刻的运动“串”起来,就构成了机器人的运动轨迹,从而解决了定位问题。 将不可避免地出现累计漂移(Accumulating Drift)。这 是由于视觉里程计(在最简单的情况下)只估计两个图像间运动造成的。 回环检测负责把“机器 人回到原始位置”的事情检测出来,而后端优化则根据该信息,校正整个轨迹的形状。
后端优化:主要指处理 SLAM 过程中噪声的问题。 如何从这些带有噪声的数据中,估计整个系统的状态以及这个状态估计的不确定性有多大(最大后验概率估计 )。在视觉 SLAM 中,前端和CV研究领域更为相关,比如图像的特征提取与匹配等,后端则主要是滤波与非线性优化算法。
回环检测:又称闭环检测(Loop Closure Detection),主要解决位置估计随时间漂移的问题。需要让机 器人具有识别曾到达过的场景的能力。视觉回环检测,实质上是一种计算图像数据相似性的算法。我们会把“A 与 B 是同一个点”这样的信息告诉后端优化算法。 然后,后端根据这些新的信息,把轨迹和地图调整到符合回环检测结果的样子。
建图(Mapping):是指构建地图的过程。(2D 栅格地图、拓扑地图以及 3D 点云地图和网格地图 )地图的形式随 SLAM 的应用场合而定。 大体上讲,它们可以分为度量地图与拓扑地图两种。
度量地图:例 如,我们选择一部分具有代表意义的东西,称之为路标(Landmark),那么一张稀疏地图 就是由路标组成的地图,而不是路标的部分就可以忽略掉。相对的,稠密地图着重于建模 所有看到的东西。对于定位来说,稀疏路标地图就足够了。而用于导航时,我们往往需要 稠密的地图 。大规模度量地图有时会出现一致性问题。
相比于度量地图的精确性,拓扑地图则更强调地图元素之间的关系。拓扑地图是一个 图(Graph),由节点和边组成,只考虑节点间的连通性。
离散时刻 t = 1, . . . , K ,各时刻的位置就记为 x1 , . . . , xK ,它们构成了主体的轨迹。地图方面,我们设地图是由许多个路标(Landmark)组成的,而每个时刻,传感器会测量到一部分路标点,得到它们的观测数据。不妨设路标点一共有 N 个,用 y1, . . . , yN 表示它们。
运动数学模型: xk =f(xk−1,uk,wk). (2.1)
这里 uk 是运动传感器的读数(有时也叫输入),wk 为噪声。整个函数可以指代任意的运动传感器。我们把它称为 运动方程。
观测方程描述的是,当小萝卜在 xk 位置上 看到某个路标点 yj,产生了一个观测数据 zk,j。同样,我们用一个抽象的函数 h 来描述这 个关系:
zk,j = h(yj,xk,vk,j). (2.2)
这里 vk,j 是这次观测里的噪声。由于观测所用的传感器形式更多,这里的观测数据 z 以及观测方程 h 也许多不同的形式。
参数化方式(Parameterization):如在平面中运动,那么,它的位姿x由两个位置和一个转角来描述,即xk =[x,y,θ]Tk。同时,运动传感器能够测量到小萝卜在每两个时间间隔变化量uk =[∆x,∆y,∆θ]Tk,那 么,此时运动方程就可以具体化为:
观测一个 2D 路标点时,能 够测到两个量:路标点与小萝卜本体之间的距离 r 和夹角 φ。我们记路标点为 y = [px , py ]T,观测数据为 z = [r, φ]T ,那么观测方程就具体化为:
如何求解定位问题(估计 x)和建图问题(估计 y)?这时,我们把 SLAM 问题建模成了一个状态估计问题。