ROS的概念分为三个层次:文件系统层、计算图层、社区层,这些层次以及概念将会在接下来的章节介绍。
除了这三个层次的概念,ROS同样定义两个names类型,包资源名称和图形资源名称。
1、ROS文件系统层次
文件系统层概念主要指在硬盘里能看到的ROS目录和文件, 例如:
- Packages : Packages是在ROS中整理及组织软体的主要单元。一个Packages包含节点(ROS runtime processes)、ROS程式库(ROS-dependent library)、数据集(datasets)、配置文件(configuration files)⋯⋯等等。Packages是您在ROS中能建立及分享的最小单元。
- Metapackages : Metapackages 是一组具体的服务相关的功能包。大部分的metpackages 只作为转换rosbuild Stacks的向后兼容的备选。
- Package Manifests : Manifests (package.xml) 描述一个package的元信息,包括了package的名字,版本,功能简述,证书信息,依赖关系,以及一些其他的被export的package所有的信息。关于package.xml 的文件说明,参考REP-0127.
- Repositories : 代码仓库是使用VCS版本控制系统的软件包集合,软件包利用版本控制维持同一版本,它能使用catkin自动发布工具bloom进行发布。这些代码仓库常通过映射来进行转换 rosbuild Stacks.仓库可以是只有一个软件包。
- Message (msg) types : 存储在my_package/msg/MyMessageType.msg的Message文件,主要定义了ROS系统的messages传输的数据结构。
- Service (srv) types : 存储在 my_package/srv/MyServiceType.srv的服务services文件,定义了ROS的服务通信时的请求(request )和响应(response )相关的数据结构。
2、ROS计算图层次
这些概念是在ros_comm库里实现的:
- Nodes : 节点主要执行计算处理 。ROS被设计为细粒度的模块化的系统;一个机器人控制系统通常有很多节点组成 。例如,一个节点控制激光测距仪,一个节点控制轮电机,一个节点执行定位,一个节点执行路径规划,一个节点提供系统图形界面,等等。一个ROS节点通过ROS客户端库 client library编写,例如 roscpp 或rospy
- Master : ROS Master 为计算图的其余部分提供名称注册和查找。没有 Master,节点将无法找到彼此、交换消息或调用服务。
- Parameter Server : 参数服务器允许将数据按密钥存储在一个中央位置。它目前是 Master 的一部分。
- Messages : 节点之间通过传递消息进行通信。消息只是一种数据结构,包括类型化字段。支持标准基本类型(整数、浮点数、布尔值等),以及基本类型数组。消息可以包括任意嵌套的结构和数组(很像 C 结构)。
- Topics : 消息通过具有发布/订阅语义的传输系统进行路由。节点通过将消息发布到给定主题来发送消息。主题是用于标识消息内容的名称。对某种数据感兴趣的节点将订阅适当的主题。一个主题可能有多个并发发布者和订阅者,一个节点可能发布和/或订阅多个主题。通常,发布者和订阅者并不知道彼此的存在。这个想法是将信息的生产与其消费分离。从逻辑上讲,可以将主题视为强类型消息总线。每条总线都有一个名称,任何人都可以连接到总线来发送或接收消息,只要它们是正确的类型。
- Services : 发布/订阅模型是一种非常灵活的通信范式,但其多对多、单向传输不适用于请求/回复交互,而这在分布式系统中通常是必需的。请求/回复是通过服务完成的,服务由一对消息结构定义:一个用于请求,一个用于回复。提供节点以某个名称提供服务,客户端通过发送请求消息并等待回复来使用该服务。ROS 客户端库通常将这种交互呈现给程序员,就好像它是一个远程过程调用。
- Bags : Bags 是一种用于保存和回放 ROS 消息数据的格式。袋子是存储数据(例如传感器数据)的重要机制,这些数据可能难以收集,但却是开发和测试算法所必需的。
ROS Master 在 ROS 计算图中充当名称服务。它存储 ROS 节点的主题和服务注册信息。节点与 Master 通信以报告其注册信息。当这些节点与 Master 通信时,它们可以接收有关其他注册节点的信息并进行适当的连接。当这个注册信息发生变化时,Master 也会对这些节点进行回调,这允许节点在新节点运行时动态创建连接。
节点直接连接到其他节点;Master 只提供查找信息,很像 DNS 服务器。订阅主题的节点将从发布该主题的节点请求连接,并将通过商定的连接协议建立该连接。ROS 中最常用的协议称为 TCPROS,它使用标准的 TCP/IP 套接字。
这种架构允许解耦操作,其中名称是构建更大和更复杂系统的主要手段。名称在 ROS 中具有非常重要的作用:节点、主题、服务和参数都有名称。每个 ROS 客户端库都支持名称的命令行重映射,这意味着可以在运行时重新配置已编译的程序以在不同的计算图拓扑中运行。
例如,要控制 Hokuyo 激光测距仪,我们可以启动 hokuyo_node 驱动程序,它与激光通信并在扫描主题上发布 sensor_msgs/LaserScan 消息。为了处理这些数据,我们可能会使用laser_filters 编写一个节点来订阅关于扫描主题的消息。订阅后,我们的过滤器会自动开始接收来自激光的消息。
注意两侧是如何解耦的。hokuyo_node 节点所做的只是发布扫描,不知道是否有人订阅。过滤器所做的只是订阅扫描,而不知道是否有人发布它们。这两个节点可以按任意顺序启动、终止和重新启动,而不会引发任何错误情况。
稍后我们可能会为我们的机器人添加另一个激光器,因此我们需要重新配置我们的系统。我们需要做的就是重新映射使用的名称。当我们开始我们的第一个 hokuyo_node 时,我们可以告诉它重新映射 scan 到 base_scan,并对我们的过滤器节点做同样的事情。现在,这两个节点都将使用 base_scan 主题进行通信,而不会听到关于 scan 主题的消息。然后我们可以为新的激光测距仪启动另一个 hokuyo_node。
3、ROS 交流社区
ROS 社区级概念是 ROS 资源,使不同的社区能够交换软件和知识。这些资源包括:
- Distributions : ROS 发行版是您可以安装的版本化堆栈的集合。发行版与 Linux 发行版扮演着类似的角色:它们使安装一组软件变得更加容易,并且它们还可以在一组软件中保持一致的版本。
- Repositories :ROS 依赖于代码存储库的联合网络,不同的机构可以在其中开发和发布自己的机器人软件组件。
- The ROS Wiki : ROS 社区 Wiki 是记录有关 ROS 信息的主要论坛。任何人都可以注册一个帐户并贡献自己的文档、提供更正或更新、编写教程等等。
- Bug Ticket System :有关文件票的信息,请参阅票证。
- Mailing Lists : ros-users 邮件列表是有关 ROS 新更新的主要沟通渠道,也是询问有关 ROS 软件问题的论坛。
- ROS Answers : 用于回答您的 ROS 相关问题的问答网站。
- Blog : 柳叶车库博客提供定期更新,包括照片和视频。
4、名称
4.1、图资源名称
图资源名称提供分层命名结构,用于 ROS 计算图中的所有资源,例如节点、参数、主题和服务。这些名称在 ROS 中非常强大,并且对于 ROS 中如何组成更大、更复杂的系统至关重要,因此了解这些名称的工作原理以及如何操作它们至关重要。
在我们进一步描述名称之前,这里有一些示例名称:
- / (全局命名空间)
- /foo
- /stanford/robot/name
- /wg/node1
图资源名称是ROS中提供封装的重要机制。每个资源都定义在一个命名空间中,它可以与许多其他资源共享。通常,资源可以在其命名空间内创建资源,并且它们可以访问在其自己的命名空间内或之上的资源。可以在不同命名空间中的资源之间建立连接,但这通常由两个命名空间上方的集成代码完成。这种封装隔离了系统的不同部分,以免意外获取错误命名的资源或全局劫持名称。
名称是相对解析的,因此资源不需要知道它们在哪个命名空间中。这简化了编程,因为可以编写一起工作的节点,就好像它们都在顶级命名空间中一样。当这些节点被集成到一个更大的系统中时,它们可以被下推到一个定义它们代码集合的命名空间中。例如,可以将一个斯坦福演示和一个 Willow Garage 演示合并到一个带有 stanford 和 wg 子图的新演示中。如果两个演示都有一个名为“camera”的节点,它们就不会发生冲突。需要对整个图形可见的工具(例如图形可视化)以及参数(例如 demo_name)可以由顶级节点创建。
4.1.1、有效名称
有效名称具有以下特征:
1.第一个字符是字母字符 ([a-z|A-Z])、波浪号 (~) 或正斜杠 (/)
2.后续字符可以是字母数字 ([0-9|a-z|A-Z])、下划线 (_) 或正斜杠 (/)
例外:基本名称(如下所述)中不能包含正斜杠 (/) 或波浪号 (~)。
4.1.2、解决
ROS中有四种类型的图资源名称:base、relative、global和private,它们的语法如下:
- base
- relative/name
- /global/name
private/name”开头的名称是私有的。它们将节点的名称转换为命名空间。例如,命名空间 /wg/ 中的 node1 具有私有命名空间 /wg/node1。私有名称可用于通过参数服务器将参数传递到特定节点。
默认情况下,解析是相对于节点的命名空间完成的。例如,节点 /wg/node1 具有命名空间 /wg,因此名称 node2 将解析为 /wg/node2。
没有命名空间限定符的名称是基本名称。基名实际上是相对名的一个子类,具有相同的解析规则。基本名称最常用于初始化节点名称。
以“/”开头的名称是全局的——它们被认为是完全解析的。应尽可能避免使用全局名称,因为它们限制了代码的可移植性。
以“
以下是一些名称解析示例:
Node | Relative (default) | Global | Private |
---|---|---|---|
/node1 | bar->/bar | /bar->/bar | ~bar->/node1/bar |
/wg/node2 | bar->/wg/bar | /bar->/bar | ~bar->/wg/node2/bar |
/wg/node3 | foo/bar->/wg/foo/bar | /foo/bar->/foo/bar | ~foo/bar->/wg/node3/foo/bar |
4.1.3、重新映射
在命令行启动节点时,可以重新映射 ROS 节点中的任何名称。有关此功能的更多信息,请参阅重新映射参数。
4.2、包资源名称
包资源名称在具有文件系统级概念的 ROS 中使用,以简化引用磁盘上文件和数据类型的过程。包资源名称非常简单:它们只是资源所在的包的名称加上资源的名称。例如,名称“std_msgs/String”指的是“std_msgs”包中的“String”消息类型。
可以使用包资源名称引用的一些与 ROS 相关的文件包括:
- Message (msg) types
- Service (srv) types
- Node types
包资源名称与文件路径非常相似,只是它们要短得多。这是因为 ROS 能够在磁盘上定位包并对它们的内容做出额外的假设。例如,消息描述始终存储在 msg 子目录中并具有 .msg 扩展名,因此 std_msgs/String 是 path/to/std_msgs/msg/String.msg 的简写。同样,Node 类型 foo/bar 相当于在 Package foo 中搜索具有可执行权限的名为 bar 的文件。
4.2.1、有效名称
包资源名称具有严格的命名规则,因为它们经常用于自动生成的代码中。因此,一个 ROS 包不能有除下划线以外的特殊字符,它们必须以字母字符开头。有效名称具有以下特征:
1.第一个字符是字母字符 ([a-z|A-Z])
2.后续字符可以是字母数字 ([0-9|a-z|A-Z])、下划线 (_) 或正斜杠 (/)
3.最多有一个正斜杠 ('/')。
4.3、 代码接口
roscpp::names 接口参考 (ROS Indigo)
-
计算
+关注
关注
2文章
450浏览量
38799 -
ROS
+关注
关注
1文章
278浏览量
17007
发布评论请先 登录
相关推荐
评论