一.SLAM介绍

即使定位和建图问题(simultaneous localization and mapping),一般简称为SLAM, 也称作(Concurrent Mapping and Localization, CML)。当机器人没有环境地图或者不清楚自身的位置时就会产生SLAM问题。机器人所具有的信息就只有历次测量值z1:tz_{1:t}z1:t​和控制量u1:tu_{1:t}u1:t​。 在SLAM问题中,机器人构建地图的同时确定自生相对于地图的位置。SLAM问题远比我们目前讨论过的问题困难的多。SLAM 问题比到目前为止讨论过的机器人领域的所有其他问题都要难解决得多。该问题比定位问题更困难,是因为地图是未知的,并且不得不沿着路径估计该地图。该问题也比给定位姿构建地图要困难,因为位姿是未知的,并且不得不沿路径估计姿态。

从概率学的角度来看,SLAM问题有两种主要的形式,它们具有同等重要的地位。其一称为在线SLAM问题online SLAM problem,它估计的是瞬时位姿以及地图的后验概率:
p(xt,m∣z1:t,u1:t)(1.1)p(x_t, m | z_{1:t}, u_{1:t}) \tag{1.1}p(xt​,m∣z1:t​,u1:t​)(1.1)
其中xtx_txt​是时刻t的位姿,m则是地图,而z1:tz_{1:t}z1:t​和u1:tu_{1:t}u1:t​分别是历次测量值和控制量。因为只包含了时刻t 的变最估计问题,该问题被称为在线SLAM 问题。在线SLAM 问题的许多算法是增量的。在这些算法中,过去的测量值和控制量一旦被处理即被丢弃。

第二种SLAM问题成为完全SLAM问题full SLAM problem。在完全SLAM中,我们尝试计算整个路径x1:tx_{1:t}x1:t​以及地图的后验概率,而不仅仅是当前的位置xtx_txt​,如图10.2所示。 p(x1:t,m∣z1:t,u1:t)(1.2)p(x_{1:t}, m | z_{1:t}, u_{1:t})\tag{1.2}p(x1:t​,m∣z1:t​,u1:t​)(1.2) 在线和完全SLAM问题之间的细微差异在于,他们使用了不同类型的算法。特别的,在线SLAM问题是对完全SLAM问题的历史位姿的积分 p(xt,m∣z1:t,u1:t)=∫∫⋯∫p(x1:t,m∣z1:t,u1:t)dx1dx2⋯dxt−1(1.3)p(x_t, m | z_{1:t}, u_{1:t}) \\ = \int \int \cdots \int p(x_{1:t}, m | z_{1:t}, u_{1:t}) dx_1 dx_2 \cdots dx_{t-1}\tag{1.3}p(xt​,m∣z1:t​,u1:t​)=∫∫⋯∫p(x1:t​,m∣z1:t​,u1:t​)dx1​dx2​⋯dxt−1​(1.3)


上图为在线SLAM 问题的图示模型(在线SLAM 的目标是估计机器人当前位姿和地图的后验)

上图为全SLAM 问题的图示模型(计算关千整个机器人路径和地图的联合后验)

SLAM 问题的第二个关键特点,与估计问题的本质有关。SLAM 问题拥有连
续和离散的要素。连续的估计问题涉及地图中物体的定位和机器人自身位姿变量。在基于特征的表示方式中,物体可能是地标,或者是由测距传感器探测到的某些部分。离散特性与一致性有关:当物体被检测到时, SLAM 算法推理该物体与之前被检测到的物体之间的联系。该推理过程是离散的:该物体要么与之前探测到的物体是同一个,要么不是。

有时,明确一致性变量是非常有用的,在线SLAM 后验由下式给定:
p(xt,m,ct∣z1:t,u1:t)(1.4)p(x_t, m, c_t | z_{1:t}, u_{1:t})\tag{1.4}p(xt​,m,ct​∣z1:t​,u1:t​)(1.4)

