ImprovedMissileEnv — Управляемая ракета, отслеживание тангажа (нормализованная, RL-совместимая)¶
На этой странице описана среда ImprovedMissileEnv, предназначенная для обучения и оценки контроллеров на основе обучения с подкреплением в продольном канале управляемой ракеты. Среда предоставляет нормализованный интерфейс наблюдений и действий, формированную награду для точного и плавного отслеживания тангажа, а также реалистичные условия завершения.
Эталонная реализация находится в tensoraerospace/envs/rocket.py (класс ImprovedMissileEnv).
Краткое описание¶
- Пространство наблюдений: 4D, нормализовано в [-1, 1]
- Пространство действий: 1D, нормализовано в [-1, 1] (команда отклонения стабилизатора)
- Цель: отслеживание изменяющегося во времени задания по тангажу при сохранении плавности управления
- Награда: квадратичные штрафы за ошибку отслеживания тангажа, рассогласование угловой скорости тангажа с эталонной динамикой, абсолютное воздействие, скорость изменения и рывок воздействия (с масштабированием)
- Завершение: выход за безопасный диапазон тангажа или достижение горизонта по времени
Наблюдение и действие¶
Пусть \(\theta\) -- текущий угол тангажа (рад), \(q\) -- угловая скорость тангажа (рад/с), а \(\theta_{ref}(t)\) -- целевой тангаж.
Наблюдение на шаге \(t\) представляет собой 4-мерный вектор:
где
- \(\theta_{max} = 20°\) (внутри преобразуется в радианы),
- \(q_{max} = 5°/\text{s}\) (внутри преобразуется в рад/с),
- \(u_{t-1} \in [-1, 1]\) -- предыдущая нормализованная команда стабилизатора.
Важно: Вектор наблюдений уже нормализован и готов к использованию. Индекс [0] содержит нормализованную ошибку отслеживания тангажа, которая может использоваться непосредственно для пропорционального управления.
Действие -- единственная нормализованная команда \(u_t \in [-1, 1]\). Она отображается в физическое отклонение стабилизатора (град), затем преобразуется в радианы:
которое преобразуется в радианы перед передачей во внутреннюю модель ракеты.
Функция награды¶
Среда использует формированную награду с пятью слагаемыми, стимулирующими точность и плавность при штрафовании чрезмерного воздействия. Награда за шаг:
с весами и масштабом по умолчанию:
Примечание: вес отслеживания тангажа \(w_\theta = 8.0\) выше, чем в большинстве других сред (например, B747, ELV используют 5.0), что отражает необходимость более точного управления тангажом в задачах наведения ракет.
Члены ошибки определяются как
где \(\dot\theta_{ref}(t)\) -- конечно-разностная производная эталонного тангажа, вычисленная с шагом моделирования \(\Delta t\). Члены гладкости воздействия используют
Замечания:
- Высокий \(w_\theta = 8.0\) акцентирует точное отслеживание тангажа для задач наведения ракет.
- \(w_q\) демпфирует реакцию относительно наклона эталонного сигнала, снижая перерегулирование и колебания.
- \(w_u, w_{\Delta}, w_{\Delta^2}\) регуляризируют расход энергии и плавность команд, подавляя дребезг.
- Общий масштаб \(s\) удерживает награды в компактном численном диапазоне для стабильности RL.
Завершение и усечение¶
- Аварийное завершение: если \(|\theta| > \theta_{max}\), эпизод завершается досрочно и на этом шаге применяется большой штраф (\(-100\)).
- Усечение: эпизод усекается при достижении заданного горизонта (число временных шагов).
Динамика эпизода¶
На каждом шаге:
- Агент выдаёт \(u_t \in [-1, 1]\).
- Среда ограничивает \(u_t\) диапазоном \([-1, 1]\), отображает в \(\delta_{stab}^°\), преобразует в радианы и продвигает внутреннюю модель ракеты.
- Наблюдение \(\mathbf{o}_{t+1}\) строится с использованием нормализованных сигналов.
- Награда \(r_t\) вычисляется по формуле выше.
- Проверяются условия завершения/усечения.
Пример использования¶
import numpy as np
from tensoraerospace.envs.rocket import ImprovedMissileEnv
from tensoraerospace.signals.standard import sinusoid_vertical_shift
from tensoraerospace.utils import generate_time_period, convert_tp_to_sec_tp
dt = 0.01
tn = 200
tp = generate_time_period(tn=tn, dt=dt)
tps = convert_tp_to_sec_tp(tp, dt=dt)
number_time_steps = len(tp)
# Эталон: плавный синусоидальный тангаж в радианах (амплитуда 1 град)
reference_signal = np.reshape(
sinusoid_vertical_shift(
tp=np.asarray(tps), frequency=0.05, amplitude=np.deg2rad(1.0), vertical_shift=0.0
),
(1, -1),
)
# Начальное состояние: [u, w, q, theta] в единицах СИ
initial_state = np.array([0, 0, 0, 0], dtype=np.float32)
env = ImprovedMissileEnv(
initial_state=initial_state,
reference_signal=reference_signal,
number_time_steps=number_time_steps,
initial_elevator_deg=0.0,
use_initial_action_on_first_step=True,
dt=dt,
)
obs, info = env.reset()
done = False
while not done:
# простое пропорциональное управление по нормализованной ошибке тангажа в [-1, 1]
u = float(np.clip(2.0 * float(obs[0]), -1.0, 1.0))
obs, reward, terminated, truncated, info = env.step(np.array([u], dtype=np.float32))
done = bool(terminated or truncated)
Замечания по реализации¶
- Границы нормализации наблюдений (\(\theta_{max}, q_{max}\)) и пределы стабилизатора определены внутри класса и при необходимости могут быть настроены.
- Веса награды доступны как атрибуты экземпляра (
w_pitch,w_q,w_action,w_smooth,w_jerk,reward_scale) и могут быть изменены для соответствия конкретным целям управления. - Внутреннее представление состояния следует порядку
[u, w, q, theta]. Среда извлекает \(q\) по индексу 2 и \(\theta\) по индексу 3. Наблюдения нормализованы в[-1, 1]. - Модель ракеты принимает вход стабилизатора в радианах; среда выполняет преобразование из градусов автоматически (действие -> градусы -> радианы).
Литература¶
tensoraerospace/envs/rocket.py-- полная реализация среды- Модель динамики управляемой ракеты:
tensoraerospace/aerospacemodel/missile.py