机器人系统设计与制作:Python语言实现3.1 什么是机器人仿真

摘要

用ROS和Gazebo进行机器人仿真

在上一章中,我们了解了机器人的机械设计过程,并着手设计了机器人的2D和3D模型。在这一章中,将对我们设计的机器人进行模拟仿真。在进行仿真之前,要先来了解一下机器人仿真的作用,它存在的优缺点,以及各式各样的机器人仿真软件工具。

本章中我们还将讨论机器人的运动学和动力学参数,它会有助于您了解机器人的各项功能。在讨论了这些概念之后,将确定用于机器人仿真的软件平台。我们计划是在机器人操作系统(Robot Operating System,ROS)平台下,使用Gazebo这个模拟仿真软件工具。在熟悉了Gazebo和ROS这些基本概念之后,我们将在Gazebo仿真环境下实现机器人的运动学和动力学建模。最后,我们会将机器人置于一个模拟的酒店环境下,测试它在为顾客送递食物过程中的自主导航能力。


3.1 什么是机器人仿真


一般来说,机器人仿真就是对机器人进行虚拟建模,并用它来对真实物理世界的机器人建模过程进行仿真。通过模拟仿真,我们可以创建一个虚拟的机器人模型,并对其设计和代码编写过程进行测试。

对于仿真的定义,我们可以参考Robert E. Shannon和Prentice Hall的《系统仿真:科学与艺术》一书,书中是这样描述的:

它是一个真实系统模型的设计过程,是辅助系统模型进行实验的一种方法,这样能够有助于了解系统产生的行为,以及生成评价系统操作性能的各种策略。因此,仿真是模型设计中一个非常重要的步骤,它能够模拟真实系统对一系列事件发生的响应行为。

在我们所定义的仿真术语中,模型和系统是两个非常关键的部分。对于模型而言,我们指的是对一组对象或想法的表达,但并不是其实体本身。对于系统而言,我们指的是一组或是能够配合完成既定目标的相关元素的集合。

机器人仿真器具体来说就是那些能够对机器人进行建模的软件应用程序,它能够搭建出一个虚拟环境来模拟机器人的真实环境。在我们的示例中,机器人的周围环境是一个有桌子和椅子的典型酒店/餐厅。我们必须通过仿真器模拟出相同的场景,测试机器人在这个环境下的工作情况。

图3-1显示的是一种机器人仿真器Gazebo。图中有一个名为TurtleBot的机器人和一些随机的物体对象。你将在接下来的章节中学习到更多关于Gazebo和TurtleBot的相关知识。

 

图3-1 机器人仿真器Gazebo

我们之前了解了机器人构建的基本需求和它的机械设计部分。接下来就是要对它的设计过程进行仿真。根据设计方案的需求,开发人员可以进行代码测试,以及验证机器人机械设计部分的有效性。机器人的虚拟模型可以根据需要进行任意修改,而不会增加任何的额外成本。

机器人仿真的一个主要优势在于可以用较低的成本建立一个复杂机器人的虚拟原型样机,其表现出的行为与实际设计的机器人相类似,我们可以不断地对虚拟机器人进行测试,并根据测试结果不断改进,直到满足所有的性能要求。但机器人仿真的缺点在于仿真器不能模拟覆盖到真实物理世界中可能发生的所有场景。

仿真的优点在于:

在刚开始构建机器人的时候,能够降低成本。

可以在仿真机器人上测试代码。

可以在不增加成本的基础上修改机器人的设计。

可以对机器人上的任何一个部分进行测试。

如果是一个复杂的系统工程,可以对机器人进行分阶段地仿真和测试。

一个完整的仿真过程能够对机器人是否满足性能要求做出判定。

几乎所有的仿真软件都能适用于许多不同的程序设计语言。

仿真的缺点在于:

真实世界中的参数变化要远比虚拟世界中多得多,在仿真建模的时候,我们不可能考虑到所有的参数变化。

所有的仿真程序都是人为设定的,而不是随机的。

让我们来了解一下最新的机器人仿真应用软件:

Gazebo:这是一个多机器人仿真器,支持多传感器。软件可以兼容ROS系统。这是一个免费、开源的仿真器,广泛应用于机器人研究领域。Gazebo的官方网站:www.gazebosim.org。

V-REP:这是由Coppelia Robotics公司设计的最先进的工业机器人3D仿真器中的一款。这个软件支持多种编程语言,包括C/C++、Python、Java、Lua、Matlab和Urbi。这个仿真器支持内置算法开发,因此可以模拟很多工业自动化的场景。同时,很多工程师也将它作为教育培训中的一种开发平台。V-REP的官方网站:http://www.coppeliarobotics.com。

Webots:这是由Cyberbotics公司开发的一款3D仿真平台,主要用于工业机器人和服务机器人的模拟仿真。这款工具软件支持Windows、Linux和Apple操作系统,目前广泛应用于教育或其他科研机构中。此软件能够使用多种编程语言,包括C、C++、Python、Java、Matlab和Urbi,对所有机器人进行建模、编程和仿真。它还兼容外部函数库,如OpenCV(Open Source Computer Vision,开放源代码计算机视觉类库)等。

RoboLogix:这是有Logic Design公司开发的一款3D工业仿真软件平台。该平台可以用于模拟真实物理世界中五轴工业机器人的开发和应用。这样,机器人上安装的程序可以在一个很广泛的实际应用中进行开发和测试。平台支持许多各种不同的工业机器人,包括ABB、Fanuc和Kawasaki。

在进行模拟仿真之前,我们先要来学习一下机器人到底是如何工作的,它背后的数学模型又是什么呢?

3.1.1 机器人数学建模

移动机器人有一个非常重要的组成部分,就是它的转向系统。它将帮助机器人在环境中行走。我们将选用差动驱动模型来降低机器人的复杂性和成本,并减小尺寸。差动式驱动的机器人主要是由安装在同一个轴上的两个轮子组成的,每个轮子分别由单独的电机控制。差动式驱动系统或转向系统是一个非完整系统,即意味着在其姿态改变时会产生一定的运动约束。例如,小汽车就是一个非完整运动约束系统,在不改变姿态的前提下,它是无法改变其位置的。下面,让我们来看看机器人是如何工作的,以及如何对机器人进行数学建模。

3.1.1.1 机器人运动学和差动转向系统

机器人运动学研究的是在不考虑外力作用下机器人运动的数学模型。它主要是分析受控系统的几何关系。而机器人动力学则是研究机器人在运动状态下,对所有外力因素进行建模。

