赞
踩
理解一个视觉 SLAM 框架由哪几个模块组成,各模块的任务是什么
搭建编程环境,为开发和实验做准备。
理解如何在 Linux下编译并运行一个程序。如果它出了问题,我们又如何对它进行调试。
掌握cmake的基本使用方法
小萝卜的例子:
假设有个叫“小萝卜”的机器人,搭载了传感器。
问题:
1.我在什么地方?一一定位。
2.周围环境是什么样?——建图。
“定位”和“建图”,是相互耦合的两个问题,准确的定位需要精确的地图,精确的地图来自准确的定位。
可以看成感知的“内外之分”。一方面要明白自身的状态 (即位置),另一方面也要了解外在的环境 (即地图)。当然,解决这两个问题的方法非常之多。比方说,在房间地板上铺设导引线,在墙壁上贴识别二维码,在桌子上放置无线电定位设备。
下面展示了一些传感器的图片。
(a) 利用二维码进行定位的增强现实软件;
(b) GPS 定位装置
(c) 铺设导轨的小车;
(d) 激光雷达;
(e) IMU 单元;
(f) 双目相机。
获取这些信息需要通过传感器,传感器又可以分为携带于机器人本体上的和安装于环境中的:
例如机器人的激光传感器、轮式编码器、相机、激光、惯性测量单元 (Imertial Measurement Unit,IMU)等等,它们测到的通常都是一些间接的物理量而不是直接的位置数据。
1. 轮式编码器会测到轮子转动的角度;
2. IMU 测量运动的角速度和加速度;
3. 相机和激光则读取外部环境的某种观测数据。
通过一些间接的手段,从这些数据推算自己的位置。虽然这听上去是一种迂回战术,但更明显的好处是,它没有对环境提出任何要求,使得这种定位方案可适用于未知环境。
例如导轨、磁条、二维码Marker、GPS(室外) 等等。
安装于环境中的传感设备,通常能够直接测量到机器人的位置信息,简单有效地解决定位问题。
然而,由于它们必须在环境中设置,在一定程度上限制了机器人的使用范围。比方说,有些地方没有 GPS信号,有些地方无法铺设导轨,这时怎么做定位呢?
——————————————————————
在 SLAM 中,非常强调未知环境。在理论上我们没法限制小萝卜的使用环境,这意味着我们没法假设像 GPS 这些外部传感器都能顺利工作。因此,使用携带式的传感器来完成 SLAM 是我们重点关心的问题。
特别地,当谈论视觉 SLAM 时,主要是指如何用相机解决定位和建图问题。
SLAM中使用的相机与我们平时见到的单反摄像头并不是同一个东西。它往往更加简单,不携带昂贵的镜头,以一定速率拍摄周围的环境,形成一个连续的视频流。普通的摄像头能以每秒钟 30 张图片的速度采集图像,高速相机则更快一些。
按照相机的工作方式,我们把相机分为三个大类:
只使用一个摄像头进行 SLAM 的做法称为单目 SLAM (Monocular SLAM)。
这种传感器结构特别的简单、成本特别的低,所以单目 SLAM 非常受研究者关注。单目相机的数据:照片。照片本质上是拍照时的场景 (Scene),在相机的成像平面上留下的一个投影。它以二维的形式反映了三维的世界。显然,这个过程丢掉了场景的一个维度:也就是所谓的深度(或距离)。在单目相机中,我们无法通过单个图片来计算场景中物体离我们的距离(远近)一一之后我们会看到,这个距离将是 SLAM 中非常关键的信息。
在单张图像里,无法确定一个物体的真实大小。它可能是一个很大但很远的物体,也可能是一个很近但很小的物体。由于近大远小的原因,它们可能在图像中变成同样大小的样子。
不知深度时,手掌上的是真人还是模型?
由于单目相机只是三维空间的二维投影,所以,如果我们真想恢复三维结构,必须移动相机的视角。在单目 SLAM 中也是同样的原理。我们必须移动相机之后,才能估计它的运动(Motion),同时估计场景中物体的远近和大小,不妨称之为结构 (Structure)。那么,怎么估计这些运动和结构呢?从生活经验中我们知道,如果相机往右移动,那么图像里的东西就会往左边移动一一这就给我们推测运动带来了信息。
另一方面,单目 SLAM 估计的轨迹和地图,将与真实的轨迹、地图,相差一个因子也就是所谓的尺度 (Scale)。由于单目 SLAM 无法仅凭图像确定这个真实尺度,所以又称为尺度不确定性。
平移之后才能计算深度,以及无法确定真实尺度,这两件事情给单目 SLAM 的应用造成了很大的麻烦。本质原因是通过单张图像无法确定深度。所以,为了得到这个深度,人们又开始使用双目和深度相机。
尽管都是为测量距离,但双目相机与深度相机测量深度的原理是不一样的。
双目相机(Stereo) 的目的,在于通过某种手段测量物体离我们的距离,克服单目无法知道距离的缺点。如果知道了距离,场景的三维结构就可以通过单个图像恢复出来,也就消除了尺度不确定性。
双目相机由两个单目相机组成,两个相机之间的距离称为:基线(Baseline)是已知的。通过这个基线来估计每个像素的空间位置一这和人眼非常相似。
(如果对双目相机进行拓展,也可以搭建多目相机,不过本质上并没有什么不同。)
双目相机测量到的深度范围与基线相关,基线距离越大,能够测量到的就越远。 双目相机的距离估计是比较左右眼的图像获得的,并不依赖其他传感设备,所以它既可以应用在室内,亦可应用于室外。双目或多目相机的缺点是配置与标定均较为复杂,其深度量程和精度受双目的基线与分辨率限制,而且视差的计算非常消耗计算资源,需要使用 GPU 和FPGA 设备加速后,才能实时输出整张图像的距离信息。因此在现有的条件下,计算量是双目的主要问题之一。
深度相机又称 RGB-D 相机,是2010 年左右开始兴起的一种相机,它最大的特点是可以通过红外结构光或 Time-of-Flight (ToF)原理,像激光传感器那样,通过主动向物体发射光并接收返回的光,测出物体离相机的距离。
TOF是飞行时间(Time of Flight)技术的缩写,即传感器发出经调制的近红外光,
遇物体后反射,传感器通过计算光线发射和反射时间差或相位差,来换算被拍摄景物的距离,
以产生深度信息,此外再结合传统的相机拍摄,
就能将物体的三维轮廓以不同颜色代表不同距离的地形图方式呈现出来。
整个视觉 SLAM 流程分为以下几步:
漂移
。后端优化(Optimization)
假设小萝卜正携带着某种传感器在未知环境里运动,怎么用数学语言描述这件事呢?
离散时间:t=1,2,3…k
小萝卜位置:x1,x2,…,xk
路标(三维空间点):y1,y2,…yn
在这样设定中,“小萝卜携带着传感器在环境中运动”,由运动方程和观测方程共同描述!
方程表述内容: 从k-1时刻到k时刻,小萝卜的位置x是如何变化的。
小萝卜从上一时刻到下一时刻运动方程:
xk-1——上一时刻位置
uk——运动传感器的读数(有时也叫输入)
wk——噪声
通常,机器人会携带一个测量自身运动的传感器,比如说码盘或惯性传感器。这个传感器可以测量有关运动的读数,但不一定直接是位置之差,还可能是加速度、角速度等信息。然而,无论是什么传感器,都能使用上述通用的、抽象的数学模型。
方程表述内容: 当小萝卜在xk 位置上看到某个路标点 yj,产生了一个观测数据 zk,j。
xk——当前位置
yj——某个路标点
vk,j——噪声
如果采集到多个路标,可能有多个观测方程!!
假设小萝卜在平面中运动,那么它的位姿(位置和姿态)由两个位置和一个转交转角来描述,即
不过,并不是所有的传感器都直接能测量出位移和角度变化,所以也存在着其他形式更加复杂的运动方程,那时我们可能需要进行动力学分析。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。