3D-визуализация полёта¶
Оба нелинейных окружения F-16 предоставляют 3D-визуализацию полёта
через стандартный API Gymnasium env.render(). На сцене отображается
инерциальная траектория в виде затухающего следа в 3D, сам летательный
аппарат — глифом в текущей позе, а ниже размещается полоса синхронных
по времени графиков канонических состояний и отклонений органов
управления.
Быстрый старт¶
import gymnasium as gym
import numpy as np
import tensoraerospace # registers env_ids
env = gym.make(
"NonlinearAngularF16-v0",
initial_state=np.zeros(14),
number_time_steps=200,
dt=0.02,
airspeed=220.0,
render_mode="human",
)
env.reset()
for _ in range(200):
env.step(np.array([2.0, 5.0, 0.0])) # stab, ail, dir (deg)
fig = env.render()
fig.show()
Тот же шаблон работает и для NonlinearLongitudinalF16-v0 — форма
действия (1,) (только руль высоты), и след схлопывается в
вертикальную плоскость.
Режимы рендера¶
render_mode |
Что происходит |
|---|---|
None (по умолчанию) |
render() возвращает None. История позиции, ориентации и графиков всё равно накапливается, поэтому можно отрендерить позже, установив env.unwrapped.render_mode и вызвав render(). |
"human" |
render() возвращает plotly.graph_objects.Figure. Вызовите .show(), чтобы открыть в браузере или встроить в Jupyter. |
"rgb_array" |
render() возвращает массив numpy формы (H, W, 3) (PNG, декодированный через PIL). Требует kaleido (уже в зависимостях) и Pillow. При kaleido>=1 PNG рендерится через системный Google Chrome, который вы устанавливаете сами (он не входит в поставку TensorAeroSpace). Если Chrome отсутствует, render() бросает понятный RuntimeError; установите Chrome один раз командой poetry run plotly_get_chrome. |
"live" |
render() возвращает plotly.graph_objects.FigureWidget, обновляющийся при каждом вызове. Отобразите его один раз через from IPython.display import display; display(env.render()), затем вызывайте env.render() после каждого env.step(), чтобы продлевать след и трассы графиков на месте. Только для ноутбука (требует anywidget, входит в зависимости). |
Параметры конфигурации¶
| Параметр | По умолчанию | Описание |
|---|---|---|
airspeed |
200.0 (м/с) |
Истинная воздушная скорость, используемая для кинематической реконструкции позиции. Постоянна в течение эпизода. |
render_mode |
None |
Один из режимов выше. |
chart_states |
зависит от алгоритма | Имена каналов состояния модели, которые будут построены под 3D-видом. По умолчанию для угловой модели: ("alpha", "beta", "wx", "wy", "wz", "stab", "ail", "dir"). По умолчанию для продольной модели: ("alpha", "wz", "stab"). |
trail_length |
None |
Если задано, сохраняются только последние N точек следа. Полезно для длинных эпизодов, где полная траектория становится визуально перегруженной. |
Как реконструируется позиция¶
Векторы состояния модели F-16 не содержат ни инерциальной позиции, ни
истинной воздушной скорости. Визуализация реконструирует позицию
интегрированием скорости, исходя из предположения о постоянной
airspeed, а также аэродинамических углов и углов Эйлера из состояния:
- Скорость в связанной системе:
(V·cos α·cos β, V·sin β, V·sin α·cos β). - Матрица направляющих косинусов «связанная → инерциальная» из углов Эйлера (yaw-pitch-roll).
- Интегрирование явным методом Эйлера:
pos[t+1] = pos[t] + R · v_body · dt.
Для продольной модели угол тангажа θ интегрируется из wz
(в состоянии θ отсутствует). Крен, рысканье и угол скольжения
остаются нулевыми.
Это намеренно простой кинематический рецепт — без моделирования ветра, гравитации или тяги. Для высокоточной траектории интегрируйте полную 6-DoF трансляцию вне окружения.
Советы¶
- Поворот камеры: 3D-сцены Plotly по умолчанию вращаются мышью (перетаскиванием).
- Сравнение запусков: вызовите
env.render(), чтобы получитьgo.Figure, и добавьте в неё дополнительные трассы перед показом. - Экспорт в PNG: переключитесь на
render_mode="rgb_array"и сохраните черезimageioилиPIL.Image.fromarray(...).save("flight.png"). - Видеть только недавний след: задайте
trail_length=200, чтобы оставить лишь последние 200 точек (убирает визуальный шум на длинных эпизодах). - Живое обновление во время роллаута в ноутбуке: см. строку
render_mode="live"в таблице режимов рендера выше.
Примеры (ноутбуки)¶
example/visualization/example_f16_3d_angular.ipynb— разомкнутый вираж с креном на 6-DoF угловом окружении.example/visualization/example_f16_3d_longitudinal.ipynb— кабрирование и нейтраль на 2-DoF продольном окружении (след в вертикальной плоскости).