Создание собственных типов сообщений

Сообщения - это одна из базовых сущностей ROS. Ранее мы всегда использовали уже созданные типы сообщений. В этой главе мы научимся создавать собственные сообщения.

Работать с файлами необходимо в директории пакета my_package, который мы создали в прошлой главе.

Создание сообщений для Топиков (Topic)

Файлы с описанием сообщений необходимо сохранить в директории ./msg нашего пакета. При этом имя файла определяет название типа созданного сообщения.

Структура файла сообщений для Топиков очень проста, мы в строчку перечисляем переменные и тип этих переменных.

Например, мы хотим использовать данные с датчика давления и температуры BMP180. Мы предполагаем, что в одном сообщении нам необходимо передавать два значения: давление и температура (стандартные параметры для барометрических датчиков).

Создадим файл ./msg/Barometer.msg

uint16  pressure
float32 temperature

Мы описали, что тип сообщения Barometer состоит из двух переменных, значение давление (pressure) типа uint16 и температуры (temperature) типа float32

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

Файл CMakeLists.txt должен содержать директивы генерации.

add_message_files(FILES Barometer.msg)

И на случай, если у нас не было "стандартных" сообщений, их нужно тоже создать

generate_messages(DEPENDENCIES std_msgs)

Далее запустим сборку пакета

cd ~/catkin_ws
catkin_make --pkg=my_package

Мы увидим сообщения о генерации нашего сообщения для разных языков

....
[ 20%] Generating Lisp code from my_package/Barometer.msg
....
[ 60%] Generating C++ code from my_package/Barometer.msg
...
[ 80%] Generating Python from MSG my_package/Barometer

Проверим, что сообщение видно в системе (получим список всех сообщений и сделаем фильтр с названием нашего пакета)

rosmsg list | grep my_package
===

my_package/Barometer

Выведем информацию о сообщении

rosmsg show my_package/Barometer
===

uint16 pressure
float32 temperature

Мы можем подключить созданный тип сообщения в наш python скрипт

from my_package.msg import Barometer

Создание сообщений для Сервисов (Services)

Для создания нового сообщения сервисов нам необходимо определить специальное парное сообщение, состоящие из двух частей. Первая часть - это Запрос (Service Request), вторая часть - это Ответ (Service Response).

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

Например, файл для сервиса сложения srv/AddTwoInts.srv

uint32 a
uint32 b
---
uint32 sum

Файлы с описанием сервисов хранятся в директории srv и имеют расширение `.srv Подробное описание файла доступно на странице wiki http://wiki.ros.org/rosbuild/srv

При этом, имя файла AddTwoInts.srv соответствует имени типа AddTwoInts.

Для подключения генерации новый сообщений сервисов, нам необходимо в файле CMakeLists.txt добавить файл .srv для обработки

add_service_files(FILES
    AddTwoInts.srv
)

Запустим заново сборку пакета

cd ~/catkin_ws
catkin_make --pkg=my_package

Мы увидим сообщения о генерации нашего сообщения для разных языков

....
[  0%] Generating Python code from SRV my_package/AddTwoInts

Проверим наличии нового типа сообщений

rossrv list | grep my_
===
my_package/AddTwoInts

Сообщение найдено.

Для работы в python мы можем импортировать сообщение следующим образом

from my_package.srv import AddTwoInts, AddTwoIntsResponse, AddTwoIntsRequest

Создание сообщений для Экшенов (Actions)

Описание формата сообщений

Файлы описания действия (Action) находятся в директории ./action пакета имеют расширение .action и выглядят приблизительно так:

Пример файла с сообщением action/DoDishes.action

# Определение цели (goal)
uint32 dishes  # Сколько мыть тарелок
---
# Определение результата (result)
uint32 total_dishes_cleaned # Сколько всего было вымыто
---
# Определение обратной связи (feedback)
uint32 dishes_cleaned # Сколько вымыто посуды сейчас

На основе этого файла .action создаются 6 вспомогательных сообщений, чтобы клиент и сервер могли общаться. Создание всех этих сообщений происходит автоматически во время процесса сборки пакета.

Для файла DoDishes.action будут созданы файлы

DoDishesAction.msg
DoDishesActionGoal.msg
DoDishesActionResult.msg
DoDishesActionFeedback.msg
DoDishesGoal.msg
DoDishesResult.msg
DoDishesFeadback.msg

Дополнительная информация о работе с Действиями (Action) доступна на станице ROS wiki

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

Как мы уже делали ранее, в файле CMakeLists.txt необходимо внести новые директивы для обработки .action файлов add_action_files

 add_action_files(
   FILES
   DoDishes.action
 )

Также нам необходимо убедиться, что есть все базовые типы для сообщений, поэтому в блоке generate_messages должны быть добавлены сообщения actionlib_msgs

generate_messages(
   DEPENDENCIES
   actionlib_msgs
   std_msgs
 )

Запустим заново сборку пакета

cd ~/catkin_ws
catkin_make --pkg=my_package

При сборке пакета мы видим, что генерируются сообщения типа DoDishes

...
[  0%] Generating C++ code from my_package/DoDishesAction.msg
[  0%] Generating Python from MSG my_package/DoDishesAction
[  3%] Generating Python from MSG my_package/DoDishesResult
[  7%] Generating C++ code from my_package/DoDishesResult.msg
...

Проверим, что установка выполнена и сообщения доступны для использования

rosmsg list | grep DoDi
===
my_package/DoDishesAction
my_package/DoDishesActionFeedback
my_package/DoDishesActionGoal
my_package/DoDishesActionResult
my_package/DoDishesFeedback
my_package/DoDishesGoal
my_package/DoDishesResult

Все сообщения доступны для использования.

Для использования в python мы можем подключить наши сообщения следующим образом

from my_package.msg import DoDishesAction, DoDishesGoal

results matching ""

    No results matching ""