Глава 5. ROS subscriber

1. Цель занятия и обзор плана

Кратко обозначьте цели урока и ожидаемые результаты. Перечислите ключевые этапы занятия. В этой главе мы разберёмся:

  • что такое подписчик (subscriber / subscription) в ROS2 и как он связан с топиком и типом сообщения;

  • как написать и запустить subscriber на rclpy (Python);

  • как проверять, что сообщения реально приходят (CLI-инструменты + rqt_graph);

  • какие проблемы чаще всего ломают подписку (имя топика, namespace, QoS, тип сообщения);

  • как применить subscriber в задачах катамарана: приём телеметрии, мониторинг, диагностика и логирование.

Ожидаемый результат: после занятия вы сможете самостоятельно создать ноду-подписчик, настроить QoS, отладить подписку по топику и снять диагностические данные (в т.ч. в rosbag2).

2. Блок описательных знаний

2.1. Что такое subscriber в ROS2

Subscriber (subscription) — это объект внутри ноды, который подписывается на топик и получает сообщения заданного типа.

В ROS2 есть три опорные сущности:

  • Topic — «шина»/канал сообщений с именем (например, /cmd_vel).

  • Message type — формат данных (например, geometry_msgs/msg/Twist).

  • Subscription — «приёмник» в конкретной ноде, который слушает топик и вызывает callback при приходе данных.

/teleop_node (publisher) --->  /cmd_vel (topic, Twist)  --->  /controller_node (subscriber)

Если вы создали subscription, но не запустили rclpy.spin(node), callback не будет вызываться.

2.2. Callback и executor: когда и где выполняется код

Когда сообщение приходит в subscriber, ROS2 кладёт его во внутреннюю очередь (с учётом QoS), после чего executor вызывает ваш callback.

2.3. QoS: почему подписка «не работает», хотя топик есть

QoS (Quality of Service) задаёт правила доставки: надёжность, буфер, хранение, «долговечность» сообщений и т.д. Подробнее см. документацию ROS2 по QoS.

2.4. Типы сообщений и как их проверять

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

  • узнать тип топика:

ros2 topic info /cmd_vel

ros2 topic info /cmd_vel -v # флаг -v (verbose) дает более развернутую информацию о топике
  • посмотреть структуру сообщения:

ros2 interface show geometry_msgs/msg/Twist

Тут же вспоминаем, что один и тот же топик не может одновременно быть разных типов.

3. Блок процедурных знаний

3.1. Быстрая диагностика подписки (до написания кода)

  1. Убедитесь, что топик реально публикуется:

ros2 topic list
ros2 topic info /cmd_vel -v
  1. Посмотрите «живые» данные:

ros2 topic echo /cmd_vel
  1. Проверьте частоту:

ros2 topic hz /cmd_vel
  1. Посмотрите граф связей:

rqt_graph

Если echo показывает сообщения, но ваша нода молчит — почти всегда виноваты namespace/remap/QoS/тип сообщения/не вызван spin.

3.2. Подписчик на Python (rclpy): минимальный рабочий шаблон

Создаём пакет:

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python ros_subscriber_demo --dependencies rclpy std_msgs

Файл ros_subscriber_demo/ros_subscriber_demo/listener.py:

import rclpy
from rclpy.node import Node
from std_msgs.msg import String


class Listener(Node):
    def __init__(self):
        super().__init__('listener')
        self.subscription = self.create_subscription(
            String,          # тип сообщения
            'chatter',       # имя топика (без / => относительное, зависит от namespace)
            self.callback,   # функция обработки
            10               # depth (QoS: KeepLast(10))
        )
        self.subscription  # чтобы линтер не ругался

    def callback(self, msg: String) -> None:
        self.get_logger().info(f'I heard: "{msg.data}"')


def main(args=None):
    rclpy.init(args=args)
    node = Listener()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()


if __name__ == '__main__':
    main()

Подключаем запуск через setup.py (entry_points). В setup.py добавьте:

entry_points={
    'console_scripts': [
        'listener = ros_subscriber_demo.listener:main',
    ],
},

Собираем и запускаем:

cd ~/ros2_ws
colcon build
source install/setup.bash
ros2 run ros_subscriber_demo listener

Проверяем, что subscriber живой, подкинув тестовый publisher:

ros2 topic pub /chatter std_msgs/msg/String "{data: 'hello'}" -r 2

4. Дополнительные материалы

Установка ROS2 https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debs.html

https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debs.html

Официальная справка https://docs.ros.org/en/jazzy/Tutorials/Beginner-CLI-Tools.html

https://docs.ros.org/en/jazzy/Tutorials/Beginner-CLI-Tools.html

Телеграм-канал российского сообщества ROS https://t.me/rosrussia

https://t.me/rosrussia