全SLAM 后验由下式给定:
p(x1:t,m,c1:t∣z1:t,u1:t)(1.5)p(x_{1:t}, m, c_{1:t} | z_{1:t}, u_{1:t})\tag{1.5}p(x1:t​,m,c1:t​∣z1:t​,u1:t​)(1.5)

在线后验由全后验对过去机器人位姿积分和对所有过去一致性求和得到:
p(xt,m,ct∣z1:t,u1:t)=∫∫⋯∫∑c1∑c2⋯∑ct−1p(x1:t,m,c1:t∣z1:t,u1:t)dx1dx2⋯dxt−1(1.6)p(x_t, m, c_t | z_{1:t}, u_{1:t}) \\= \int \int \cdots \int \sum_{c_1} \sum_{c_2} \cdots \sum_{c_{t-1}} p(x_{1:t}, m, c_{1:t} | z_{1:t}, u_{1:t}) dx_1 dx_2 \cdots dx_{t-1} \tag{1.6}p(xt​,m,ct​∣z1:t​,u1:t​)=∫∫⋯∫c1​∑​c2​∑​⋯ct−1​∑​p(x1:t​,m,c1:t​∣z1:t​,u1:t​)dx1​dx2​⋯dxt−1​(1.6)

在两个SLAM 问题版本(即在线SLAM 和全SLAM) 中,估计全后验的
式(1. 4) 或式(1. 5) 是SLAM 问题的黄金定律。全后验捕捉所有关千地图
和位姿或路径的已知内容。
在实际应用中,计算全后验常是不可实现的。其原因有两个:①连续参数空
间的高维数;②离散一致性变量的数量巨大。许多先进的SLAM 算法用数以万计或更多的特征来构建地图。即使在已知一致性的情况下,只是这些地图的后验就包含了10510^5105甚至更多维的概率分布。这与定位问题形成了鲜明的对比,定位问题的后验是在三维连续空间上的估计。而且,在多数应用中,一致性是未知的。一致性变量c1:tc_{1:t}c1:t​的可能分配的数量随时间呈指数增长。因此,可用的能处理一致性问题的SLAM 算法必须依赖近似。

二.SLAM的性质

  • 形式
    该特征与它的两种形式有关。在线SLAM问题与地图一起计算当前姿势的后验,而完整SLAM问题与地图一起计算整个路径的后验。

  • 性质
    SLAM问题的第二个关键特征与其性质有关。SLAM问题通常具有连续和离散的元素。

    • 连续
      让我们从SLAM问题的连续部分开始。
      在SLAM期间,机器人会不断收集测距信息以估算机器人的姿势,并不断感应环境以估算物体或地标的位置。因此,机器人的姿势和物体位置都是SLAM问题的连续方面。

    • 离散
      现在,转到SLAM问题的第二部分。
      正如之前提到的,机器人不断地感知环境以估计对象的位置,这样做时,SLAM算法必须识别在任何新检测到的对象与先前检测到的对象之间是否存在关系。这有助于机器人了解它之前是否曾经在同一位置。在每个时刻,机器人都必须回答以下问题:“我以前来过这里吗?”。这个问题的答案是二进制-是或否-这就是使对象之间的关系成为SLAM问题的离散组成部分的原因,即对应关系已知对象之间的这种离散关系。

SLAM挑战

在SLAM下,计算由机器人姿态,地图和对应关系组成的整个后验对机器人技术提出了很大的挑战,这主要是由于连续和离散的部分。

连续
由机器人姿势和对象位置组成的连续参数空间是高维的。在绘制环境并进行自身定位时,机器人会遇到许多物体,并且必须跟踪其中的每个物体。因此,变量的数量将随时间增加,这使问题具有高度的维度,并且难以计算后验。

离散
接下来,离散参数空间由对应值组成,并且由于大量的对应变量而具有很高的维数。不仅如此,由于机器人将继续感测环境并将新检测到的对象与先前检测到的对象相关联,因此对应值随时间呈指数增长。即使假设已知的对应值,在地图上的后验也仍然是高维的。

