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

ImprovedComSatEnv — Улучшенная среда управления спутником

ImprovedComSatEnv — это улучшенная версия среды управления спутником связи, специально разработанная для задач обучения с подкреплением. Включает нормализованные пространства действий и наблюдений, LQR-подобную функцию вознаграждения и множественные цели управления.

Ключевые особенности

  • Нормализованные пространства

    Пространства действий и наблюдений нормализованы к [-1, 1] для лучшей стабильности и сходимости при обучении.

  • Многоцелевое управление

    Отслеживание угловой скорости при поддержании стабильности орбиты, минимизации энергопотребления и обеспечении плавного управления.

  • LQR-подобное вознаграждение

    Квадратичная функция стоимости с настраиваемыми весами для различных целей управления.

  • Ограничения безопасности

    Автоматическое завершение эпизода при нарушении ограничений для обеспечения реалистичной работы спутника.

Описание среды

Пространство состояний

Среда отслеживает следующие переменные состояния:

Переменная Символ Описание Единицы
Радиальная позиция ρ Расстояние от центра Земли км
Радиальная скорость ρ̇ Скорость изменения радиуса м/с
Угловая скорость θ̇ Орбитальная угловая скорость рад/с

Пространство наблюдений

Нормализованный вектор наблюдений в диапазоне [-1, 1] из 4 компонент:

[
    norm_theta_dot_error,  # Нормализованная ошибка отслеживания угловой скорости
    norm_rho_error,        # Нормализованное отклонение радиальной позиции
    norm_rho_dot,          # Нормализованная радиальная скорость
    norm_prev_action       # Предыдущее управляющее воздействие (для плавности)
]

Пространство действий

Одно непрерывное действие, нормализованное к [-1, 1]:

  • u₂: Тангенциальная тяга
  • Диапазон: [-1, 1] (нормализованный)
  • Физический диапазон: [-25, 25] (условные единицы)
  • u₂ > 0: Ускорение (увеличение угловой скорости)
  • u₂ < 0: Торможение (уменьшение угловой скорости)

Функция вознаграждения

Вознаграждение вычисляется как отрицательная стоимость со следующими компонентами:

\[ r = -\text{scale} \cdot \left( w_{\theta} e_{\theta}^2 + w_{\rho} e_{\rho}^2 + w_{\dot{\rho}} e_{\dot{\rho}}^2 + w_u u^2 + w_{\Delta u} (\Delta u)^2 + w_{\Delta^2 u} (\Delta^2 u)^2 \right) \]

Где:

Вес Символ По умолчанию Описание
Угловая скорость w_θ̇ 10.0 Точность отслеживания (основная цель)
Радиальная позиция w_ρ 2.0 Стабильность орбиты
Радиальная скорость w_ρ̇ 0.5 Демпфирование скорости
Стоимость действия w_u 0.01 Энергоэффективность
Плавность w_Δu 0.05 Плавность управления
Рывок w_Δ²u 0.01 Подавление дрожания

Условия завершения

Эпизод завершается (terminated=True) со штрафным вознаграждением -100, если:

  1. Чрезмерная угловая скорость: |θ̇| > 0.02 рад/с (2× макс)
  2. Нестабильность орбиты: |ρ - ρ_nominal| > 500 км
  3. Чрезмерная радиальная скорость: |ρ̇| > 200 м/с (2× макс)

Эпизод прерывается (truncated=True) при достижении максимального числа временных шагов.

Быстрый старт

Базовое использование

import numpy as np
from tensoraerospace.envs import ImprovedComSatEnv
from tensoraerospace.signals.standard import unit_step
from tensoraerospace.utils import generate_time_period

# Генерация опорного сигнала
dt = 0.01
tp = generate_time_period(tn=20, dt=dt)
number_time_steps = len(tp)

# Скачок угловой скорости в момент t=10с
reference_signal = unit_step(
    degree=0.002, 
    tp=tp, 
    time_step=int(10.0/dt),
    output_rad=True
).reshape(1, -1) + 0.001  # Базовая линия 0.001 рад/с

# Начальное состояние: [rho (км), rho_dot (м/с), theta_dot (рад/с)]
initial_state = np.array([6371.0, 0.0, 0.001])

# Создание среды
env = ImprovedComSatEnv(
    initial_state=initial_state,
    reference_signal=reference_signal,
    number_time_steps=number_time_steps,
    dt=dt,
)

# Сброс и запуск
obs, info = env.reset()
for _ in range(100):
    action = env.action_space.sample()  # Замените на вашу политику
    obs, reward, terminated, truncated, info = env.step(action)
    if terminated or truncated:
        break

Обучение с PPO

from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import DummyVecEnv

# Оборачиваем среду
env = DummyVecEnv([lambda: ImprovedComSatEnv(...)])

# Создаём агента PPO
model = PPO(
    "MlpPolicy",
    env,
    learning_rate=3e-4,
    n_steps=2048,
    batch_size=64,
    n_epochs=10,
    gamma=0.99,
    gae_lambda=0.95,
    clip_range=0.2,
    ent_coef=0.01,
    verbose=1
)

