初识视觉SLAM:用相机解决定位和建图问题

引言:视觉SLAM 是指用相机解决定位和建图问题。本文以一个小机器人为例形象地介绍了视觉SLAM的功能及特色。
本文选自《视觉SLAM十四讲:从理论到实践》。算法

  SLAM 是Simultaneous Localization and Mapping 的缩写,中文译做“同时定位与地图构建”。它是指搭载特定传感器的主体,在没有环境先验信息的状况下,于运动过程当中创建环境的模型,同时估计本身的运动。若是这里的传感器主要为相机,那就称为“视觉SLAM”。微信

  假设咱们组装了一台叫做“小萝卜”的机器人,大概的样子如所示。
           图片描述
        小萝卜设计图。左边:正视图;右边:侧视图。设备有相机、轮子、笔记本,手是装饰品。
  
  虽然有点像“安卓”,但它并非靠安卓系统来计算的。咱们把一台笔记本塞进了它的后备箱内(方便咱们随时拿出来调试程序)。它能作点什么呢?
  咱们但愿小萝卜具备自主运动能力。虽然世界上也有放在桌面像摆件同样的机器人,可以和人说话或播放音乐,不过一台平板电脑彻底能够胜任这些事情。做为机器人,咱们但愿小萝卜可以在房间里自由移动。无论咱们在哪里招呼一声,它都会滴溜溜地走过来。
  要移动首先得有轮子和电机,因此咱们在小萝卜的下方安装了轮子(足式机器人步态很复杂,咱们暂时不考虑)。有了轮子,机器人就可以四处行动了,但不加控制的话,小萝卜不知道行动的目标,就只能四处乱走,更糟糕的状况下会撞上墙形成损毁。为了不这种状况的发生,咱们在它的脑壳上安装了一个相机。安装相机的主要动机,是考虑到这样一个机器人和人类很是类似——从画面上一眼就能看出。有眼睛、大脑和四肢的人类,可以在任意环境里轻松自在地行走、探索,咱们(天真地)以为机器人也可以完成这件事。为了使小萝卜可以探索一个房间,它至少须要知道两件事:app

  • 我在什么地方?——定位。框架

  • 周围环境是什么样?——建图。ide

“定位”和“建图”,能够当作感知的“内外之分”。做为一个“内外兼修”的小萝卜,一方面要明白自身的状态(即位置),另外一方面也要了解外在的环境(即地图)。固然,解决这两个问题的方法很是多。比方说,咱们能够在房间地板上铺设导引线,在墙壁上贴识别二维码,在桌子上放置无线电定位设备。若是在室外,还能够在小萝卜脑壳上安装定位设备(像手机或汽车同样)。有了这些东西以后,定位问题是否已经解决了呢?咱们不妨把这些传感器(见)分为两类。
  一类传感器是携带于机器人本体上的,例如机器人的轮式编码器、相机、激光传感器,等等。另外一类是安装于环境中的,例如前面讲的导轨、二维码标志,等等。安装于环境中的传感设备,一般可以直接测量到机器人的位置信息,简单有效地解决定位问题。然而,因为它们必须在环境中设置,在必定程度上限制了机器人的使用范围。比方说,有些地方没有GPS信号,有些地方没法铺设导轨,这时该怎么作定位呢?
         【图2】
  一些传感器。(a)利用二维码进行定位的加强现实软件;(b)GPS定位装置;(c)铺设导轨的小车;(d)激光雷达;(e)IMU单元;(f)双目相机。
  
  咱们看到,这类传感器约束了外部环境。只有在这些约束知足时,基于它们的定位方案才能工做。反之,当约束没法知足时,咱们就无法进行定位了。因此说,虽然这类传感器简单可靠,但它们没法提供一个广泛的、通用的解决方案。相对地,那些携带于机器人本体上的传感器,好比激光传感器、相机、轮式编码器、惯性测量单元(Inertial Measurement Unit,IMU)等,它们测到的一般都是一些间接的物理量而不是直接的位置数据。例如,轮式编码器会测到轮子转动的角度,IMU测量运动的角速度和加速度,相机和激光传感器则读取外部环境的某种观测数据。咱们只能经过一些间接的手段,从这些数据推算本身的位置。虽然这听上去是一种迂回战术,但更明显的好处是,它没有对环境提出任何要求,从而使得这种定位方案可适用于未知环境。
  回顾前面讨论过的SLAM定义,咱们在SLAM中很是强调未知环境。在理论上,咱们无法限制小萝卜的使用环境,这意味着咱们无法假设像GPS这些外部传感器都能顺利工做。所以,使用携带式的传感器来完成SLAM是咱们重点关心的问题。特别地,当谈论视觉SLAM时,咱们主要是指如何用相机解决定位和建图问题。
  视觉SLAM是本书的主题,因此咱们尤为关心小萝卜的眼睛可以作些什么事。SLAM中使用的相机与咱们平时见到的单反摄像头并非同一个东西。它每每更加简单,不携带昂贵的镜头,而是以必定速率拍摄周围的环境,造成一个连续的视频流。普通的摄像头能以每秒钟30张图片的速度采集图像,高速相机则更快一些。按照工做方式的不一样,相机能够分为单目相机(Monocular)、双目相机(Stereo)和深度相机(RGB-D)三大类,如所示。直观看来,单目相机只有一个摄像头,双目有两个,而RGB-D原理较复杂,除了可以采集到彩×××片以外,还能读出每一个像素与相机之间的距离。深度相机一般携带多个摄像头,工做原理和普通相机不尽相同,在第5讲会详细介绍其工做原理,此处读者只需有一个直观概念便可。此外,SLAM中还有全景相机、Event相机等特殊或新兴的种类。虽然偶尔能看到它们在SLAM中的应用,不过到目前为止尚未成为主流。从样子上看,小萝卜使用的彷佛是双目相机。
             【图3】
                   形形×××的相机:单目、双目和深度相机。
                   
  咱们来分别看一看各类相机用来作SLAM时有什么特色。ui

