Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Создание новых сообщений для сервисов

#№# Что вы узнаете в этом разделе:

  • Как создать собственное сообщение для сервиса
  • Структуру файла .srv (запрос и ответ)
  • Как настроить сборку пакета для генерации сервисов
  • Как проверить, что сервис правильно создан
  • Как использовать созданные сервисы в программах

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

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

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

Для примера, мы разберем пример сервиса, который сложит три числа.

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

Создадим файл srv/AddThreeInts.srv

std_msgs/Int32 x
std_msgs/Int32 y
std_msgs/Int32 z
---
std_msgs/UInt32 sum

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

Важно отметить, что имя файла AddThreeInts.srv соответствует сообщению сервиса AddThreeInts.

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

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

В файл CMakeLists.txt необходимо обновить блок инструкции сборки в части rosidl_generate_interfaces, добавить ссылку на файл сервиса srv/AddThreeInts.srv)

find_package(geometry_msgs REQUIRED) 
find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/CPUInfo.msg" 
  "srv/AddThreeInts.srv" #Добавленно
  DEPENDENCIES std_msgs
)

Файл package.xml мы обновили, когда создавали сообщение для топиков.

Сборка и тестирование пакета

Соберем пакет

cd ~/user_ws
colcon build --packages-select robot_msgs
====
Starting >>> robot_msgs
Finished <<< robot_msgs [9.01s]

Summary: 1 package finished [9.22s]

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

ros2 interface list --only-srvs | grep Add
===
    diagnostic_msgs/srv/AddDiagnostics
    example_interfaces/srv/AddTwoInts
    robot_msgs/srv/AddThreeInts
    slam_toolbox/srv/AddSubmap

Мы видим созданные сообщения Сервиса robot_msgs/srv/AddThreeInts

Просмотрим информацию

ros2 interface show robot_msgs/srv/AddThreeInts
====
int32 x
int32 y
int32 z
---
int32 sum

Дополнительная информация

Официальная документация создание сообщений https://docs.ros.org/en/jazzy/Tutorials/Beginner-Client-Libraries/Custom-ROS2-Interfaces.html

Официальная документация с описанием системы сообщений https://docs.ros.org/en/jazzy/Concepts/Basic/About-Interfaces.html

Примеры созданного пакета и python программы https://github.com/voltbro/turtlebro2-examples/tree/master/ros2-base/chapter8