热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

专栏系列文章如下:

视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客

“定位”和“建图”,可以看成感知的“内外之分”。


传感器分类:

传感器分为两类: 一类传感器是携带于机器人本体上的,例如机器人的轮式编码器、相机、激光等等。另一类是安装于环境中的,例如导轨、二维码标志等等。安装于环境中的传感设备,通常能够直接测量到机器人的位置信息,简单有效地解决定位问题。然而,由于它们必须在环境中设置,在一定程度上限制了机器人的使用范围。比方说,有些地方没有GPS信号,有些地方无法铺设导轨。

这类传感器约束了外部环境。只有在这些约束满足时,基于它们的定位方案才能工作。虽然这类传感器简单可靠,但它们无法提供一个普遍的,通用的解决方案。相对的,那些携带于机器人本体上的传感器,比如激光传感器、相机、轮式编码器、惯性测量单元(Inertial Measurement)等等,它们测到的通常都是一些间接的物理量而不是直接的位置数据。例如,轮式编码器会测到轮子转动的角度、IMU测量运动的角速度和加速度,相机和激光则读取外部环境的某种观测数据。我们只能通过一些间接的手段,从这些数据推算自己的位置。明显的好处是,它没有对环境提出任何要求,使得这种定位方案可适用于未知环境。

按照相机的工作方式,我们把相机分为单目(Monocular)、双目(Stereo)和深度相机(RGB-D)三个大类。直观看来,单目相机只有一个摄像头,双目有两个,而 RGB-D原理较复杂,除了能够采集到彩色图片之外,还能读出每个像素离相机的距离。此外,SLAM 中还有全景相机、Event 相机等。

单目相机:

只使用一个摄像头进行SLAM的做法称为单目SLAM(Monocular SLAM)。

照片,本质上是拍照时的场景(Scene),在相机的成像平面上留下的一个投影。它以二维的形式反映了三维的世界。显然,这个过程丢掉了场景的一个维度:也就是所谓的深度(或距离)。在单目相机中,我们无法通过单个图片来计算场景中物体离我们的距离(远近),这个距离是SLAM中非常关键的信息。

在单张图像里,你无法确定一个物体的真实大小。它可能是一个很大但很远的物体,也可能是一个很近但很小的物体。由于近大远小的原因,它们可能在图像中变成同样大小的样子。

由于单目相机只是三维空间的二维投影,所以,如果我们想恢复三维结构,必须移动相机的视角。在单目SLAM中也是同样的原理。我们必须移动相机之后,才能估计它的运动(Motion),同时估计场景中物体的远近和大小。

那么,怎么估计这些运动和结构呢?从生活经验中我们知道,如果相机往右移动,那么图像里的东西就会往左边移动——这就给我们推测运动带来了信息。另一方面,我们还知道近处的物体移动快,远处的物体则运动缓慢。于是,当相机移动时,这些物体在图像上的运动,形成了视差。通过视差,我们就能定量地判断哪些物体离得远,哪些物体离的近。

然而,即使我们知道了物体远近,它们仍然只是一个相对的值。如果把相机的运动和场景大小同时放大两倍,单目所看到的像是一样的。同样的,把这个大小乘以任意倍数,我们都将看到一样的景象。这说明了单目SLAM 估计的轨迹和地图,将与真实的轨迹、地图,相差一个因子,也就是所谓的尺度(Scale)。由于单目 SLAM 无法仅凭图像确定这个真实尺度,所以又称为尺度不确定性。 平移之后才能计算深度,以及无法确定真实尺度,这两件事情给单目SLAM 的应用造成了很大的麻烦。后面为了得到这个深度,开始使用双目和深度相机。

双目相机和深度相机的目的,在于通过某种手段测量物体离我们的距离,克服单目无法知道距离的缺点。如果知道了距离,场景的三维结构就可以通过单个图像恢复出来,也就消除了尺度不确定性。

双目相机:

由两个单目相机组成,两个相机之间的距离(称为基线(Baseline))是已知的。我们通过这个基线来估计每个像素的空间位置。人类可以通过左右眼图像的差异,判断物体的远近,在计算机上也是同样的道理。计算机上的双目相机需要大量的计算才能估计每一个像素点的深度,相比于人类是非常的笨拙。双目相机测量到的深度范围与基线相关。基线距离越大,能够测量到的就越远。双目相机的距离估计是比较左右眼的图像获得的,并不依赖其他传感设备,所以它既可以应用在室内,也可应用于室外。双目或多目相机的缺点是配置与标定较为复杂,其深度量程和精度受双目的基线与分辨率限制,而且视差的计算非常消耗计算资源,需要使用 GPU 和 FPGA 设备加速后,才能实时输出整张图像的距离信息。

