1.简介

  本文的主要目的是简单介绍移动机器人领域中广泛应用的技术SLAM(同步定位与地图绘制)的理论基础以及应用细节。虽然目前存在很多关于SLAM技术的方方面面的论文,但是对于一个新手来说,仍然需要花费大量的时间去调研与把握SLAM发展的脉络。本文希望能够将SLAM技术在保持一些理论基础的前提下,能够按照一种简单易懂的方式呈现出现了。在阅读完本文后,读者应该可以在一个移动机器人上实现最简单使用的SLAM技术。
 
  SLAM可以通过多种方法实现,首先其可以在多种不同的硬件上实现。其次,SLAM更像是一个概念而不是一个算法。SLAM技术包含了许多步骤,其中的每一个步骤均可以使用不同的算法实现。在这里,我们对其中的每一步介绍一种最为常见的方法,至于其他的方法仅作一个简介。
 
  本文的目的是一种非常简单实用的方式将SLAM技术呈现出来,如果读者有一定SLAM技术的技术,可以看出这里提供了一种基于EKF(扩展卡尔曼滤波)的完整的解决方案。需要注意的是,SLAM技术仍然是目前机器人领域的研究热点之一,仍然有许多问题需要深入研究。
 
2.关于SLAM
 
  SLAM是同步定位与地图构建(Simultaneous Localization And Mapping)的缩写。SLAM主要用于解决移动机器人在未知环境中运行时定位导航与地图构建的问题。
  SLAM通常包括如下几个部分,特征提取,数据关联,状态估计,状态更新以及特征更新等。对于其中每个部分,均存在多种方法。针对每个部分,我们将详细解释其中一种方法。在实际使用过程中,读者可以使用其他的方法代替本文中说明的方法。这里,我们以室内环境中运行的移动机器人为例进行说明,读者可以将本文提出的方法应用于其他的环境以及机器人中。
  SLAM既可以用于2D运动领域,也可以应用于3D运动领域。这里,我们将仅讨论2D领域内的运动。
 
3.硬件
 
3.1 机器人
  从0开始搭建机器人平台将会是一个耗时的过程,也是没有必要的。我们可以选择一些市场上成熟的机器人开发平台进行我们的开发。这里,我们以一个非常简单的自己开发的机器人开发平台讨论,读者可以选择自己的机器人开发平台。
3.2 测距单元
  目前比较常见的测距单元包括激光测距、超声波测距以及图像测距三种。其中,激光测距是最为常用的方式。通常激光测距单元比较精确、高效并且其输出不需要太多的处理。其缺点在于价格一般比较昂贵(目前已经有一些价格比较便宜的激光测距单元)。激光测距单元的另外一个问题是其穿过玻璃平面的问题。另外激光测距单元不能够应用于水下测量。
  另外一个常用的测距方式是超声波测距。超生波测距以及声波测距等以及在过去得到十分广泛的应用。相对于激光测距单元,其价格比较便宜;但其测量精度较低。激光测距单元的发射角仅0.25°,因而,激光基本上可以看作直线;相对而言,超声波的发射角达到了30°,因而,其测量精度较差。但在水下,由于其穿透力较强,因而,是最为常用的测距方式。最为常用的超声波测距单元是Polaroid超声波发生器。
第三种常用的测距方式是通过视觉进行测距。传统上来说,通过视觉进行测距需要大量的计算,并且测量结果容易随着光线变化而发生变化。如果机器人运行在光线较暗的房间内,那么视觉测距方法基本上不能使用。但最近几年,已经存在一些解决上述问题的方法。一般而言,视觉测距一般使用双目视觉或者三目视觉方法进行测距。使用视觉方法进行测距,机器人可以更好的像人类一样进行思考。另外,通过视觉方法可以获得相对于激光测距和超声波测距更多的信息。但更过的信息也就意味着更高的处理代价,但随着算法的进步和计算能力的提高,上述信息处理的问题正在慢慢得到解决。
  这里,我们使用激光测距方法进行距离测量。其可以很容易实现较高的测量精度并且很容易应用于SLAM中。
 
