Перейти к содержанию

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, а также аэродинамических углов и углов Эйлера из состояния:

  1. Скорость в связанной системе: (V·cos α·cos β, V·sin β, V·sin α·cos β).
  2. Матрица направляющих косинусов «связанная → инерциальная» из углов Эйлера (yaw-pitch-roll).
  3. Интегрирование явным методом Эйлера: 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 продольном окружении (след в вертикальной плоскости).