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), а параметры линейно интерполируют
инерции по доле остатка топлива:
Опорные точки полёта¶
Пять опубликованных анкеров покрывают коридор активного полёта, основанные на 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):
X-15 имеет цельноповоротный горизонтальный стабилизатор (нет отдельного руля высоты на неподвижном стабе) — вся поверхность поворачивается целиком. Ограничения: \(|\delta_e| \le 15°\), \(|\delta_a| \le 15°\), \(|\delta_r| \le 8.5°\) (рулевая мощность мала из-за маленького клиновидного вертикального оперения), все ограничены скоростью \(60\,°/с\).
Гиперзвуковая аэродинамическая сборка¶
Коэффициенты интерполируются по числу Маха на сетке из 8 анкер-Mach точек, основанных на данных Walker/Wolowicz:
Производная подъёмной силы \(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-е уравнение состояния:
Для соосного сопла стандартная форма «постоянная масса с текущим 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-словарь после каждого шага содержит:
так что 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-табом. Незначимо для демо-задач управления, но стоит добавить для высокоточных расчётов реентри.
Связанные модули¶
- Boeing 747-100 (нелинейная 6-DoF) — тяжёлый воздушно-реактивный, дополнительная модель низких Mach и большой массы. Те же шаблоны кода.
- F-16 (нелинейная продольная) — истребитель, средние Mach с cubic-spline aero-таблицами.
- X-15 (линейная продольная) — legacy single-trim-point
state-space модель в FPS-единицах. Backward-compatible импорт:
from tensoraerospace.aerospacemodel.x15 import LongitudinalX15.
Ссылки¶
- 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.