Создание новых сообщений для сервисов
#№# Что вы узнаете в этом разделе:
- Как создать собственное сообщение для сервиса
- Структуру файла
.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