深度相机

又称 RGB-D相机,可以通过红外结构光或 Time-of-Flight(ToF)原理,像激光传感器那样,通过主动向物体发射光并接收返回的光,测出物体离相机的距离。 不像双目那样通过软件计算来解决,而是通过物理的测量手段,可节省大量的计算量。目前常用的 RGB-D 相机包括Kinect/Kinect V2、 Realsense等。不过,现在多数 RGB-D 相机还存在测量范围窄、噪声大、视野小、易受日光干扰、无法测量透射材质等诸多问题,在SLAM方面,主要用于室内SLAM。


视觉SLAM流程

1. 传感器信息读取。在视觉 SLAM 中主要为相机图像信息的读取和预处理。如果在机器人中,还可能有测速码盘、惯性传感器等信息的读取和同步。

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

3. 后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在VO之后, 又称为后端(Back End)。

4. 回环检测(Loop Closing)。判断机器人是否曾经到达过先前的位置。如果检测到回环,它会把信息提供给后端进行处理。

5. 建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。

视觉里程计

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

计算机是如何通过图像确定相机的运动呢?图像在计算机里只是一个数值矩阵。这个矩阵里表达着什么东西,计算机毫无概念(这也正是现在机器学习要解决的问题)。

视觉 SLAM 中,我们只能看到一个个像素,知道它们是某些空间点在相机的成像平面上投影的结果。所以,为了定量地估计相机运动,必须在了解相机与空间点的几何关系之后进行。 VO能够通过相邻帧间的图像估计相机运动,并恢复场景的空间结构。VO只计算相邻时刻的运动,而和往前的信息没有关联。假定我们已有了一个视觉里程计,估计了两张图像间的相机运动。那么,只要把相邻时刻的运动串起来,就构成了机器人的运动轨迹,从而解决了定位问题。另一方面,我们根据每个时刻的相机位置,计算出各像素对应的空间点的位置,就得到了地图。

但是,有了VO,并没有解决SLAM问题。

仅通过视觉里程计来估计轨迹,将出现累计漂移(Accumulating Drift)。这是由于视觉里程计(在最简单的情况下)只估计两个图像间运动造成的。每次估计都带有一定的误差,而由于里程计的工作方式,先前时刻的误差将会传递到下一时刻, 导致经过一段时间之后,估计的轨迹将不再准确。比方说,机器人先向左转90度,再向右 转了90度。由于误差,我们把第一个90度估计成了89度。向右转之后机器人的估计位置并没有回到原点。即使之后的估计再准确,与真实值相比,都会带上这-1度的误差。这也就是所谓的漂移(Drift)。这将导致我们无法建立一致的地图。为了解决漂移问题,我们还需要两种技术:后端优化和回环检测。回环检测负责把机器人回到原始位置检测出来,而后端优化则根据该信息,校正整个轨迹的形状。

后端优化

主要指处理SLAM过程中噪声的问题。现实中,再精确的传感器也带有一定的噪声。便宜的传感器测量误差较大,昂贵的则较小,有的传感器还会受磁场、温度的影响。

所以,除了解决如何从图像估计出相机运动之外,我们还要关心这个估计带有多大的噪声,这些噪声是如何从上一时刻传递到下一时刻的、而我们又对当前的估计有多大的信心。

后端优化要考虑的问题,就是如何从这些带有噪声的数据中,估计整个系统的状态,以及这个状态估计的不确定性有多大——这称为最大后验概率估计(Maximum-a-Posteriori,MAP)。这里的状态既包括机器人自身的轨迹,也包含地图。在SLAM框架中,前端给后端提供待优化的数据,以及这些数据的初始值。而后端负责整体的优化过程,它往往面对的只有数据,不必关心这些数据到底来自什么传感器。在视觉 SLAM 中,前端和计算机视觉研究领域更为相关,比如图像的特征提取与匹配等,后端则主要是滤波与非线性优化算法。早期的SLAM问题是一个状态估计问题,这正是后端优化要解决的东西。

SLAM 问题的本质:对运动主体自身和周围环境空间不确定性的估计。为了解决SLAM,我们需要状态估计理论,把定位和建图的不确定性表达出来,然后采用滤波器或非线性优化,去估计状态的均值和不确定性(方差)。

回环检测

又称闭环检测(Loop Closure Detection),主要解决位置估计随时间漂移的问题。假设实际情况下,机器人经过一段时间运动后回到了原点,但是由于漂移,它的位置估计值却没有回到原点。

