Service
Last updated
Last updated
Модель коммуникации в режиме Сервис представляет собой двунаправленную синхронную связь между клиентом (Service Client), создающим запрос, и сервером (Service Server), отвечающим на запрос. Синхронность в данном случае означает, что если наша программа отправит запрос, то до получения ответа от сервера программа находится в этой точке и ожидает результат.
Данный способ удобно использовать для периодической передачи данных или когда существует потребность в синхронной связи (режим запрос-ответ).
Сервер отвечает только тогда, когда есть запрос (Service Request) и клиент, который может получить ответ (Service Response). В отличие от модели работы с топиками, модель сервис работает с "одноразовыми" соединениями. Поэтому, когда цикл запрос и ответ завершен, соединение между двумя нодами будет прервано.
Формат запроса и ответа задается специальным парным Сообщением (Message), в котором есть два сообщения: первое для запроса (Service Request), второе для ответа (Service Response). Файлы с описанием сервисов хранятся в директории srv
и имеют расширение .srv
Подробное описание файла доступно на странице wiki http://wiki.ros.org/rosbuild/srv
В файле описания сервиса первая часть (до разделителя ---) - это описание сообщения запроса, далее описание сообщения ответа.
Например srv/AddToInts.srv
uint32 x
uint32 y
---
uint32 sum
При этом, имя файла AddToInts.srv
соответствует имени Сервиса AddToInts.
Для отладки и тестирования сервисов ROS существует специальная консольная утилита rosservice
:
rosservice call Выполнение запроса к серверу
rosservice find Поиск сервиса по типу
rosservice info Выводит информацию о сервисе
rosservice list Выводит список запущенных сервисов
rosservice type Выводит тип сообщений используемый сервисом
rosservice uri Выводит RPC URL сервиса
Примеры использования rosservice
:
Вызов сервиса service_name
c аргументами service-args
:
rosservice call /service_name service-args
Вызов сервиса my_service
с аргументами 1 и 2:
rosservice call /my_service 1 2
Для сложных сообщений аргументы с параметрами возможно писать в YAML синтаксисе, например:
rosservice call /my_service "{x: 1, y: 2}"
Подробно об использовании YAML http://wiki.ros.org/ROS/YAMLCommandLine.
rosservice list
Выводит список активных сервисов.
rosservice type /service_name
Выводит тип обрабатываемого сообщения.
$ rosservice type my_service | rossrv show
result:
int64 x
int64 y
---
int64 sum
Пример выводит описание типа сообщения для сервиса.