4.SLAM一般过程
  SLAM通常包含几个过程,这些过程的最终目的是更新机器人的位置估计信息。由于通过机器人运动估计得到的机器人位置信息通常具有较大的误差,因而,我们不能单纯的依靠机器人运动估计机器人位置信息。在使用机器人运动方程得到机器人位置估计后,我们可以使用测距单元得到的周围环境信息更正机器人的位置。上述更正过程一般通过提取环境特征,然后在机器人运动后重新观测特征的位置实现。SLAM的核心是EKF。EKF用于结合上述信息估计机器人准确位置。上述选取的特征一般称作地标。EKF将持续不断的对上述机器人位置和周围环境中地标位置进行估计。
  
  当机器人运动时,其位置将会发生变化。此时,根据机器人位置传感器的观测,提取得到观测信息中的特征点,然后机器人通过EKF将目前观测到特征点的位置、机器人运动距离、机器人运动前观测到特征点的位置相互结合,对机器人当前位置和当前环境信息进行估计。
 
5.激光雷达数据
  SLAM的第一步需要通过测距单元获取机器人周围环境的信息。这里,我们以激光测距单元为例。以一个常见的激光测距单元为例,其测量范围可到360°,水平分辨率为0.25°,即激光束的角度为0.25°。其输出如下:
 
  2.98,2.99,3.00,3.01,3.02,3.49,3.50,...,2.20,8.17,2.21
 
  激光测距单元的输出表示机器人距最近障碍物的距离。如果由于某些原因,激光测距单元无法测量某个特定角度上的安全范围,那么其将返回一个最大值,这里以8.1为例,测距单元返回数据超过8.1即意味着激光测距单元在该角度上发生测量错误。需要注意的是,激光测距单元可以以很高的频率对周围环境进行测量,其可以实现10-100Hz的全周扫描。
 
6.机器人自身运动模型
 
  SLAM的另外一个很重要的数据来源是机器人通过自身运动估计得到的自身位置信息。机器人自身位置数据通过对机器人轮胎运行圈数的估计可以得到机器人自身位置的一个估计,其可以被看作EKF的初始估计数据。
 
  另外一个需要注意的是需要保证机器人自身位置数据与测距单元数据的同步性。为了保证其同步性,一般采用插值的方法对数据进行前处理。由于机器人的运动规律是连续的,因而,一般对机器人自身位置数据进行插值。相对而言,由于测距单元数据的不连续性,因而其插值基本上是不可以实现的。
 
7.地标
 
地标是环境中易于观测和区分的特征。一般使用这些特征确定机器人位置。我们可以通过下面的方法想象上述工作过程,假设在一个陌生的房间内,闭上眼睛,那么此时我们如何确定自身的位置呢?通常而言,我们将在环境中不断走动,通过触摸物体或者墙壁确定自身位置。上述如被触摸的物体以及墙壁等都可以被看做用于估计自身位置的地标。下面是一些典型的地标。
 
可以看出,通常而言,对于不同的环境,一般我们选择不同的地标。
 
一般而言,地标需要满足下面的条件:
 
  1. 地标应该可以从不同的位置和角度观察得到;
 
  2. 地标应该是独一无二的,从而可以很容易的将底边从其他物体中分辨出来
 
  3. 地标不应该过少,从而导致机器人需要花费额外的代价寻找地标;
 
  4. 地标应该是静止的,因而,我们最好不要使用一个人作为地标
 
8.特征提取
 
  根据上述确定完需要提取的特征后,我们接下来需要从测距单元获得的信息中准确的提取出我们需要的特征。特征提取的方法有很多种,其主要取决于需要提取特征以及测距单元的类型。
 
  这里,我们将以如何从激光雷达得到的信息提取有效特征为例进行说明。这里,我们使用两种典型的特征提取方法,Spike方法和RANSAC方法。
 
