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

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-мерный вектор:

\[ \mathbf{o}_t = \big[\underbrace{\mathrm{clip}\!\Big(\frac{\dot\theta(t) - \dot\theta_{ref}(t)}{\dot\theta_{max}},\,-1,\,1\Big)}_{\text{[0] norm\_theta\_dot\_error}},\; \underbrace{\mathrm{clip}\!\Big(\frac{\rho(t) - \rho_0}{\Delta\rho_{max}},\,-1,\,1\Big)}_{\text{[1] norm\_rho\_error}},\; \underbrace{\mathrm{clip}\!\Big(\frac{\dot\rho(t)}{\dot\rho_{max}},\,-1,\,1\Big)}_{\text{[2] norm\_rho\_dot}},\; \underbrace{u_{t-1}}_{\text{[3] prev action}}\big] \]

где

  • \(\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]\). Она отображается в физическую тангенциальную тягу:

\[ F_{u2}(t) = u_t \cdot F_{max}, \quad F_{max} = 25.0. \]

Функция награды

Среда использует LQR-подобную формированную награду с шестью квадратичными штрафными членами и бонусом за выживание. Награда за шаг:

\[ r_t = -\,s\,\Big(\,w_{\dot\theta}\,e_{\dot\theta}^2 \;+\; w_\rho\,e_\rho^2 \;+\; w_{\dot\rho}\,e_{\dot\rho}^2 \;+\; w_u\,u_t^2 \;+\; w_\Delta\,(\Delta u_t)^2 \;+\; w_{\Delta^2}\,(\Delta^2 u_t)^2\Big) \;+\; 0.1, \]

с весами и масштабом по умолчанию:

\[w_{\dot\theta}=5.0,\quad w_\rho=0.01,\quad w_{\dot\rho}=0.2,\quad w_u=0.001,\quad w_\Delta=0.01,\quad w_{\Delta^2}=0.001,\quad s=0.1.\]

Члены ошибки определяются как

\[ e_{\dot\theta} = \frac{\dot\theta(t) - \dot\theta_{ref}(t)}{\dot\theta_{max}},\qquad e_\rho = \frac{\rho(t) - \rho_0}{\Delta\rho_{max}},\qquad e_{\dot\rho} = \frac{\dot\rho(t)}{\dot\rho_{max}}. \]

Члены гладкости воздействия используют

\[ \Delta u_t = u_t - u_{t-1},\qquad \Delta^2 u_t = u_t - 2 u_{t-1} + u_{t-2}. \]

Константа \(+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\).
  • Усечение: эпизод усекается при достижении заданного горизонта (число временных шагов).

Динамика эпизода

На каждом шаге:

  1. Агент выдаёт \(u_t \in [-1, 1]\).
  2. Среда ограничивает \(u_t\) диапазоном \([-1, 1]\), отображает в тягу \(F_{u2}\) и продвигает внутреннюю модель спутника.
  3. Наблюдение \(\mathbf{o}_{t+1}\) строится с использованием нормализованных сигналов.
  4. Награда \(r_t\) вычисляется по формуле выше.
  5. Проверяются условия завершения/усечения.

Пример использования

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