程序员

人人都能懂点VSLAM技术

2020-07-18  本文已影响0人  编程异思坊

写在前面

SLAM (Simultaneous Localization And Mapping,同步定位与地图构建),主要为了解决移动机器人在未知环境运行时定位导航与地图构建的问题。

事实上,SLAM 并不是某一种特定的算法,而是一个概念。SLAM 涉及多种研究方向,每个方向里面才涉及到多种算法。SLAM 基于应用层面可分为激光 SLAM 和 Visual SLAM(简称 VSLAM),这篇文章所提及的就是 VSLAM,一种基于视觉的同步定位与地图构建

碰巧最近在测试一款基于 VSLAM 的扫地机器人,所以查阅了一些资料。当然,这里不涉及具体的算法,真实情况是没能力讲解。里面涉及的算法对于我这个弱弱的本科生并不友好,所以只能根据资料提及一些概念性的东西。

VSLAM 框架

VSLAM 几乎都用一个基本的框架 ,这种 VSLAM 框架主要分为五个模块:传感器数据读取前端后端建图和回环检测。大致流程如下图所示:

vslam 框架

VSLAM 之传感器数据

传感器除了惯性测量单元(Inertial measurement unit,简称IMU)之外,最重要的部件就是摄像头了。VSLAM 涉及到的摄像头主要有三种:单目摄像头双目摄像头RGB-D(深度图像)

单目摄像头

单目摄像头拍摄的图像是二维的,无法得到深度信息(距离),所以我们无法通过单张图像计算场景中的物体与我们之间的距离。这确实是个难题,没有距离信息就无法定位和构建地图。

然而办法总比困难多。有人就想到一个好的解决方法。可以通过移动摄像头来改变摄像头的视角,根据“近处的物体移动快,远处的物体移动慢”这一原理,从而得知物体的远近,但这仍然是相对值,这种三维结构是不准确的,或者说是大概的。

虽然在获取深度信息上单目摄像头没什么优势,但在扫地机器人上装设单目摄像头却十分常见。常见的扫地机器人的摄像头是对准天花板的,这样环境比较固定且简单,有利于提取特征点。

有了摄像头后,能够很好的解决扫地机器人打滑无法定位的问题。

以往的扫地机器人获取定位信息只能信赖轮子,当扫地机器人打滑时轮子依然在转,然而机器并不知道自己已经打滑,在它看来还在正常走。

增加摄像头后,可以将图像信息与轮子信息结合起来判断。当轮子打滑时,扫地机器人知道轮子在正常走,但是通过图像知道机器并没有往前走,它会优先信赖图像上的信息,这样一来定位还是准确的。

下图是一款基于 VSLAM 的扫地机器人。

扫地机器人

双目摄像头

双目摄像头由两个单目摄像头组成(两个摄像头之间的距离叫“基线”是已知的),通过所获得的两幅图像融合,直接计算出物体深度值,克服单目摄像头无法知道距离的缺点。具有成本低,能耗小,精度高等优势,所以被广泛的应用于 VSLAM 系统中。

虽然双目摄像头优势明显,但也存在一些缺陷。例如配置与标定较复杂,并且视差的计算非常消耗计算机资源。

下图是一个双目摄像头。


双目摄像头

RGB-D(深度图像)

深度图像 = 普通的 RGB 三通道彩色图像 + Depth Map

RGB-D 相机是新兴的视觉传感器,它可以同时获取周围环境的 RGB 图像和每个像素的深度(Depth)信息,相比于单目或双目利用算法计算空间点的三维坐标,RGB-D 相机获取空间点的 3D 信息更加直接,深度信息通过红外结构光或 TOF 原理测得,和激光雷达有些类似,被称为伪激光雷达。


RGB-D 相机

VSLAM 之前端

又称为视觉里程计(visual odometry,简称VO)。那什么是里程计呢?例如,我们在汽车轮胎上安装计数码盘,就可以得到轮胎转动的距离,从而得到汽车的估计。或者,也可以测量汽车的速度、加速度,通过时间积分来计算它的位移。完成这种运动估计的装置(包括硬件和算法)叫做里程计(Odometry)。