8.1 Spike
  
  Spike方法使用极值寻找特征。通过寻找测距单元返回数据中相邻数据差距超过一定范围的点作为特征点。通过这种方法,当测距单元发射的光束从墙壁上反射回来时,测距单元返回的数值为某些值;而当发射光束碰到其他物体并反射回来时,此时测距单元将返回另外一些数值;两者将具有较大的差别。
  Spike方法也可以通过下面的步骤实现,对于相邻的三个点A,B,C,分别计算(A-B)与(C-B),然后将两者相加,如果结果超过一定范围,则表示提取到一个特征。
    采用Spike方法提取环境特征,需要保证相邻两个激光束照射的物体距离机器人距离之间具有较大的变化,因而,其并不能够适用于光滑环境中的特征提取。
 
8.2 RANSAC
  RANSAC(随机采样方法)也可以被用于从激光测距单元返回数据中提取系统特征。其中测距单元返回数据中的直线将被提取为路标。在室内环境中,由于广泛存在墙壁等,因而,在测距单元返回的数据中将存在大量的直线。
 
  RANSAC首先采用随机采样的方法提取测距单元返回数据中的一部分,然后采用最小二乘逼近方法来对上述数据进行拟合。进行数据拟合后,RANSAC方法将会检查测距单元数据在拟合曲线周围的分布情况。如果分布情况满足我们的标准,那么我们就认为机器人看到了一条直线。
 
  在使用EKF估计机器人位置和环境地图时,EKF需要将地标按照距离机器人当前的位置和方位表示出来。
前面我们提到了特征提取的两种不同的方法,Spike方法和RANSAC方法,两者均可以用于室内环境中特征的提出。相比较而言,Spike方法较为简单,并且对室内环境中的活动物体不具有鲁棒性。RANSAC方法通过提取直线的方法提取环境中的特征,相对较为复杂,但对室内活动的物体具有更好的适应性。
 
9.数据关联
 
  数据关联是将不同时刻位置传感器提取到的地标信息进行关联的过程,也成为重观察过程。
 
  举例来说,对于我们人类来说,假设我们在一个房间内看到了一把椅子,现在我们离开房间,过一段时间后,再次回到房间,如果我们再次看到了椅子,那么我们可以认为这把椅子很有可能就是我们之前看到的椅子。但是,如果我们假设房价内有两把完全一样的椅子,重复上述过程,当我们再次来到房间后,我们可能无法区分我们看到的两把椅子。但我们可以猜测,此时比如说左边的椅子仍然是之前看到的左边的椅子,而右边的椅子仍然是之前看到的右边的椅子。
 
  在实际应用中进行数据关联时,我们可能遇到下面的问题:
 
  1. 我们可能上一次看到了某个地标,但下一次却没有看到;
 
  2.我们可能这次看到了地标,但之后却再也看不到这个地标;
 
  3.我们可能错误的将现在看到的某个地标与之前看到的某个地标进行关联;
 
  根据我们选择路标时的标准,我们可以很容易的排除上面第1和第2个问题。但对于第三个问题,如果发生了,将会对我们的导航以及地图绘制造成严重的问题。
 
  现在我们将讨论解决上面第三个问题的方法。假设我们现在已经到了每时每刻采集处理得到的路标的方位信息,并将其其中的特征存储在一数据库中。数据库初始阶段是空的,首先我们建立的第一条规则是,除非该特征已经出现了N次,否则我们并不将其加入数据库。当得到一副新的传感器信息后,我们进行下面的计算:
 
  1.得到一副新的传感器信息后,首先利用上面的特征提取方法提取特征;
 
  2.将提取到的特征与数据库中已经出现N次的并且距离最近的特征关联起来;
 
  3.通过验证环节验证上面的关联过程是正确的,如果验证通过,则表明我们再次看到了某个物体,因而其出现次数+1,否则表明我们看到了一个新的特征,在数据库中新建一个特征,并将其记作1.
 
  上述特征关联方法被称作距离最近方法。上面最简单的计算距离的方法是欧式距离的计算,其他距离计算包括马氏距离等,虽然效果更好,但计算结果更为复杂。
 
  验证环节通过利用EKF执行过程中,观测误差的有界性进行判断。因而,我们可以通过判断一个路标是否在现存路标的误差允许范围内来判断其是否为新的路标。路标区域可以通过图形绘制或者定义一个椭圆误差。