Skip to content

IliaTrofimov/UnityDroneSim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Unity Drone Simulator

Компьютерная модель квадрокоптера с ИИ-автопилотом на базе 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 (вывод статистики по наградам).

Агенты

  1. Drone_Raycaster - использует несколько RayPerceptionSensor3D для имитации работы лидара. Наиболее прост в обучении.
  2. Drone_DepthSensor - использует CameraSensor для обработки карты глубины. Карта глубины получается из z-буффера в шейдере DepthMap (см. папку Rendering). Для обучения желательно установить маленький размер выходного изображения. Обучается гораздо дольше.

Все агенты также имеют набор из 12 скалярных наблюдений, они вычисляются в DroneAgent.CollectObservations():

  1. IsLanded : [0, 1]
  2. IsDestroyed : [0, 1]
  3. WaypointDistance : [0, inf] или нормализованное значение
  4. WaypointHeading.x, WaypointHeading.y : [-180, 180] или нормализованное значение - азимут и зенит
  5. Altitude : [0, inf] или нормализованное значение
  6. LinearVelocity.x, LinearVelocity.y, LinearVelocity.z : [0, inf] или нормализованное значение
  7. AngularVelocity.x, AngularVelocity.y, AngularVelocity.z : [0, inf] или нормализованное значение

В DroneAgent.ObservationSettings можно задать парамеры нормализация наблюдений. Для отладки удобно исползовать ненормализованные значения, для обучения - строго нормализованные.

Управление для всех агентов одинаковое:

  1. throttle : [-1, 1] - базовое значение подъёмной силы, при использовании ПИД задаёт желаемую вертикальную скорость
  2. pitch, roll : [-1, 1] - повороты относительно продольной и поперечной осей, при использовании ПИД задают желаемые углы поворота
  3. yaw : [-1, 1] - поворот относительно вертикально оси, при использовании ПИД задаёт желаемыую скорость поворота

Запуск

Работоспособность проверена в Unity 6. Для работы необходимо открыть одну из имеющихся сцен (Pillars и Road готовы для обучения агентов, остальные для проверки функционала). Все агенты упакованы с отдельные префабы в Prefabs/Drones. Некоторые сторонние компоненты и пакеты, а также текстуры не были включены в репозиторий для экономии места. Пакеты можно самостоятельно найти и скачать (они не влияют на работу), текстуры и материалы придётся заменить на свои.

Демо

YouTube видео

GIF (качество и частота кадров снижены):

demo_1

demo_2

demo_3

demo_4

demo_5

PS

Изначально проект разрабатывался как форк Berkeley UnityDroneSim, но в ходе работы почти весь оригинальный код был заменён, поэтому я отвязал исходный репозиторий.

About

Simulating quadcopter drone in Unity

Topics

Resources

License

Stars

Watchers

Forks

Contributors 3

  •  
  •  
  •