3. Топики: издатель, подписчик и наблюдение за данными

Идея обмена через топики

Издатель отправляет сообщения определённого типа, а подписчик получает их через callback. Издателю не нужно знать число подписчиков. Такой обмен подходит для потоковых данных: положения, изображений, измерений и команд скорости.

Узел turtlesim публикует положение черепахи и принимает команды движения. Название топика и тип сообщения — разные характеристики: одно имя не объясняет структуру передаваемых данных.

Исследуем готовую систему

Запустите в отдельном терминале:

ros2 run turtlesim turtlesim_node

В другом терминале с подключённым окружением выполните:

ros2 node list
ros2 topic list -t
ros2 topic info /turtle1/pose
ros2 interface show turtlesim/msg/Pose
ros2 topic echo /turtle1/pose

Для управления откройте ещё один терминал:

ros2 run turtlesim turtle_teleop_key

Двигайте черепаху и сопоставляйте изменение координат с выводом подписчика.

Создание своего узла

В Python-узле на основе rclpy.node.Node создайте подписку на /turtle1/pose. В callback сохраняйте x и y. Создайте издатель и таймер для периодической отправки выбранных данных. Зарегистрируйте исполняемую функцию в console_scripts пакета, пересоберите workspace и подключите его окружение.

Не заменяйте работу таймера бесконечным циклом внутри callback: такой цикл мешает обработке других событий.

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

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

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

  • Может ли у топика быть несколько подписчиков?
  • Почему одинаковое имя при несовместимых типах не обеспечивает обмен?
  • Для чего нужен executor и вызов spin?

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