5,SLAM的处理过程

SLAM过程包括许多步骤,该过程的目标是使用环境更新机器人的位置。由于机器人的里程计通常是存在误差的,我们不能直接依赖于里程计。我们可以用激光扫描环境来校正机器人的位置,这是通过从环境中提取特征并不断观察机器人移动来实现的。EKF(扩展卡尔曼滤波器)是SLAM过程的核心。EKF负责基于环境特征对机器人位置进行更新,这些环境特征通常被称为LANDMARK,以下我们统称为地标,关于地标,将在接下来的几章中与EKF一起解释。EKF对机器人位置的不确定性以及在环境中所见的地标的不确定性进行了跟踪。

下图给出了SLAM过程的概要。(1、激光传感器对环境特征(地标)进行提取->数据融合给EKF算法;)

当里程计发生变化时,由于机器人的移动的有一个不确定的误差,因此新的机器人位置将基于里程计的更新数据经过EKF处理进行更新。地标将从机器人所处的新的环境中被提取出来,然后机器人试图将这些地标与之前看到的地标联系起来。重新观察的地标被用来更新机器人在EKF中的位置。以前未见过的地标被添加到EKF中作为新的观测依据,以便以后可以重新观测。所有这些步骤将在接下来的章节中以非常实用的方式解释我们的ER1机器人是如何实现的。需要注意的是,在这些步骤中的任何时刻EKF都将对机器人当前的位置进行估计。

下面的图表将试图更详细地解释这个过程:机器人由三角形表示。星星代表地标。机器人最初用传感器测量地标的位置(用闪电表示的传感器测量)。

图2

-------------------------------------------------------------------------------------------

机器人根据编码器等算出来的里程计数据,认为他自己在如下图3的位置

图3

--------------------------------------------------------------------------------------

同步地,机器人再次使用激光传感器测量地标,算出机器人在图4的位置,但发现这个位置与机器人计步法认为它们应该在的位置不匹配。因此,机器人并不在它根据编码器里程计测算出的图3的位置。

图4

-----------------------------------------------------------------------------------------------------------------------------

由于相比计步法里程计位置,机器人更相信激光传感器,所以现在它利用地标所获得的信息来确定自己的位置点线三角形(机器人最初认为自己的位置由虚线三角形表示)。

图5

-------------------------------------------------------------------------------------------------------------------------------------------

事实上,机器人却在这图6实线三角形。激光传感器也并不完美,因此可以确切的说,机器人无法精确地知道它在哪里。然而,这个激光的传感器估计比仅仅依靠编码器计步法要好。点线三角形表示机器人通过激光传感器认为的位置;这个虚线三角形是计步法里程计告认为的位置;然而EKF算法却不相信他们任何一个是精确地位置,于是他算出了最后一个实线三角形的位置。

图6

6,激光数据
        SLAM过程的第一步是获取机器人周围环境的数据。当我们选择使用激光扫描仪时,我们就可以得到激光数据。我们使用的SICK激光扫描仪可以输出一个角度100°或180°测量范围。垂直分辨率为0.25°、0.5°或1.0°,意味着激光测量的区域宽度是0.25°,宽0.5°或1.0°。典型的激光扫描仪输出如下:
2.98,2.99,3.00,2.98,2.99,3.49,3.50,....,2.20,8.17,2.21
激光扫描仪的输出以米表示从右到左的范围。
如果由于某种原因,激光扫描仪不能测出特定角度的确切长度,它将返回一个高值,我们使用8.1作为阈值来判断该值是否为错误的。但是一些激光扫描仪可以配置超过8.1米的测量范围,这里只需要配置为8.1m。最后需要注意的是激光扫描仪数据输出非常快,使用串行端口可以达到11HZ的频率。
与激光扫描仪接口的代码见附录B:SICK LMS200 interface code.
7,里程计数据
        SLAM的一个重要方面是里程计数据。里程计数据的目的是提供一个机器人的大致位置,通过机器人车轮的运动来测量,作为在扩展卡尔曼滤波器中机器人可能在哪里的初步猜测。使用内置的telnet服务器很容易从ER1机器人获得里程数数据。您可以将一个文本字符串发送到特定端口上的telnet服务器,服务器将返回应答。