因此,SLAM算法在估计后验时必须依赖于近似,以节省计算内存。

三、FastSLAM

1.FastSLAM简介

FastSLAM算法解决了全部问题SLAM已知对应。

  • 估计轨迹: FastSLAM使用粒子过滤器方法估计轨迹的后验。这将为SLAM提供一个优势,以解决已知姿势的映射问题。
  • 估计地图: FastSLAM使用低维扩展卡尔曼滤波器来求解使用局部高斯模型建模的地图的独立特征。

用Rao-Blackwellized粒子过滤器方法已知用粒子过滤器和高斯表示后验的惯用方法。

我们已经看到,FastSLAM算法可以解决具有已知对应关系的完整SLAM问题。由于FastSLAM使用粒子滤波器方法来解决SLAM问题,因此一些机器人专家认为它是一种能够解决Full SLAM和Online SLAM问题的强大算法。

FastSLAM估计完整的机器人路径,因此可以解决Full SLAM问题。
另一方面,FastSLAM中的每个粒子都估计瞬时姿势,因此FastSLAM也解决了在线SLAM问题。

现在,存在FastSLAM算法的三个不同实例。

  • FastSLAM 1.0
    FastSLAM 1.0算法既简单又易于实现,但是由于粒子滤波器会导致样本效率低下,因此该算法效率不高。

  • FastSLAM 2.0
    FastSLAM 2.0算法通过施加不同的分布来克服FastSLAM 1.0的效率低下问题,这导致了较少的粒子数量。请记住,FastSLAM 1.0和2.0算法都使用低维扩展卡尔曼滤波器来估计地图特征上的后验。

  • 基于网格的FastSLAM
    FastSLAM的第三个实例实际上是对FastSLAM的扩展,称为基于网格的FastSLAM算法,该算法使FastSLAM适应于网格图。在本课程中,您将学习基于网格的FastSLAM。

2.基于网格的FastSLAM技术

为了使FastSLAM适应网格映射,我们需要三种不同的技术:

  1. Sampling Motion- p(xt∣xt−1[k],ut)p(x_{t} | x_{t-1}^{[k]} , u_{t})p(xt​∣xt−1[k]​,ut​):给定第k个粒子的先前姿态,并根据当前控制uuu估算当前姿态。
  2. Map Estimation- p(mt∣zt,xt[k],mt−1[k])p(m_{t} | z_{t}, x_{t}^{[k]} , m_{t-1}^{[k]})p(mt​∣zt​,xt[k]​,mt−1[k]​):根据当前测量值,当前第k个粒子姿态和先前的第k个粒子图估计当前图
  3. 重要性权重- p(zt∣xt[k],m[k])p(z_{t} | x_{t}^{[k]} , m^{[k]})p(zt​∣xt[k]​,m[k]):根据当前第k个粒子姿态和当前第k个粒子图,估计当前测量的可能性。

基于网格的FastSLAM算法

3.gmapping ROS包

gmapping提供基于激光的SLAM。这意味着可以向其节点提供机器人激光测量值和里程计值,并期望它提供环境的2D占用栅格图。当机器人移动并使用其激光测距仪传感器收集感官信息时,地图将更新。

该软件包包含用于OpenSlam Gmapping的ROS包装器。gmapping软件包提供了基于激光的SLAM(同时定位和映射),作为称为slam_gmapping的ROS节点。使用slam_gmapping,可以根据激光和移动机器人收集的数据来创建二维占用栅格图(如建筑物平面图)。

更多参考此处。

创建catkin_ws

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ cd ..
$ catkin_make

执行系统更新/升级

$ apt-get update
$ apt-get upgrade -y

报错:

W: GPG error: http://packages.ros.org trusty InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY F42ED6FBAB17C654

解决办法:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <PUBKEY>

