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

TensorAeroSpace

Open-source аэрокосмический симулятор + библиотека адаптивного управления. Trim, fly, fail, recover — всё в чистом NumPy.

Установить Quickstart Модели Алгоритмы

GitHub PyPI Hugging Face Python versions Downloads License Ask DeepWiki

Зачем TensorAeroSpace?

  • Реальные самолёты, не игрушки

    Каждая модель транскрибирована из рецензированных источников: NASA CR-2144 (B-747), NASA TM X-1669 (X-15), CEAS Aeronautical Journal 2025 (Skywalker X8), JSBSim (B-737), Roskam Vol VI + class-II UAV литература (RQ-7 Shadow). Trim-точки достигают машинной точности; cross-validated против опубликованных производных.

  • Ядро — чистый NumPy

    Никаких проприетарных симуляторов, MATLAB-лицензий и скомпилированных бинарников. 6-DoF Newton-Euler ОДУ на порядок быстрее JSBSim для свипов синтеза управления, и тривиально дифференцируема для adjoint-методов.

  • Уникальный каталог адаптивного управления

    Стандартный RL-стек (PPO, SAC, DDPG, DQN, A2C, A3C, GAIL) плюс полное семейство incremental-ADP (IHDP, IM-GDHP, ET-DHP, iADP, AA-INDI, AIDI) — редко встречаются в одном open-source пакете. Всё через единый Gymnasium API.

  • Подсистема повреждений из коробки

    Per-surface потеря эффективности, hard-overs, jam-события, асимметричная тяга при отказе двигателя, override конфигурации flap-jam — всё компонуется в DamageProfile. Работает на B-747 и F-16 без дополнительных настроек; хуки паритетны на остальных самолётах.

  • Native Gymnasium

    Каждая среда реализует стандартный контракт reset() / step() / action_space / observation_space. Drop-in в любой Gymnasium / Stable Baselines3 / CleanRL pipeline.

  • Постоянно проверяется

    Сходимость trim, конвенции знаков отклонения поверхностей, время выгорания топлива — всё зафиксировано 894 unit-тестами с регрессионным покрытием на каждый push.


30-секундный старт

import gymnasium as gym
import tensoraerospace  # регистрирует все envs
import numpy as np

env = gym.make("NonlinearB747-v0", trim_at=(20_000.0, 674.0),
               number_time_steps=2000, dt=0.01)
obs, _ = env.reset()
trim_action = np.array([-0.0126, 0.0, 0.0, 0.555])  # rad / [0, 1]
for _ in range(2000):
    obs, _, _, trunc, _ = env.step(trim_action)
    if trunc: break

print(f"V={float(np.linalg.norm(obs[:3])):.1f} ft/s, "
      f"alt={-float(obs[11]):.0f} ft")
# → V=674.0 ft/s, alt=20000 ft  (идеальное удержание trim)
import gymnasium as gym
import numpy as np
from tensoraerospace.agent.pid import PID
from tensoraerospace.utils import generate_time_period
from tensoraerospace.signals.standard import unit_step

dt = 0.01
tp = generate_time_period(tn=10, dt=dt)
ref = unit_step(degree=5, tp=tp, time_step=2.0,
                output_rad=True).reshape(1, -1)

env = gym.make('LinearLongitudinalF16-v0',
               number_time_steps=len(tp),
               initial_state=[[0], [0]],
               reference_signal=ref, use_reward=False)
pid = PID(env, kp=-14.29, ki=-8.24, kd=-1.30, dt=dt)

obs, _ = env.reset()
for t in range(len(tp) - 1):
    u = pid.select_action(ref[0, t], float(obs[0]))
    obs, _, term, trunc, _ = env.step(np.array([[float(u)]],
                                                dtype=np.float32))
    if term or trunc: break
from tensoraerospace.aerospacemodel.b747.nonlinear import trim
from tensoraerospace.envs.b747_nonlinear import NonlinearB747Env
from tensoraerospace.agent.ihdp.model import IHDPAgent
import numpy as np, math

# Trim на FL200 cruise
r = trim(altitude_ft=20_000.0, V_ft_s=674.0)
env = NonlinearB747Env(trim_at=(20_000.0, 674.0),
                        number_time_steps=3000, dt=0.02)

agent = IHDPAgent(actor_settings={...}, critic_settings={...},
                  incremental_settings={...},
                  tracking_states=["d_theta"],
                  selected_states=["d_theta", "q"],
                  selected_input=["d_elev"],
                  number_time_steps=3000,
                  indices_tracking_states=[0])

# Single-pass online learning — без offline pre-training
obs, _ = env.reset()
# ... запуск rollout ...
# → Late-half MAE θ = 0.043° на 1° ступеньке (4.3% амплитуды)
python example/reinforcement_learning/deep_rl/sac-b747-render.py \
    --render --dt 0.1 --tn 200 \
    --repo TensorAeroSpace/sac-b747 --device cuda

Или через Python:

from tensoraerospace.agent.sac import SAC
from tensoraerospace.envs.b747 import ImprovedB747Env

