Unity среда¶
UnityAirplaneEnvironment — учебная Unity‑среда для задач обучения с подкреплением на самолёте: готовые сцены с усложнениями, настраиваемая физика и удобная Python‑обёртка под gym.
- Готовые сцены: базовая, птицы, обледенение, дождь, ветер
- Управление и физика:
AircraftManager, аэро‑модули, конфиги экспериментов - Python API:
get_plane_envиunity_discrete_env(дискретизация 3^7 действий) - Масштабирование: Docker, GPU, параллельные воркеры
Быстрый старт¶
- Соберите Unity build → Сборка среды в Unity
- Запустите и проверьте Python‑обёртку → Взаимодействие с Python
- Запустите обучение A3C в контейнере → Запуск в Docker (GPU/CPU, распределённо)
Исходники: tensoraerospace/UnityAirplaneEnvironment
Компоненты среды¶
Для моделирования движения самолёта используются следующие компоненты:
| Компонент | Назначение | Где используется/параметры |
|---|---|---|
| Rigidbody | Физический компонент в центре масс. Определяет массу и динамику. | Применяется к объекту центра масс ЛА |
| CentreOfGravity | Маркер центра масс летательного аппарата. | Ставится на центр масс ЛА |
| AeroBody | Расчёт аэродинамики для частей ЛА. Указывает группу и ссылку на Rigidbody. |
На каждом элементе (крылья, фюзеляж и т. п.) |
| AeroGroup | Коллекция ссылок на все AeroBody самолёта. |
На управляющем объекте ЛА |
| Thruster | Прикладывает тягу в корректной точке. | На пропеллер/двигатель |
| Elevator | Управляемые поверхности: рули, закрылки и т. д. | На подвижных частях крыла/оперения |
| AircraftManager | Физика и управление самолётом. Обрабатывает каналы управления. | Отдельный объект сцены |
| FlightDynamicsFlightManager | Ссылки на самолёт, центр масс, AircraftManager и конфигурацию эксперимента (ветер, стартовая поза и др.). |
Отдельный объект сцены |
Каналы управления (AircraftManager)¶
| Канал | Описание | Диапазон |
|---|---|---|
| Thrust | Тяга двигателя | Нормализованный: [-1, 1]; в дискретной обёртке: |
| Aileron | Элероны | [-1, 1] / |
| Elevator | Руль высоты | [-1, 1] / |
| ElevatorTrim | Триммер руля высоты | [-1, 1] / |
| Rudder | Руль направления | [-1, 1] / |
| FlapUp | Поднять закрылки | Тоггл/импульс |
| FlapDown | Опустить закрылки | Тоггл/импульс |
Note
В дискретной обёртке unity_discrete_env семимерное действие кодируется как одно целое число: 3 значения на канал ⇒ всего 3^7 действий.
Сцены Unity¶
Для обучения подготовлено 5 сцен (1 базовая и 4 с усложнениями). Сцены находятся по пути UnityAirplaneEnvironment/Assets/AlbLab3/Scenes.
MLAgentsScene — базовая
Базовая сцена со стандартными настройками самолёта.
MLAgentsSceneBirds — птицы
Периодически к самолёту прикладывается случайная сила.
Настройка: компонент Birds на объекте AircraftManager (Impact и интервал). Точки приложения — случайно крылья или нос. Величина — в диапазоне (Impact, 2 × Impact).
MLAgentsSceneCold — обледенение
Двигатель ограничен по мощности, возможна «остановка» тяги; органы управления могут замерзать.
Настройка: поле MaxThrust в AircraftManager; компонент Cold задаёт интервалы «заморозки» (на экране — надпись «controls frozen»).
MLAgentsSceneRain — дождь
Постоянный вертикальный вектор силы, направленный вниз.
Настройка: компонент Rain (поле Impact).
MLAgentsSceneWind — ветер
Параметры задаются в UnityAirplaneEnvironment/Assets/AlbLab3/Experiment Settings/ml_agent_wind.asset (скорость Wind speed, направления Wind Azimuth и Wind Elevator). В примере: скорость 10, Wind Elevator = 30.
Note
К самолёту применяется ускорение свободного падения g = 9.81.
Взаимодействие с Python¶
Ниже — минимальный пример получения gym-обёртки Unity-среды и опциональной дискретизации действий:
from tensoraerospace.envs.unity_env import get_plane_env, unity_discrete_env
# Путь к собранной Unity-сцене (пример для Linux)
UNITY_BUILD_PATH = "/path/to/linux_build/build.x86_64"
# Если среда запускается как отдельный процесс/сервер, задайте server=True и уникальный worker
env = get_plane_env(UNITY_BUILD_PATH, server=True, worker=0)
# Для дискретного пространства действий используйте обёртку
env = unity_discrete_env(env)
obs = env.reset()
done = False
total_reward = 0.0
while not done:
action = env.action_space.sample()
obs, reward, done, info = env.step(action)
total_reward += reward
env.close()
Tip
Если вы запускаете несколько копий среды параллельно, задавайте уникальный worker для каждого процесса и используйте server=True.
Сборка среды в Unity¶
- В Unity откройте меню File → Build Settings.
- Выберите сцену, целевую платформу и нажмите Build.
- Укажите папку для сборки исполняемого файла.
Запуск в Docker (GPU/CPU, распределённо)¶
Преимущества распределённого обучения на GPU: высокая производительность, естественный параллелизм (например, в A3C), ускорение обучения и возможность более крупных моделей. Для эффективной работы потребуется организация обмена и синхронизации между процессами/устройствами.
Пример Dockerfile c установленными зависимостями и запуском TensorBoard:
FROM pytorch/pytorch:2.2.0-cuda12.1-cudnn8-runtime
RUN pip install mlagents==1.1.0 scipy==1.5.4 tensorboard==2.17.0
RUN mkdir /workspace/logs
COPY a3c_example.py /workspace
ENTRYPOINT tensorboard --logdir /workspace/logs --port 8889 --host 0.0.0.0 & python /workspace/a3c_example.py
Скрипт обучения (A3C, несколько воркеров через worker_id):
from tensoraerospace.envs.unity_env import get_plane_env, unity_discrete_env
from tensoraerospace.agent.a3c import Agent, setup_global_params
def env_function(worker_id):
# /tf/linux_build/build.x86_64 — путь к собранному Unity-окружению внутри контейнера
return get_plane_env("/tf/linux_build/build.x86_64", server=True, worker=worker_id)
actor_lr = 0.0005
critic_lr = 0.001
gamma = 0.99
hidden_size = 128
update_interval = 1
max_episodes = 100
setup_global_params(actor_lr, critic_lr, gamma, hidden_size, update_interval, max_episodes)
agent = Agent(env_function, gamma)
agent.train()
Запуск контейнера с пробросом библиотеки и сборки Unity:
Warning
Для GPU внутри контейнера необходим nvidia-container-toolkit. На Windows используйте абсолютные пути в -v.
Пример запуска обучения¶
Связанные примеры¶
- Unity с DQN — обучение DQN-агента (дискретные действия)
- Unity с SAC — обучение SAC-агента (непрерывное управление)






