Глава 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. Быстрая диагностика подписки (до написания кода)
-
Убедитесь, что топик реально публикуется:
ros2 topic list
ros2 topic info /cmd_vel -v
-
Посмотрите «живые» данные:
ros2 topic echo /cmd_vel
-
Проверьте частоту:
ros2 topic hz /cmd_vel
-
Посмотрите граф связей:
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 |