agent = SAC.from_pretrained("TensorAeroSpace/sac-b747")
env = ImprovedB747Env(dt=0.1, number_time_steps=200)
obs, _ = env.reset()
while True:
    action = agent.select_action(obs, evaluate=True)
    obs, _, term, trunc, _ = env.step(action)
    env.render(mode="human")
    if term or trunc: break

Библиотека самолётов

У каждой модели есть Gymnasium-среда, trim solver, полная 6-DoF динамика и рецензированные исходные данные.

Самолёт Класс Конфигурации Источник аэродинамики Особенность
F-16 Fighting Falcon Истребитель продольный · 6-DoF угловой · damage NASA / Stevens-Lewis tables Cubic-spline aero, полная damage-подсистема
Boeing 747-100 Тяжёлый транспорт NOMINAL · POWER_APPROACH · LANDING NASA CR-2144 (Heffley & Jewell) Помоторная асимметричная тяга + flap jam
Boeing 737-100/800 Средний транспорт 737-100 · 737-800 (NG) JSBSim + Roskam Vol VI Бенчмарки координированного поворота
X-15 Гиперзвуковой research BASIC · A2 record NASA TM X-1669 + Thompson 2000 Mach-table 0.4–6.7, XLR99 ракета, переменная масса
Skywalker X8 Малый UAV (3.4 кг) flying-wing CEAS Aeronautical Journal 2025 Рецензированная flight-test ID
AAI RQ-7 Shadow UAV класса II (170 кг) RQ-7B Beard & McLain + NASA TM-2014-218686 V-tail mixed control
Quadrotor Мультиротор nonlinear 6-DoF + damage Standard quad-X derivation Per-rotor отказы, X-config allocator
F-4C, ELV, ComSat, GeoSat, LSU, Ultrastick, UAV, Missile Linear / improved разные Roskam, AIAA conf Классический state-space + RL-friendly wrapper

Смотреть полную галерею моделей →


Каталог управления

20 алгоритмов, разбитых по семьям:

Алгоритм Описание
PID Классический PID с несколькими методами тюнинга
MPC Model-Predictive Control с MLP / NARX / Transformer моделями объекта

Классическая batch-trained ADP-семья:

Алгоритм Notebook
HDP (Heuristic Dynamic Programming) acd_hdp_b747.ipynb
DHP (Dual Heuristic Programming) acd_dhp_b747.ipynb
GDHP (Globalized Dual HP) acd_gdhp_b747.ipynb
AD-HDP acd_adhdp_b747.ipynb
AD-GDHP acd_adgdhp_b747.ipynb
AD-DHP acd_addhp_b747.ipynb

Онлайн single-pass adaptive critic — уникальная часть каталога:

Алгоритм Слежение за командой / крейс Сценарии повреждения
IHDP F-16 sin-α, B-747 θ-step, B-737 90° turn, quadrotor failure recovery
IM-GDHP F-16 нелинейный
ET-DHP F-16 синусоида B-747 engine-out (0.28° ψ-error), F-16 damage
iADP F-16 нелинейный F-16 damage
AA-INDI F-16 нелинейный
AIDI F-16 damage

Стандартный model-free RL-стек:

Алгоритм Тип Pretrained checkpoint
SAC Off-policy actor-critic HF: TensorAeroSpace/sac-b747
DSAC Distributional SAC step-response & tracking варианты
PPO On-policy clipped objective 8 самолётов
DDPG Deterministic policy gradient B-747
DQN Discrete value iteration B-747, Unity
A2C Synchronous actor-critic B-747 + NARX critic
A3C Asynchronous A-C B-747
GAIL Generative imitation F-16 dataset

Архитектура

┌────────────────────────────────────────────────────────────────────────┐
│                        пакет tensoraerospace                           │
├──────────────────┬──────────────────────┬───────────────────────────────┤
│  aerospacemodel  │         envs         │            agent              │
├──────────────────┼──────────────────────┼───────────────────────────────┤
│  pure-NumPy      │   Gymnasium-spec     │   Classical · ADP · Deep RL   │
│  6-DoF dynamics  │   обёртки            │   PID, IHDP, ET-DHP, SAC, ... │
│  Trim solvers    │   "virtual" /        │   Все потребляют Gym env API  │
│  Damage subsys.  │   "normalized"       │                               │
│                  │   action modes       │                               │
└──────────────────┴──────────────────────┴───────────────────────────────┘
                         Gymnasium / SB3 / CleanRL  ← любой RL pipeline подключается

Три пакета слабо связаны. Можно использовать dynamics автономно (без Gym), env без агента (просто обёртка), или построить свой регулятор против любой модели. Единый Gymnasium API на linear / nonlinear / damaged моделях означает, что код регулятора портируется без изменений.


Сценарии использования

«Нужна точная 6-DoF модель для синтеза регулятора.»

  1. Выберите планер из галереи моделей.
  2. Используйте trim solver (trim(altitude, V)) для нахождения операционной точки.
  3. Линеаризуйте вокруг trim или запустите нелинейную симуляцию напрямую.
  4. Валидируйте против опубликованных cruise / loiter / hypersonic условий в docs.

Пример: Boeing 747 нелинейный, B-737 координированный поворот.

