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

North American X-15 (Нелинейная гиперзвуковая 6-DoF модель)

tensoraerospace.aerospacemodel.x15.nonlinear — полная нелинейная 6-DoF модель X-15 — гиперзвукового исследовательского аэрокосмолёта с Mach-табулированной аэродинамикой, ракетным двигателем XLR99 и переменной массой, охватывающая участок от сброса с B-52 (\(M = 0.83\), \(h = 45\,000\) ft) через гиперзвуковой пик (\(M = 6.7\), \(h = 102\,000\) ft) и до пост-выгорания (planирующий полёт).

Параметр Значение
Источник аэродинамики NASA TM X-1669 (Walker & Wolowicz 1968) + TM 2598
Диапазон Mach 0.4 — 6.7
Диапазон высот 0 — 250 000 ft
Конфигурации BASIC (X-15-1/3), A2 (X-15A-2 с внешними баками)
Двигатель Reaction Motors XLR99 — 57 000 lbf, throttle 30–100 %
Координаты NED, body axis, ZYX 321 Euler
Размерность состояния 13 (12-D твёрдое тело + масса топлива)
Управляющие поверхности Цельноповоротный стабилизатор, элероны, руль, throttle
Подсистема повреждений Хуки открыты (паритет с B-747), но события ещё не написаны

Геометрия и масса (Walker/Wolowicz, Thompson 2000)

S    = 200 ft²        (опорная площадь крыла)
b    = 22.36 ft       (размах)
c̄    = 10.27 ft       (САХ)
c.g. = 0.22 c̄         (центр масс)
Конфигурация Empty W, lb Топливо, lb Gross W, lb Iy, slug·ft² (full)
BASIC (X-15-1, X-15-3) 14 600 17 900 32 500 88 × 10³
A2 (рекордный самолёт) 16 050 30 900 46 950 110 × 10³

Масса и моменты инерции изменяются во времени: вектор состояния несёт канал m_prop (индекс 12), а параметры линейно интерполируют инерции по доле остатка топлива:

\[ I_i(t) = I_i^{\text{empty}} + \frac{m_\text{prop}(t)}{m_\text{prop}^\text{full}} \bigl(I_i^{\text{full}} - I_i^{\text{empty}}\bigr). \]

Опорные точки полёта

Пять опубликованных анкеров покрывают коридор активного полёта, основанные на NASA TM X-1669 Table 2 и циклограммах из Thompson 2000.

FC Метка h, ft M V, ft/s α₀, град δ_e₀, град Топливо, lb
1 boost_start 45 000 0.83 797 4.5 −2.5 17 900
2 boost_climb 70 000 2.5 2 412 5.0 −3.0 10 500
3 cruise_M4 100 000 4.0 3 865 4.0 −2.0 6 500
4 coast_high 200 000 5.0 4 876 10.0 −1.0 0
5 hypersonic_record 102 000 6.7 6 525 4.5 −2.0 2 000

Это точки траектории, а не trim-точки — см. Об отсутствии trim-конверта ниже.

Состояние и управление

State (13-D, body axis, NED, ZYX 321 Euler):

[u, v, w,           # body velocity, ft/s
 p, q, r,           # body angular rates, rad/s
 φ, θ, ψ,           # Euler angles, rad
 x_e, y_e, z_e,     # NED position, ft  (z_e положительное вниз ⇒ altitude = -z_e)
 m_prop]            # остаток топлива, lb

Control (4-D):

[δ_e,  δ_a,  δ_r,  δ_T]
   ↓     ↓     ↓     ↓
all-fly  ail  rud   throttle
 (рад)  (рад) (рад)   [0, 1]

X-15 имеет цельноповоротный горизонтальный стабилизатор (нет отдельного руля высоты на неподвижном стабе) — вся поверхность поворачивается целиком. Ограничения: \(|\delta_e| \le 15°\), \(|\delta_a| \le 15°\), \(|\delta_r| \le 8.5°\) (рулевая мощность мала из-за маленького клиновидного вертикального оперения), все ограничены скоростью \(60\,°/с\).

Гиперзвуковая аэродинамическая сборка