# Обучение
model.learn(total_timesteps=100_000)

# Сохранение модели
model.save("ppo_comsat")

Параметры конфигурации

Границы нормализации

env.max_angular_velocity = 0.01  # рад/с
env.max_radial_velocity = 100.0  # м/с
env.max_radial_position_deviation = 500.0  # км
env.max_thrust = 25.0
env.nominal_rho = 6371.0  # км (радиус Земли)

Настройка весов вознаграждения

Настройте веса для различных приоритетов управления:

# Агрессивное отслеживание
env.w_theta_dot = 20.0  # Приоритет отслеживанию
env.w_smooth = 0.001    # Меньший штраф за неплавность

# Энергоэффективное управление
env.w_action = 0.1      # Выше стоимость энергии
env.w_theta_dot = 5.0   # Ослабить отслеживание

# Плавное управление
env.w_smooth = 0.1      # Высокий штраф за неплавность
env.w_jerk = 0.05       # Высокое подавление дрожания

Сравнение с базовой ComSatEnv

Особенность ComSatEnv ImprovedComSatEnv
Пространство действий [-60, 60] [-1, 1] (нормализовано)
Пространство наблюдений Ненормализованные [-1, 1] (нормализовано)
Функция вознаграждения Простая ошибка LQR-подобная многоцелевая
Штраф за неплавность
Энергоэффективность
Ограничения безопасности
Обработка начального действия

Советы по обучению

  1. Начните с весов по умолчанию: Веса вознаграждения по умолчанию обеспечивают хороший баланс для большинства задач.

  2. Настройте скорость обучения: Если обучение нестабильно, уменьшите скорость обучения до 1e-4 или ниже.

  3. Отслеживайте завершения: Если эпизоды завершаются слишком часто, ослабьте ограничения безопасности или улучшите начальную политику.

  4. Используйте curriculum learning: Начните с более простых опорных сигналов (меньшие скачки) и постепенно увеличивайте сложность.

  5. Нормализуйте опорный сигнал: Убедитесь, что опорный сигнал остаётся в разумных пределах для динамики спутника.

Документация API

ImprovedComSatEnv(initial_state, reference_signal, number_time_steps, dt=0.01, initial_thrust=0.0, use_initial_action_on_first_step=True, nominal_rho=6371.0, render_mode=None)

Bases: Env

Improved communication satellite environment with normalized spaces.

This environment provides
  • Normalized action space [-1, 1] for tangential thrust u2
  • Normalized observation space for better RL training
  • LQR-style reward function with multiple objectives:
    • Angular velocity tracking (theta_dot)
    • Orbital radius stabilization (rho)
    • Energy efficiency (minimize thrust)
    • Control smoothness
  • Realistic termination conditions

Attributes:

Name Type Description
action_space Box

Normalized action space [-1, 1].

observation_space Box

Normalized observation space.

max_angular_velocity float

Maximum angular velocity in rad/s.

max_radial_position_deviation float

Maximum radial deviation in km.

max_thrust float

Maximum tangential thrust magnitude.

Initialize ImprovedComSatEnv environment.

Parameters:

Name Type Description Default
initial_state ndarray

Initial state [rho, rho_dot, theta_dot] in SI units (km, m/s, rad/s).

required
reference_signal ndarray

Reference angular velocity trajectory in rad/s. Shape: (1, number_time_steps).

required
number_time_steps int

Total number of simulation steps.

required
dt float

Simulation time step in seconds. Defaults to 0.01.

0.01
initial_thrust float

Initial thrust value. Defaults to 0.0.

0.0
use_initial_action_on_first_step bool

If True, applies initial_thrust on first step. Defaults to True.

True
nominal_rho float

Nominal orbital radius in km. Defaults to 6371.0 (Earth radius).

6371.0
render_mode str | None

None, "human" or "ansi".

None

get_init_args()

Get initialization arguments as a dictionary.

Returns:

Name Type Description
dict Dict[str, Any]

Dictionary of initialization arguments.

reset(seed=None, options=None)

Reset environment to initial state.

Parameters:

Name Type Description Default
seed int

Random seed.

None
options dict

Additional reset options.

None

Returns:

Name Type Description
tuple Tuple[ndarray, Dict[str, Any]]

Initial observation and empty info dict.

step(action)

Execute one simulation step.

Parameters:

Name Type Description Default
action ndarray

Normalized action in range [-1, 1].

required

Returns:

Name Type Description
tuple Tuple[ndarray, float, bool, bool, Dict[str, Any]]

(observation, reward, terminated, truncated, info).

render(mode=None)

Render a lightweight telemetry snapshot.

См. также

  • Базовая модель ComSat: Описание математической модели
  • Пример обучения PPO: example/reinforcement_learning/deep_rl/example_ppo_comsat_improved.py
  • ImprovedB747Env: Аналогичная улучшенная среда для самолёта