Пошаговый пример: управление F‑16 с IHDP¶
Понятный пошаговый пример на базе example_ihdp_beautiful.ipynb: от создания опорного сигнала до запуска IHDP и интерпретации графиков. В конце — FAQ и советы.
Для более сжатой версии того же эксперимента см. Пример: IHDP на линейной F-16. Для сложной задачи слежения за синусоидой на нелинейной модели — Пример: IHDP на нелинейной F-16.
— Шаг 1. Время и опорный сигнал
Шаг 1. Время симуляции и опорный сигнал¶
Задаём дискретизацию и горизонт моделирования. Формируем ступенчатый опорный сигнал по углу атаки alpha: это цель, к которой агент будет стремиться, минимизируя ошибку слежения.
import numpy as np
from tensoraerospace.utils import generate_time_period, convert_tp_to_sec_tp
from tensoraerospace.signals.standard import unit_step
dt = 0.01 # дискретизация, с
tp = generate_time_period(tn=20, dt=dt) # массив шагов времени
tps = convert_tp_to_sec_tp(tp, dt=dt) # время в секундах для графиков
number_time_steps = len(tp)
# Заданная ступенька по углу атаки (5°) на 10‑м шаге
reference_signals = unit_step(degree=5, tp=tp, time_step=10, output_rad=True).reshape(1, -1)
Шаг 2. Инициализация среды F‑16¶
Создаём среду LinearLongitudinalF16-v0. Указываем начальное состояние, состав вектора состояний/выхода и канал управления (руль высоты — ele). Включаем tracking_states=["alpha"], чтобы ориентировать обучение на слежение за углом атаки.
import gymnasium as gym
env = gym.make(
'LinearLongitudinalF16-v0',
number_time_steps=number_time_steps,
initial_state=[[0], [0], [0]], # порядок: [theta, alpha, q]
reference_signal=reference_signals,
use_reward=False,
state_space=["theta", "alpha", "q"],
output_space=["theta", "alpha", "q"],
control_space=["ele"],
tracking_states=["alpha"],
)
obs, info = env.reset()
Шаг 3. Параметры Actor / Critic / Incremental model¶
IHDP использует три модуля:
Actor— нейросеть, выдающая управляющее воздействие по ошибке слежения.Critic— нейросеть, оценивающая функционал качества J(x) и его градиент.Incremental model— онлайн‑идентификация и локальная линеаризация динамики.
Параметры ниже подобраны под демонстрационный кейс: сильная персистентная составляющая (type_PE="combined") ускоряет идентификацию; высокие learning_rate уместны при коротком горизонте и насыщениях (WB_limits).
actor_settings = {
"start_training": 5,
"layers": (25, 1),
"activations": ("tanh", "tanh"),
"learning_rate": 2.0,
"learning_rate_exponent_limit": 10,
"type_PE": "combined",
"amplitude_3211": 15,
"pulse_length_3211": 5 / dt,
"maximum_input": 25,
"maximum_q_rate": 20,
"WB_limits": 30,
"NN_initial": 120,
"cascade_actor": False,
"learning_rate_cascaded": 1.2,
}
critic_settings = {
"Q_weights": [8],
"start_training": -1,
"gamma": 0.99,
"learning_rate": 15.0,
"learning_rate_exponent_limit": 10,
"layers": (25, 1),
"activations": ("tanh", "linear"),
"WB_limits": 30,
"NN_initial": 120,
"indices_tracking_states": env.unwrapped.indices_tracking_states,
}
incremental_settings = {
"number_time_steps": number_time_steps,
"dt": dt,
"input_magnitude_limits": 25,
"input_rate_limits": 60,
}
Шаг 4. Создание агента IHDP¶
Передаём агенту конфигурацию модулей и метаданные среды. Следите за согласованностью indices_tracking_states с порядком состояний среды.
from tensoraerospace.agent.ihdp.model import IHDPAgent
agent = IHDPAgent(
actor_settings,
critic_settings,
incremental_settings,
env.unwrapped.tracking_states,
env.unwrapped.state_space,
env.unwrapped.control_space,
number_time_steps,
env.unwrapped.indices_tracking_states,
)
Шаг 5. Основной цикл симуляции¶
На каждом шаге:
agent.predictвозвращает управляющее воздействие с учётом текущего состояния и опорного сигнала,- среда интегрирует динамику и возвращает новое состояние,
- при необходимости можно учитывать
reward(здесь отключён для чистоты контроля по слежению).
from tqdm import tqdm
xt = np.array([[0], [0], [0]]) # начальное состояние [theta, alpha, q]
for step in tqdm(range(number_time_steps - 3)):
ut = agent.predict(xt, reference_signals, step)
xt, reward, terminated, truncated, info = env.step(np.array(ut))
if terminated or truncated:
break
Шаг 6. Визуализация результатов¶
Сравниваем траекторию alpha с опорным сигналом и анализируем динамику wz. Сглаженность и отсутствие перерегулирования зависят от весов критика, ограничений и скоростей обучения.
env.unwrapped.model.plot_transient_process('alpha', tps, reference_signals[0], to_deg=True, figsize=(15, 4))
Ожидаемые признаки корректной работы:
- Ошибка
alphaбыстро стремится к нулю без устойчивых колебаний wzне выходит за физически разумные пределы и затухает- Управляющий сигнал (если вывести) не насыщается длительно
Note
Параметры обучения подобраны для демонстрации и могут отличаться от оптимальных для вашей задачи.
Sanity‑checks (быстрые проверки)¶
- Осреднённая абсолютная ошибка по
alphaза финальные 20% горизонта меньше 5–10% от амплитуды ступеньки - Нет длительного насыщения управляющего сигнала
- Дискретный шаг
dtсогласован с динамикой (нет «пилообразного» шума)
Единицы измерения и нормализация¶
- Углы
theta,alpha,qв моделях и графиках — в радианах, для визуализации переводим в градусы (to_deg=True) - Управление
ele— в радианах; ограничения задаются в тех же единицах - Если используете собственные признаки — нормализуйте входы для стабильного обучения
Частые вопросы и советы¶
-
Почему добавляется персистентное возбуждение (PE)? Для качественной идентификации инкрементальной модели требуется богатая динамика входа; иначе актор и критик быстро «залипают».
-
Как выбрать
Q_weightsу критика? Увеличение веса по ошибке слежения (например, поalpha) повышает приоритет точности слежения относительно энергозатрат. -
Что делать при дрожании управления? Снизьте
learning_rate, увеличьтеWB_limitsосторожно, ограничьтеmaximum_input/maximum_q_rate, проверьте масштабирование признаков. -
Как ускорить выход на режим? Поднимите
learning_rateактёра/критика, но следите за устойчивостью; увеличьте амплитуду PE, если идентификация идёт медленно.
См. также¶
- Обзор IHDP: алгоритм и гиперпараметры
- Пример: IHDP на линейной F-16 — сжатый вариант того же эксперимента.
- Пример: IHDP на нелинейной F-16 — слежение за синусоидой с feedforward.
- Пример: IHDP при отказе в полёте — как онлайн-идентификация восстанавливается после изменения динамики.