如果有某种手段,让机器人知道回到了原点这件事,或者把原点识别出来,我们再把位置估计值拉过去,就可以消除漂移了。这就是所谓的回环检测。我们认为,地图存在的主要意义,是为了让机器人知晓自己到达过的地方。为了实现回环检测,我们需要让机器人具有识别曾到达过的场景的能力。我们更希望机器人能使用携带的传感器——也就是图像本身,来完成这一任务。例如,我们可以判断图像间的相似性,来完成回环检测。如果回环检测成功,可以显著地减小累积误差。所以视觉回环检测,实质上是一种计算图像数据相似性的算法。由于图像的信息非常丰富,使得正确检测回环的难度也降低了不少。在检测到回环之后,我们会把“A 与 B 是同一个点”这样的信息告诉后端优化算法。然后,后端根据这些新的信息,把轨迹和地图调整到符合回环检测结果的样子。这样,如果我们有充分而且正确的回环检测,就可以消除累积误差,得到全局一致的轨迹和地图。

建图

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

对于家用扫地机器人来说,这种主要在低矮平面里运动的机器人,只需要一个二维的地图,标记哪里可以通过,哪里存在障碍物,就够它在一定范围内导航了。

而对于一个相机,它有六自由度的运动,我们至少需要一个三维的地图。有时我们不需要地图,或者地图可以由其他人提供,例如行驶的车辆往往可以得到已经绘制好的当地地图。建图并没有一个固定的形式和算法。一组空间点的集合也可以称为地图,一个漂亮的3D模型也是地图,一个标记着城市、村庄、铁路、河道的图片也是地图。地图的形式随SLAM的应用场合而定。大体上讲,它们可以分为度量地图与拓扑地图两种。

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

稠密地图着重于建模所有看到的东西。对于定位来说,稀疏路标地图就足够了。而用于导航时,我们往往需要稠密的地图。稠密地图通常按照某种分辨率,由许多个小块组成。二维度量地图是许多个小格子(Grid),三维则是许多小方块(Voxel)。一般地,一个小块含有占据、空闲、未知三种状态,以表达该格内是否有物体。当我们查询某个空间位置时,地图能够给出该位置是否可以通过的信息。这样的地图可以用于各种导航算法。这种地图需要存储每一个格点的状态,耗费大量的存储空间,而且多数情况下地图的许多细节部分是无用的。另一方面,大规模度量地图有时会出现一致性问题。很小的一点转向误差,可能会导致两间屋子的墙出现重叠,使得地图失效。

拓扑地图(Topological Map)相比于度量地图的精确性,拓扑地图则更强调地图元素之间的关系。拓扑地图是一个图(Graph),由节点和边组成,只考虑节点间的连通性,例如 A,B 点是连通的,而不考虑如何从A点到达B点的过程。它放松了地图对精确位置的需要,去掉地图的细节问题,是一种更为紧凑的表达方式。拓扑地图不擅长表达具有复杂结构的地图。

如何对地图进行分割形成结点与边,又如何使用拓扑地图进行导航与路径规划,仍是有待研究的问题。


SLAM 问题的数学表述

1. 什么是运动?要考虑从k−1时刻到k时刻,机器人的位置x是如何变化的。

机器人会携带一个测量自身运动的传感器,比如说码盘或惯性传感器。这个传感器可以测量有关运动的读数,但不一定直接是位置之差,还可能是加速度、角速度等信息。无论是什么传感器,我们都能使用一个通用的、抽象的数学模型: xk = f (xk−1,uk, wk).

这里uk是运动传感器的输入,wk 为噪声。这称为运动方程。

2. 什么是观测?假设机器人在k时刻,于xk处探测到了某一个路标yj,要考虑这件事情是如何用数学语言来描述的。

观测方程描述的是,当机器人在xk位置上看到某个路标点yj,产生了一个观测数据zk,j。用一个抽象的函数h来描述这个关系: zk,j = h (yj , xk, vk,j )。

vk,j是这次观测里的噪声。

根据机器人的真实运动和传感器的种类,存在着若干种参数化方式(Parameterization)。

假设机器人在平面中运动,那么,它的位姿由两个位置和一个转角来描述,x1, x2 是两个轴上的位置而 θ 为转角,即

输入的指令是两个时间间隔位置和转角的变化量:

此时运动方程:

并不是所有的输入指令都是位移和角度的变化量,比如“油门”或者 “控制杆”的输入就是速度或加速度量,存在着其他形式更加复杂的运动方程,我们需要进行动力学分析。关于观测方程,比方说机器人携带着一个二维激光传感器。我们知道激光传感器观测一个2D路标点时,能够测到两个量:路标点与机器人本体之间的距离 r 和夹角 ϕ。

记路标点为

位姿为

观测数据为

那么观测方程就为:

考虑视觉 SLAM 时,传感器是相机,那么观测方程就是“对路标点拍摄后,得到了图像中的像素”的过程。 针对不同的传感器,这两个方程有不同的参数化形式。

