Сервисы

На уроках ранее мы познакомились с такой сущностью как топики. По сути, работа с ними, это "классическая" PubSub модель коммуникации. Использовать ее удобно, когда у нас есть постоянный поток данных.

Но это не единственная модель коммуникации. Сегодня мы поговорим об еще одной модели взаимодействия между модулями в ROS, это Сервис (Service).

Сервис (Service)

Эта модель коммуникации очень похожа на "удаленный" вызов функции. Один процесс вызывает функцию, а другой процесс обрабатывает Запрос и возвращает результат - Ответ.

В этой модели обработка данных происходит "синхронно", это означает что программа, отправившая Запрос "останавливается" в ожидании Ответа. И продолжает свое выполнение только после получения данных с результатом.

Рассмотрим простой сервис, который умеет складывать два числа.

Описания сервиса

Создание нового сервиса похоже на создание нового типа сообщения, то чем мы занимались на предыдущем уроке. Сначала, нам необходимо описать формат сообщения для Сервиса. В какой структуре посылается Запрос (ServiceRequest) ** и отправляется Ответ** (ServiceResponse).

Для этого нам необходимо создать в пакете папку srv и в ней файл с расширением .srv

В файле описания сервиса, первая часть (до разделителя ---) это описание сообщения Запроса, далее описание сообщения Ответа.

Файл srv/AddTwoInts.srv

uint32 x
uint32 y
---
uint32 sum

Так мы создали структуру из двух значений uint32 которые мы хотим сложить. И значение sum как результат работы нашего сервиса.

Важно отметить что имя файла AddTwoInts.srv, соответствует имени Сервиса AddTwoInts.

Генерация сообщений Сервиса

Для того, чтобы сообщения сервисов можно было использовать в ROS, необходимо добавить обработку этих файлов в процесс сборки пакета.

В файл CMakeLists.txt необходимо добавить блок

# Declare the service files to be built
add_service_files(FILES
    AddTwoInts.srv
)

И произвести сборку пакета.

Если все выполнено без ошибок, то мы можем убедиться что файл с описанием сервиса установлен верно. Для этого выполним поиск и фильтрацию .srv файлов утилитой rossrv

rossrv list | grep Add
====
base_ros/AddTwoInts

И мы можем просмотреть информацию о этом типе Сервиса:

rossrv info base_ros/AddTwoInts 
====
uint32 x

uint32 y

---

uint32 sum

Обучающее видео по Сервисам: https://youtu.be/_PRpH7zf5Ls

results matching ""

    No results matching ""