计步测程数据和激光数据的难点在于正确的获得时间,就是控制两数据同步获取和数据融合。如果以后检索里程计数据,那么某个时刻的激光数据将会过时失效。为了确保它们同时有效,我们可以推断数据。由于运动控制是已知的,所以最容易推断里程计数据。很难预测激光扫描仪的测量结果。如果可以控制返回测量值的时间,那么同时请求激光扫描仪值和测程数据就比较容易了。与ER1接口的代码附录C: ER1 interface code.

8,环境特征(地标)
地标是那些很容易被重新观察并区别于环境的特征形状。就是这些地标被机器人用来分析它在哪里(定位自己)。
类比一下,你的眼睛被蒙起来行走,就能想象这个机器人是如何工作的。如果你被蒙着眼睛在你熟悉的房子里移动,你可能会伸出手触摸物体或拥抱墙壁,这样你就不会迷路了。诸如触摸门框这样的特征事物的感觉可以帮助你估计你在哪里。声呐和激光扫描仪就是的机器人的触觉。
以下是来自不同环境的良好的地标:

图7自由女神像是一个很好的地标,因为它是独一无二的,可以很容易地从不同的环境或地点看到,如陆地、海洋和空气。

图8码头上的木柱可能是水下航行器的地标。
正如你所看到的,机器人所使用的地标类型往往取决于机器人所处的环境。
地标应该被可重新探测,例如从不同的位置,从不同的角度都能够被探测出。地标应该足够独特,这样就可以从一个时间帧到另一个时间帧被很容易地探测而不会混淆。换句话说,如果你在稍后的时间重新观察两个地标,你应该很容易就能确定哪个是我们之前见过的那个地标。如果两个地标前后探测起来非常相近,这就比较尴尬了。
一个机器人在环境中给定识别的地标应该足够多,否则没有足够的可见地标的话,机器人可能不得不花更长时间,这样机器人可能会迷路。
如果你决定某物是一个地标它应该是静止的。使用一个人作为地标是一个坏主意。这个标准的原因很简单。如果这个地标并不总是在同一个地方,那么机器人怎么知道这个地标在哪里呢?
怎么利用它来定位呢,关于合适的地标,重点特点如下:
•地标很容易被重新探测。
•不同的地标应该相互区别。
•环境中的地标应该很丰富。
•地标应该是特定固定静止的。

图9在我们的机器人使用的室内环境中,有许多直线和清晰的角。这些都可以用作地标。

7.特征提取

根据上述步骤6确定完需要提取的特征后,我们接下来需要从测距单元获得的信息中准确的提取出我们需要的特征。特征提取的方法有很多种,其主要取决于需要提取特征以及测距单元的类型。

这里,我们将以如何从激光雷达得到的信息提取有效特征为例进行说明。这里,我们使用两种典型的特征提取方法,Spike方法和RANSAC方法。

Spike方法使用极值寻找特征。通过寻找测距单元返回数据中相邻数据差距超过一定范围的点作为特征点。通过这种方法,当测距单元发射的光束从墙壁上反射回来时,测距单元返回的数值为某些值;而当发射光束碰到其他物体并反射回来时,此时测距单元将返回另外一些数值;两者将具有较大的差别。如下图所示:

图中红点为根据Spike方法提取到的特征。

Spike方法也可以通过下面的步骤实现,对于相邻的三个点A,B,C,分别计算(A-B)与(C-B),然后将两者相加,如果结果超过一定范围,则表示提取到一个特征。

采用Spike方法提取环境特征,需要保证相邻两个激光束照射的物体距离机器人距离之间具有较大的变化,因而,其并不能够适用于光滑环境中的特征提取。