如果一个里程计主要依靠视觉传感器,比如单目、双目相机,我们就叫它视觉里程计。视觉里程计最主要的问题是如何从几个相邻图像中,估计相机的运动。相邻图像间的相似性,为我们估计相机运动提供了依据。

视觉里程计

通过把相邻帧的运动轨迹串起来,就构成了相机载体(如机器人)的运动轨迹,解决了定位的问题。然后根据估算的每个时刻相机的位置,计算出各像素的空间点的位置,就得到了地图。

视觉里程计只计算相邻帧的运动,进行局部估计,这会不可避免的出现累积漂移,这是因为每次估计两个图像间的运动时都有一定的误差,经过相邻帧多次传递,前面的误差会逐渐累积,轨迹漂移(drift)的越来越厉害。

解决轨迹漂移的方法有两个:后端优化、回环检测。

VSLAM 之后端

VSLAM 的后端工作主要是对视觉前端得到的不够准确的相机位姿和重建地图进行优化微调。在视觉前端中,不管是进行位姿估计还是建图,都是利用相邻帧之间的关系来完成的,这种依赖局部约束且不停地链式进行的算法,必将导致优化误差逐帧累积,最终产生一个较大的误差漂移。

因此,后端优化的思路就是从全局(整个相机运动过程)中选取一些关键帧,利用这些关键帧之间的关系建立起时间和空间跨度更大的、需要同时满足的全局约束,以优化之前得到的不够准确的各帧的相机位姿。

同时在现实中,再精确的传感器也带有一定的噪声。有的传感器还会受磁场、温度的影响。

所以,除了优化“如何从图像估计出相机运动”之外,我们还要关心这个估计带有多大的噪声,这些噪声是如何从上一时刻传递到下一时刻的,而我们又对当前的估计有多大的自信。后端优化要考虑的问题,就是如何从这些带有噪声的数据中估计整个系统的状态,以及这个状态估计的不确定性有多大。

VSLAM 之回环检测

回环检测,又称闭环检测,是指机器人识别曾到达某场景,使得地图闭环的能力。说的简单点,就是机器人在左转一下,右转一下建图的时候能意识到某个地方是“我”曾经来过的,然后把此刻生成的地图与刚刚生成的地图做匹配。


回环检测成功

回环检测之所以能成为一个难点,是因为:如果回环检测成功,可以显著地减小累积误差,帮助机器人更精准、快速的进行避障导航工作。而错误的检测结果可能使地图变得很糟糕。因此,回环检测在大面积、大场景地图构建上是非常有必要的 。


回环检测失败

VSLAM 之建图

这里介绍 SLAM 的几种建图类型,没找到非常契合这篇文章的 VSLAM 建图资料凑合看吧。。。

SLAM根据不同的传感器类型和应用需求建立不同的地图。常见的有 2D 栅格地图2D 拓扑地图3D 点云地图等。

比如前面提到过的扫地机器人,它只需要知道房屋内部的简单二维地图就可以了,不需要知道房屋到底有多高。它只需要知道哪里可以通过,哪里是障碍物,而不需要知道这个障碍物到底是什么,长什么样子。

因此目前大部分具有 SLAM 功能的扫地机器人几乎都是采用廉价的消费级激光雷达方案。当然目前市面上还是有 VSLAM 的扫地机器人的身影相对来说比较少。

2D 栅格地图

2D 拓扑地图更强调地图元素之间的连通关系,而对精确的位置要求不高,去掉了大量地图的细节,是一种非常紧凑的地图表达方式。如下所示:

2D 拓扑地图

3D 点云地图在 VSLAM 中用的比较多,主要用于真实场景的视觉重建,重建的地图非常直观漂亮。但是点云地图会占据非常大的存储空间。

3D 点云地图

总结

看完这篇文章后,我们对 VSLAM 应该有了一个基本的认知。起码再次看到这个词的时候,我们知道它是什么和用来干什么了。

目前来说,VSLAM 已经受到越来越多人的关注,尤其是扫地机器人领域。因为 VSLAM 应用于扫地机器人上面相对简单和成熟。起码我已经测试过一款基于 VSLAN 的扫地机器人,总体表现得很稳定,算是一款成熟的产品了。多关注 SLAM 这种新兴技术,没准你就是风口上的那头猪呢?

上一篇下一篇

猜你喜欢

热点阅读