7. Сервисы ROS 2: запрос, ответ, клиент и сервер

Когда нужен сервис

Сервис реализует обмен «запрос — ответ». Клиент передаёт входные данные, сервер выполняет операцию и возвращает результат. Сервис подходит для короткого вычисления или команды, результат которой нужен вызывающей стороне. Промежуточного feedback-потока у обычного сервиса нет.

Контракт .srv содержит две части, разделённые строкой ---. Например, для учебного вычисления суммы:

float64 a
float64 b
---
float64 sum

Разместите интерфейс в каталоге srv пакета интерфейсов и включите его в генерацию. После сборки проверьте тип через ros2 interface show.

Разделение обязанностей

Сервер создаёт сервис ожидаемого типа и заполняет ответ в callback. Клиент создаёт клиентский объект, ожидает доступности сервиса и отправляет запрос. Асинхронный вызов возвращает future: ответ появится после обработки событий executor, а не немедленно в момент отправки.

Отдельно проверяйте доступность сервера, выполнение запроса и получение ответа. Наличие имени в списке сервисов ещё не доказывает корректность вычисления.

Практика

Реализуйте сервер суммы и клиент. Запустите их раздельно. Изучите список и тип сервиса:

ros2 service list -t
ros2 service type /sum

Для интерфейса study_interfaces/srv/Sum пример вызова:

ros2 service call /sum study_interfaces/srv/Sum '{a: 2.0, b: 3.0}'

Имена здесь учебные: они должны совпадать с вашим пакетом и сервером.

Самостоятельное задание

Проверьте положительные, отрицательные и нулевые входные значения. Остановите сервер и опишите поведение клиента при недоступности сервиса.

Самопроверка

  • Чем сервер отличается от подписчика на топик?
  • Почему длительное движение робота неудобно оформлять как блокирующий сервис?
  • Кто обрабатывает события, пока клиент ожидает ответ?

Основа урока: учебное пособие «Операционная система для роботов ROS 2», ИТМО, 2026, печатные страницы 47–53. Это учебный конспект с упражнениями; полные примеры и рисунки приведены в пособии.