Компьютерная модель квадрокоптера с ИИ-автопилотом на базе Unity ML Agents.
Данный проект включает в себя компоненты, отвечающие за корректную реализацию полёта квадрокоптера, и компоненты для проведения обучения с подкреплением.
Для управлением квадрокоптером используется компонент DroneInputsController, который способен принимать ввод как от клавиатуры (через новую Input System и старый Input Manager), так и программно от других модулей через свой метод SetInputs(throttle, pitch, yaw, roll). Каждый из 4-х винтов создаёт подъёмную силу и применяет её к Rigidbody квадрокоптера с помощью AddForceAtPosition(). Реактивный момент вращения иммитируется одним вызовом AddTorque() (здесь используется сумма всех подъёмных сил, умноженная на константу). Все силы сразу может применить один компонент QuadcopterComputer.CalculateMotorsForces(throttle, pitch, yaw, roll) (такой подход видится более эффективным), или их можно по-очереди вычислить и применить в соотвестующих компонентах DroneModtor.ApplyForce(rigidBody, throttle, pitch, yaw, roll) (такая возможность есть, но она не использована фактически).
Дополнительно реализованы ПИД-стабилизаторы для всех 4-х компонентов управляющего вектора. Стабилизация применяется к выходным управляющим сигналам из DroneInputsController в компоненте QuadcopterComputer, результирующие сигналы далее подаются в CalculateMotorsForces(). Различные варианты стабилизаторов есть в папке Drone/Stability. Также стабилизацию можно отключить.
Модель состояния квадрокоптера реализована классом DroneStateManager. Дрон может находиться в состояниях: посадка, авария, полёт. В зависимости от типа и скорости коллизии с другими объектами будет выбран соотвествующий статус.
Вся логика связанная с обучением находится в паке RL. Агент реализован классом DroneAgent. Для своей работы он требует наличия компонентов DroneInputsController для управления, QuadcopterComputer для применения сил, WaypointNavigator для отслеживания текущего маршрута. Агент вычилсяет награду в OnActionReceived() с помощью класса DroneAgentRewardProvider, который инкапсулирует вычисление различных частей суммарной награды (все отдельные награды находятся в RL/Rewards). Для контроля параллельного обучения множества агентов можно воспользоваться компонентами DroneTrainingManager (быстрая настройка всех агентов, задание парметров среды) и DroneTrainingStatistics (вывод статистики по наградам).
- Drone_Raycaster - использует несколько
RayPerceptionSensor3Dдля имитации работы лидара. Наиболее прост в обучении. - Drone_DepthSensor - использует
CameraSensorдля обработки карты глубины. Карта глубины получается из z-буффера в шейдереDepthMap(см. папку Rendering). Для обучения желательно установить маленький размер выходного изображения. Обучается гораздо дольше.
Все агенты также имеют набор из 12 скалярных наблюдений, они вычисляются в DroneAgent.CollectObservations():
IsLanded: [0, 1]IsDestroyed: [0, 1]WaypointDistance: [0, inf] или нормализованное значениеWaypointHeading.x,WaypointHeading.y: [-180, 180] или нормализованное значение - азимут и зенитAltitude: [0, inf] или нормализованное значениеLinearVelocity.x,LinearVelocity.y,LinearVelocity.z: [0, inf] или нормализованное значениеAngularVelocity.x,AngularVelocity.y,AngularVelocity.z: [0, inf] или нормализованное значение
В DroneAgent.ObservationSettings можно задать парамеры нормализация наблюдений. Для отладки удобно исползовать ненормализованные значения, для обучения - строго нормализованные.
Управление для всех агентов одинаковое:
throttle: [-1, 1] - базовое значение подъёмной силы, при использовании ПИД задаёт желаемую вертикальную скоростьpitch,roll: [-1, 1] - повороты относительно продольной и поперечной осей, при использовании ПИД задают желаемые углы поворотаyaw: [-1, 1] - поворот относительно вертикально оси, при использовании ПИД задаёт желаемыую скорость поворота
Работоспособность проверена в Unity 6. Для работы необходимо открыть одну из имеющихся сцен (Pillars и Road готовы для обучения агентов, остальные для проверки функционала). Все агенты упакованы с отдельные префабы в Prefabs/Drones. Некоторые сторонние компоненты и пакеты, а также текстуры не были включены в репозиторий для экономии места. Пакеты можно самостоятельно найти и скачать (они не влияют на работу), текстуры и материалы придётся заменить на свои.
GIF (качество и частота кадров снижены):
Изначально проект разрабатывался как форк Berkeley UnityDroneSim, но в ходе работы почти весь оригинальный код был заменён, поэтому я отвязал исходный репозиторий.




