ROS服务和消息

ROS Service and Message

我正在使用ROS系统,我是初学者。 我在 ROS 中遇到了服务和消息(srv 和 msgs)。从 ros wiki,我设法理解像 msgs 用于定义传递的消息类型,而服务是关于请求和响应的。如有错误请指正。

然而,我无法理解何时使用它们。我认为,如果我有用 C++ 编写的模块和 Python 中的其他处理模块,这可能比我可以使用 srv 和 msgs 在两个模块之间进行通信更有用。但是,ROS 也有发布者和订阅者系统,可以用来代替吗?

其次,当我们使用 srv 时,我们只需要定义 msgs 还是可以独立使用?

首先,让我在这里指出你:

http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29

这是Ros tutorials给出的第一个例子。

发布者和订阅者是用来实现节点互通的实体。发布者 post 向频道发送消息,而订阅者收听此类频道以获取可能由发布者发送的消息。发布者 post 使用消息进行引导,并根据要实现的目标保存不同类型的数据。订阅者获取这些消息并自动执行 callback function 以实现对数据有用的东西。

现在让我指点你:

http://wiki.ros.org/ROS/Tutorials/WritingServiceClient%28c%2B%2B%29

是一个类似的例子,只不过这次是用服务来实现通信。与消息有关的是,一旦节点发布了一条消息,整个通信就结束了,节点将继续其剩余的工作。另一方面,客户端(他们使用服务)与服务器通信;他们向服务器发布消息,然后等待该服务器的响应。

示例:

  1. 假设您有两个节点:第一个节点创建并发布随机 int 数字,第二个节点获取这些数字并在屏幕上发布它们的方块。您可以想象我们只需要那里的消息:第一个节点不必等待第二个节点的答复。第一个节点将使用发布者提供整数,而第二个节点将使用订阅者获取这些整数并执行一个函数,该函数将post它们的平方。
  2. 假设你想用 ROS 实现一个井字游戏:现在你想要 3 个节点:其中 2 个是相同的,它们代表两个玩家,而第三个是人工智能处理董事会。现在 AI 将棋盘发布给玩家,但它还需要等待答案;该答案将是当前玩家会选择的举动。这就是必须在此处使用服务的原因。

如果您确定自己理解一个包含消息的简单程序和一个包含服务的简单程序,那么您可以通过创建示例来扩展您的知识,例如上面介绍的示例。只有这样,你才能完全掌握。

ROS publishing/subscribing 是多对多(在连接方面)和单向 数据传输。它是异步的,这意味着您的代码不会阻塞,您需要实现一个异步执行的回调函数。

另一方面,ROS 服务是同步的一对一双向数据传输,这意味着客户端会阻塞并等待服务器的响应。

考虑以下情况:

  1. 想想机器人和带有机器人模型的模拟器。模拟器需要实时更新机器人的模型(当现实世界中的机器人更改配置时,模拟器需要更新模型以反映该更改,以便模拟器中的机器人模型始终是最新的真实机器人的当前配置)。
  2. 想想一个控制机器人收银员的节点。此节点需要使用机器人的摄像头检测到客户才能开始交互。

在第一种情况下,您将需要一个 publishing/subscribing 模型,因为模拟器在执行其他操作时需要数据实时流动。因此机器人会将其关节值发布到一个主题,模拟器将使用回调函数订阅该主题,该回调函数将异步实时更新模拟器中的机器人模型。

然而,在第二种情况下,您不希望节点不断地检查客户,这不是您想要不断做的事情。您在程序逻辑中知道何时需要检测客户。当你第一次启动你的节点时,你知道你需要阻塞并等待客户进来。这里使用服务更合适。当您想要检测客户时,您会向服务器发送请求(结果您的程序会阻塞等待响应)。服务器将使用摄像头检测客户(使用某种检测算法)并相应地回复您。

一般来说,当您需要数据不断流动并希望异步处理这些数据时,您将使用 publishing/subscribing,而当您需要特定计算同步发生时,您将使用服务。