Модуль 4
Топики: подписчик — слушаем эфир
5 блок(ов) теории · 12 заданий · 170 баллов
Подписчик (subscriber) — вторая половинка топика: он получает сообщения, которые издатель кладёт в канал. Создаётся вызовом node.create_subscription(тип, "имя/топика", колбэк, depth) — те же четыре аргумента, что у издателя из модуля 3, только вместо сообщения подписке передаётся функция-обработчик. Колбэк (callback, «обратный вызов») — обычная Python-функция, которую пишет ваша нода, а вызывает не она: цикл событий сам запускает колбэк на каждое входящее сообщение. У std_msgs колбэк получает ровно один параметр — объект-сообщение с полем data: подписка на Float32 доставляет msg.data — число заряда, на String — строку статуса, на Bool — флаг.
Внутри колбэка — обычный Python, никакого «ROS-языка» для данных нет. Порог — сравнение msg.data с числом и действие по исходу. Фильтр — if, молча отсеивающий ненужные значения: не каждое пришедшее сообщение заслуживает реакции. Подсчёт — переменная-счётчик, которую колбэк увеличивает на каждом вызове. Наконец, преобразование — собрать из значения строку для человека или перевести единицы. Учебный стенд «Модуля» говорит в те же каналы, что и в модуле 3: /telemetry/battery, /telemetry/sats, /telemetry/status, /telemetry/armed, /telemetry/link.
Где исполняется колбэк? Не в момент publish и не на «сервере графа» — в самой ноде-подписчике, внутри rclpy.spin. Издатель только кладёт сообщение в транспорт; дальше оно проходит путь «очередь издателя → DDS-транспорт → очередь подписчика», и вынимать его оттуда должен цикл событий: spin разгружает очереди подписок своей ноды и по очереди вызывает колбэк на каждое сообщение. Отсюда главное правило подписчика: колбэк обязан быть коротким. Колбэки одной ноды исполняются строго по очереди, в одном потоке: пока один спит или крутит тяжёлый цикл, стоит вся нода — вторая подписка не получает, таймер не тикает. «Спать в колбэке» нельзя именно поэтому: блокируется обработка всех остальных сообщений ноды, а не только текущего канала; тяжёлую работу выносят из колбэка наружу. Реальный rclpy умеет и многопоточность: MultithreadedExecutor — исполнитель, разносящий колбэки по нескольким потокам; это API за границей мока, знать слово стоит, исполняет курс только однопоточный spin.
Задания
0/12 заданий · 0/170 баллов
1. Подписчик: функция-колбэк на каждое сообщение
10 балл(ов)Первая роль в паре pub/sub — принимающая. Собеседование в дрон-компанию продолжается: «что такое подписчик в rclpy?» Выберите вариант, который верно называет природу подписчика и объясняет, чем он не является: не отдельный процесс и не цикл, который пишут руками.