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: Торможение (уменьшение угловой скорости)
Функция вознаграждения¶
Вознаграждение вычисляется как отрицательная стоимость со следующими компонентами:
Где:
| Вес | Символ | По умолчанию | Описание |
|---|---|---|---|
| Угловая скорость | w_θ̇ | 10.0 | Точность отслеживания (основная цель) |
| Радиальная позиция | w_ρ | 2.0 | Стабильность орбиты |
| Радиальная скорость | w_ρ̇ | 0.5 | Демпфирование скорости |
| Стоимость действия | w_u | 0.01 | Энергоэффективность |
| Плавность | w_Δu | 0.05 | Плавность управления |
| Рывок | w_Δ²u | 0.01 | Подавление дрожания |
Условия завершения¶
Эпизод завершается (terminated=True) со штрафным вознаграждением -100, если:
- Чрезмерная угловая скорость: |θ̇| > 0.02 рад/с (2× макс)
- Нестабильность орбиты: |ρ - ρ_nominal| > 500 км
- Чрезмерная радиальная скорость: |ρ̇| > 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-подобная многоцелевая |
| Штраф за неплавность | ❌ | ✅ |
| Энергоэффективность | ❌ | ✅ |
| Ограничения безопасности | ❌ | ✅ |
| Обработка начального действия | ❌ | ✅ |
Советы по обучению¶
-
Начните с весов по умолчанию: Веса вознаграждения по умолчанию обеспечивают хороший баланс для большинства задач.
-
Настройте скорость обучения: Если обучение нестабильно, уменьшите скорость обучения до 1e-4 или ниже.
-
Отслеживайте завершения: Если эпизоды завершаются слишком часто, ослабьте ограничения безопасности или улучшите начальную политику.
-
Используйте curriculum learning: Начните с более простых опорных сигналов (меньшие скачки) и постепенно увеличивайте сложность.
-
Нормализуйте опорный сигнал: Убедитесь, что опорный сигнал остаётся в разумных пределах для динамики спутника.
Документация 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
|
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: Аналогичная улучшенная среда для самолёта