这里的<PUBKEY>就是丢失的public key。例如F42ED6FB17C654。

在src中应用turtlebot_gazebo和turtlebot_teleop

$ cd src/
$ git clone https://github.com/turtlebot/turtlebot_simulator
$ git clone https://github.com/turtlebot/turtlebot

安装软件包依赖项

$ cd ..
$ source devel/setup.bash
$ rosdep -i install turtlebot_gazebo
$ rosdep -i install turtlebot_teleop

编译软件包

$ catkin_make
$ source devel/setup.bash

在Willow Garage环境中部署Turltebot

$ roslaunch turtlebot_gazebo turtlebot_world.launch world_file:=worlds/willowgarage.world

现在,将gmapping包与机器人对接以执行SLAM。

解决办法:

$ cd ~/
$ hg clone https://bitbucket.org/osrf/gazebo_models

下载完成后讲gazebo_models复制到~/.gazebo文件夹中,重命名为models

Terminal 1
在Willow环境中启动Turtlebot

$ cd ~/catkin_ws
$ source devel/setup.bash
$ roslaunch turtlebot_gazebo turtlebot_world.launch world_file:=worlds/willowgarage.world

Turtlebot should now appear in a Willow Garage environment.

Terminal 2
运行 keyboard teleop node

$ cd ~/catkin_ws
$ source devel/setup.bash
$ roslaunch turtlebot_teleop keyboard_teleop.launch

Don’t move your robot yet!

Terminal 3
运行 slam_gmapping node

$ cd ~/catkin_ws
$ source devel/setup.bash
$ rosrun gmapping slam_gmapping

Terminal 4
运行rviz并订阅不同的已发布主题以可视化地图

$ rosrun rviz rviz

如下编辑rviz配置:

将固定框架更改为map
保持参考系为默认
添加机器人模型
添加相机并选择/camera/rgb/image_raw主题
添加地图并选择/map主题

Terminal 5

$ cd /home/workspace/
$ rosrun map_server map_saver -f myMap

运行map_server将生成map.pgm和map.yaml文件:

但是我发现我的rviz一直无法获得地图。猜测可能是tf信息转换有问题,我使用了他给的整合包无法解决这个问题。

整合包在此处。

