2.1 ROS 架构和基本概念

       ROS 的概念分三个层次:文件系统层、计算图层和社区层。本章会对这些分层原则以及其中的概念进行系统讲解。

2.1.1 文件系统层

 ROS 是一个类 Linux 操作系统,有专门的组织文件的规则。如下图所示:

2.1 ROS 架构和基本概念_第1张图片

  • Packages: 软件包或者功能包,它是 ROS 中软件的基本单元,也是我们可以构建和发布的最小单元,是用于实现特定功能的相关文件的集合,包括节点文件、所依赖的库、数据集、配置文件等等内容。前面我们运行的两个可执行文件 turtlesim_node 和 turtle_teleop_key 都属于 turtlesim 包。
  • Metapackages: 元功能包是多个相似目的的功能包的集合,比如一个与移动机器人导航相关的元功能包就可能会包含定位相关的功能包或者路径规划相关的功能包,不同的功能包相互配合共同实现机器人导航的目的。
  • Package Manifests:每个功能包都有一个 package.xml 文件,我们称之为功能包清单,其中存放了功能包相关的描述信息,包括功能包的功能介绍、作者信息、依赖关系、编辑时间以及许可信息等内容。
  • Message (msg) types: 消息是 ROS 中两个不同的节点之间的通信方式,我们可以使用 ROS 系统中默认提供的消息类型,也可以使用我们自定义发布的消息类型。
  • Service (srv) types: 服务类型定义了 ROS 中服务的请求与响应的数据结构,同样的我们可以使用 ROS 系统中默认提供的服务类型,也可以使用我们自定义发布的服务类型。

2.2 计算图层

  计算图层描述的是 ROS 中的程序是如何在端对端的对等网络中处理数据的。计算图层的基本概念包括:节点、主节点、参数服务器、消息、服务、话题和数据包等等,它们会以不同的方式向计算图提供数据。

  • 节点(Nodes):是指执行运算任务的进程。它是 ROS 中模块化设计理念的最直接的体现,一个机器人控制系统中通常包含许多节点。还是以移动机器人系统为例,一个节点控制激光雷达,一个节点控制车轮电机,一个节点处理定位信息,一个节点处理路径规划策略等等,它们彼此之间相互协作来达到一个共同的目标。

  • 主节点(Master):提供了名称注册和对计算图中其他内容的查找服务。没有主节点,其他节点将无法彼此查找,交换消息或调用服务。

  • 参数服务器(Parameter Server):参数服务器允许通过密钥将数据存储在中央位置。它目前是 Master 的一部分。

  • 消息(Messages):节点之间通过传递消息进行通信。消息是一个数据结构,包括类型字段。 支持标准基本类型(整型,浮点数,布尔值等),以及基本类型的数组。 消息可以包含任意嵌套的结构和数组(非常类似于C语言中的结构体)。

  • 话题(Topics):消息是通过一种发布/订阅(Publish/Subscribe)的方式进行传输的。节点通过发布消息给话题把消息发送出来,话题是用于标识消息内容的名称。对于这些数据感兴趣的节点就可以通过订阅这些话题来获取数据。单个话题可以有多个发布者和订阅者,并且单个节点也可以发布或者订阅多个话题。通常,发布者和订阅者并不了解彼此的存在,从逻辑上说话题可以被视为一个消息总线,每个总线都有一个名称,只要类型匹配,任何节点都可以连接到该总线以发送或者接收消息。

    2.1 ROS 架构和基本概念_第2张图片
  • 服务(Services):刚刚介绍的发布/订阅模式是一种非常灵活的通信方式,但是并不适用于双向的同步传输场景,而这在分布式系统中通常是必需的。所以 ROS 中的请求/答复是通过服务完成的,服务由一对通信数据类型定义,一个类型用于请求,一个类型用于答复。节点提供服务并给服务命名,客户端通过发送请求消息并等待回复来使用该服务,同一名称的服务只允许有一个节点提供。

  • 数据包(Bags):数据包是一种用于保存和回放 ROS 数据的格式。它可以用于存储数据(如传感器数据),这些数据可能很难收集,但对于开发和测试算法是必需的,不同开发者之间也可以在社区分享这些数据包。

  ROS Master 在整个计算图中扮演了一个命名服务的角色。它存储了 ROS 节点的话题和服务注册信息。节点与主节点通信以报告其注册信息。这些节点与主节点通信时,它们可以接收有关其他已注册节点的信息并进行适当的连接。当此注册信息更改时,主服务器还将对这些节点进行回调,从而允许节点在运行新节点时动态创建连接。

  节点直接连接到其他节点,主节点就像DNS服务器一样只提供查询信息。订阅话题的节点将请求发布该话题的节点的连接,并将通过已达成共识的连接协议建立该连接。 ROS中最常用的协议称为 TCPROS,它使用是标准的 TCP/IP 套接字。

  ROS 的这种分布式通信结构允许解耦操作,其中名称是构建更大,更复杂的系统的主要手段。名称在 ROS 中具有非常重要的作用,节点、话题、服务和参数都具有名称。每个ROS客户端库都支持名称的命令行重映射,这意味着可以在运行时重新配置已编译的程序,以在不同的计算图拓扑中运行。例如,要控制 Hokuyo 激光测距仪,我们可以启动 hokuyo_node 驱动程序,该驱动程序与激光测距仪对话并在话题 scan 上发布 sensor_msgs/LaserScan 消息。为了处理该数据,我们可以编写一个名为 laser_filters 的节点,该节点订阅话题 scan 的消息。订阅后,我们的 laser_filters 节点将自动开始接收来自雷达的消息了。

2.3 开源社区层

  开源社区层的概念主要是包含了 ROS 生态中的很多资源,这些资源使得不同的社区之间可以交换软件和知识,构建了一个友好的开源共享的环境。这些资源包括以下几种:

  • 发行版(Distributions):ROS 的发行版与Linux发行版有相似的作用,它们使安装软件集更加容易,并且一组软件之间保持一致的版本。
  • 软件源(Repository):ROS 依赖于共享网络上的开源代码,不同的机构可以在其中开发和发布自己的机器人软件组件。
  • ROS Wiki:ROS Wiki是记录ROS信息的主要论坛。任何人都可以注册一个帐户并贡献自己的文档,提供更正或更新,编写教程等,本教程大部分内容均是以ROS Wiki中的内容为参考整理翻译而来。
  • 邮件列表(Mailing Lists):邮件列表是有关 ROS 更新的主要交流渠道,也是一个提出有关ROS 软件问题的论坛。
  • ROS Answers:一个用于回答与ROS有关的问题的问答网站。
  • Blog:博客(ros.org)提供定期更新,包括照片和视频。
     

你可能感兴趣的:(ROS机器人操作系统,机器人)