TensorAeroSpace
Open-source аэрокосмический симулятор + библиотека адаптивного управления. Trim, fly, fail, recover — всё в чистом NumPy.
Зачем 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 модель для синтеза регулятора.»
- Выберите планер из галереи моделей.
- Используйте trim solver (
trim(altitude, V)) для нахождения операционной точки. - Линеаризуйте вокруг trim или запустите нелинейную симуляцию напрямую.
- Валидируйте против опубликованных cruise / loiter / hypersonic условий в docs.
Пример: Boeing 747 нелинейный, B-737 координированный поворот.
«Хочу benchmark нового агента на аэрокосмических задачах.»
- Drop-in любая из 20+ envs зарегистрированных через
gym.make("...-v0"). - Использовать встроенные PID / IHDP / SAC baselines для честного сравнения.
- Сравнить метрики с опубликованными comparison-исследованиями.
- Запушить обученную модель в Hugging Face через тот же wrapper.
Пример: SAC на B-747, IHDP vs PID на F-16.
«Исследую реконфигурацию управления после повреждения.»
- Используйте подсистему повреждений — surface jam, потеря эффективности, engine flameout, flap jam, отказ RCS.
- Декларативно компонуйте
DamageProfile. - Запустите online ADP-агент (ET-DHP, iADP, AIDI), который адаптируется в реальном времени.
«Изучаю динамику полёта или адаптивное управление.»
- Начните с cookbook — 16 step-by-step рецептов от "hello world" до FTC под повреждением.
- Прочитайте 11 уроков по state-space, controllability, RL fundamentals и hands-on practical (XFLR5 → Simulink → Python).
- Откройте любой 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.
-
Boeing 737 нелинейный
737-100 / 737-800 с JSBSim аэродинамикой, JT8D / CFM56-7B engine models, машинно-точный trim, MIMO IHDP пример координированного поворота.
-
X-15 hypersonic
M = 0.4 → 6.7, ракетный двигатель XLR99, переменная масса, 13-state vector с propellant-каналом. Время выгорания 79.8 с — соответствует Thompson 2000 с точностью 0.2 %.
-
Skywalker X8 малый UAV
Рецензированная flight-test идентификация (CEAS Aeronautical Journal 2025). 3.4 кг flying-wing, 3-канальное управление, propeller-airframe drag coupling.
-
B-747 damage subsystem v2
Помоторная асимметричная тяга + flap-jam configuration override + 5 готовых пресетов включая
LEFT_OUTER_ENGINE_FAILURE. -
Реструктуризация
example/Top-level сгруппирован по классу регулятора;
reinforcement_learning/разбит наincremental_adp/иdeep_rl/. 101 notebook, все пути обновлены в docs.
Featured-метрики¶
Реальные числа из исполняемых 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 |
Установка¶
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.