Коэффициенты интерполируются по числу Маха на сетке из 8 анкер-Mach точек, основанных на данных Walker/Wolowicz:

M_grid = [0.4, 0.8, 1.2, 2.0, 3.0, 4.0, 5.0, 6.7]

Производная подъёмной силы \(C_{L_\alpha}\) монотонно падает от \(\sim 3.5\) /рад на низких Mach до \(\sim 2.05\) /рад при \(M = 6.7\) — близко к ньютоновскому пределу 2 для острогранного гиперзвукового тела. Коэффициент сопротивления \(C_{D_0}\) имеет пик в трансзвуке (\(\sim 0.038\) при \(M = 1.2\)) и падает на гиперзвуке (\(\sim 0.022\)), когда ударная структура полностью прилегает.

Полные таблицы коэффициентов лежат в aero.py, включая:

Символ Покрытие
\(C_{L_0}, C_{L_\alpha}, C_{L_q}, C_{L_M}, C_{L_{\delta_e}}\) Продольная подъёмная сила
\(C_{D_0}, C_{D_\alpha}, C_{D_M}\) Продольное сопротивление
\(C_{m_\alpha}, C_{m_q}, C_{m_M}, C_{m_{\delta_e}}, C_{m_{\dot\alpha}}\) Момент тангажа
\(C_{Y_\beta}, C_{Y_p}, C_{Y_r}, C_{Y_{\delta_a}}, C_{Y_{\delta_r}}\) Боковая сила
\(C_{l_\beta}, C_{l_p}, C_{l_r}, C_{l_{\delta_a}}, C_{l_{\delta_r}}\) Момент крена
\(C_{n_\beta}, C_{n_p}, C_{n_r}, C_{n_{\delta_a}}, C_{n_{\delta_r}}\) Момент рысканья

Ракетный двигатель XLR99

Reaction Motors XLR99 (Thompson 2000, NASA SP-2000-4222):

  • Тяга на уровне моря \(T_{SLS} = 57\,000\) lbf.
  • Регулируемая от 30 % до 100 % — ниже 30 % двигатель считается выключенным.
  • Удельный импульс \(I_{sp} = 254\) с (значение sea-level используется по всему эпизоду — поправка вакуума ≤ 5 % игнорируется).
  • Расход массы на полной тяге: \(\dot m = T / I_{sp} \approx 224\) lb/с → 80 с выгорания для BASIC.
  • Выгорание автоматическое: при m_prop ≤ 0 двигатель возвращает нулевую тягу независимо от команды throttle.

В отличие от воздушно-реактивного JT9D Boeing 747, тяга ракеты не зависит от Mach и высоты — нет inlet recovery, нет ram-эффекта.

Уравнения движения

Стандартные Newton-Euler в body axis, идентичны модели B-747 (см. Boeing 747-100 Nonlinear для полного вывода). Эффект переменной массы добавляет 13-е уравнение состояния:

\[ \dot m_{\text{prop}} = -\dot m_e\bigl(\delta_T,\, m_{\text{prop}}\bigr). \]

Для соосного сопла стандартная форма «постоянная масса с текущим m» \(m\dot{\vec v} = \Sigma\vec F + \vec T\) точна (член скорости-выдува-массы уже учтён в том, что \(T\) трактуется как внешне-измеренная тяга). Масса и инерции в моментном уравнении пересчитываются при каждой оценке ODE, так что интегратор естественно видит правильные значения на протяжении всего выгорания.

Об отсутствии trim-конверта

В отличие от транспортных самолётов, у X-15 нет настоящего крейсерского конверта. XLR99 не может масштабировать тягу под сопротивление при любых \((M, h)\) — на полной тяге ракета подавляет сопротивление, и самолёт ускоряется / набирает высоту; ниже 30 % двигатель выключен, и самолёт обязан снижаться.

Доступны два режима тримминга:

  • trim(altitude, V, throttle) — фиксирует throttle, решает по \((\alpha, \delta_e, \gamma)\). Реалистичное поведение X-15: на полной тяге самолёт круто набирает высоту, после выгорания — планирует.
  • level_trim(altitude, V) — фиксирует \(\gamma = 0\), решает по \((\alpha, \delta_e, \delta_T)\). В большинстве случаев не сходится — отмечается через converged=False. Полезно только как sanity-check.