取成通用的抽象形式,SLAM过程可总结为两个基本方程:

这两个方程描述了最基本的SLAM问题:当我们知道运动测量的读数u,以及传感器的读数z 时,如何求解定位问题(估计x)和建图问题(估计y)?这时,我们把 SLAM 问题建模成了一个状态估计问题:如何通过带有噪声的测量数据,估计内部的、隐藏着的状态变量?

SLAM 状态估计问题的求解,与两个方程的具体形式,以及噪声服从哪种分布有关。

我们按照运动和观测方程是否为线性,噪声是否服从高斯分布进行分类,分为线性/非线性和高斯/非高斯系统。其中线性高斯系统(Linear Gaussian, LG 系统)是最简单的,它的无偏的最优估计可以由卡尔曼滤波器(Kalman Filter, KF)给出。

而在复杂的非线性非高斯系统 (Non-Linear Non-Gaussian,NLNG 系统)中,我们会使用以扩展卡尔曼滤波器(Extended Kalman Filter, EKF)和非线性优化两大类方法去求解它。

直至21世纪早期,以 EKF 为主的滤波器方法占据了 SLAM 中的主导地位。在工作点处把系统线性化,并以预测 ——更新两大步骤进行求解。最早的实时视觉SLAM系统即是基于EKF开发的。随后,为了克服 EKF 的缺点(例如线性化误差和噪声高斯分布假设),人们开始使用粒子滤波器(Particle Filter)等其他滤波器,乃至使用非线性优化的方法。

时至今日,主流视觉 SLAM 使用以图优化(Graph Optimization)为代表的优化技术进行状态估计。优化技术已经明显优于滤波器技术,只要计算资源允许,我们通常都偏向于使用优化方法。

机器人更多时候是一个三维空间里的机器人。三维空间的运动由三个轴构成,所以机器人的运动要由三个轴上的平移,以及绕着三个轴的旋转来描述,这一共有六个自由度。在视觉SLAM 中,对6自由度的位姿如何表达,优化。观测方程如何参数化,即空间中的路标点是如何投影到一张照片上的,这需要解释相机的成像模型。最后,怎么求解上述方程?这需要非线性优化的知识。


推荐阅读
  • 当前物联网领域十大核心技术解析:涵盖哪些关键技术?
    经过近十年的技术革新,物联网已悄然渗透到日常生活中,对社会产生了深远影响。本文将详细解析当前物联网领域的十大核心关键技术,包括但不限于:1. 军事物联网技术,该技术通过先进的感知设备实现战场环境的实时监测与数据传输,提升作战效能和决策效率。其他关键技术还包括传感器网络、边缘计算、大数据分析等,这些技术共同推动了物联网的快速发展和广泛应用。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 独家解析:深度学习泛化理论的破解之道与应用前景
    本文深入探讨了深度学习泛化理论的关键问题,通过分析现有研究和实践经验,揭示了泛化性能背后的核心机制。文章详细解析了泛化能力的影响因素,并提出了改进模型泛化性能的有效策略。此外,还展望了这些理论在实际应用中的广阔前景,为未来的研究和开发提供了宝贵的参考。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战?
    Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战? ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • 投融资周报 | Circle 达成 4 亿美元融资协议,唯一艺术平台 A 轮融资超千万美元 ... [详细]
  • 为了评估精心优化的模型与策略在实际环境中的表现,Google对其实验框架进行了全面升级,旨在实现更高效、更精准和更快速的在线测试。新的框架支持更多的实验场景,提供更好的数据洞察,并显著缩短了实验周期,从而加速产品迭代和优化过程。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • R语言中向量(Vector)数据类型的元素索引与访问:利用中括号[]和赋值操作符在向量末尾追加数据以扩展其长度
    在R语言中,向量(Vector)数据类型的元素可以通过中括号 `[]` 进行索引和访问。此外,利用中括号和赋值操作符,可以在向量的末尾追加新数据,从而动态地扩展向量的长度。这种方法不仅简洁高效,还能灵活地管理向量中的数据。 ... [详细]
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 浅析卷积码的应用及其优势:探讨卷积编码在通信系统中的关键作用与特性
    本文详细介绍了卷积编码的基本原理,并深入分析了其在通信系统中的应用及其显著优势。卷积编码通过在编码过程中引入冗余信息,有效提高了数据传输的可靠性和抗干扰能力,成为现代通信系统中不可或缺的关键技术。文章还探讨了卷积编码在不同场景下的具体实现方法及其性能特点。 ... [详细]
  • 美团优选推荐系统架构师 L7/L8:算法与工程深度融合 ... [详细]
author-avatar
跳花妹535
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有