一个移动机器人或小车,它通过6个自由度(DOF)来表示它的姿态(x, y, z, 横滚,偏航,俯仰)。其中,它的位置可以用(x, y, z)来表示,它的姿态可以用(横滚角,俯仰角,偏航角)来表示。横滚角(roll)是绕着侧向旋转的,俯仰角(pitch)是绕着前后旋转的,而偏航角(yaw,也称为方向角或航向角)表示机器人在x-y平面的前进方向上的航向角。差动式驱动的机器人在x-y平面上移动,因此它的平面姿态主要由x、y和θ来表示,其中θ是机器人顶部的前进方向与x轴形成的夹角。以上这些信息已经足够用来描述一个差动机器人的位置和姿态了,如图3-2所示。

对差动式驱动机器人,可以通过调整左右两边的独立被控的电机的速度,对其运动进行控制。也就是说,可以分别调整V-left和V-right两个参数。图3-3显示了当前市场上流行的两款差动式驱动机器人。

差动式驱动机器人的正向运动学方程可用于解决以下问题:

如果机器人在t时刻的位置为(x, y, θ),那么在t+δt时刻机器人的姿态(x′, y′, θ′)由控制参数V-left和V-right来确定。

 

图3-3 iRobot、Roomba和Pioneer 3DX

这种方法可以用在机器人按照特定轨迹运动的情况。

3.1.1.2 正向运动学方程

我们先来看看正向运动学的一个示例方案。图3-4所示的是一个轮式机器人的例子。

根据之前所提到的内容可知,绕着y轴所产生的运动被称为横滚。其余的可视为侧滑。假设在不产生侧滑的情况下,轮子完整地转完一圈,相当于走了2πr的距离,其中r为轮子的半径。我们可以先假定运动是在二维平面上进行,这也就意味着这个平面必须是平坦无起伏的。

当机器人侧倾时,必须绕着左右轮同轴延长线上的一个点进行旋转。机器人旋转所围绕的这个点被称为瞬时曲率中心(Instantaneous Center of Curvature,ICC)。图3-5给出了差动式驱动机器人轮子的构造,并画出了瞬时曲率中心。

图3-4 机器人的一个轮子绕着本体y轴旋转 图3-5 差动式驱动机器人的轮子构造

机器人运动学方程推导的核心是机器人的角速度ω。每个轮子绕ICC旋转,轮子的半径为r。

轮子的速度为v = 2πr/T,其中,T是轮子绕ICC转一圈所花费的时间。角速度ω是由2π/T得到,单位为弧度(或角度)/每秒。结合方程v和w可得ω = 2π/T。

v = rω(1)

差动式驱动系统的详细模型,如图3-6所示。

 

图3-6 差动式驱动系统的详细模型

如果将之前的方程同时用在两个轮子上,其结果也是相同的,也就是说,ω可以表示为:

ω (R + l/2) = Vr(2)

ω (R - l/2) = Vl(3)

其中,R是从ICC到两轮轴距中点的距离,l是两轮之间的轴长。有了ω和R之后,我们可以得到以下结果:

R = l/2 (Vl + Vr)/(Vr - Vl)(4)

ω = (Vr - Vl)/l(5)

上面的方程是用于解决正向运动学问题的。假设机器人以角速度ω运动了δt秒,它当前的朝向,或者说是角度将变为:

θ′ = ωδt + θ(6)

其中,围绕ICC旋转的中心点的坐标,可以由基本的三角函数得到:

ICC = [ICCx, ICCy] = [x - R sinθ, y + R cosθ](7)

机器人绕着ICC转了ωδt度后的图形如图3-7所示。

 

图3-7 机器人绕着ICC转了ωδt度

给定了起始位置点(x, y),则新的位置点(x′, y′)可以由二维旋转矩阵计算得到。以角速度ω绕着ICC转了δt秒之后,在t+δt时刻的位置点可由下面的公式计算得到:

(8)

在给定ω、δt和R之后,新的位姿(x′, y′, θ′)可以由方程(6)和(8)计算得到。

ω可以从方程(5)计算得到,但Vr和Vl很难通过精确测量得到。每个轮子的转速不能直接测量得到,而是要通过轮速编码器这种传感器测量才能获得。从轮速编码器获得的数据其实就是机器人的里程计数值。这类传感器被安装在轮轴上,轮子每向前转动一步(每一步大概0.1mm)都会按顺序记录下一个二进制信号。将这些二进制信号输入到一个计数器,这样vδt就是从t时刻到t+δt时刻所走过的距离:

n×step = vδt

这样,我们就可以通过计算得到v:

v = n×step/δt(9)

如果把方程(9)代入方程(3)和(4),我们可以得到下面的结果:

R = l/2 (Vl + Vr)/(Vr - Vl) = l/2 (nl + nr)/(nr - nl)(10)

ωδt = (Vr - Vl) δt/l = (nr - nl)×step/l(11)

这里,nl和nr分别为左右轮的编码器计数结果。Vl和Vr分别为左右轮的速度。由此,机器人从当前点的位姿(x, y, θ),经过了δt时间之后,左右轮移动的总步数分别为nl和nr,得到新的点的位姿(x′, y′, θ′)为:

(12)

其中,

R = l/2 (nl + nr)/(nr - nl)(13)

ωδt = (nr - nl)×step/l(14)

ICC = [x - R sinθ, y + R cosθ](15)

以上推导出的运动学方程与机器人的机械设计和几何结构有很大关系。不同的设计方案导出的动力学方程也是不相同的。

3.1.1.3 逆向运动学

在给定轮速的情况下,正向运动学方程能够提供一个实时更新的位置和姿态。现在,我们可以来考虑一下逆向的问题。

t时刻机器人的位姿为(x, y, θ),在确定了控制参数V-left和V-right之后,在t+δt时刻的位姿为(x′, y′, θ′)。

在差动式驱动机器人的运动学问题上,因为不能通过简单设定轮子的速度,就让机器人移动到任意指定的位姿,所以这个问题一直没有一个比较好的解决方案。在非完整机器人的约束控制上这个问题可以解决,这种类型的机器人可以移动到任何指定的位置和

朝向。

在非完整机器人的约束控制中,如果可以给定一个差动序列(V-left, V-right),就可以采用一些方法来解决移动的约束性问题。我们将方程(12)代入方程(15),可以确定某些运动控制状态下的特殊情况:

如果V-right = V-left => nr = nl => R = ∞, ωδT = 0 =>:这意味着机器人是直线移动的,θ角不变。

如果V-right = -V-left => nr = - nl => R = 0, ωδt =2nl×step/l且ICC = [ICCx, ICCy] =

[x, y] => x′ = x, y′ = y, θ′ = θ + ωδt =>:这意味着机器人绕着ICC旋转,也就是说,在[x, y]不变的情况下,θ可以取任意值。

