5. Пользовательские сообщения и отдельный пакет интерфейсов

Зачем нужен собственный тип

Стандартные сообщения удобны, когда их смысл соответствует задаче. Если нужно передавать связанную структуру данных, можно определить собственный интерфейс. В пособии рассматривается сообщение с двумерными координатами.

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

Описание сообщения

В отдельном пакете на основе ament_cmake создайте каталог msg и файл Position2D.msg:

float64 x
float64 y

Это описание структуры, а не программа Python. При сборке ROS генерирует языковые представления сообщения. В CMakeLists.txt подключите генерацию интерфейсов через rosidl_generate_interfaces, а в package.xml укажите зависимости генерации и выполнения и принадлежность к группе пакетов интерфейсов. Полный пример конфигурации приведён в разделе 3.3 пособия.

Проверка после сборки

Для пакета с условным именем study_interfaces:

cd ~/ros2_ws
colcon build --symlink-install
source install/setup.bash
ros2 interface show study_interfaces/msg/Position2D

Если тип не найден, сначала проверьте результат сборки и подключённое окружение. Наличие .msg в исходниках само по себе не делает интерфейс доступным.

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

Создайте узел, принимающий /turtle1/pose и публикующий только координаты в собственном типе. Сравните значения входного и выходного топиков. Добавьте зависимость программного пакета от пакета интерфейсов.

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

  • Где задаются поля сообщения, а где выполняется его публикация?
  • Почему после изменения .msg требуется пересборка?
  • Как другой пакет узнаёт о зависимости от вашего интерфейса?

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