Drone X

Таймеры и частота: система с ритмом

5 блок(ов) теории · 12 заданий · 175 баллов

До сих пор ноды курса говорили по событию: пришло сообщение — сработал колбэк. Живой системе нужен собственный ритм: симулятор АКБ меряет заряд раз в секунду, heartbeat подтверждает линк десять раз в секунду, контур управления шлёт цели десятки раз. Ритм задаёт таймер — будильник внутри ноды: node.create_timer(период, колбэк) обещает вызывать функцию-колбэк каждые «период» секунд. Период — время между двумя срабатываниями; частота — число срабатываний в секунду, единица — герц (Гц). Величины взаимообратные: период = 1/частота, частота = 1/период. «10 Гц» — десять раз в секунду, то есть таймер с периодом 0.1 с; «1 Гц» — период 1.0 с. В моке курса таймер честен до деталей: он срабатывает, когда сим-время пересекает его дедлайн, и каждый тик переносит дедлайн на +период; никакого настенного времени — только детерминированный счёт симуляции.

Почему не цикл «while True: publish(); sleep(0.1)»? В реальном rclpy такой цикл занимает поток ноды: спящий main не пускает цикл событий к колбэкам — подписки молчат, соседние таймеры стоят. Таймер переворачивает задачу: нода лишь регистрирует «вызывай tick каждые 0.1 с», а разгружает ритм цикл событий; между тиками нода свободна и отвечает на всё остальное.

Частота — компромисс: чем она выше, тем свежее данные, но больше эфира и процессора уходит. Рабочие ориентиры стенда: плавная телеметрия вроде заряда АКБ — 1 Гц достаточно, заряд меняется медленно; heartbeat-линк — 10 Гц, молчание двух-трёх тиков уже тревога; цели управления — 50 Гц и выше, контуру стабилизации нужны частые обновления; событийные статусы (смена режима, авария) живут вовсе без расписания — по случаю.

Одна нода может нести несколько таймеров: у каждого свой период и свой колбэк — быстрый ведёт heartbeat, медленный публикует статус; состояние у них общее, это переменные одной ноды. При совпадении дедлайнов мок срабатывает таймеры в порядке создания; выключенный узел не тикает никакими таймерами — на этом строится инъекция отказа в симуляции. И о дрейфе: настоящий таймер отсчитывает следующий период после завершения колбэка — колбэк занял пять миллисекунд, тик опоздал на пять, потери накапливаются, поэтому реальная частота всегда чуть ниже заданной. В моке дрейфа нет: сим-время шагает дискретно и идеально — это свойство виртуального времени симуляции, а не недоработка курса.

Задания

0/12 заданий · 0/175 баллов

1. Зачем таймер, а не спящий цикл

10 балл(ов)

Коллега-новичок предлагает держать ритм циклом прямо в теле ноды: «while True: pub.publish(...); time.sleep(0.1)» — зачем тогда create_timer? Выберите вариант, который верно называет главный довод за таймер и объясняет, чем плох спящий цикл.

1 / 12