Glide-trim (после выгорания) сходится чисто на средних/низких высотах:

from tensoraerospace.aerospacemodel.x15.nonlinear import trim

# 30 kft, M ≈ 0.7, топлива нет
result = trim(altitude_ft=30_000.0, V_ft_s=800.0,
              throttle=0.0, propellant_lb=0.0)
print(f"α = {math.degrees(result.alpha_rad):+.2f}°")    # ~ 4°
print(f"γ = {math.degrees(result.gamma_rad):+.2f}°")    # ~ -6° (снижается)
print(f"converged = {result.converged}")                # True

Gymnasium env

Зарегистрирована как "NonlinearX15-v0". Три режима инициализации:

import gymnasium as gym
import tensoraerospace  # регистрирует env

# 1. По одной из 5 опубликованных trim-точек
env = gym.make("NonlinearX15-v0", flight_condition_id=2, number_time_steps=2000)

# 2. Trim-finder при произвольных (h, V) и throttle
env = gym.make("NonlinearX15-v0",
    trim_at=(30_000.0, 800.0), trim_throttle=0.0, number_time_steps=2000)

# 3. Произвольное 13-D начальное состояние
import numpy as np
env = gym.make("NonlinearX15-v0",
    initial_state=np.array([2412, 0, 211, 0,0,0, 0, 0.087, 0,
                            0, 0, -70_000, 10_500]),
    number_time_steps=2000)

Action space: либо "virtual" (физические единицы), либо "normalized" (для RL: [-1, 1]^4).

info-словарь после каждого шага содержит:

{"propellant_lb": ..., "engine_running": True / False}

так что RL-агенты могут планировать вокруг выгорания (например, выбирать throttle для продления активной фазы или переключаться в режим планирования после flameout).

Scope и ограничения

Этот MVP фокусируется на аэродинамическом конверте полёта. Вне скоупа первого выпуска:

  • Reaction Control System (RCS) — X-15 имел peroxide-двигатели для управления ориентацией выше ~ 250 kft, где аэродинамические поверхности теряют эффективность (низкое \(\bar q\)). Моделирование RCS добавляет 8 двигателей с per-thruster моделью отказов.
  • Унос абляционного покрытия — X-15A-2 терял ~ 100 lb абляционного материала за полёт на M=6.7. Незначимо для динамики, но заметно для отслеживания c.g.
  • Подсистема повреждений — в параметрах и модели открыты хуки damage_state (паритет с подсистемой повреждений B-747), но событий пока не написано. Engine flameout, surface jam, потеря эффективности управления могут быть добавлены при появлении задачи.
  • Стратопауза / мезосфера — выше 200 kft простая модель изотермической стратосферы, использованная здесь, расходится с US Std 1976 atmosphere более чем на 5 %. Плотности настолько малы (\(\rho \le 10^{-7}\) slug/ft³), что аэродинамические силы пренебрежимы — но точность траектории выше \(h = 200\) kft выиграет от более детальной атмосферы.
  • Момент от смещения тяги — линия тяги XLR99 моделируется соосной с body x. На самом деле двигатель сидит чуть ниже c.g., создавая небольшой носо-вниз момент, компенсируемый trim-табом. Незначимо для демо-задач управления, но стоит добавить для высокоточных расчётов реентри.

Связанные модули

Ссылки

  • NASA TM X-1669 — Walker H. J., Wolowicz C. H. Stability and Control Derivatives of the X-15 Airplane, NASA Flight Research Center, 1968.
  • NASA TN D-1402 — ранние данные устойчивости X-15.
  • NASA SP-2000-4222 — Thompson M. O. At the Edge of Space: The X-15 Flight Program. Включает расходы топлива XLR99 и envelope.
  • NASA TM 2598 — X-15A-2 advanced configuration reference.
  • Stevens B. L., Lewis F. L., Johnson E. N. Aircraft Control and Simulation, Wiley, 3rd ed., 2015 — body-axis Newton-Euler.