结合这些操作,采用下面的算法可以让机器人从初始位姿移动到任意目标位姿:

1.?调整机器人的朝向,直到机器人朝向与初始位置到目标位置的连线方向一致,V-right = -V-left = V-rot。

2.?沿着当前方向直行,直至目标位置,V-right = V-left = V-ahead。

3.?调整机器人的朝向,直至与目标方向一致,V-right = -V-left = V-rot。

其中,V-rot和V-ahead可以取值任意。

关于运动学方程的更多信息可参考:http://www8.cs.umu.se/~thomash/reports/Kinem-aticsEquationsForDifferentialDriveAndArticulatedSteeringUMINF-11.19.pdf。

让我们来看看机器人仿真所要用到的具体工具软件。了解了机器人的运动学,将帮助你更容易地构建机器人的仿真试验,它还有助于机器人软件的编写。我们将用到的仿真工具软件有:

机器人操作系统(Robot Operating System,ROS)

Gazebo

这些都是当前比较流行的机器人编程和仿真工具。现在,让我们先来简要了解一下ROS和Gazebo的定义和特性。紧接着,我们将会讨论如何使用这些工具进行机器人仿真。

3.1.2 ROS和Gazebo简介

ROS是一个编写机器人软件的平台框架。ROS的主要目标在于全球范围内机器人软件的复用。它是由一系列的工具、库和约定组成的,目的在于通过多样化的机器人平台去简化复杂的和鲁棒的机器人行为。

ROS的官方定义:

ROS是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象、底层设备控制、常用函数的实现、进程间消息传递和包管理。它还提供了用于获取、构建、编译和跨计算机运行代码所需的工具和库函数。ROS在某些方面与“机器人框架”相似,例如Player、YARP、Orocos、CARMEN、Orca、MOOS和Microsoft Robotics Studio。

关于ROS的更多信息,请参考:http://wiki.ros.org/ROS/Introduction。

ROS的主要特点有:

分布式框架:ROS是一个分布式的框架,可以同时在多台机器上运行,所以机器人的计算可以分开在不同的机器上进行。它可以减少机器人的在线处理程序。

代码复用:ROS主要的设计目标是提高代码的复用率。代码复用使得ROS能够在世界范围内形成一个良好的研究团队和开发社区。ROS下的可执行文件被称为节点。这些可执行文件能够组合成一个单独完整的实体,被称为ROS包。一组这样的包集合被称为堆,堆便于共享和分发。

语言独立性:ROS框架可以使用当前流行的编程语言(如Python、C++和Lisp)。节点可以用任何一种语言来编写,通过ROS这个框架节点之间可以做到无障碍交流。

测试简单:ROS有一个内置的单元/集成测试框架rostest,用于测试ROS功能包。

大规模:ROS适合大型的运行时系统和开发过程。

免费并且开源:ROS的源代码是开放的,并且是完全免费使用的。在BSD(Berkeley Software Distribution)协议许可下,ROS的核心部分是可以被复用的,包括用于商业领域和不开源的产品上。

接下来的部分主要讨论ROS的基本框架。

ROS系统架构

ROS系统架构主要分成三个层级:

ROS文件系统级

ROS计算图级

ROS社区级

ROS文件系统级

ROS的文件系统主要包括硬盘上ROS文件的组织形式。其中,我们必须要了解的有以下几个方面:

功能包(Package):ROS功能包是ROS软件框架的主要单元。一个ROS功能包可能包含可执行文件、ROS依赖库、配置文件等几个部分。ROS功能包可以复用和共享。

功能包清单(Package Manifest):清单文件(package.xml)列出了所有功能包的详细信息,包括名称、描述、许可信息和依赖关系。

消息(msg)类型:消息描述存储在一个功能包内的msg文件夹下。ROS消息是一组通过ROS进行数据发送的数据结构。消息的定义存储在扩展名为.msg格式的文件里。

服务(srv)类型:服务描述存储在srv文件夹下,文件的扩展名为.srv。该文件定义了ROS下服务请求和响应的数据结构。

ROS计算图级

ROS的计算图是ROS处理数据的一种点对点的网络形式。ROS计算图级中的基本概念包括节点、ROS控制器、参数服务器、消息和服务。

节点(Node):执行运算的进程。例如,机器人的一个节点发布了机器人里程计数据,另一个节点发布了激光扫描数据等。一个ROS节点的编写,需要ROS客户端库文件的支持(如roscpp和rospy)。我们会在创建示例节点的时候,介绍这个库文件。

ROS控制器(Master):提供计算图级上的名称注册和查找。如果没有运行这个控制器,节点将无法找到其他节点,也不能发布消息。

参数服务器(Parameter server):允许数据存储在系统的核心位置。

消息(Message):节点之间通过传递消息进行通信。每个消息都是有着简单固定格式的数据结构。它支持多种数据类型,如整型、浮点型、布尔类型等。

主题(Topic):节点之间通过ROS消息传输系统进行数据交换,我们称之为“主题”。主题是用来确定消息的内容的。对某一类数据感兴趣的一个节点将会订阅相对应的主题。一般来说,消息的发布者和订阅者并不知道对方的存在,这样做是为了将消息的发布和订阅解耦。从逻辑上讲,可以认为一个主题就是一条单独固定的消息数据总线。每条数据总线(主题)都有一个名称,任何一个节点都能连接到总线上进行消息的发送或接收,只要消息类型是正确的。

服务(Service):发布/订阅模型是一种非常灵活的通信模式,但这种多对多的交互方式无法在单向传输模式下同时进行请求/应答,它需要一种分布式的系统来完成。因此,请求/应答需要通过服务来进行,它定义了一对消息结构:一个用于请求,一个用于应答。当一个节点提供某个服务时,必须有一个名称和一个客户端,这个客户端是用来发送消息请求和等待消息应答的。ROS客户端库通常为程序员提供这种交互方式,类似于一种远程过程调用。

消息记录包(Bag):一种用于保存和回放ROS消息数据的文件格式。消息记录包是一种存储数据的重要机制,例如它能够获取并记录各种难以收集的传感器数据,而这些数据对于算法的开发和测试是非常必要的。

在ROS计算图级中ROS控制器提供命名服务。它为ROS节点存储主题和服务注册信息。节点之间通过控制器进行通信,发布它们的注册信息。由于这些节点都能与控制器进行通信,所以就可以根据需要与其他注册节点建立连接,并接收来其他节点的信息。当节点的注册信息发生变化时,控制器对这些节点还会产生回调服务,这样就可以允许动态创建新的节点连接并运行。