单目相机

  只使用一个摄像头进行SLAM的作法称为单目SLAM(Monocular SLAM)。这种传感器结构特别简单,成本特别低,因此单目SLAM很是受研究者关注。你确定见过单目相机的数据:照片。是的,做为一张照片,它有什么特色呢?
  照片本质上是拍照时的场景(Scene)在相机的成像平面上留下的一个投影。它以二维的形式反映了三维的世界。显然,这个过程丢掉了场景的一个维度,也就是所谓的深度(或距离)。在单目相机中,咱们没法经过单张图片来计算场景中物体与咱们之间的距离(远近)。以后咱们会看到,这个距离将是SLAM中很是关键的信息。因为咱们人类见过大量的图像,造成了一种天生的直觉,对大部分场景都有一个直观的距离感(空间感),它能够帮助咱们判断图像中物体的远近关系。好比说,咱们可以辨认出图像中的物体,而且知道其大体的大小;好比,近处的物体会挡住远处的物体,而太阳、月亮等天体通常在很远的地方;再如,物体受光照后会留下影子,等等。这些信息均可以帮助咱们判断物体的远近,但也存在一些状况会使这种距离感失效,这时咱们就没法判断物体的远近及其真实大小了。 所示就是这样一个例子。在这张图像中,咱们没法仅经过它来判断后面那些小人是真实的人,仍是小型模型。除非咱们转换视角,观察场景的三维结构。换言之,在单张图像里,你没法肯定一个物体的真实大小。它多是一个很大但很远的物体,也多是一个很近但很小的物体。因为近大远小的缘由,它们可能在图像中变成一样大小的样子。
              【图4】
               单目视觉中的尴尬:不知道深度时,手掌上的人是真人仍是模型?
  
  因为单目相机拍摄的图像只是三维空间的二维投影,因此,若是真想恢复三维结构,必须改变相机的视角。在单目SLAM中也是一样的原理。咱们必须移动相机,才能估计它的运动(Motion),同时估计场景中物体的远近和大小,不妨称之为结构(Structure)。那么,怎么估计这些运动和结构呢?从生活经验中咱们知道,若是相机往右移动,那么图像里的东西就会往左边移动——这就给咱们推测运动带来了信息。另外一方面,咱们还知道:近处的物体移动快,远处的物体则运动缓慢。因而,当相机移动时,这些物体在图像上的运动就造成了视差。经过视差,咱们就能定量地判断哪些物体离得远,哪些物体离得近。
  然而,即便咱们知道了物体远近,它们仍然只是一个相对的值。好比咱们在看电影时,虽然可以知道电影场景中哪些物体比另外一些大,但没法肯定电影里那些物体的“真实尺度”:那些大楼是真实的高楼大厦,仍是放在桌上的模型?而摧毁大厦的是真实怪兽,仍是穿着特摄服装的演员?直观地说,若是把相机的运动和场景大小同时放大两倍,单目相机所看到的像是同样的。一样地,把这个大小乘以任意倍数,咱们都将看到同样的景象。这说明,单目SLAM估计的轨迹和地图将与真实的轨迹和地图相差一个因子,也就是所谓的尺度(Scale)。因为单目SLAM没法仅凭图像肯定这个真实尺度,因此又称为尺度不肯定性。
