ROS是一种基于匿名发布/订阅( publish/subscribe)机制的中间件,允许在不同的ROS进程之间传递消息。任何ROS 2系统的核心是ROS图( graph)。 ROS图指的是ROS系统中的节点网络以及它们之间通信的连接。
图概念的快速概述
- 节点(Nodes):节点是使用ROS与其他节点通信的实体。
- 消息(Messages):订阅或发布一个主题时使用的ROS数据类型。
- 主题(Topics):节点可以将消息发布到主题,也可以订阅主题以接收消息。
- 发现(Discovery):节点确定如何相互通信的自动化过程。
节点(Nodes)
节点是ROS图中的参与者。 ROS节点使用ROS客户端库(Client Libraries)与其他节点通信。 节点可以发布或订阅主题。 节点还可以提供或使用服务。 存在与节点相关联的可配置参数。 节点之间的连接通过分布式发现过程建立。 节点可以位于相同或者不同的进程中,也可以位于不同的机器上。 这些概念将在后面的章节中更详细地描述。
客户端库(Client Libraries)
ROS客户端库允许以不同编程语言编写的节点进行通信。 有一个核心ROS客户端库(RCL),它实现了不同语言的ROS API所需的通用功能。 这使得特定于语言的客户端库更易于编写,并且它们具有更一致的行为。
以下客户端库由ROS 2团队维护:
- rclcpp = C ++客户端库
- rclpy = Python客户端库
此外,ROS社区还开发了其他客户端库。 有关更多详细信息,请参阅ROS 2客户端库文章。
发现(Discovery)
节点的发现通过ROS 2的底层中间件自动发生。它可以总结如下:
1、当一个节点启动时,它会将其存在广播给具有相同ROS域的网络上的其他节点(使用ROS_DOMAIN_ID环境变量设置),其他节点响应此广播时发布自己的信息,以便节点间可以进行适当的连接并且可以进行通信。
2、节点定期广播其存在,这样即使在初始发现期之后也可以与新发现的实体建立连接。
3、节点在离线时通告其他节点。
节点只和与他们具有兼容的服务质量设置(Qos)的其他节点建立连接。
例子:talker-listener
打开两个终端分别执行两条命令:
ros2 run demo_nodes_cpp talker
ros2 run demo_nodes_py listener