Создание собственных типов сообщений
Сообщения - это одна из базовых сущностей 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