← На главную

Дрон учится летать без PID: RL-политика на 50 Гц

28.06.2026 04:17 · hackernews

Автор проекта по обучению дрона с подкреплением (RL) выложил детальный план. Ключевое решение: RL-политика будет напрямую управлять всеми 8 моторами на частоте 50 Гц через последовательный порт. Никакого традиционного PID-регулятора в цепи — только так политика получит полную власть перераспределять тягу при отказе моторов.

Особое внимание уделено шести классам отказов: одиночный мотор, соседняя пара (45°, смешанные CW/CCW), 90° однотипные, 135° смешанные, 180° однотипные и полная потеря ESC (каждый ESC управляет своим квадром). Самый тяжёлый случай — отказ двух однотипных моторов через 90°. Это единственный сценарий, который бьёт сразу по двум проблемам: дисбаланс крутящего момента по рысканию (оба отказавших мотора вращались в одну сторону) и пространственная асимметрия оставшейся геометрии тяги. Потери двух моторов одного направления оставляют 2 CW и 4 CCW (или наоборот). Чтобы сбалансировать рыскание, CW моторы должны работать вдвое сильнее CCW. При максимальной тяге 1393 гс на мотор потолок сбалансированной тяги — 5572 гс, чего хватит для поддержания соотношения тяги к весу 2:1 при массе дрона до 2.8 кг (аппарат весит 1 кг). Оставшиеся 6 моторов охватывают дугу 270°, так что управление по крену и тангажу сохраняется. Худший сценарий выживаем — дрон будет вращаться, но сможет зависнуть и мягко приземлиться.

Для симуляции автор использует MuJoCo — на CPU он быстр, а на Mac недоступны Isaac Lab и другие NVIDIA-инструменты. Одно твёрдое тело с 8 точками тяги — MuJoCo хватает, можно запустить ~128 параллельных сред на ноутбуке. Модель строится по замерам, а не по CAD: масса, тензор инерции (тест бифилярного маятника), кривые тяги моторов, их постоянная времени, точка газа висения. В симуляцию добавлены две вещи, которые обычно убивают перенос из симуляции в реальность для моторного управления: задержка моторов (20–50 мс до выхода на заданные обороты) и задержка цикла (15–30 мс от показаний IMU до изменения тяги). Задержка цикла рандомизируется агрессивно — меняется каждый эпизод и дрожит внутри эпизода, чтобы политика не привыкла к фиксированной задержке.

Всё остальное тоже рандомизируется: масса ±10%, константы тяги каждого мотора ±15% (дешёвые моторы неодинаковы, автор собрал 8 точек данных), центр масс, просадка батареи во время полёта, шум датчиков.

Тренировка — PPO через PufferLib. SAC отброшен: его эффективность по выборкам не нужна, ведь шаги симуляции почти бесплатны. PPO с кучей параллельных сред — то, что реально используется в работах по sim-to-real для полётов, и он лучше дружит с агрессивной рандомизацией. Два решения из литературы: критик получает «читерские» данные (какие моторы отказали, точные константы тяги, истинную скорость), а актёр видит только то, что дадут реальные сенсоры. Критик выбрасывается после тренировки. Обнаружитель отказов пока отсутствует — политика сама разбирается по последним 5 кадрам наблюдений и действий. При отказе двух однотипных моторов дрон физически не может удерживать курс — правильное поведение: махнуть рукой на рыскание, медленно вращаться вокруг вертикальной оси и сохранять горизонт. Если награда штрафует вращение, политика пожертвует креном и тангажом в погоне за недостижимым курсом. Mueller & D'Andrea показали то же для квадрокоптеров при потере одного мотора — их восстановившийся дрон всё время вращается. Здесь будет так же, намеренно.

Если политика покажет выживаемость в симуляции, её экспортируют в ONNX и запустят на RPi 4 (автор сомневается, стоит ли выбрать другой микроконтроллер). Сеть — ~45 тысяч параметров, inference занимает меньше миллисекунды, так что Pi не узкое место. 50-герцовый цикл будет читать attitude и гироскоп по serial, прогонять политику и писать 8 команд моторам. А потом — сам эксперимент: полёт, убийство моторов с пульта и проверка, научили ли миллионы симулированных крушений чему-то полезному.

Читать оригинал →