我正在使用ROS系统而且我是初学者。 我在ROS中遇到了Service和Message(srv和msgs)。从ros wiki中,我设法理解,msgs用于定义传递的消息类型,服务是关于请求和响应的。如果我弄错了,请纠正我。
然而,我无法理解何时使用它们。我想如果我用C ++编写的模块和Python中的其他处理模块可能会有用,也许我可以使用srv和msgs在2个模块之间进行通信。但是,ROS还有可以替代使用的发布者和订阅者系统吗?
其次,当我们使用srv时,我们只需要定义msgs或者可以独立使用?
答案 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 :(得分:0)
ROS发布/订阅是多对多(就连接而言)和单向 数据传输。它是异步的,这意味着您的代码将不会阻塞,并且您将需要实现一个将以异步方式运行的回调函数。
另一方面,ROS服务是同步的和一对一的双向数据传输,这意味着客户端将阻塞并等待服务器的响应。
考虑以下情况:
在第一种情况下,您将需要一个发布/订阅模型,因为模拟器将需要数据在执行其他操作时实时流动。因此,机器人会将其联合值发布到某个主题,模拟器将通过回调函数订阅该主题,该回调函数将异步实时更新模拟器中的机器人模型。
但是,在第二种情况下,您不希望节点不断检查客户,也不希望您不断进行。您需要在程序逻辑中知道何时需要检测客户。首次启动节点时,您知道需要阻止并等待客户进入。在这里使用服务更合适。当您想检测到客户时,便向服务器发送请求(结果是程序阻塞等待响应)。服务器将使用相机(使用某种检测算法)来检测客户,并相应地回复您。
通常来说,当您需要数据不断流动并且想要异步处理这些数据时,将使用发布/订阅;而当需要特定计算来同步进行时,则将使用服务。