Слайд 1 из 12
Дрон — стабилизация и испытания
У нас уже есть дрон, которым можно вручную управлять через Rigidbody. Но он не возвращается сам в горизонт: отпускание клавиши прекращает крутящий момент, а не стирает накопленную скорость. Сегодня сделаем копию сцены и добавим отдельный стабилизатор. На обложке показана именно задача пары: после наклона корпус должен плавно выровняться, при этом поворот Q и E вокруг вертикали остаётся доступным.
Слайд 2 из 12
Сравнение до и после
Запустите сохранённую сцену без стабилизатора и повторите короткое нажатие W. Пусть студенты сначала опишут наблюдение: дрон продолжает вращаться или остаётся наклонённым. Затем спросите, что нужно сделать автоматике. Если она просто тянет корпус к горизонту, он может проскочить его и качаться. Поэтому ответ состоит из двух частей: вернуть ошибку наклона к нулю и погасить скорость вращения. Эту мысль сначала проверим на графике, потом перенесём в Unity.
Слайд 3 из 12
Ошибка ориентации без углов Эйлера
Помните занятие о кватернионах? Мы не будем вычитать три показания transform.eulerAngles. Нам важно только одно геометрическое условие: локальная ось up дрона должна совпасть с мировой вертикалью. FromToRotation строит поворот от первого направления ко второму. Если корпус уже горизонтален, ошибка почти нулевая. Если наклонён, получаем ось и угол необходимого возврата. Рыскание вокруг вертикали при этом не задаётся заново.
Слайд 4 из 12
Возврат без торможения
Сначала нажмите «Без торможения». Линия пересекает ноль и снова уходит в другую сторону: система возвращает угол, но не убирает скорость. Попросите студентов назвать физический аналог — пружина без амортизатора. Затем нажмите «С торможением» и сравните движение. Можно самостоятельно подвигать kₚ и kᵈ. Это упрощённая модель одного угла, не точный расчёт Unity Rigidbody; она нужна, чтобы увидеть роль двух частей контроллера.
Слайд 5 из 12
Две части контроллера
Теперь запишем идею графика как угловое ускорение. Первая часть направлена к целевой ориентации, вторая сопротивляется уже имеющейся угловой скорости. Если добавить обычное торможение по всем трём осям, стабилизатор начнёт мешать повороту Q и E. Поэтому из angularVelocity вычтем компонент вдоль локального up и будем гасить только наклон. Коэффициенты не являются универсальными числами для любого дрона; их подбирают на конкретной сцене.
Слайд 6 из 12
Подготовьте вторую сцену
Не изменяйте исходную сцену напрямую: она нужна как контрольный случай. Скопируйте её под новым именем и только там добавьте стабилизатор. Проверьте, что на объекте по-прежнему один Rigidbody, а старые два скрипта тяги и ручного управления остались. Если между сценами поменять массу, демпфирование или начальную высоту, будет трудно понять, какая разница вызвана именно новым контроллером.
Слайд 7 из 12
Полный код `DroneAutoLevel.cs`
Разбираем код по этапам. Сначала берём Rigidbody и проверяем, что дрон не перевёрнут: этот учебный контроллер работает только в обычном диапазоне наклона. Затем FromToRotation находит поворот к горизонту. ToAngleAxis отдаёт угол в градусах, поэтому переводим его в радианы для формулы. Из angularVelocity убираем вращение вокруг локального up. Наконец, складываем возврат и торможение и вызываем AddTorque в мировых координатах. Полный файл копируется прямо со слайда.
Слайд 8 из 12
Почему `ToAngleAxis` недостаточно само по себе
Представьте маятник, который проходит нижнюю точку: по положению кажется, что он уже на месте, но скорость у него максимальна. С дроном то же самое. Ошибка угла около нуля не означает, что вращение остановилось. Поэтому одного кватерниона ошибки недостаточно для плавного поведения. Нам нужна ещё угловая скорость Rigidbody, и мы применяем момент против её части, отвечающей за наклон.
Слайд 9 из 12
Одинаковый манёвр в двух сценах
Давайте проверять не только на одном нажатии. Сделайте одинаковый короткий манёвр W в обеих сценах и сравните результат. Потом A проверит другую ось наклона. Затем Q и E: дрон должен по-прежнему уметь поворачиваться вокруг вертикали. Если стабилизатор почти блокирует Q/E, ищите ошибку в выделении tiltVelocity или слишком большое общее демпфирование. Сравнивать две сцены лучше при одинаковом времени удержания клавиши.
Слайд 10 из 12
Настройте коэффициенты
Теперь давайте подберём значения. Сначала меняйте только returnGain, оставив dampingGain прежним. Если возврат очень медленный, добавьте немного. Если дрон резко рвётся через горизонт, уменьшите. Затем настройте dampingGain, пока колебания не станут приемлемыми. Не называйте конкретное число правильным для любого проекта: физические параметры Rigidbody и шаг симуляции тоже влияют на поведение. Запишите финальные значения, чтобы можно было повторить опыт.
Слайд 11 из 12
Граница учебной модели
Честно обозначим, чего эта модель не умеет. В коде есть проверка переворота: если локальный up смотрит вниз, контроллер не пытается автоматически спасать дрон. Это отдельная сложная задача. Четыре винта на модели пока декоративные; силы действуют суммарно на Rigidbody. Позже можно будет заменить суммарную тягу силами в четырёх точках, но это не должно мешать понять нынешнюю пару и не входит в обязательный результат.
Слайд 12 из 12
Результат занятия
В конце покажите две сцены рядом или последовательно: одинаковое нажатие, разное поведение. На проверке мне важно не только увидеть выравнивание, но и услышать объяснение: кватернион показывает ошибку ориентации, а угловая скорость нужна для торможения. Проверьте Console и сохраните оба состояния. В следующем разделе курса мы перейдём к аэродинамике самолёта, где кроме ориентации будет важно направление движения относительно воздуха.