简而言之:如何在 ZMQ 中实现来自 ROS 的“服务”之类的东西?
ROS2 通常基于主题的订阅者和发布者,与 ZeroMQ 使用它们的方式相同:消息在路径下发布,只有订阅该路径(的基础)的客户端才能接收它。
但是 ROS2 还有一个称为服务的概念(docs),其中请求被推送到某个地址,并且侦听该地址的类似服务器的事物将发送回复。一个漂亮的 GIF:
这个概念的伟大之处在于,服务客户端不需要知道谁托管服务。它们仅通过名称匹配。
在 ZMQ 中,我希望实现类似的目标:我有一堆功能(服务?),我想将它们分布在一组套接字(服务器)上。我希望这些服务连接到单个客户端,并让该客户端进行调用,而客户端必须事先知道将要连接(例如,仅按名称调用服务)。 因此客户可能会致电:
/machine/valve
/machine/leds
/global/state
并将收到他们的回复。但可能来自单个或 2 或 3 个不同的节点,具体取决于正在运行的内容。
一种选择是在 ZMQ 中使用
PUB-SUB
和
SUB-PUB
来执行此类命令。客户端还将绑定订阅者来监听为命令发布的确认。但有一些限制:i) 发布者不知道是否有订阅者,REQ-REP
,客户端为每个功能绑定一个
REQ
,节点与REQ
连接。这里的主要缺点是客户必须事先拆分功能。