Обычно ROS2 на основе подписчиков и издателей тем, точно так же, как их использует ZeroMQ: сообщения публикуются по пути, и их получают только клиенты, которые подписаны (база) на этот путь.
Но ROS2 также есть концепция, называемая службами (документами), где запрос отправляется на адрес, и нечто похожее на сервер, прослушивающее этот адрес, отправляет ответ. Хороший GIF:

Что хорошо в этой концепции, так это то, что клиенту службы не нужно знать, кто размещает службу. Они совпадают только по имени.
В ZMQ я надеюсь добиться чего-то похожего: у меня есть набор функций (сервисов?), которые я хочу распределить по набору сокетов ( серверы). Я хочу, чтобы эти службы подключались к одному клиенту и чтобы этот клиент совершал вызовы без, чтобы клиент заранее знал, что будет подключено (например, вызывая службу только по имени).
Итак, клиент может звонить:
Код: Выделить всё
/machine/valve
/machine/leds
/global/state
Один из вариантов — использовать PUB-SUB и SUB-PUB в ZMQ для таких команд. Клиент также привязывает подписчика к прослушиванию подтверждений, опубликованных для команд. Но есть некоторые ограничения:
i) издатель не будет знать, нет ли подписчиков,
ii) невозможно определить, было ли удалено опубликованное сообщение,
iii) невозможно предотвратить прослушивание одной и той же темы несколькими узлами, что приводит к двойному выполнению функций.
Другой вариант — REQ-REP< /code>, где клиент привязывает REQ для каждой функции, а узлы подключаются с помощью REQ. Основным недостатком здесь является то, что клиенту уже необходимо заранее разделить функциональность.
Подробнее здесь: https://stackoverflow.com/questions/786 ... -in-zeromq