如何在 ZeroMQ 中完成相当于 ROS 服务的功能?

问题描述 投票:0回答:1

简而言之:如何在 ZMQ 中实现来自 ROS 的“服务”之类的东西?


ROS2 通常基于主题的订阅者和发布者,与 ZeroMQ 使用它们的方式相同:消息在路径下发布,只有订阅该路径(的基础)的客户端才能接收它。
但是 ROS2 还有一个称为服务的概念(docs),其中请求被推送到某个地址,并且侦听该地址的类似服务器的事物将发送回复。一个漂亮的 GIF:

这个概念的伟大之处在于,服务客户端不需要知道谁托管服务。它们仅通过名称匹配。

在 ZMQ 中,我希望实现类似的目标:我有一堆功能(服务?),我想将它们分布在一组套接字(服务器)上。我希望这些服务连接到单个客户端,并让该客户端进行调用,而客户端必须事先知道将要连接(例如,仅按名称调用服务)。 因此客户可能会致电:

/machine/valve /machine/leds /global/state

并将收到他们的回复。但可能来自单个或 2 或 3 个不同的节点,具体取决于正在运行的内容。

一种选择是在 ZMQ 中使用
PUB-SUB

SUB-PUB
来执行此类命令。客户端还将绑定订阅者来监听为命令发布的确认。但有一些限制:
i) 发布者不知道是否有订阅者,

ii) 无法判断发布的消息是否被丢弃,

iii) 无法阻止多个节点听同一个主题,导致函数双重执行。

另一个选项是

REQ-REP

,客户端为每个功能绑定一个

REQ
,节点与
REQ
连接。这里的主要缺点是客户必须事先拆分功能。
    

python networking ros zeromq
1个回答
0
投票

    XPUB/XSUB
  1. 与手工制作的代理一起使用,该代理会将响应发送到正确的套接字。

XPUB/XSUB with proxy

使用
    ROUTER/DEALER
  1. 与 REQ/REP。

Router example 在这两种情况下,我建议阅读 zguide,至少前五章,因为它涵盖了实现您的需求所需了解的大部分概念。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.