ROS服务和消息

时间:2015-04-05 14:43:59

标签: python c++ robotics ros

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

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

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

2 个答案:

答案 0 :(得分:3)

首先,我来指点一下:

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

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

发布者和订阅者是用于实现节点互通的实体。发布者将消息发布到频道,而订阅者则倾听此类频道以获取发布者可能发送的消息。发布者使用消息发布到频道,并根据尝试实现的内容保存不同类型的数据。订阅者接收这些消息并自动执行callback function以实现对数据有用的内容。

现在让我指点一下:

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

这是一个类似的例子,但这一次,服务被用来实现沟通。带有消息的东西是,一旦节点发布消息,整个通信事情就结束了,节点继续完成其余的工作。另一方面,客户端(他们使用服务)与服务器通信;他们向服务器发布消息,然后等待该服务器的响应。

<强>示例:

  1. 想象一下,你有两个节点:第一个创建并发布随机的int数字,第二个节点获取这些数字并在屏幕上发布它们的方块。您可以想象我们只需要消息:第一个节点不必等待第二个节点的答案。第一个节点将使用发布者提供整数,而第二个节点将使用订阅者获取这些整数并执行将发布其正方形的函数。
  2. 想象一下你想要用ROS实现一个井字游戏:现在你想拥有3个节点:其中2个是相同的,它们代表两个玩家,而第三个是AI处理董事会。现在AI将棋盘发布给玩家,但它也需要等待回答;答案将是当前玩家选择的举动。这就是为什么必须在这里使用服务的原因。
  3. 如果您确定了解带有消息的简单程序和带有服务的简单程序,那么您可以通过创建示例来扩展您的知识,如上所示。只有这样,你才能完全掌握它。

答案 1 :(得分:0)

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

另一方面,

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

考虑以下情况:

  1. 考虑机器人和具有机器人模型的模拟器。模拟器需要实时更新机器人的模型(随着现实世界中机器人的配置发生变化,模拟器需要更新模型以反映该更改,从而使模拟器中的机器人模型始终保持最新状态。真实机器人的当前配置)。
  2. 考虑一个控制机器人收银员的节点。该节点需要使用机器人的摄像头检测客户,以开始互动。

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

但是,在第二种情况下,您不希望节点不断检查客户,也不希望您不断进行。您需要在程序逻辑中知道何时需要检测客户。首次启动节点时,您知道需要阻止并等待客户进入。在这里使用服务更合适。当您想检测到客户时,便向服务器发送请求(结果是程序阻塞等待响应)。服务器将使用相机(使用某种检测算法)来检测客户,并相应地回复您。

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