ImprovedComSatEnv — Спутник связи, управление орбитой (нормализованная, RL-совместимая)¶
На этой странице описана среда ImprovedComSatEnv, предназначенная для обучения и оценки контроллеров на основе обучения с подкреплением для спутника связи в продольном канале управления. Среда предоставляет нормализованный интерфейс наблюдений и действий, LQR-подобную формированную награду для точного отслеживания угловой скорости и орбитальной стабильности, а также реалистичные условия завершения.
Эталонная реализация находится в tensoraerospace/envs/comsat.py (класс ImprovedComSatEnv).
Краткое описание¶
- Пространство наблюдений: 4D, нормализовано в [-1, 1]
- Пространство действий: 1D, нормализовано в [-1, 1] (команда тангенциальной тяги)
- Цель: отслеживание изменяющейся во времени угловой скорости при поддержании стабильности орбитального радиуса
- Награда: LQR-подобные квадратичные штрафы за ошибку отслеживания угловой скорости, отклонение орбитального радиуса, радиальную скорость, абсолютную тягу, скорость изменения тяги и рывок тяги, плюс бонус за выживание
- Завершение: выход за безопасный орбитальный диапазон или достижение горизонта по времени
Наблюдение и действие¶
Пусть \(\dot\theta\) -- текущая угловая скорость (рад/с), \(\rho\) -- орбитальный радиус (км), \(\dot\rho\) -- радиальная скорость (м/с), а \(\dot\theta_{ref}(t)\) -- целевая угловая скорость.
Наблюдение на шаге \(t\) представляет собой 4-мерный вектор:
где
- \(\dot\theta_{max} = 0.1\) рад/с -- максимальная угловая скорость для нормализации,
- \(\Delta\rho_{max} = 100.0\) км -- максимальное отклонение радиальной позиции от номинала,
- \(\dot\rho_{max} = 200.0\) м/с -- максимальная радиальная скорость для нормализации,
- \(\rho_0 = 6371.0\) км -- номинальный орбитальный радиус (радиус Земли, настраивается),
- \(u_{t-1} \in [-1, 1]\) -- предыдущая нормализованная команда тяги.
Действие -- единственная нормализованная команда \(u_t \in [-1, 1]\). Она отображается в физическую тангенциальную тягу:
Функция награды¶
Среда использует LQR-подобную формированную награду с шестью квадратичными штрафными членами и бонусом за выживание. Награда за шаг:
с весами и масштабом по умолчанию:
Члены ошибки определяются как
Члены гладкости воздействия используют
Константа \(+0.1\) -- бонус за выживание, стимулирующий более длительные эпизоды.
Замечания:
- Больший \(w_{\dot\theta}\) акцентирует точное отслеживание угловой скорости (основная задача).
- \(w_\rho\) штрафует отклонение орбитального радиуса от номинала (малый вес для гибкости).
- \(w_{\dot\rho}\) демпфирует радиальную скорость для стабилизации орбиты.
- \(w_u, w_\Delta, w_{\Delta^2}\) регуляризируют расход энергии и плавность команд.
- Общий масштаб \(s\) удерживает награды в компактном численном диапазоне для стабильности RL.
Завершение и усечение¶
- Избыточная угловая скорость: если \(|\dot\theta| > 50 \cdot \dot\theta_{max} = 5.0\) рад/с, эпизод завершается досрочно со штрафом \(-10\).
- Избыточное радиальное отклонение: если \(|\rho - \rho_0| > 5 \cdot \Delta\rho_{max} = 500\) км, эпизод завершается досрочно со штрафом \(-10\).
- Избыточная радиальная скорость: если \(|\dot\rho| > 10 \cdot \dot\rho_{max} = 2000\) м/с, эпизод завершается досрочно со штрафом \(-10\).
- Усечение: эпизод усекается при достижении заданного горизонта (число временных шагов).
Динамика эпизода¶
На каждом шаге:
- Агент выдаёт \(u_t \in [-1, 1]\).
- Среда ограничивает \(u_t\) диапазоном \([-1, 1]\), отображает в тягу \(F_{u2}\) и продвигает внутреннюю модель спутника.
- Наблюдение \(\mathbf{o}_{t+1}\) строится с использованием нормализованных сигналов.
- Награда \(r_t\) вычисляется по формуле выше.
- Проверяются условия завершения/усечения.
Пример использования¶
import numpy as np
from tensoraerospace.envs.comsat import ImprovedComSatEnv
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)
# Эталон: плавная синусоидальная угловая скорость в рад/с
reference_signal = np.reshape(
sinusoid_vertical_shift(
tp=np.asarray(tps), frequency=0.05, amplitude=0.01, vertical_shift=0.0
),
(1, -1),
)
# Начальное состояние: [rho (км), rho_dot (м/с), theta_dot (рад/с)]
initial_state = np.array([6371.0, 0.0, 0.0], dtype=np.float32)
env = ImprovedComSatEnv(
initial_state=initial_state,
reference_signal=reference_signal,
number_time_steps=number_time_steps,
dt=dt,
initial_thrust=0.0,
use_initial_action_on_first_step=True,
nominal_rho=6371.0,
)
obs, info = env.reset()
done = False
while not done:
# простое пропорциональное управление по нормализованной ошибке угловой скорости
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)
Замечания по реализации¶
- Границы нормализации наблюдений (\(\dot\theta_{max}\), \(\Delta\rho_{max}\), \(\dot\rho_{max}\)) и пределы тяги определены внутри класса и при необходимости могут быть настроены.
- Веса награды доступны как атрибуты экземпляра (
w_theta_dot,w_rho,w_rho_dot,w_action,w_smooth,w_jerk,reward_scale) и могут быть изменены для соответствия конкретным целям управления. - Внутреннее представление состояния следует порядку
[rho, rho_dot, theta_dot](км, м/с, рад/с), но наблюдения нормализованы в[-1, 1]. - Номинальный орбитальный радиус
nominal_rhoпо умолчанию равен 6371.0 км (радиус Земли) и настраивается через конструктор.
Литература¶
tensoraerospace/envs/comsat.py-- полная реализация среды- Модель спутника связи:
tensoraerospace/aerospacemodel/comsat.py