节点之间是直接连接的,控制器类似一个DNS服务器,只提供查找信息服务。节点之间通过订阅和发布同一个主题进行连接请求,并在建立连接之后共同遵守一个约定的连接协议。ROS中最常见的协议就是TCPROS,它用的是标准TCP/IP的套接字。

图3-8显示了在节点和控制器之间,主题和服务的工作流程。

ROS社区级

ROS社区级的概念主要是关于ROS资源的,它能够通过独立的网络社区分享软件和知识。这些资源包括:

发行版(Distributions):ROS发行版是一个可以独立安装、带有版本号的一系列功能包集。它像Linux发行版一样发挥类似的作用:它们更容易安装软件,而且能够通过一个软件集合来维持一致的版本。

软件源(Repositories):ROS依赖于共享开源代码与软件源的网站或主机服务,在这里不同的机构可以发布和分享各自的机器人软件组件。

ROS Wiki:用于记录ROS信息文档的主要论坛。任何人都可以注册自己的账户,并贡献自己的文档,提供修正、更新,编写教程等服务。

邮件列表(Mailing Lists):用户邮件列表ros-users是关于ROS更新的主要交流渠道。同时它也是一个论坛,用户可以在上面关于ROS软件使用中的遇到的问题进行提问。

在ROS的官方网站www.ros.org上,可以获得关于ROS更多的概念及相关信息。现在,我们来看看ROS的安装过程。

3.1.3 在Ubuntu 14.04.2下安装ROS Indigo

根据前面的讨论,我们了解到ROS是一个元操作系统,需要安装在一个主机系统上。ROS完全支持Ubuntu和Linux,但对于Windows和OS X还处于实验阶段。下面列出了一些最新的ROS发行版本。

发行版本 发布时间

ROS Indigo Igloo 2014.7.22

ROS Hydro Medusa 2013.9.4

ROS Groovy Galapagos 2012.12.31

 

下面,我们将要来看看在Ubuntu 14.04.2 LTS下安装最新版本ROS Indigo Igloo的过程。ROS Indigo Igloo主要针对的是Ubuntu 14.04 LTS。如果你是Windows或OS X用户,那么你可以先在虚拟机(VirtualBox)上安装Ubuntu,然后再安装ROS。VirtualBox的下载链接:https://www.virtualbox.org/wiki/Downloads。

安装说明如下:

1.?为了允许下载restricted、universe和multiverse,需要配置Ubuntu软件库。可以用Ubuntu中的Software & Update工具进行配置。我们可以在Ubuntu Unity查找菜单下进行简单搜索,勾选下列选项,如图3-9截图所示。

 

图3-9 Ubuntu软件和更新工具

2.?设置系统,从packages.ros.org中接收ROS功能包。ROS Indigo版本只能在Ubuntu 13.10和Ubuntu 14.04下安装。将packages.ros.org存储到Ubuntu apt库列表下,使用下面的命令:

 

3.?接下来,添加apt-keys。apt-key是用于管理密钥列表的,apt通过密钥对功能包进行认证。经过这些密钥认证过的功能包将被认为是可信的。使用下面的命令可以将apt-keys添加到ROS功能包:

 

4.?添加了apt-keys之后,必须更新Ubuntu功能包的索引。使用下面的命令添加并更新ROS包和Ubuntu包:

 

5.?更新了ROS包之后,我们就可以开始安装功能包了。使用下面的命令安装ROS必要的库和工具:

 

6.?在桌面安装完成之后,可能还需要安装一些附加的功能包。每个附加安装的功能包在书中后续适当的部分都会提到。桌面安装需要花费一些时间。在ROS安装完成之后,你已经完成了大部分工作。下一步就是要初始化rosdep,有了它可以很容易地安装ROS资源包的依赖项从而进行编译,并运行ROS的核心组件:

 

7.?为了在当前的bash shell下使用ROS工具和命令行,可以添加ROS环境变量到.bashrc文件中。这将会在每个bash会话开始的时候执行。使用下面的命令添加ROS环境变量到.bashrc文件:

 

下面的命令将在当前shell下执行.bashrc脚本,并在当前shell下产生变化:

 

8.?在安装过程中有一个非常有用的工具rosinstall,这个工具需要单独安装。它仅需要一个命令就可以帮助你很容易地下载到很多ROS包的资源树:

 

在安装完ROS之后,我们将讨论如何创建一个ROS的示例包。在创建一个功能包之前,我们先要建立一个ROS的工作区,然后在ROS工作区中创建功能包。我们将采用catkin来构建系统,即使用ROS下的一系列工具集合来创建功能包。catkin构建系统能够将源代码生成可执行文件或共享库。ROS Indigo使用catkin构建系统来创建功能包。下面,让我们先来看看catkin是什么。

什么是catkin

catkin是ROS的官方编译构建系统。在使用catkin之前,ROS用的是rosbuild系统构建功能包。在最新版本的ROS中,catkin代替了它。catkin结合了CMake宏命令和Python脚本来提供类似于CMake的通用工作流程。catkin提供了一个比rosbuild系统更好的包的分发功能,更好的交叉编译以及更好的可移植性。有关catkin更多信息可以参考wiki.ros.org/catkin。

catkin工作区是一个文件夹,可以进行修改、构建以及安装catkin包。

现在,我们来看一下如何创建一个ROS下的catkin工作区。

使用下面的命令创建一个名为catkin_ws的父目录和名为src的子文件夹:

 

使用下面的命令将目录切换到src文件夹。我们将在src文件夹中创建功能包:

 

使用下面的命令初始化catkin工作区:

 

在完成catkin工作区初始化之后,使用下面的命令能够很容易地构建功能包(即使在没有源文件的情况下):

 

catkin_make命令用于在src目录中构建功能包。在构建功能包之后,我们会在catkin_ws目录下看到一个build文件夹和一个devel文件夹。可执行文件被存储在build文件夹和devel文件夹中,同时有shell脚本文件添加到ROS环境下的工作区中。

创建ROS功能包

在本节中,我们将看到如何创建一个功能包,它包含两个Python节点。其中,一个节点用于发布一个Hello World消息主题,另一个节点订阅该主题。

使用catkin_create_pkg命令在ROS工作区创建一个catkin ROS功能包。

在创建工作区的过程中,需要新建src文件夹,并在该文件夹下创建功能包。在创建包之前,使用下面的命令先切换到src文件夹:

 

使用下面的命令创建一个hello_world包及std_msgs依赖项,这个依赖项包含标准的消息定义。ROS下Python客户端库是rospy:

 

在功能包成功创建后,会返回下面的信息:

 

在hello_world包被成功创建之后,需要添加两个Python节点或脚本,用于演示主题的订阅和发布。

