Как я могу реализовать эквивалент службы ROS в ZeroMQ?Python

Программы на Python
Anonymous
Как я могу реализовать эквивалент службы ROS в ZeroMQ?

Сообщение Anonymous »

Короче: Как я могу реализовать что-то вроде «Сервиса» из ROS в ZMQ?

Обычно 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

Вернуться в «Python»