平移以后才能计算深度,以及没法肯定真实尺度,这两件事情给单目SLAM的应用形成了很大的麻烦。其根本缘由是经过单张图像没法肯定深度。因此,为了获得这个深度,人们开始使用双目和深度相机。编码

双目相机和深度相机

  使用双目相机和深度相机的目的,在于经过某种手段测量物体与咱们之间的距离,克服单目相机没法知道距离的缺点。一旦知道了距离,场景的三维结构就能够经过单个图像恢复出来,也就消除了尺度不肯定性。尽管都是为了测量距离,但双目相机与深度相机测量深度的原理是不同的。双目相机由两个单目相机组成,但这两个相机之间的距离﹝称为基线(Baseline)﹞是已知的。咱们经过这个基线来估计每一个像素的空间位置——这和人眼很是类似。咱们人类能够经过左右眼图像的差别判断物体的远近,在计算机上也是一样的道理(见)。若是对双目相机进行拓展,也能够搭建多目相机,不过本质上并无什么不一样。
【图5】
      双目相机的数据:左眼图像,右眼图像。经过左右眼的差别,可以判断场景中物体与相机之间的距离。
      
  计算机上的双目相机须要大量的计算才能(不太可靠地)估计每个像素点的深度,相比于人类真是很是笨拙。双目相机测量到的深度范围与基线相关。基线距离越大,可以测量到的就越远,因此无人车上搭载的双目一般会是个很大的家伙。双目相机的距离估计是比较左右眼的图像得到的,并不依赖其余传感设备,因此它既能够应用在室内,亦可应用于室外。双目或多目相机的缺点是配置与标定均较为复杂,其深度量程和精度受双目的基线与分辨率所限,并且视差的计算很是消耗计算资源,须要使用GPU和FPGA设备加速后,才能实时输出整张图像的距离信息。所以在现有的条件下,计算量是双目的主要问题之一。
  深度相机(又称RGB-D相机,在本书中主要使用RGB-D这个名称)是2010年左右开始兴起的一种相机,它最大的特色是能够经过红外结构光或Time-of-Flight(ToF)原理,像激光传感器那样,经过主动向物体发射光并接收返回的光,测出物体与相机之间的距离。这部分并不像双目相机那样经过软件计算来解决,而是经过物理的测量手段,因此相比于双目相机可节省大量的计算(见)。目前经常使用的RGB-D相机包括Kinect/Kinect V二、Xtion Pro Live、RealSense等。不过,如今多数RGB-D相机还存在测量范围窄、噪声大、视野小、易受日光干扰、没法测量透射材质等诸多问题,在SLAM方面,主要用于室内,室外则较难应用。
            【图6】
           RGB-D数据:深度相机能够直接测量物体的图像和距离,从而恢复三维结构。
           
  咱们讨论了几种常见的相机,相信经过以上的说明,你已经对它们有了直观的了解。如今,想象相机在场景中运动的过程,咱们将获得一系列连续变化的图像(你能够用手机录个小视频试试)。视觉SLAM的目标,是经过这样的一些图像,进行定位和地图构建。这件事情并无咱们想象的那么简单。它不是某种算法,只要咱们输入数据,就能够往外不断地输出定位和地图信息了。SLAM须要一个完善的算法框架,而通过研究者们长期的努力工做,现有这个框架已经定型了。关于框架咱们之后再聊~spa

  本文选自《视觉SLAM十四讲:从理论到实践》一书,点此连接可在博文视点官网查看此书。
                    图片描述
  想及时得到更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                       图片描述.net

此外,本周正在进行一项热门活动——《尽在双11》阿里专家问答!
《尽在双11》的做者乐田、仁重正经过开源问答来答复读者有关《尽在双11》这本书的疑问~
更多好问题,期待你来问!设计

相关文章
相关标签/搜索