首先,使用下面的命令在hello_world包中创建一个名为scripts的文件夹:

 

切换到scripts文件夹,并创建一个名为hello_world_publisher.py的脚本和一个hello_world_subscriber.py脚本,用于发布和订阅hello world消息。下面的章节将涉及这些脚本或是节点的代码和说明。

Hello_world_publisher.py

节点hello_world_publisher.py主要发布了一个欢迎信息hello world到主题hello_pub中,发布的频率为10Hz。

这段代码的分步解释如下:

1.?如果编写一个ROS Python的节点,则需要导入rospy。它包含Python的API,其与ROS的主题、服务等相互作用。

2.?为了发送hello world消息,需要从std_msgs包中导入一个String的数据类型。它对标准的数据类型有一个消息定义。使用下面的命令进行导入:

 

3.?下面的代码创建了一个对象发布到主题hello_pub上。数据类型是String,queue_size等于10。如果设置的订阅频率太慢来不及接收数据,可以调整queue_size选项:

 

4.?下面这行代码强制初始化了所有ROS Python节点。初始化的时候需要给每个节点分配一个名称。有了名称之后,节点才能启动。每个节点以名称为唯一标识,与其他节点进行通信。如果运行中两个节点有相同的节点名称,其中一个将会关闭。如果想要同时运行这两个节点,使用标记anonymous = True。

 

5.?下面这行代码创建一个速率对象r。在对象Rate中使用sleep()方法,可以设定更新循环的速率。这里,我们设定速率为10:

 

6.?下面这个循环将检查rospy能否构建标记rospy.is_shutdown()。执行这个循环,在键入Ctrl + C时,循环退出。

在循环内部,消息hello world会被打印在终端上,同时以10Hz的速率发布在主题hello_pub上:

 

7.?除了对Python常规检查__main__的之外,下面的代码还将捕获异常rospy.ROSInterruptException,当键入Ctrl + C或者是其他原因使得节点关闭时,通过rospy.sleep()方法和rospy.Rate.sleep()方法能将这个异常抛出。有了这个异常处理之后,就不会继续执行sleep()后面的代码了。

 

在发布主题之后,我们来看看如何订阅主题。接下来的部分介绍了订阅hello_pub主题的相关代码。

Hello_world_subcriber.py

订阅主题的代码如下:

 

下面的代码是当一个消息到达hello_pub主题后,执行一个回调函数。data这个变量包含了来自主题的消息,使用函数rospy.loginfo()可以将其打印出来:

 

下面将开始启动节点hello_world_subscriber,并订阅hello_pub主题。

1.?消息的数据类型为String,当消息到达这个主题后,执行一个名为callback的回调函数:

 

 

2.?直到节点被关闭,下面的代码才使节点退出:

 

3.?检查Python代码。主体部分是调用listener()方法,这个方法将订阅hello_pub主题:

 

4.?在保存了两个Python节点之后,需要使用chmod命令更改执行权限:

 

5.?在更改了文件权限之后,使用catkin_make命令构建功能包:

 

6.?添加当前ROS工作区路径到所有终端,这样就能够在这个工作区内访问ROS功能包:

 

下面是订阅和发布节点的输出:

1.?首先,需要运行roscore以启动节点。不同节点之间需要通过roscore命令或ROS控制器进行通信。所以,执行第一条命令:

 

2.?在执行了roscore之后,使用下面的命令运行每个节点。

3.?发布节点:

 

4.?订阅节点。这个节点订阅了hello_pub主题,如图3-10所示:

 

以上我们简要介绍了ROS的一些基本概念。下面,我们来看看什么是Gazebo,以及在ROS下如何使用Gazebo。

 

图3-10 订阅节点

什么是Gazebo

Gazebo是一个开源免费的机器人仿真器,可以用它来进行算法测试、机器人设计,以及真实场景下的回归测试。Gazebo可以准确有效地用于机器人群的仿真,模拟出复杂的室内和室外环境。Gazebo拥有强大的物理引擎、高质量的图形显示能力、实用的编程接口和图形界面。

Gazebo有以下这些特点:

动态仿真:使用Gazebo的一个物理引擎,可以进行机器人的动力学仿真,例如,Open Dynamics Engine (ODE) (http://opende.sourceforge.net/),Bullet (http://bulletphysics.org/wordpress/),Simbody (https://simtk.org/home/simbody/),DART(http://dartsim.github.io/)等。

先进的3D图形显示:Gazebo使用OGRE框架(http://www.ogre3d.org/),可以提供高质量的渲染、灯光、阴影、纹理效果。

传感器支持:Gazebo能够支持大部分的传感器,包括激光测距仪、Kinect型传感器、2D/3D相机等。在仿真时可以选择模拟噪声或没有噪音。

插件:可以为机器人、传感器以及环境控制,开发自定义的插件。插件可以访问Gazebo API。

机器人模型:Gazebo可以提供当前主流的机器人模型,例如PR2、Pioneer 2 DX、iRobot Create和TurtleBot。同时也可以自定义机器人模型。

TCP//IP传输:可以在远程计算机上运行仿真程序,通过Gazebo的一个界面接口运行基于套接字的消息传递服务。

云仿真:使用CloudSim框架在云服务器上运行仿真程序(http://cloudsim.io/)。

命令行工具:扩展的命令行工具用来检查和记录仿真过程。

Gazebo安装

Gazebo安装后可以作为ROS下的一个独立应用程序或集成应用程序使用。在本章中,我们将在ROS下使用Gazebo进行仿真,并在ROS框架下测试我们所编写的代码。

如果想尝试安装最新的Gazebo独立仿真器,可以按照http://gazebosim.org/download 上给出的步骤进行安装。

我们不需要分别单独安装Gazebo和ROS,因为Gazebo是内置于完整版的ROS桌面安装程序中的。

ROS功能包里已经集成了Gazebo程序包gazebo_ros_pkgs,就是在标准版Gazebo之外加了一个封装器。这个功能包为Gazebo环境下的机器人仿真提供了必要的接口,并通过使用ROS的消息服务实现。

使用下面的命令,可以完成ROS Indigo下Gazebo_ros_pkgs的完整安装:

 

在ROS下测试Gazebo

假定ROS的环境已配置完成,在开始使用Gazebo之前需要先运行roscore:

 

运行ROS下的Gazebo命令:

 

运行Gazebo实际上需要两个可执行文件,分别是Gazebo服务器和Gazebo客户端。Gazebo服务器将执行仿真过程,Gazebo客户端则运行Gazebo的GUI。运行上面的命令,将同时并行运行Gazebo的服务器和客户端。

GazeboGUI的屏幕截图如图3-11所示。

在运行Gazebo之后,将生成下列主题。使用rostopic命令,我们会发现以下主题列表:

 

图3-11 GazeboGUI界面

 

 

使用下面的命令,可以分别运行服务器和客户端。

运行Gazebo服务器:

 

运行Gazebo客户端:

 

我们已经在ROS下安装了Gazebo基础功能包。如果你不打算构建机器人的硬件部分,可以直接购买已经完成硬件设计的机器人TurtleBot来进行下一步的仿真实验,其网址为http://store.clearpathrobotics.com/products/turtlebot-2。

接下来,我们来看看如何在ROS下安装TurtleBot。

ROS Indigo下安装机器人TurtleBot功能包集合

TurtleBot从它的来源介绍到安装过程,都可以参考:

http://wiki.ros.org/Robots/TurtleBot。

下面介绍的是TurtleBot的一个快速安装过程,及来自apt包管理器的依赖项。

1.?首先,需要安装synaptic包管理器,可以使用下面的命令实现。synaptic是apt的图形包管理程序,它基于GTK+的GUI前端应用,提供了一个与apt-get命令行程序相类似的功能:

 

2.?在安装了synaptic包管理器之后,打开它,通过使用关键字ros-indigo-rocon进行搜索和过滤。

3.?安装synaptic列表上所有的功能包,如图3-12所示。

 

图3-12 synaptic上的功能包

Rocon也称为机器人音乐会,是TurtleBot包集合的一个依赖项。这个包的主要作用是将ROS用到多机器人的平板设备上。关于更多rocon的信息可参考http://wiki.ros.org/rocon。

在安装rocon之后,还需要安装另一个名为kobuki包的依赖项。kobuki非常类似于Yujin机器人的移动平台(http://wiki.ros.org/kobuki)。TurtleBot包依赖于这些功能包集合。

通过synaptic可以安装ros-indigo-kobuki功能包,例如rocon包。图3-13所示的是安装过程的屏幕截图。

 

图3-13 功能包安装过程屏幕截图

通过以下每一步的详细过程,展示了从ROS Indigo下的源代码直接安装和构建TurtleBot最新版的ROS包。这些包依赖项的安装过程在前面已经提到过了。

1.?在home文件夹下创建一个turtlebot文件夹:

 

2.?切换到turtlebot目录下:

 

3.?下载TurtleBot最新的源代码:

 

https://raw.github.com/yujinrobot/yujin_tools/master/rosinstalls/indigo/turtlebot.rosinstall

4.?安装所有依赖项的源代码:

 

5.?构建源代码:

 

6.?添加命令source ~/turtlebot/devel/setup.bash 到.bashrc文件中,使得所有终端都能访问TurtleBot :

 

7.?执行.bashrc文件:

 

Ubuntu下用apt包管理器安装TurtleBot的ROS功能包

如果不想通过编译源代码的方式安装TurtleBot包,那么可以使用apt包管理器。下面的命令是安装ROS下的TurtleBot包:

 

现在,让我们来看看如何在Gazebo下对TurtleBot进行仿真,并将机器人移置到一个空的环境下。

ROS和Gazebo环境下对TurtleBot进行仿真

TurtleBot仿真器功能包包含了turtlebot_gazebo包,可以在Gazebo下对TurtleBot进行仿真。

在TurtleBot包安装成功后,在ROS和Gazebo环境下键入下面的命令,打开TurtleBot仿真器:

 

在另一个终端,运行下面的命令。它将执行一个Python脚本,使得可以通过键盘来控制TurtleBot,这就是所谓的键盘远程操作:

 

输出的屏幕截图如图3-14所示。

上图窗口左上角显示的是终端在执行仿真命令,窗口左下角显示的是在执行teleop命令。

我们可以用屏幕上提到的关键词通过键盘远程操作来移动机器人。还可以用rostopics命令来监测机器人模型的值。使用下面的命令,还可以查看当前主题:

 

 

图3-14 输出的屏幕截图

传感器检测到的所有值都会发布出来,例如Kinect传感器、车轮编码器的里程计值、里程计的惯导(IMU)值,以及Gazebo的状态值。

通过TurtleBot包克隆得到的机器人模型和仿真参数都是不一样的。我们可以对大部分拥有差动转向系统的移动机器人执行这样的克隆操作。通过复制TurtleBot代码,可以为机器人创建多样的功能包。为我们自己定义的机器人命名为ChefBot代替原来的TurtleBot,并根据这个名字来命名这个机器人的所有功能包。

用TurtleBot包进行Gazebo建模

在TurtleBot的包集合里,可以用turtlebot_gazebo和turtlebot_description这两个包来实现机器人的运动学模型和仿真。其中,turtlebot_gazebo功能包提供了在Gazebo下启动仿真程序所需的文件。turtlebot_description功能包涵盖了机器人的运动学模型和Gazebo模型。

通过对TurtleBot包进行复用和定制,可以为我们的机器人重新创建相同的功能包集合。我们的机器人被命名为ChefBot,那么就可以创建chefbot_gazebo功能包,其中包含启动仿真程序的文件。ROS下的启动文件是一个XML文件,在这里可以通过运行单个文件,达到能够同时启动多个节点并且设置多个参数的目的。需要使用roslaunch命令,运行启动文件。

可以在http://wiki.ros.org/roslaunch上查到已经实现的ChefBot的ROS功能包。

下面的命令完整地复制了ChefBot的ROS功能包:

 

chefbot_description功能包涵盖了机器人的运动学模型和Gazebo模型。图3-15中列出了这两个功能包中各种不同的文件。

 

图3-15 chefbot_description和chefbot_Gazebo功能包

切换到目录catkin_ws,我们进行ROS包的创建和开发。在src文件夹中,首先创建一个名为chefbot的文件夹。然后,使用下面的命令创建ChefBot的所有功能包:

 

使用下面的命令,创建chefbot_gazebo包以及所需要的依赖项:

 

在创建了功能包之后,你可以从Packt Publishing网站下载的章节源代码中,复制chefbot_gazebo包中的两个文件夹。这段代码改编自turtlebot_gazebo包,也可以参考它的原始代码进行更深入的开发。

以下内容是每个文件的使用说明。首先讨论的是chefbot_gazebo包。在启动文件夹下,对每个功能都有一个启动文件。

chefbot_empty_world.launch:该文件在Gazebo下启动ChefBot模型,设定周围环境为空,机器人的环境信息存储在一个Gazebo文件里。

chefbot_playground.launch:该文件在Gazebo下启动ChefBot模型,设定的Gazebo仿真环境包含一些随机的障碍物,例如圆柱体和盒子等。

gmapping_demo.launch:该文件实现的是同步定位与映射(Simultaneous Localiza-tion And Mapping,SLAM)。通过SLAM技术,可以将周围环境建立地图,并保存下来供将来使用。在我们的示例中,可以使用这个功能包建立酒店环境的地图。我们将在下一章讨论更多关于gmapping的功能实现。关于SLAM的更多详细信息,可以参考http://wiki.ros.org/gmapping。

amcl_demo.launch:AMCL(Adaptive Monte Carlo Localization)即自适应蒙特卡罗定位(http://wiki.ros.org/amcl)。在建立好环境地图之后,机器人可以在地图上完成自身定位,同时通过轮速得到反馈,从而实现自主导航。机器人的反馈被称为里程计。AMCL定位算法和导航算法,如路径规划等,都是通过这个启动文件实现的。

chefbot_base.launch.xml:这个XML文件解析了一个xacro文件chefbot_circles_kinect.urdf.xacro,用于chefbot_description文件夹下的URDF。将xacro文件转换为URDF格式之后,相当于生成了ROS下的机器人模型。在后续部分,我们将学习到更多关于URDF和xacro的相关知识。

在生成了URDF格式的机器人模型之后,这个XML文件将从URDF格式的机器人描述中生成新的适用于Gazebo环境下的模型描述。同时,它也会启动一个速度优化节点,将优先考虑机器人收到命令的反应速度。命令速度的一个实际例子是通过键盘或操纵杆对机器人进行操控时机器人的反应速度。根据不同的优先级分配,不同的命令以不同的优先级到达机器人中。下面,我们开始了解更多关于URDF和xacro的介绍,从而对机器人能够进行更清楚地描述。

什么是机器人模型,URDF、xacro还是robot state publisher

ROS下机器人模型的功能包有很多,使用它们可以对各式各样的机器人进行建模,对于模型的描述有固定的格式(URDF),它们都存储在XML文件中。功能包集合的核心是URDF,它的作用是解析URDF文件,并构建一个机器人对象模型。

Unified Robot Description Format(URDF,统一机器人描述格式)是XML规范格式,用来描述机器人模型。我们可以用URDF来表示机器人的下列特点:

机器人的动力学和运动学描述

机器人的可视化表示

机器人的碰撞模型

机器人的描述是由一系列连接、部件和关节组成的,这些关节能够把不同的连接组合在一起。一个典型的机器人描述如下面的代码所示:

 

如果想了解更多有关URDF的信息,可以参考:

http://wiki.ros.org/urdf

http://wiki.ros.org/urdf/Tutorials

xacro(XML宏)是一种XML格式的计算机宏语言。有了xacro,我们可以创建更简短且可读性更强的XML文件。可以在URDF下使用xacro来简化URDF文件。如果要添加xacro到URDF,需要调用另外的解析节点将xacro转换为URDF。

有关xacro更多的介绍,可以参考:http://wiki.ros.org/xacro。

robot_state_publisher可以将机器人的状态发布到tf上(http://wiki.ros.org/tf)。状态一旦发布,系统的所有组件就都可以使用tf。这个功能包的输入是机器人的关节角,并且通过机器人的运动学树模型计算得出机器人连接的3D姿态,进行发布。这个包可以看成是一个库,或者相当于一个ROS节点。这个包已经经过测试,且代码是稳定可靠的。在一段时间内,是不会有很大改变的。

World files:这些文件表示机器人的周围环境会跟机器人模型一起加载到Gazebo上。两个world文件,empty.world和playground.world,都包含在启动文件里,因此在启动Gazebo时就已经将其自动加载。

CMakeList.txt和package.xml:这些文件是在创建包的时候一起创建的。在一个功能包内,CmakeList.txt文件帮助构建节点或库,package.xml文件内的列表列出了这个包的所有依赖项。

在ROS下创建一个ChefBot_description

chefbot_description功能包包括机器人的URDF模型。在创建这个包之前,可以通过下载得到ChefBot的功能包集合。这样能帮助你加快创建的过程。

下面,我们来看看如何创建chefbot_description。以下步骤将指导你如何创建这个功能包:

1.?首先,需要切换到src目录下的chefbot文件夹中:

 

2.?使用下面的命令创建机器人的描述功能包,以及它的依赖项,例如URDF、xacro和Kobuki的描述功能包,并创建移动机器人:

 

3.?从下载的源代码中,复制meshes、URDF和robots这三个文件夹到package文件夹下。mesh文件夹涵盖机器人的三维模型描述,URDF文件夹包含URDF描述和机器人传感器信息。整个机器人模型被拆分成为一系列的xacro文件,使其具有更好的可读性,也更容易进行调试。

下面,我们来看看这个包里每个文件的功能。可以参考下载的源代码来检查这些文件,也可以将这些下载的文件直接复制到新创建的文件夹中。每个URDF文件夹的功能介绍如下:

chefbot_base.urdf.xacro:这个xacro文件表示的是机器人的运动学模型。它用URDF标签对机器人的所有连接单元进行建模。连接单元包括两个轮子、两个脚轮和陀螺仪等。3D Kinect传感器的建模不包含在这个文件中。它还为每个连接附加了网格信息。这个文件是对Kobuki移动设备功能包的复用。

chefbot_base_gazebo.urdf.xacro:这个文件是对Gazebo下机器人每个连接的模型表示。它包括执行机构的定义、传感器的定义、差动机器人的参数设置等。Gazebo读取这些具体数值来执行仿真试验。可以通过改变这些文件中参数的值,对机器人的参数进行调整。

chefbot_gazebo.urdf.xacro:之前的Gazebo中的URDF不包含Kinect 3D传感器的定义。这个文件可以用于启动kinect_openni,它是一个Gazebo插件,用于仿真机器人的Kinect传感器。

chefbot_library.urdf.xacro:这个文件包含所有的xacro文件和机器人传感器。仅这个文件就可以启动机器人的所有描述。

chefbot_properties.urdf.xacro:这个文件包括了Kinect 3D传感器在机器人模型中的位置。

common_properties.urdf.xacro:这个文件包含了网格的属性,例如网格的颜色。

kinect.urdf.xacro:这个文件存放在sensors文件夹下,包含了Gazebo下的Kinect参数。chefbot_gazebo.urdf.xacro和chefbot_properties.urdf.xacro这两个文件都包含了这个文件,它用于Kinect的参数设置。

chefbot_circles_kinect_urdf.xacro:这个文件存放在robot文件夹下。它包括chef-bot_library.urdf.xacro文件,会加载开始仿真时所需要的机器人的所有描述文件。

在meshes文件夹中,主要的内容是机器人的身体和轮子两部分,以及机器人ChefBot的3D模型。

与TurtleBot相似,使用下面的命令可以启动ChefBot仿真:

 

当执行这个命令时,启动文件将会按照图3-16所示的顺序执行。

我们已经了解了每个文件的功能。还需要重点讨论以下几个文件:

chefbot_gazebo.urdf.xacro

kinect.urdf.xacro

chefbot_base.urdf.xacro

 

图3-16 启动文件的执行顺序

chefbot_gazebo.urdf.xacro

我们来看看chefbot_base_gazebo.urdf.xacro这个文件。这个文件的定义很长,这里我们只讨论其中重要的部分。

在讨论Gazebo的定义之前,可以参考URDF中提到的Gazebo的标签参数。对于URDF的各种标签,可以参考http://osrf-distributions.s3.amazonaws.com/sdformat/api/1.5.html。

在前面讲述的URDF部分,提到过Gazebo下每个连接的定义用标签标识。下面描述的是通过使用Gazebo参数,对URDF定义的机器人的各个关节连接进行建模的过程。这里的关节包括主动轮和脚轮部分的关节。其中,参数mu1和mu2表示摩擦系数,kp和kd表示关节的动力刚度和阻尼。MinDepth表示在使用接触修正脉冲之前允许的最低深度。MaxVel表示最大接触修正速度的截断项:

 

 

 

下面代码描述的是惯性测量单元(Inertial Measurement Unit,IMU)在Gazebo下对机器人的建模过程(http://en.wikipedia.org/wiki/Inertial_measurement_unit)。IMU在机器人上的主要作用是能够得到一个准确的里程计值。

 

 

 

下面给出了Gazebo下差分驱动控制器插件的代码。kobuki驱动系统下的差分驱动插件将被重用。在这一节中,还会提到机器人的主要测量度量,如轮子间的距离、轮子直径、电机的转矩等。本节内容还包括悬崖感应传感器,但它不会用在我们所搭建的机器人模型中。如果不用它,也可以忽略这部分内容:

 

kinect.urdf.xacro

这个文件主要包含各个关节的定义和Kinect传感器的连接。

这个文件还包括两个启动文件:

 

文件chefbot_gazebo.urdf.xacro是由Gazebo下的Kinect插件组成的。我们将复用TurtleBot的这个插件。Kinect插件实质上就是libgazebo_ros_openni_kinect.so文件,我们还可以定义Kinect参数,如下面的代码所示:

 

chefbot_base.urdf.xacro

这个文件定义了机器人的关节和连接,还包括chefbot_gazebo.urdf.xacro文件。机器人的关节主要是主动轮、脚轮等。其中,XML文件定义了机器人的身体、主动轮和

脚轮。

机器人的基本连接包括机器人的身体,但不包括轮子。可以从Blender软件中导出机器人身体部分的网格文件,并用MeshLab将其保存成扩展名为.DAE的文件(http://en.wikipedia.org/wiki/COLLADA)。基础关节部分是一个固定类型文件,在底座上没有固定运动部分。可以定义机器人每个连接的配置文件和惯性。这些文件都是从TurtleBot里复用过来的,如下面的代码所示:

 

 

 

 

3.1.4 在酒店环境下进行ChefBot和TurtleBot仿真

详细讨论了每个文件之后,开始尝试在酒店环境下对两个机器人进行仿真。仿真的过程和屏幕截图如下。

与TurtleBot相似,可以使用下面的命令启动ChefBot:

 

图3-17显示的是Gazebo环境下的机器人模型。

 

图3-17 Gazebo环境下的机器人模型

退出Gazebo,开始构建机器人的酒店环境。

第一步是新建一个world文件,并将其保存为扩展名为.world的文件。一个典型的酒店环境,有9个矩形桌子,如下面的屏幕截图所示。可以通过下面的命令新建一个空的Gazebo的world文件,选用基本形状,在Gazebo下搭建一个环境:

1.?启动roscore:

 

2.?在Gazebo下打开一个空的world文件:

 

3.?现在已经创建了一个环境,如图3-18所示,并保存为empty.world文件。

4.?复制empty.world文件到chefbot_decription包下的world文件夹中。使用下面的命令,启动机器人环境:

 

在对机器人ChefBot进行仿真之前,我们将创建一个相同的环境。对于机器人TurtleBot,过程也是相类似的。

与chefbot_description不同,对于TurtleBot用户,需要复制turtlebot_description文件夹:

 

图3-18 创建的环境

1.?开始启动gmapping文件,进行区域映射。使用下面的命令启动gmapping过程:

 

2.?对于TurtleBot,使用下面的命令:

 

3.?启动gmapping过程,如果想查看映射过程,启动rviz,它是一种ROS下的传感器数据可视化工具(http://wiki.ros.org/rviz)。对于TurtleBot,使用相同的命令:

 

rviz工具的屏幕截图如图3-19所示。

创建一个房间的地图,必须启动键盘遥控操作:

1.?使用键盘操控功能,可以通过操作键盘移动机器人,这样可以对整个区域进行建图:

 

2.?对于TurtleBot,使用的命令相同。一个完整的周围环境地图如图3-20所示。

3.?地图构建完成之后,使用下面的命令将地图保存为hotel_world文件:

 

对于TurtleBot,使用的命令相同。

4.?地图保存完成之后,退出目前正在使用的所有其他应用程序。

 

图3-19 rviz工具的界面

 

图3-20 完整的环境地图

5.?地图生成之后,下一步是使用生成的地图,进行机器人的定位和自主导航。

6.?使用下面的命令,启动Gazebo:

 

7.?对于TurtleBot,使用下面的命令:

 

8.?对于ChefBot,进行amcl的演示。需要注意路径,每个用户的路径可能会不一样。

9.?对于ChefBot,使用下面的命令:

 

10.?对于TurtleBot,使用下面的命令:

 

11.?使用下面的命令,运行rviz。对于TurtleBot和ChefBot,所用的命令是相同的:

 

现在,通过2D Nav Goal功能按钮,可以命令机器人移动到地图上的某个位置。单击这个按钮,选择一个桌子附近的位置。在点击了这个位置之后,它将进行路线规划,机器人按照规划的路线移动到这个位置,如图3-21所示。

 

图3-21 机器人的规划路线

机器人能够绕过障碍,并规划出一条距离目标位置最短的路径。如果构建的地图是准确的,在经过几次运行之后,会发现机器人的移动过程非常完美。地图构建的过程可以参考链接http://wiki.ros.org/costmap_2d进行不断优化。作为提供食物服务的应用来说,机器人需要有精度很高的环境地图,这样能为它传送食物提供精确的位置。

你可能感兴趣的:(机器人系统设计与制作:Python语言实现3.1 什么是机器人仿真)