Udacity机器人软件工程师课程笔记(三十五) - SLAM - 基于网格的FastSLAM相关推荐

  1. Udacity机器人软件工程师课程笔记(十五)-运动学-正向运动学和反向运动学(其二)-DH参数等

    正向运动学和反向运动学 目录 2D中的旋转矩阵 sympy包 旋转的合成 旋转矩阵中的欧拉角 平移 齐次变换及其逆变换 齐次变换的合成 Denavit-Hartenberg 参数 DH参数分配算法 正 ...

  2. Udacity机器人软件工程师课程笔记(十六)-机械臂仿真控制实例(其一)-Gazebo、RViz和Moveit!

    机械臂仿真控制实例 目录 环境设置 项目工具介绍 Gazebo (1)Gazebo组件 (2)Gazebo界面 统一机器人描述格式(URDF) RViz Moveit! 1.环境设置 对于此项目,使用 ...

  3. Udacity机器人软件工程师课程笔记(十)-ROS-Catkin-包(package)和gazebo

    包和gazebo仿真 1.添加包 (1)克隆simple_arm包 克隆现有的包并将其添加到我们新创建的工作区. 首先导航到src目录,然后从其github仓库克隆本课程 simple_arm 的包. ...

  4. Udacity机器人软件工程师课程笔记(十九) - 3D感知介绍 - 主动/被动式传感器、RGB-D相机、点云

    3D感知介绍 目录 传感器 RGB-D相机 点云 1.传感器 主动式传感器是指向目标发射电磁波,然后收集从目标反射回来的电磁波信息的传感器,如合成孔径雷达等. 被动式传感器指只能收集地而目标反时来自太 ...

  5. Udacity机器人软件工程师课程笔记(十八)-机械臂仿真控制实例(其三)-KR210机械臂反向运动学

    机械臂仿真控制实例(其二)-KR210正向运动学 目录 反向运动学概述 为Kuka KR210创建IK解算器 1.反向运动学概述 KR210的最后三个关节是满足三个相邻的关节轴线在单点处相交的旋转关节 ...

  6. Udacity机器人软件工程师课程笔记(十四)-运动学-正向运动学和反向运动学(其一)

    正向运动学和反向运动学 目录 2D中的旋转矩阵 sympy包 旋转的合成 旋转矩阵中的欧拉角 平移 齐次变换及其逆变换 齐次变换的合成 Denavit-Hartenberg 参数 DH参数分配算法 正 ...

  7. Udacity机器人软件工程师课程笔记(十二)-ROS-编写更复杂的ROS节点(arm_mover节点 和 look_away 节点)

    更复杂的ROS节点 1. Arm_mover节点 为了打好更好的基础,这是在Arm_mover节点还需要学习的内容 自定义消息生成 服务 参数 启动文件 为了理解上述内容,我们将编写另一个名为arm_ ...

  8. Udacity机器人软件工程师课程笔记(五)-样本搜索和找回-基于漫游者号模拟器-自主驾驶

    9.自主驾驶 在接下来的环节中,我们要实现漫游者号的自动驾驶功能. 完成这个功能我们需要四个程序,第一个为感知程序,其对摄像头输入的图片进行变换处理和坐标变换使用.第二个程序为决策程序,功能是帮助漫游 ...

  9. Udacity机器人软件工程师课程笔记(七)-ROS介绍和Turtlesim包的使用

    Robotics Software engineer笔记 1.ROS简介与虚拟机配置 (1)ROS简介 ROS是一款机器人软件框架,即机器人操作系统(Robot Operating System). ...

最新文章

  1. java 反序列化工具 marshalsec改造 加入dubbo-hessian2 exploit
  2. uos安装方法_UOS(最美操作系统)安装与使用体验
  3. 浅谈Android事件分发机制
  4. 在CentOS下为sqlplus和rman 添加rlwrap
  5. bootstrap table中文文档_用Python完成一件小事:自动生成文档报告
  6. NLog 2.0.0.2000 使用实例
  7. 【数据结构和算法笔记】用c语言实现栈
  8. 进入保护模式(八)简单OS内存使用分布
  9. 中国姓氏大全(常见508个,罕见740个)
  10. 一个故事讲完 CPU 的工作原理
  11. 深度学习之torch(一)MINIST手写字符分类
  12. php ip138获取,php通过调用ip138数据库获取IP及网络类型
  13. phyton计算每天进步的力量
  14. HttpClient 4.2.3 (GA) 这些名字里面都有GA,GA代表什么意思啊?
  15. php启动后no input file specified.,no input file specified 三种解决方法
  16. 6 月直播 7 场全剧透。今天:飞腾CPU调优原理及方法 | 第 19 期
  17. Yocto开发讲解系列 - 总目录
  18. 1162开放英语4 (2)
  19. blender绑定骨骼法 2 rig
  20. 深入浅出,详解深度优先搜索(DFS)

热门文章

  1. 2018考研英语:10篇必背的真题文章
  2. 递归函数 集合 列表 元组
  3. MySQL主主配置说明
  4. Go 学习笔记(44)— Go 标准库之 os(获取文件状态、获取/修改文件权限、创建、删除目录和文件、获取进程ID、设置获取环境变量)
  5. js字母大小写字母转换
  6. 20150726 填坑日记
  7. shell--数组的定义/访问/赋值/遍历
  8. [转]后期-快速消除痘痘,完美修复MM肌肤
  9. mariadb转mysql_MariaDB/MySQL备份和恢复(二):数据导入、导出
  10. matlab pup,matlab利用bar函数画不同颜色直方图