Модуль 3
Топики: издатель — говорим в эфир
4 блок(ов) теории · 12 заданий · 165 баллов
Издатель (publisher, «публикующий») — половинка топика, через которую нода отправляет сообщения. Создаётся вызовом node.create_publisher(тип, "имя/топика", depth): тип — один из четырёх классов std_msgs (String, Int32, Float32, Bool), имя — адрес канала, depth — глубина очереди. Сама публикация — метод издателя publish(сообщение): у std_msgs сообщение — объект с полем data, обычно одной строкой: String(data="READY") или Int32(data=9). Один вызов publish кладёт в топик ровно одно сообщение; регулярный поток издателю даст таймер — тема модуля 5, здесь работаем одиночными публикациями и читаем их из шины графа.
Третий аргумент depth — первый выход на QoS (Quality of Service, «качество обслуживания»): так называются правила доставки сообщений между издателем и подписчиком. В моке из всех политик QoS исполняется только depth — сколько последних сообщений топик хранит в своей истории; лишние вытесняются новыми. Напоминание из М1: depth в моке принадлежит топику — глубину фиксирует первый создатель топика (издатель или подписка), а не каждому издателю и каждому подписчику отдельно, как в реальном ROS 2; очередям и потерям посвящён модуль 6.
Имя топика — адрес в эфире: ведущий слэш и путь из snake_case-сегментов. Конвенция стенда: префикс /telemetry/ и имя данных — /telemetry/status, /telemetry/sats, /telemetry/armed, /telemetry/battery, /telemetry/link. Самодокументирующееся имя — половина диагностики: ros2 topic list без объяснений показывает, что где летает.
Тип выбирается под данные: заряд АКБ — Float32 (дробное), число спутников — Int32 (целое), флаг armed — Bool, текст статуса — String. Чтобы сообщение дошло, подписчику нужны ровно две вещи — имя топика и тип сообщения; discovery соединяет стороны сам. Из М1 сюда переносится урок порядка: подписчик, подключившийся после публикации, это сообщение не получит — топик по умолчанию ничего не хранит для опоздавших (семантика volatile, «летучая», нехранящая; очереди с хранением — тема модуля 6).
И строки-памятки из М1, чтобы привычки от мока не стали ложными: spin мока — шаговый executor, и его одиночный вызов не блокирует, а настоящий rclpy.spin блокирует: крутит цикл колбэков, пока ноду не остановят. Третья памятка — мок строже реальности: дубликат имени узла он считает ошибками, конфликт типов топика — тоже, а настоящий ROS 2 оба случая молча разруливает сам.
Задания
0/12 заданий · 0/165 баллов
1. Контракт подписчика: имя топика и тип
10 балл(ов)Собеседование в дрон-компанию продолжается: «что нужно знать подписчику, чтобы получить сообщение из топика?» Выберите вариант, который называет ровно тот минимум, без которого подписка не состоится, — и объясняет, почему сетевые адреса, файлы и номера процессов тут ни при чём.