第1章 ROS入门
本书的主要目的是教你如何从头开始构建自主移动机器人。我们将使用机器人操作系统( , ROS)对机器人进行编程,它的操作将在名为的仿真器上进行模拟。在接下来的章节中,还会介绍机器人的机械设计、电路设计、嵌入式编程并使用ROS进行高级软件编程。
本章将从ROS基础知识开始学习,包括如何安装ROS,如何使用ROS和编写基础的应用程序,以及的基础知识。本章内容是自主机器人项目的基础。如果你已经了解了ROS的基础知识,并且已经在系统上安装了ROS,那么可以跳过这一章。但是,你仍然可以在以后浏览这一章来增强对ROS基础知识的记忆。
本章将涵盖以下主题:
·对ROS的概述。
·在 16.04.3上安装ROS 。
·介绍、安装和测试。
我们开始使用和ROS来对机器人编程吧!
1.1 技术要求
可以从以下链接获得本章中提到的完整代码:。
1.2 ROS概述
ROS是用于创建机器人应用程序的软件框架,其主要目的是提供可以用于创建机器人应用程序的功能,创建的应用程序也可以被其他机器人再次使用。ROS由一系列可以简化机器人软件开发的软件工具、软件库和软件包组成。
ROS是BSD()许可的一个完整的开源项目,可用于研究和商业应用。虽然ROS表示机器人操作系统,但它并不是一个真正的操作系统。相反,它是一个提供了真实操作系统功能的元操作系统。以下是ROS提供的主要功能:
·消息传递接口:这是ROS的核心功能,它支持进程间通信。使用这种消息传递功能,ROS程序可以与其链接的系统进行通信并交换数据。下面的章节中,我们将学习更多关于在ROS程序/节点之间交换数据的技术术语。
·硬件抽象:ROS具有一定程度的抽象,使开发人员能够创建与机器人无关的应用程序。这类应用程序可以用于任何机器人,因此开发人员只需要关心底层的机器人硬件。
·软件包管理:把ROS节点以软件包形式组织在一起,则称为ROS软件包。ROS软件包由源代码、配置文件、构建文件等组成。我们可以创建包、构建包和安装包。ROS中有一个构建系统,可以帮助构建这些软件包。ROS的软件包管理使ROS的开发更加系统化和组织化。
·第三方软件库集成:ROS框架可与许多第三方软件库集成,如、PCL、等。这有助于开发者在ROS中创建各种各样的应用程序。
·底层设备控制:使用机器人工作时,也可能需要使用底层设备,例如控制I/O引脚、通过串口发送数据等设备。这也可以使用ROS完成。
·分布式计算:处理来自机器人传感器的数据所需的计算量非常大。使用ROS可以轻松地将计算分配到计算节点集群中。分配计算能力使处理数据的速度比使用单个计算机更快。
·代码复用:ROS的主要目标是实现代码复用。代码复用促进了全球研发团队的发展。ROS的可执行文件叫作节点。这些可执行文件被打包成一个实体,叫作ROS软件包。一批软件包集合叫作元软件包,软件包和元软件包都可以共享和分发。
·语言独立性:ROS框架可以使用当前流行的编程语言(如、C++和Lisp)。节点可以用任何一种语言来编写,并且可以通过ROS框架进行无障碍通信。
·测试简单:ROS有一个内置的单元/集成测试框架,用于测试ROS软件包。
·扩展:ROS可以扩展到机器人中执行复杂的计算。
·免费且开源:ROS的源代码是开放的,并且是完全免费的。ROS的核心部分,经BSD( )协议许可,可以在商业领域和不开源的产品上复用。
ROS是管道(消息传递)、开发工具、应用功能和生态系统的组合。ROS中有强大的开发工具,可以调试和可视化机器人数据。ROS具有内置的机器人应用功能,如机器人导航、定位、绘图、操作等。它们有助于创建强大的机器人应用程序。
图1-1显示了ROS的组成。
图1-1 ROS的组成
更多有关ROS的信息,请参考。
1.2.1 ROS框架
ROS框架主要分成三个层级:
·ROS文件系统。
·ROS计算图。
·ROS社区。
ROS文件系统
ROS的文件系统主要介绍了硬盘上ROS文件的组织形式。其中,我们必须了解的主要有以下几个方面:
·软件包():ROS软件包是ROS软件框架的独立单元。ROS软件包可能包含源代码、第三方软件库、配置文件等。ROS软件包可以复用和共享。
·软件包清单( ):清单文件(.xml)列出了软件包的所有详细信息,包括名称、描述、许可信息以及最重要的依赖关系。
·消息(msg)类型:消息的描述存储在软件包的msg文件夹下。ROS消息是一组通过ROS的消息传递系统进行数据发送的数据结构。消息的定义存储在扩展名为.msg的文件里。
·服务(srv)类型:服务的描述使用扩展名.srv存储在srv文件夹下。该文件定义了ROS内服务请求和响应的数据结构。
ROS计算图
ROS的计算图是ROS处理数据的一种点对点的网络形式。ROS计算图中的基本功能包括节点、ROS控制器、参数服务器、消息和服务:
·节点(Node):ROS节点是使用ROS功能处理数据的进程。节点的基本功能是计算。例如,节点可以对激光扫描仪数据进行处理,以检查是否存在碰撞。ROS节点的编写需要ROS客户端库文件(如和)的支持,这将在下一节中讨论。
·ROS控制器():ROS节点可以通过名为ROS控制器的程序相互连接。此程序提供计算图其他节点的名称、注册和查找信息。如果不运行这个控制器,节点之间将无法相互连接和发送消息。
·参数服务器( ):ROS参数是静态值,存储在叫作参数服务器的全局位置。所有节点都可以从参数服务器访问这些值。我们甚至可以将参数服务器的范围设置为以访问单个节点,或者设置为以访问所有节点。
·ROS主题():ROS节点使用命名总线(叫作ROS主题)彼此通信。数据以消息的形式流经主题。通过主题发送消息称为发布,通过主题接收数据称为订阅。
·消息():ROS消息是一种数据类型,可以由基本数据类型(如整型、浮点型、布尔类型等)组成。ROS消息流经ROS主题。一个主题一次只能发送/接收一种类型的消息。我们可以创建自己的消息定义并通过主题发送它。
·服务():我们看到使用ROS主题的发布/订阅模型是一种非常灵活的通信模式,这是一种一对多的通信模式,意味着一个主题可以被任意数量的节点订阅。在某些情况下,可能还需要一种请求/应答类型的交互方式,它可以用于分布式系统。这种交互方式可以使用ROS服务实现。ROS服务的工作方式与ROS主题类似,因为它们都有消息类型定义。使用该消息定义可以将服务请求发送到另一个提供该服务的节点。服务的结果将作为应答发送。该节点必须等待,直到从另一个节点接收到结果。
·ROS消息记录包(Bag):这是一种用于保存和回放ROS主题的文件格式。ROS消息记录包是记录传感器数据和处理数据的重要工具。这些包之后可以用于离线测试算法。
图1-2显示了在节点和控制器之间,ROS主题和ROS服务的工作流程。
图1-2 ROS节点和ROS控制器之间的通信
从图1-2可以看到,ROS控制器位于两个ROS节点之间。我们必须记住的一件事是,在启动ROS中的任何节点之前,应该先启动ROS控制器。ROS控制器充当节点之间的中介,以交换关于其他ROS节点的信息,从而建立通信。假设节点1希望发布名为/xyz的主题,消息类型为abc。它将首先接近ROS控制器,说:“我将发布一个名为/xyz的主题,消息类型为abc,并共享其细节。”当另一个节点,比如节点2,希望订阅消息类型为abc的相同主题/xyz时,控制器将共享关于节点1的信息,并分配一个端口来直接在这两个节点之间启动通信,而不需要与ROS控制器通信。
ROS服务的工作方式与之类似。ROS控制器类似DNS服务器,当第二个节点向第一个节点请求主题或服务时,它可以共享节点的详细信息。ROS使用的通信协议是(),它使用的是标准TCP/IP套接字。
ROS社区
ROS社区由ROS开发人员和研究人员组成,他们可以创建和维护软件包,并交换现有软件包、新发布的软件包和其他与ROS框架相关的新信息。ROS社区提供以下服务:
·发行版本():ROS发行版有一组特定版本的软件包。本书中使用的发行版是ROS 。还有其他可用的版本,比如ROS 和,它们有一个可以安装的特定版本。在每个发行版中维护软件包更容易。在大多数情况下,发行版中的软件包相对稳定。
·资源库():在线资源库是保存软件包的地方。通常,开发人员在资源库中保存一组类似的软件包,称为元软件包。还可以将单个软件包保存在独立资源库中。我们可以简单地复制资源库并构建或复用软件包。
·ROS wiki:从ROS wiki几乎可以获得所有ROS文档。通过使用ROS wiki(),可以从最基本的概念到最高级的编程来了解ROS。
·邮件列表( List):如果想获得有关ROS的更新消息,可以订阅ROS邮件列表()。还可以从ROS ()获得最新的ROS消息。
·ROS应答:这与 网站非常相似。你可以在这个门户中提出与ROS相关的问题,并且可能会得到来自世界各地开发人员的帮助()。
可以从ROS的官方网站上了解关于ROS的其他功能。现在,我们继续介绍ROS的安装过程。
1.2.2 在上安装ROS
根据前面的讨论,我们了解到ROS是元操作系统,需要安装在主机系统上。ROS完全支持和,但对于和OS X的支持还处于实验阶段。表1-1列出了一些最新的ROS发行版本。
表1-1 ROS发行版本
下面我们将介绍在 16.04.3 LTS上安装名为的ROS长期稳定支持(Long-Term , LTS)的发行版的过程。ROS Kame主要针对的是 16.04 LTS。在查看了以下说明之后,还可以在 18.04 LTS上最新的LTS 中找到设置ROS的说明。如果你是或OS X用户,那么可以先在虚拟机()上安装,然后再安装ROS。的下载链接为。
你可以在上找到完整的操作说明。
安装说明如下:
(1)配置资源库,允许、和下载权限。可以用中的 & 工具进行配置。我们可以直接在 查找菜单下进行简单搜索,然后按图1-3所示勾选选项。
图1-3 的 & 工具
(2)将系统设置为从接收ROS软件包。ROS 版本仅支持 15.10和16.04。使用下面的命令将存储到的apt库列表:
(3)接下来,添加apt-key。apt-key用于管理密钥列表,apt通过密钥对软件包进行认证。经过这些密钥认证的软件包将被认为是可信的。使用下面的命令可以将apt-key添加到ROS软件包:
(4)添加了apt-key之后,必须更新软件包列表。使用下面的命令添加并更新ROS软件包和软件包:
(5)更新了ROS软件包之后,就可以开始安装软件包了。使用下面的命令安装ROS必需的软件包、开发工具和软件库:
(6)在桌面安装完成之后,可能还需要安装一些附加的软件包。每个附加安装的软件包在书中后续对应的部分都会提到。安装桌面需要花费一些时间。在ROS安装完成之后,就已经完成了大部分工作。下一步就是初始化,有了它就可以很容易地安装ROS资源包的依赖项:
(7)为了在当前的bash 下使用ROS工具和命令,可以在.文件中添加ROS环境变量。这将会在每个bash会话开始时执行。使用下面的命令添加ROS环境变量到.文件:
下面的命令将在当前下运行.脚本,并在当前下产生变化:
(8)在安装软件包的依赖项时有一个很好用的工具,这个工具需要单独安装。它仅需要一个命令就可以帮助你下载到很多ROS软件包的资源树:
最新的LTS 的安装过程类似于前面的过程。可以同时安装 18.04 LTS和。你可以在上找到完整的说明。
在完成ROS的安装之后,我们将讨论如何在ROS中创建示例软件包。在创建软件包之前,先要建立ROS工作区,然后在ROS工作区中创建软件包。我们将采用构建系统,是一系列工具的集合,用于在ROS中创建软件包。构建系统能够从源代码生成可执行文件或共享库。ROS 使用构建系统来创建软件包。下面,我们先来看看是什么。
1.2.3 什么是
是ROS的官方编译构建系统。在之前,ROS用系统来构建软件包。在最新版本的ROS中,代替了。结合了宏命令和脚本来提供和同样的通用工作流程。提供了比系统更好的软件包发布功能、更好的交叉编译功能以及更好的可移植性。有关的更多信息,可以参考/。
工作区是一个文件夹,可以在其中对软件包进行修改、构建以及安装。
现在,我们来看如何创建ROS的工作区。
使用下面的命令创建名为的父目录和名为src的子文件夹:
使用下面的命令将目录切换到src文件夹。我们将在src文件夹中创建软件包:
使用下面的命令初始化工作区:
在完成工作区初始化之后,使用下面的命令能够直接(即使在没有源文件的情况下)构建软件包:
命令用于在src目录中构建软件包。构建软件包之后,在目录下可以看到一个文件夹和一个文件夹。可执行文件存储在文件夹中。在文件夹中,有可以在ROS环境下添加工作区的脚本文件。
1.2.4 创建ROS软件包
在本节中,我们将介绍如何创建包含两个节点的示例软件包。其中一个节点用于在名为/的主题上发布 字符串消息,另一个节点订阅该主题。
在ROS中使用命令可以创建 ROS软件包。
软件包会在src文件夹中创建,这个文件夹是我们在创建工作区的过程中创建的。在创建软件包之前,使用下面的命令先切换到src文件夹:
使用下面的命令创建包及依赖项,该依赖项包含标准的消息定义。ROS的客户端库是:
在软件包成功创建后,会返回以下信息:
在包成功创建之后,需要添加两个节点或脚本,用于演示主题的订阅和发布。
首先,使用下面的命令在包中创建名为的文件夹:
切换到文件夹,并创建名为r.py和er.py的脚本,用于发布和订阅 消息。下面将介绍这些脚本或节点的代码和函数。
r.py
节点r.py主要发布欢迎信息 到主题/中,发布频率为10Hz。
图1-4显示了两个ROS节点之间的相互作用。
图1-4 发布者和订阅者节点之间的通信
本书的完整代码还可在获得。
此节点代码的分步解释如下:
(1)如果要编写ROS 节点,则需要导入。它包含的API,可以与ROS的主题、服务等相互作用。
(2)要从包中导入消息数据类型才能发送 消息。包对标准的数据类型有一个消息定义。使用下面的命令进行导入:
(3)下面的代码创建了主题的一个发布对象。消息类型是,的值为10。如果设置的订阅频率太低导致来不及接收数据,可以调整选项:
(4)下面这行代码对所有ROS节点进行初始化,并给每个节点命名。如果运行过程中两个节点有相同的节点名称,那么其中一个将会关闭。如果想要同时运行这两个节点,可以如下使用=True标志:
(5)下面这行代码创建速率对象r。在对象Rate中使用()方法,可以更新设定的循环速率。这里,我们设定速率为10:
(6)下面的循环将检查是否构建了.()标志。接下来,执行这个循环。按下<Ctrl+C>时,循环退出。
在循环内部,消息 会被打印在终端上,并同时以10Hz的速率发布在主题上:
(7)下面的代码对的进行检查并调用()函数。代码将持续执行(),当按下<Ctrl+C>时,节点将关闭:
在发布主题之后智能系统与技术指导书,教你零基础动手创建自主移动机器人,我们将介绍如何订阅主题。接下来的部分介绍订阅主题的相关代码。
er.py
免责声明:本文系转载自其它媒体,版权归原作者所有;旨在传递信息,不代表本站的观点、立场和对其真实性负责。如需转载,请联系原作者。如果来源标注有误或侵犯了您的合法权益等其他原因不想在本站发布,来信即删。