«Хочу benchmark нового агента на аэрокосмических задачах.»

  1. Drop-in любая из 20+ envs зарегистрированных через gym.make("...-v0").
  2. Использовать встроенные PID / IHDP / SAC baselines для честного сравнения.
  3. Сравнить метрики с опубликованными comparison-исследованиями.
  4. Запушить обученную модель в Hugging Face через тот же wrapper.

Пример: SAC на B-747, IHDP vs PID на F-16.

«Исследую реконфигурацию управления после повреждения.»

  1. Используйте подсистему повреждений — surface jam, потеря эффективности, engine flameout, flap jam, отказ RCS.
  2. Декларативно компонуйте DamageProfile.
  3. Запустите online ADP-агент (ET-DHP, iADP, AIDI), который адаптируется в реальном времени.

Пример: ET-DHP B-747 engine-out удержание курса (0.28°).

«Изучаю динамику полёта или адаптивное управление.»

  1. Начните с cookbook — 16 step-by-step рецептов от "hello world" до FTC под повреждением.
  2. Прочитайте 11 уроков по state-space, controllability, RL fundamentals и hands-on practical (XFLR5 → Simulink → Python).
  3. Откройте любой notebook из галереи примеров и запустите локально.

Пример: Урок 1 — Введение в State-Space, Cookbook — Online-адаптивные агенты.


Что нового

  • AAI RQ-7 Shadow нелинейный

    Тактический UAV класса II, 170 кг, V-tail mixed convention, 4-канальное управление. Синтезирован из Beard & McLain + NASA TM-2014-218686 + Roskam Vol VI.

    model/aai_shadow_nonlinear

  • Boeing 737 нелинейный

    737-100 / 737-800 с JSBSim аэродинамикой, JT8D / CFM56-7B engine models, машинно-точный trim, MIMO IHDP пример координированного поворота.

    model/b737_nonlinear

  • X-15 hypersonic

    M = 0.4 → 6.7, ракетный двигатель XLR99, переменная масса, 13-state vector с propellant-каналом. Время выгорания 79.8 с — соответствует Thompson 2000 с точностью 0.2 %.

    model/x15_nonlinear

  • Skywalker X8 малый UAV

    Рецензированная flight-test идентификация (CEAS Aeronautical Journal 2025). 3.4 кг flying-wing, 3-канальное управление, propeller-airframe drag coupling.

    model/skywalker_x8_nonlinear

  • B-747 damage subsystem v2

    Помоторная асимметричная тяга + flap-jam configuration override + 5 готовых пресетов включая LEFT_OUTER_ENGINE_FAILURE.

    model/b747_nonlinear

  • Реструктуризация example/

    Top-level сгруппирован по классу регулятора; reinforcement_learning/ разбит на incremental_adp/ и deep_rl/. 101 notebook, все пути обновлены в docs.

    example README


Реальные числа из исполняемых example-notebook:

Сценарий Результат Источник
B-747 ET-DHP heading hold под отказом двигателя ψ-error 0.28° vs open-loop −85.5° notebook
B-737 MIMO IHDP координированный поворот 90° финальная ψ-error 0.98°, max сайдслип 0.11° notebook
B-747 IHDP ступенька θ (1°) late-half MAE 0.043° notebook
X-15 boost-burnout (full throttle) выгорание 79.8 с vs Thompson 2000: 80 с model
Skywalker X8 cruise trim машинная точность (residual 1e-15) model

Установка

pip install tensoraerospace
poetry add tensoraerospace
git clone https://github.com/TensorAeroSpace/TensorAeroSpace.git
cd TensorAeroSpace
poetry install
docker run --rm -p 8888:8888 ghcr.io/tensoraerospace/tas-jupyter

Python 3.10–3.12, MATLAB не требуется, нет проприетарных code paths.


Ресурсы

📦 Пакет PyPI · GitHub · Hugging Face
📚 Документация Модели · Алгоритмы · Cookbook · Уроки
🧪 Примеры 101 notebook на GitHub
📊 Бенчмарки Comparison-исследования · Метрики
💬 Сообщество Issues · DeepWiki Q&A

Цитирование

Если вы используете TensorAeroSpace в исследовании, пожалуйста, сошлитесь:

@software{tensoraerospace,
  title  = {TensorAeroSpace: An Open-Source Aerospace Simulation and Adaptive Control Toolkit},
  author = {Mazaev, A. and contributors},
  year   = {2026},
  url    = {https://github.com/TensorAeroSpace/TensorAeroSpace},
  note   = {Pure-NumPy 6-DoF aerospace dynamics + Gymnasium envs + classical/adaptive/deep RL agents}
}

Для базовых аэродинамических источников — NASA CR-2144 (B-747), NASA TM X-1669 (X-15), CEAS Aeronautical Journal 2025 (Skywalker X8), JSBSim (B-737), Beard & McLain (Aerosonde / Shadow), Roskam Vol VI — пожалуйста, также сошлитесь на оригинальные references, перечисленные на странице каждой модели.


MIT licensed · построено на NumPy, PyTorch, Gymnasium · powered by aerospace research community.