ROS服务和消息

ROS Service and Message

本文关键字:消息 服务 ROS      更新时间:2023-10-16

我正在使用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教程中给出的第一个示例。

发布者和订阅者是用于实现节点内部通信的实体。发布者向某个频道发布消息,而订阅者则收听这些频道以获取可能由发布者发送的消息。发布者使用消息发布到频道,这些消息包含不同类型的数据,具体取决于要实现的目标。订阅服务器接收这些消息并自动执行callback function,以实现对数据有用的东西。

现在让我给你指出:

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

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

示例:

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

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

ROS发布/订阅是多对多(就连接而言)和单向的数据传输。它是异步的,这意味着您的代码不会阻塞,并且您需要实现一个异步操作的回调函数。

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

考虑以下情况:

  1. 想象一个机器人和一个带有机器人模型的模拟器。模拟器需要实时更新机器人的模型(当现实世界中的机器人改变配置时,模拟器需要更新模型以反映这种变化,使得模拟器中的机器人模型总是与真实机器人的当前配置最新)
  2. 想象一个控制机器人收银员的节点。该节点需要使用机器人的摄像头检测客户以启动交互

在第一种情况下,您将需要一个发布/订阅模型,因为模拟器在做其他事情时需要数据实时流动。因此,机器人将向某个主题发布其关节值,模拟器将通过回调函数订阅该主题,该函数将实时异步更新模拟器中的机器人模型。

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

一般来说,当您需要数据不断流动并且希望异步处理这些数据时,您将使用发布/订阅,而当您需要同步进行特定计算时,则使用服务。