RANSAC(随机采样方法)也可以被用于从激光测距单元返回数据中提取系统特征。其中测距单元返回数据中的直线将被提取为路标。在室内环境中,由于广泛存在墙壁等,因而,在测距单元返回的数据中将存在大量的直线。

RANSAC首先采用随机采样的方法提取测距单元返回数据中的一部分,然后采用最小二乘逼近方法来对上述数据进行拟合。进行数据拟合后,RANSAC方法将会检查测距单元数据在拟合曲线周围的分布情况。如果分布情况满足我们的标准,那么我们就认为机器人看到了一条直线。

在使用EKF估计机器人位置和环境地图时,EKF需要将地标按照距离机器人当前的位置和方位表示出来。我们可以很容易的使用三角几何的方法将提取到的直线转变为固定的特征点,如下图所示:

SLAM FOR DUMMIES 第5-8章 中文翻译的更多相关文章

  1. 《Django By Example》第九章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag 注:哈哈哈,第九章终于来啦 ...

  2. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  3. 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...

  4. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  5. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...

  6. 《Django By Example》第五章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:大家好,我是新来的翻译, ...

  7. 《Django By Example》第六章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:无他,祝大家年会都中奖!) 第六章 ...

  8. 《Django By Example》第七章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:咳咳,第七章终于来了.其 ...

  9. 《Django By Example》第十一章 中文 翻译 (个人学习,渣翻)

    第十一章 缓存内容 (译者 @ucag 注:这是倒数第二章,最后一个项目即将完成. @夜夜月 将会接过翻译的最后一棒.这本书的翻译即将完成.这也是我翻译的最后一章,作为英语专业的学生,我对于翻译有了更 ...

随机推荐

  1. 怎么解决MathType希腊字母无法显示的问题

    MathType是一种常见的数学公式编辑软件,有些用户在编辑论文公式的时候发现,一些希腊字母在公式编辑器中无法打出来,上面显示一个“叉”号,面对这种MathType希腊字母无法显示的问题该如何解决呢? ...

  2. mysqldump如何针对某些数据库进行备份?针对某个数据库进行备份?

    需求描述: 通过mysqldump工具对mysql服务器中的某几个数据库进行备份. 或者就对其中的一个数据库进行备份. 操作过程: 1.通过--databases参数后面加上数据库的名字进行备份 [m ...

  3. Python图像处理库PIL的ImageSequence模块介绍

    ImageSequence模块包括了一个wrapper类,它能够让用户迭代訪问图形序列中每一帧图像. 一.ImageSequence模块的函数 1.  Iterator 定义:ImageSequenc ...

  4. (转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信

    此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目com ...

  5. MySQL<添加、更新与删除数据>

    添加.更新与删除数据 添加数据 为表中所有字段添加数据 INSERT INTO 表名(字段名1,字段名2,……) VALUES(值1,值2,……); insert into 表名 values(值1, ...

  6. Java精选笔记_面向对象(多态、异常)

    多态 概述 可以理解为事物存在的多种体现形态.同样的引用调用同样的方法却做了不同的事情 多态的本质是:一个程序中同名的不同方法. 多态的体现 父类的引用指向子类的对象,父类的引用接收子类的对象. 多态 ...

  7. PHP-003

    PHP函数大全(转) usleep() 函数延迟代码执行若干微秒.unpack() 函数从二进制字符串对数据进行解包.uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID.time_sl ...

  8. Linux 虚拟终端:screen

    screen 是一个虚拟终端,我们可以把执行时间很长的命令放在虚拟终端中执行,即使终端断开,这个虚拟终端也会在后台执行 [root@localhost ~]$ yum install -y scree ...

  9. lua和C++交互的lua栈操作——以LuaTinker为例

    一. -- C++类注册函数(LuaTinker) 的lua栈操作: -- lua栈内容(执行到pop语句) 栈地址 <--执行语句 space_name[name] = t1 -- (2b8) ...

  10. GIT+ Coding使用方法

    1 进入码市 :https://coding.net    注册一个账户 2 创建一个项目: 3 本地window环境.安装git : https://git-scm.com/download/win ...