【问题标题】:ROS Service and MessageROS 服务和消息
【发布时间】:2015-04-05 14:43:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: python c++ robotics ros


    【解决方案1】:

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

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

    这是Rostutorials给出的第一个例子。

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

    现在让我指出你:

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

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

    示例:

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

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

    【讨论】:

    • 作为第三个示例,也可以使用服务,以减少不必要的通信工作。例如,路径规划器可能不会订阅地图主题,而是仅在需要时请求地图(在这种情况下,发送给服务器的消息不包含任何内容)。这样做的好处是,新地图只需在实际需要时发送和处理。
    【解决方案2】:

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

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

    考虑以下情况:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多