Cloud Environment with Re-imaging
This tutorial demonstrates the configuration and use of a BSK-RL environment considering cloud coverage and re-imaging capabilities. Two reward functions are presented: a single-picture binary case (where targets are deemed occluded by clouds or not and no re-imaging is allowed) and a re-imaging case where the problem is formulated in terms of the targets’ probability of being successfully observed. Still, the satellite cannot observe the true cloud coverage of each target, only its forecast. The satellite has to image targets while keeping a positive battery level. This example script is part of an upcoming publication.
Loading Modules
[1]:
from bsk_rl import ConstellationTasking
import numpy as np
from typing import Optional, Callable, Union
from Basilisk.architecture import bskLogging
from Basilisk.utilities import orbitalMotion
from bsk_rl import act, obs, sats
from bsk_rl.sim import dyn, fsw, world
from bsk_rl.scene.targets import UniformTargets
from bsk_rl.data.base import Data, DataStore, GlobalReward
from bsk_rl.data.unique_image_data import (
UniqueImageData,
UniqueImageStore,
UniqueImageReward,
)
bskLogging.setDefaultLogLevel(bskLogging.BSK_WARNING)
Making a Scenario with Cloud Covered Targets
To account for clouds in the simulation process, we can associate a cloud coverage value to each target that represents the percentage of cloud coverage over that area. Cloud coverage can be randomly generated or derived from real data. Here, we have an example on how to use a stochastic cloud model using UniformTargets as a base and attach the following information to each target:
cloud_cover_true
represents the true cloud coverage. Information from external sources, such as historical cloud data, can be used here based on each target’s position.cloud_cover_forecast
represents the cloud coverage forecast. Forecast from external sources can be plugged in here.cloud_cover_sigma
represents the standard deviation of the cloud coverage forecast.belief
represents the probability that the target was successfully observed.prev_obs
time at which the last picture of the target was taken.
[2]:
class CloudTargets(UniformTargets):
mu_data = 0.6740208166434426 # Average global cloud coverage
def __init__(
self,
n_targets: Union[int, tuple[int, int]],
priority_distribution: Optional[Callable] = None,
radius: float = orbitalMotion.REQ_EARTH * 1e3,
sigma_levels: tuple[float, float] = (0.01, 0.05),
reward_thresholds: Union[float, tuple[float, float]] = 0.95,
belief_init: tuple[float, float] = (0.0, 0.94),
prev_obs_init: tuple[float, float] = (0.0, 5700.0),
) -> None:
super().__init__(n_targets, priority_distribution, radius)
self.reward_thresholds = reward_thresholds
self.sigma_levels = sigma_levels
self.belief_init = belief_init
self.prev_obs_init = prev_obs_init
def regenerate_targets(self) -> None:
super().regenerate_targets()
for target in self.targets:
# Initialize true cloud coverage
cloud_cover_true = np.random.uniform(
0.0, self.mu_data * 2
) # Instead, true cloud coverage can be obtained by historical data based on the target's position
cloud_cover_true = np.clip(cloud_cover_true, 0.0, 1.0)
target.cloud_cover_true = cloud_cover_true
# Initialize cloud coverage forecast
target.cloud_cover_sigma = np.random.uniform(
self.sigma_levels[0], self.sigma_levels[1]
)
cloud_cover_forecast = np.random.normal(
target.cloud_cover_true, target.cloud_cover_sigma
)
target.cloud_cover_forecast = np.clip(cloud_cover_forecast, 0.0, 1.0)
# Set reward threshold
if isinstance(self.reward_thresholds, float):
target.reward_threshold = self.reward_thresholds
else:
target.reward_threshold = np.random.uniform(
self.reward_thresholds[0], self.reward_thresholds[1]
)
# Initialize beliefs and previous observations
b_S1 = np.random.uniform(self.belief_init[0], self.belief_init[1])
b_S0 = 1 - b_S1
target.belief = np.array([b_S0, b_S1])
target.prev_obs = -np.random.uniform(
self.prev_obs_init[0], self.prev_obs_init[0]
)
target.belief_update_var = 0.0
# Define the randomization interval for the number of targets
n_targets = (1000, 10000)
scenario = CloudTargets(n_targets=n_targets)
Making a Rewarder Considering Cloud Coverage for the Single-picture Case
When considering targets potentially covered by clouds, we can use a binary reward model where the reward is proportional to the target priority if the target’s cloud coverage is below its reward_threshold
(how much cloud coverage is acceptable). Therefore, we create a modified rewarder CloudImageBinaryRewarder
; it has similar settings as the UniqueImageReward class, but cloud_covered
and cloud_free
information is added. Additionally, the
calculate_reward
function is modified for the binary reward model.
For this case, the reward function is given by
where \(\rho_i\) is priority, \(c_{p_i}\) is the true cloud coverage, and \(c_{\text{thr}_i}\) is the reward_threshold
for target \(i\). For a case where the reward is linearly proportional to the cloud coverage, see Cloud Environment
[3]:
from typing import TYPE_CHECKING
if TYPE_CHECKING: # pragma: no cover
from bsk_rl.scene.targets import (
Target,
)
class CloudImageBinaryData(UniqueImageData):
"""DataType for unique images of targets."""
def __init__(
self,
imaged: Optional[list["Target"]] = None,
duplicates: int = 0,
known: Optional[list["Target"]] = None,
cloud_covered: Optional[list["Target"]] = None,
cloud_free: Optional[list["Target"]] = None,
) -> None:
"""Construct unit of data to record unique images.
Keeps track of ``imaged`` targets, a count of ``duplicates`` (i.e. images that
were not rewarded due to the target already having been imaged), and all
``known`` targets in the environment. It also keeps track of which targets are considered
``cloud_covered`` and ``cloud_free`` based on the specified threshold.
Args:
imaged: List of targets that are known to be imaged.
duplicates: Count of target imaging duplication.
known: List of targets that are known to exist (imaged and unimaged).
cloud_covered: List of imaged targets that are known to be cloud covered.
cloud_free: List of imaged targets that are known to be cloud free.
"""
super().__init__(imaged=imaged, duplicates=duplicates, known=known)
if cloud_covered is None:
cloud_covered = []
if cloud_free is None:
cloud_free = []
self.cloud_covered = list(set(cloud_covered))
self.cloud_free = list(set(cloud_free))
def __add__(self, other: "CloudImageBinaryData") -> "CloudImageBinaryData":
"""Combine two units of data.
Args:
other: Another unit of data to combine with this one.
Returns:
Combined unit of data.
"""
imaged = list(set(self.imaged + other.imaged))
duplicates = (
self.duplicates
+ other.duplicates
+ len(self.imaged)
+ len(other.imaged)
- len(imaged)
)
known = list(set(self.known + other.known))
cloud_covered = list(set(self.cloud_covered + other.cloud_covered))
cloud_free = list(set(self.cloud_free + other.cloud_free))
return self.__class__(
imaged=imaged,
duplicates=duplicates,
known=known,
cloud_covered=cloud_covered,
cloud_free=cloud_free,
)
class CloudImageBinaryDataStore(UniqueImageStore):
"""DataStore for unique images of targets."""
data_type = CloudImageBinaryData
def compare_log_states(
self, old_state: np.ndarray, new_state: np.ndarray
) -> CloudImageBinaryData:
"""Check for an increase in logged data to identify new images.
Args:
old_state: older storedData from satellite storage unit
new_state: newer storedData from satellite storage unit
Returns:
list: Targets imaged at new_state that were unimaged at old_state
"""
update_idx = np.where(new_state - old_state > 0)[0]
imaged = []
for idx in update_idx:
message = self.satellite.dynamics.storageUnit.storageUnitDataOutMsg
target_id = message.read().storedDataName[int(idx)]
imaged.append(
[target for target in self.data.known if target.id == target_id][0]
)
cloud_covered = []
cloud_free = []
for target in imaged:
cloud_coverage = target.cloud_cover_true
if cloud_coverage > target.reward_threshold:
cloud_covered.append(target)
else:
cloud_free.append(target)
return CloudImageBinaryData(
imaged=imaged, cloud_covered=cloud_covered, cloud_free=cloud_free
)
class CloudImageBinaryRewarder(UniqueImageReward):
"""DataManager for rewarding unique images."""
data_store_type = CloudImageBinaryDataStore
def calculate_reward(
self, new_data_dict: dict[str, CloudImageBinaryData]
) -> dict[str, float]:
"""Reward new each unique image once using self.reward_fn().
Args:
new_data_dict: Record of new images for each satellite
Returns:
reward: Cumulative reward across satellites for one step
"""
reward = {}
for sat_id, new_data in new_data_dict.items():
reward[sat_id] = 0.0
for target in new_data.cloud_free:
reward[sat_id] += self.reward_fn(target.priority)
for new_data in new_data_dict.values():
self.data += new_data
return reward
# Define the reward function as a function of the priority of the target and the cloud cover
def reward_function_binary(priority):
return priority
# Uncomment this line and comment the reward in the cell below to use the binary reward function
# rewarder = CloudImageBinaryRewarder(reward_fn=reward_function_binary)
Making a Rewarder Considering Cloud Coverage for the Re-imaging Case
If the target is deemed occluded by clouds, it won’t be tasked again in the single-picture case. However, the problem can be formulated in terms of the probability of observing the target (\(\text{P}(S=1)\), represented by the variable belief
in the code) given the number of pictures and time difference between pictures (\(\delta t_i\)). Thus, a new rewarder named CloudImageProbabilityRewarder
is created to accommodate this new formulation, as well as a new reward function.
The reward function accounts for the desired success probability threshold for each target (\(\theta_{\text{thr}_i}\), represented by reward_threshold
in the code) and has a tunable parameter \(\alpha\in[0,1]\):
[4]:
class CloudImageProbabilityData(Data):
"""DataType for unique images of targets."""
def __init__(
self,
imaged: Optional[list["Target"]] = None,
imaged_complete: Optional[list["Target"]] = None,
list_belief_update_var: Optional[list[float]] = None,
known: Optional[list["Target"]] = None,
) -> None:
"""Construct unit of data to record unique images.
Keeps track of ``imaged`` targets and completely imaged targets (those with a success probability
higher than the ``reward_threshold``).
Args:
imaged: List of targets that are known to be imaged.
imaged_complete: List of targets that are known to be completely imaged (P(S=1) >= reward_threshold).
list_belief_update_var: List of belief update variations for each target after each picture.
known: List of targets that are known to exist (imaged and not imaged)
"""
if imaged is None:
imaged = []
if imaged_complete is None:
imaged_complete = []
if list_belief_update_var is None:
list_belief_update_var = []
if known is None:
known = []
self.known = list(set(known))
self.imaged = list(imaged)
self.imaged_complete = list(set(imaged_complete))
self.list_belief_update_var = list(list_belief_update_var)
def __add__(
self, other: "CloudImageProbabilityData"
) -> "CloudImageProbabilityData":
"""Combine two units of data.
Args:
other: Another unit of data to combine with this one.
Returns:
Combined unit of data.
"""
imaged = list(self.imaged + other.imaged)
imaged_complete = list(set(self.imaged_complete + other.imaged_complete))
list_belief_update_var = list(
self.list_belief_update_var + other.list_belief_update_var
)
known = list(set(self.known + other.known))
return self.__class__(
imaged=imaged,
imaged_complete=imaged_complete,
list_belief_update_var=list_belief_update_var,
known=known,
)
class CloudImageProbabilityDataStore(DataStore):
"""DataStore for unique images of targets."""
data_type = CloudImageProbabilityData
def __init__(self, *args, **kwargs) -> None:
"""DataStore for unique images.
Detects new images by watching for an increase in data in each target's corresponding
buffer.
"""
super().__init__(*args, **kwargs)
def get_log_state(self) -> np.ndarray:
"""Log the instantaneous storage unit state at the end of each step.
Returns:
array: storedData from satellite storage unit
"""
return np.array(
self.satellite.dynamics.storageUnit.storageUnitDataOutMsg.read().storedData
)
def compare_log_states(
self, old_state: np.ndarray, new_state: np.ndarray
) -> CloudImageProbabilityData:
"""Check for an increase in logged data to identify new images.
This method also performs the belief update (new probability of success) for each target
based on the cloud coverage forecast and the time difference between the current time and
the previous observation time. It also keeps track of the variation in the belief update.
Args:
old_state: older storedData from satellite storage unit
new_state: newer storedData from satellite storage unit
Returns:
list: Targets imaged at new_state that were unimaged at old_state
"""
update_idx = np.where(new_state - old_state > 0)[0]
imaged = []
for idx in update_idx:
message = self.satellite.dynamics.storageUnit.storageUnitDataOutMsg
target_id = message.read().storedDataName[int(idx)]
imaged.append(
[target for target in self.data.known if target.id == target_id][0]
)
list_imaged_complete = []
list_belief_update_var = []
current_sim_time = self.satellite.simulator.sim_time
belief_update_func = self.satellite.belief_update_func
for target in imaged:
target_prev_obs = (
target.prev_obs
) # Time at which the target was previously observed
target_time_diff = (
current_sim_time - target_prev_obs
) # Time difference between the current time and the previous observation time
target_belief = (
target.belief
) # Belief of the target before the current picture
target_cloud_cover_forecast = target.cloud_cover_forecast
updated_belief = belief_update_func(
target_belief, target_cloud_cover_forecast, target_time_diff
)
target.belief = updated_belief # Update the belief of the target
target.belief_update_var = updated_belief[1] - target_belief[1]
target.prev_obs = current_sim_time # Update the previous observation time
if updated_belief[1] > target.reward_threshold:
list_imaged_complete.append(target)
list_belief_update_var.append(target.belief_update_var)
return CloudImageProbabilityData(
imaged=imaged,
imaged_complete=list_imaged_complete,
list_belief_update_var=list_belief_update_var,
)
class CloudImageProbabilityRewarder(GlobalReward):
datastore_type = CloudImageProbabilityDataStore
def __init__(
self,
reward_fn: Callable,
alpha: float = 0.5,
) -> None:
"""
Modifies the constructor to include the alpha parameter to tune the reward function and
the reward function.
Args:
reward_fn: Reward as function of priority, targets belief, and alpha.
"""
super().__init__()
self.reward_fn = reward_fn
self.alpha = alpha
def initial_data(self, satellite: "sats.Satellite") -> "UniqueImageData":
"""Furnish data to the scenario.
Currently, it is assumed that all targets are known a priori, so the initial data
given to the data store is the list of all targets.
"""
return self.data_type(known=self.scenario.targets)
def calculate_reward(
self, new_data_dict: dict[str, CloudImageProbabilityData]
) -> dict[str, float]:
"""Reward new each unique image once using self.reward_fn().
Args:
new_data_dict: Record of new images for each satellite
Returns:
reward: Cumulative reward across satellites for one step
"""
reward = {}
for sat_id, new_data in new_data_dict.items():
reward[sat_id] = 0.0
for target, belief_variation in zip(
new_data.imaged, new_data.list_belief_update_var
):
reward[sat_id] += self.reward_fn(
target.priority, belief_variation, self.alpha, reach_threshold=False
)
for target in new_data.imaged_complete:
reward[sat_id] += self.reward_fn(
target.priority, None, self.alpha, reach_threshold=True
)
return reward
# Define the reward function as a function of the priority of the target, the cloud cover, and the number of times the target has been imaged
def reward_function_probability(
priority: float, belief_variation: float, alpha: float, reach_threshold: bool
) -> float:
"""
Rewards based on the priority of the target, the belief variation, and the alpha parameter.
Args:
priority: Priority of the target.
belief_variation: Variation in the belief of the target after the picture.
alpha: Tuning parameter between 0 and 1.
reach_threshold: Boolean indicating whether the target has reached the reward threshold.
Returns:
float: Reward for the target.
"""
if reach_threshold:
return priority * (1 - alpha)
else:
return priority * belief_variation * alpha
rewarder = CloudImageProbabilityRewarder(
reward_fn=reward_function_probability, alpha=1.0
)
CloudImageProbabilityDataStore
requires a function belief_update_func
that returns the updated success probability for target \(i\) (\(\text{P}^{(k+1)}_i(S=1)\)) given its current success probability (\(\text{P}^{(k)}_i(S=1)\)), cloud coverage forecast (\(c_{f_i}\)), and the time different between the current and previous image (\(\delta t_i\)).
The update in the success probability is given by:
To penalize two consecutive pictures without enough elapsed time (and not enough shift in clouds’ position), a new cloud-free probability variable \(g_{f_i}\) is introduced such that
where \(\beta\) is given by a sigmoid
and
leading to:
[5]:
def time_variation(
delta_t: float, t_const: float, k_1: float = 2.5, k_2: float = 2.5, k_3: float = 1.0
) -> float:
"""
Time variation function based on sigmoid function.
Args:
delta_t (float): Time difference between the current time and the previous observation time.
t_const (float): Time constant for the sigmoid function.
k_1 (float): Sigmoid function parameter.
k_2 (float): Sigmoid function parameter.
k_3 (float): Sigmoid function parameter.
Returns:
float: Time variation value.
"""
if delta_t <= 0:
return 0
else:
return 1 / (k_3 + np.exp(-k_1 * (delta_t / t_const - k_2)))
def belief_update(
b: list[float], cloud_cover_forecast: float, delta_t: float, t_const: float
) -> np.array:
"""
Update the belief based on the cloud forecast and the time variation.
Args:
b (np.array): Belief array (b(S=0), b(S=1)).
cloud_forecast (float): Cloud coverage forecast.
delta_t (float): Time difference between the current time and the previous observation time.
t_const (float): Time constant for the sigmoid function.
Returns:
np.array: Updated belief array
"""
cloud_time_variation = time_variation(delta_t, t_const)
cloud_free = (1 - cloud_cover_forecast) * cloud_time_variation
cloud_cover_bar = 1 - cloud_free
b_0 = b[0] * cloud_cover_bar
b_1 = 1 - b_0
return np.array([b_0, b_1])
def belief_update_func(
b: list[float], cloud_cover_forecast: float, delta_t: float
) -> np.array:
"""
Belief update function for the satellite.
Args:
b (np.array): Belief array (b(S=0), b(S=1)).
cloud_forecast (float): Cloud coverage forecast.
delta_t (float): Time difference between the current time and the previous observation time.
Returns:
np.array: Updated belief array
"""
time_constant = 30 * 60 / 5 # 30 minutes
return belief_update(b, cloud_cover_forecast, delta_t, time_constant)
Configuring the Satellite to Have Access to Cloud Information
The satellite has observations and actions associated with it that are relevant to the decision-making process. The observation space can be modified to include information about the targets and the weather (cloud coverage forecast, reward threshold, success probability, etc) which allows better informed decision-making.
-
SatProperties: Body angular velocity, instrument pointing direction, body position, body velocity, battery charge (properties in flight software model or dynamics model). Also, customized dynamics property in CustomDynModel below: Angle between the sun and the solar panel.
OpportunityProperties: Target’s priority, cloud coverage forecast, standard deviation of cloud coverage forecast, probability of being successfully imaged, and last time it was imaged (upcoming 32 targets).
Time: Simulation time.
Eclipse: Next eclipse start and end times.
-
Charge: Enter a sun-pointing charging mode for 60 seconds.
Image: Image target from upcoming 32 targets
Dynamics model: FullFeaturedDynModel is used and a property, angle between sun and solar panel, is added.
Flight software model: SteeringImagerFSWModel is used.
[6]:
class CustomSatComposed(sats.ImagingSatellite):
observation_spec = [
obs.SatProperties(
dict(prop="omega_BP_P", norm=0.03),
dict(prop="c_hat_P"),
dict(prop="r_BN_P", norm=orbitalMotion.REQ_EARTH * 1e3),
dict(prop="v_BN_P", norm=7616.5),
dict(prop="battery_charge_fraction"),
dict(prop="solar_angle_norm"),
),
obs.Eclipse(),
obs.OpportunityProperties(
dict(prop="priority"),
dict(
fn=lambda sat, opp: opp["object"].cloud_cover_forecast
), # Cloud coverage forecast (percentage of the area covered by clouds)
dict(
fn=lambda sat, opp: opp["object"].cloud_cover_sigma
), # Confidence on the cloud coverage forecast
# dict(fn=lambda sat, opp: opp["object"].reward_threshold), #Reward threshold for each target. Uncomment if using variable threshold
dict(
fn=lambda sat, opp: opp["object"].belief[1]
), # Probability of successfully imaging the target. Used only in the re-imaging case
dict(
fn=lambda sat, opp: opp["object"].prev_obs, norm=5700
), # Previous observation time. Used only in the re-imaging case
type="target",
n_ahead_observe=32,
),
obs.Time(),
]
action_spec = [
act.Charge(duration=60.0),
act.Image(n_ahead_image=32),
]
# Modified the constructor to include the belief update function
def __init__(self, *args, belief_update_func=None, **kwargs) -> None:
super().__init__(*args, **kwargs)
self.belief_update_func = belief_update_func
class CustomDynModel(dyn.FullFeaturedDynModel):
@property
def solar_angle_norm(self) -> float:
sun_vec_N = (
self.world.gravFactory.spiceObject.planetStateOutMsgs[
self.world.sun_index
]
.read()
.PositionVector
)
sun_vec_N_hat = sun_vec_N / np.linalg.norm(sun_vec_N)
solar_panel_vec_B = np.array([0, 0, -1]) # Not default configuration
mat = np.transpose(self.BN)
solar_panel_vec_N = np.matmul(mat, solar_panel_vec_B)
error_angle = np.arccos(np.dot(solar_panel_vec_N, sun_vec_N_hat))
return error_angle / np.pi
dyn_type = CustomDynModel
fsw_type = fsw.SteeringImagerFSWModel
It is necessary to add a filter to remove targets that reached the success threshold from the targets list when re-imaging is allowed such that:
[7]:
def belief_threshold_filter(opportunity):
if opportunity["type"] == "target":
return (
True
if opportunity["object"].belief[1] < opportunity["object"].reward_threshold
else False
)
return True
When instantiating a satellite, these parameters can be overriden with a constant or rerandomized every time the environment is reset using the sat_args
dictionary.
[8]:
dataStorageCapacity = 20 * 8e6 * 100
sat_args = CustomSatComposed.default_sat_args(
imageAttErrorRequirement=0.01,
imageRateErrorRequirement=0.01,
batteryStorageCapacity=80.0 * 3600 * 2,
storedCharge_Init=lambda: np.random.uniform(0.4, 1.0) * 80.0 * 3600 * 2,
u_max=0.2,
K1=0.5,
nHat_B=np.array([0, 0, -1]),
imageTargetMinimumElevation=np.radians(45),
rwBasePower=20,
maxWheelSpeed=1500,
storageInit=lambda: np.random.randint(
0 * dataStorageCapacity,
0.01 * dataStorageCapacity,
), # Initialize storage use close to zero
wheelSpeeds=lambda: np.random.uniform(
-1, 1, 3
), # Initialize reaction wheel speeds close to zero
dataStorageCapacity=dataStorageCapacity, # Large storage to avoid filling up in three orbits
)
Initializing and Interacting with the Environment
For this example, we will be using the multi-agent ConstellationTasking environment. Along with passing the satellite that we configured, the environment takes a scenario, which defines the environment the satellite is acting in, and a rewarder, which defines how data collected from the scenario is rewarded.
[9]:
from bsk_rl.utils.orbital import walker_delta_args
sat_arg_randomizer = walker_delta_args(
altitude=500.0, n_planes=1, inc=45, clustersize=5, clusterspacing=72
)
satellites = [
CustomSatComposed(f"EO-{i}", sat_args, belief_update_func=belief_update_func)
for i in range(5)
]
# Add filter to satellites to remove targets that have already reached the belief threshold
for sat in satellites:
sat.add_access_filter(belief_threshold_filter)
env = ConstellationTasking(
satellites=satellites,
world_type=world.GroundStationWorldModel,
world_args=world.GroundStationWorldModel.default_world_args(),
scenario=scenario,
rewarder=rewarder,
sat_arg_randomizer=sat_arg_randomizer,
sim_rate=0.5,
max_step_duration=300.0,
time_limit=95 * 60 / 2, # half orbit
log_level="INFO",
failure_penalty=0.0,
# disable_env_checker=True, # For debugging
)
First, reset the environment. It is possible to specify the seed when resetting the environment.
[10]:
observation, info = env.reset(seed=1)
2025-05-09 15:44:55,397 gym INFO Resetting environment with seed=1
2025-05-09 15:44:55,400 scene.targets INFO Generating 1020 targets
2025-05-09 15:44:55,671 sats.satellite.EO-0 INFO <0.00> EO-0: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-05-09 15:44:55,748 sats.satellite.EO-1 INFO <0.00> EO-1: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-05-09 15:44:55,819 sats.satellite.EO-2 INFO <0.00> EO-2: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-05-09 15:44:55,897 sats.satellite.EO-3 INFO <0.00> EO-3: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-05-09 15:44:55,986 sats.satellite.EO-4 INFO <0.00> EO-4: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-05-09 15:44:56,096 gym INFO <0.00> Environment reset
It is possible to print out the actions and observations. The composed satellite action_description returns a human-readable action map each satellite has the same action space and similar observation space.
[11]:
print("Actions:", env.satellites[0].action_description, "\n")
print("States:", env.unwrapped.satellites[0].observation_description, "\n")
# Using the composed satellite features also provides a human-readable state:
for satellite in env.unwrapped.satellites:
for k, v in satellite.observation_builder.obs_dict().items():
print(f"{k}: {v}")
Actions: ['action_charge', 'action_image_0', 'action_image_1', 'action_image_2', 'action_image_3', 'action_image_4', 'action_image_5', 'action_image_6', 'action_image_7', 'action_image_8', 'action_image_9', 'action_image_10', 'action_image_11', 'action_image_12', 'action_image_13', 'action_image_14', 'action_image_15', 'action_image_16', 'action_image_17', 'action_image_18', 'action_image_19', 'action_image_20', 'action_image_21', 'action_image_22', 'action_image_23', 'action_image_24', 'action_image_25', 'action_image_26', 'action_image_27', 'action_image_28', 'action_image_29', 'action_image_30', 'action_image_31']
States: [np.str_('sat_props.omega_BP_P_normd[0]'), np.str_('sat_props.omega_BP_P_normd[1]'), np.str_('sat_props.omega_BP_P_normd[2]'), np.str_('sat_props.c_hat_P[0]'), np.str_('sat_props.c_hat_P[1]'), np.str_('sat_props.c_hat_P[2]'), np.str_('sat_props.r_BN_P_normd[0]'), np.str_('sat_props.r_BN_P_normd[1]'), np.str_('sat_props.r_BN_P_normd[2]'), np.str_('sat_props.v_BN_P_normd[0]'), np.str_('sat_props.v_BN_P_normd[1]'), np.str_('sat_props.v_BN_P_normd[2]'), np.str_('sat_props.battery_charge_fraction'), np.str_('sat_props.solar_angle_norm'), np.str_('eclipse[0]'), np.str_('eclipse[1]'), np.str_('target.target_0.priority'), np.str_('target.target_0.prop_1'), np.str_('target.target_0.prop_2'), np.str_('target.target_0.prop_3'), np.str_('target.target_0.prop_4_normd'), np.str_('target.target_1.priority'), np.str_('target.target_1.prop_1'), np.str_('target.target_1.prop_2'), np.str_('target.target_1.prop_3'), np.str_('target.target_1.prop_4_normd'), np.str_('target.target_2.priority'), np.str_('target.target_2.prop_1'), np.str_('target.target_2.prop_2'), np.str_('target.target_2.prop_3'), np.str_('target.target_2.prop_4_normd'), np.str_('target.target_3.priority'), np.str_('target.target_3.prop_1'), np.str_('target.target_3.prop_2'), np.str_('target.target_3.prop_3'), np.str_('target.target_3.prop_4_normd'), np.str_('target.target_4.priority'), np.str_('target.target_4.prop_1'), np.str_('target.target_4.prop_2'), np.str_('target.target_4.prop_3'), np.str_('target.target_4.prop_4_normd'), np.str_('target.target_5.priority'), np.str_('target.target_5.prop_1'), np.str_('target.target_5.prop_2'), np.str_('target.target_5.prop_3'), np.str_('target.target_5.prop_4_normd'), np.str_('target.target_6.priority'), np.str_('target.target_6.prop_1'), np.str_('target.target_6.prop_2'), np.str_('target.target_6.prop_3'), np.str_('target.target_6.prop_4_normd'), np.str_('target.target_7.priority'), np.str_('target.target_7.prop_1'), np.str_('target.target_7.prop_2'), np.str_('target.target_7.prop_3'), np.str_('target.target_7.prop_4_normd'), np.str_('target.target_8.priority'), np.str_('target.target_8.prop_1'), np.str_('target.target_8.prop_2'), np.str_('target.target_8.prop_3'), np.str_('target.target_8.prop_4_normd'), np.str_('target.target_9.priority'), np.str_('target.target_9.prop_1'), np.str_('target.target_9.prop_2'), np.str_('target.target_9.prop_3'), np.str_('target.target_9.prop_4_normd'), np.str_('target.target_10.priority'), np.str_('target.target_10.prop_1'), np.str_('target.target_10.prop_2'), np.str_('target.target_10.prop_3'), np.str_('target.target_10.prop_4_normd'), np.str_('target.target_11.priority'), np.str_('target.target_11.prop_1'), np.str_('target.target_11.prop_2'), np.str_('target.target_11.prop_3'), np.str_('target.target_11.prop_4_normd'), np.str_('target.target_12.priority'), np.str_('target.target_12.prop_1'), np.str_('target.target_12.prop_2'), np.str_('target.target_12.prop_3'), np.str_('target.target_12.prop_4_normd'), np.str_('target.target_13.priority'), np.str_('target.target_13.prop_1'), np.str_('target.target_13.prop_2'), np.str_('target.target_13.prop_3'), np.str_('target.target_13.prop_4_normd'), np.str_('target.target_14.priority'), np.str_('target.target_14.prop_1'), np.str_('target.target_14.prop_2'), np.str_('target.target_14.prop_3'), np.str_('target.target_14.prop_4_normd'), np.str_('target.target_15.priority'), np.str_('target.target_15.prop_1'), np.str_('target.target_15.prop_2'), np.str_('target.target_15.prop_3'), np.str_('target.target_15.prop_4_normd'), np.str_('target.target_16.priority'), np.str_('target.target_16.prop_1'), np.str_('target.target_16.prop_2'), np.str_('target.target_16.prop_3'), np.str_('target.target_16.prop_4_normd'), np.str_('target.target_17.priority'), np.str_('target.target_17.prop_1'), np.str_('target.target_17.prop_2'), np.str_('target.target_17.prop_3'), np.str_('target.target_17.prop_4_normd'), np.str_('target.target_18.priority'), np.str_('target.target_18.prop_1'), np.str_('target.target_18.prop_2'), np.str_('target.target_18.prop_3'), np.str_('target.target_18.prop_4_normd'), np.str_('target.target_19.priority'), np.str_('target.target_19.prop_1'), np.str_('target.target_19.prop_2'), np.str_('target.target_19.prop_3'), np.str_('target.target_19.prop_4_normd'), np.str_('target.target_20.priority'), np.str_('target.target_20.prop_1'), np.str_('target.target_20.prop_2'), np.str_('target.target_20.prop_3'), np.str_('target.target_20.prop_4_normd'), np.str_('target.target_21.priority'), np.str_('target.target_21.prop_1'), np.str_('target.target_21.prop_2'), np.str_('target.target_21.prop_3'), np.str_('target.target_21.prop_4_normd'), np.str_('target.target_22.priority'), np.str_('target.target_22.prop_1'), np.str_('target.target_22.prop_2'), np.str_('target.target_22.prop_3'), np.str_('target.target_22.prop_4_normd'), np.str_('target.target_23.priority'), np.str_('target.target_23.prop_1'), np.str_('target.target_23.prop_2'), np.str_('target.target_23.prop_3'), np.str_('target.target_23.prop_4_normd'), np.str_('target.target_24.priority'), np.str_('target.target_24.prop_1'), np.str_('target.target_24.prop_2'), np.str_('target.target_24.prop_3'), np.str_('target.target_24.prop_4_normd'), np.str_('target.target_25.priority'), np.str_('target.target_25.prop_1'), np.str_('target.target_25.prop_2'), np.str_('target.target_25.prop_3'), np.str_('target.target_25.prop_4_normd'), np.str_('target.target_26.priority'), np.str_('target.target_26.prop_1'), np.str_('target.target_26.prop_2'), np.str_('target.target_26.prop_3'), np.str_('target.target_26.prop_4_normd'), np.str_('target.target_27.priority'), np.str_('target.target_27.prop_1'), np.str_('target.target_27.prop_2'), np.str_('target.target_27.prop_3'), np.str_('target.target_27.prop_4_normd'), np.str_('target.target_28.priority'), np.str_('target.target_28.prop_1'), np.str_('target.target_28.prop_2'), np.str_('target.target_28.prop_3'), np.str_('target.target_28.prop_4_normd'), np.str_('target.target_29.priority'), np.str_('target.target_29.prop_1'), np.str_('target.target_29.prop_2'), np.str_('target.target_29.prop_3'), np.str_('target.target_29.prop_4_normd'), np.str_('target.target_30.priority'), np.str_('target.target_30.prop_1'), np.str_('target.target_30.prop_2'), np.str_('target.target_30.prop_3'), np.str_('target.target_30.prop_4_normd'), np.str_('target.target_31.priority'), np.str_('target.target_31.prop_1'), np.str_('target.target_31.prop_2'), np.str_('target.target_31.prop_3'), np.str_('target.target_31.prop_4_normd'), np.str_('time')]
sat_props: {'omega_BP_P_normd': array([-0.00350386, 0.00198976, -0.00368761]), 'c_hat_P': array([-0.58085052, 0.0322632 , -0.81337061]), 'r_BN_P_normd': array([-0.54798211, -0.70115756, 0.60713484]), 'v_BN_P_normd': array([ 0.8111179 , -0.26445426, 0.42668281]), 'battery_charge_fraction': 0.5117561268266025, 'solar_angle_norm': np.float64(0.5154094809633692)}
eclipse: [np.float64(4590.0), np.float64(1050.0)]
target: {'target_0': {'priority': 0.23110739788422052, 'prop_1': np.float64(0.6773821240549803), 'prop_2': 0.017984788259031905, 'prop_3': np.float64(0.47193060176014956), 'prop_4_normd': -0.0}, 'target_1': {'priority': 0.7053880626885703, 'prop_1': np.float64(0.23103685455589726), 'prop_2': 0.012802744584004837, 'prop_3': np.float64(0.5448547507690691), 'prop_4_normd': -0.0}, 'target_2': {'priority': 0.1633664559021203, 'prop_1': np.float64(1.0), 'prop_2': 0.020608850788857196, 'prop_3': np.float64(0.5387060943662177), 'prop_4_normd': -0.0}, 'target_3': {'priority': 0.9672643792272313, 'prop_1': np.float64(0.6771252894737922), 'prop_2': 0.043546720561153066, 'prop_3': np.float64(0.01327414045488771), 'prop_4_normd': -0.0}, 'target_4': {'priority': 0.03177482425911071, 'prop_1': np.float64(0.9188487053805751), 'prop_2': 0.012359745287068721, 'prop_3': np.float64(0.6244352067126765), 'prop_4_normd': -0.0}, 'target_5': {'priority': 0.1620597486265063, 'prop_1': np.float64(0.32471532540988063), 'prop_2': 0.021931235486235705, 'prop_3': np.float64(0.6855506082056277), 'prop_4_normd': -0.0}, 'target_6': {'priority': 0.053247230445791494, 'prop_1': np.float64(0.465036271289076), 'prop_2': 0.03563025242548773, 'prop_3': np.float64(0.9025594456524167), 'prop_4_normd': -0.0}, 'target_7': {'priority': 0.4330199859612206, 'prop_1': np.float64(1.0), 'prop_2': 0.020218306152100317, 'prop_3': np.float64(0.6702366946572057), 'prop_4_normd': -0.0}, 'target_8': {'priority': 0.3011615633479109, 'prop_1': np.float64(0.18844447543725398), 'prop_2': 0.04545257905252125, 'prop_3': np.float64(0.06768644938605572), 'prop_4_normd': -0.0}, 'target_9': {'priority': 0.8395413208814804, 'prop_1': np.float64(0.6431795157724476), 'prop_2': 0.017677605544106918, 'prop_3': np.float64(0.4728944248799916), 'prop_4_normd': -0.0}, 'target_10': {'priority': 0.204358127861885, 'prop_1': np.float64(0.7343889025097664), 'prop_2': 0.04130035476650628, 'prop_3': np.float64(0.594948373774243), 'prop_4_normd': -0.0}, 'target_11': {'priority': 0.28542099633679585, 'prop_1': np.float64(0.0), 'prop_2': 0.03282052579591975, 'prop_3': np.float64(0.6527384073426662), 'prop_4_normd': -0.0}, 'target_12': {'priority': 0.6309456070754336, 'prop_1': np.float64(0.739476692944099), 'prop_2': 0.049961295436929204, 'prop_3': np.float64(0.5204203695786651), 'prop_4_normd': -0.0}, 'target_13': {'priority': 0.7378480194092552, 'prop_1': np.float64(0.5791299721901717), 'prop_2': 0.041116455683144884, 'prop_3': np.float64(0.3477342839272196), 'prop_4_normd': -0.0}, 'target_14': {'priority': 0.9753392450721888, 'prop_1': np.float64(0.9604974429840596), 'prop_2': 0.027048174127053265, 'prop_3': np.float64(0.3223324395696421), 'prop_4_normd': -0.0}, 'target_15': {'priority': 0.18951471677506737, 'prop_1': np.float64(1.0), 'prop_2': 0.028045202951577725, 'prop_3': np.float64(0.6864588826656022), 'prop_4_normd': -0.0}, 'target_16': {'priority': 0.829892142068991, 'prop_1': np.float64(0.051031544545620415), 'prop_2': 0.012951927671282034, 'prop_3': np.float64(0.9184774474430497), 'prop_4_normd': -0.0}, 'target_17': {'priority': 0.805208197948648, 'prop_1': np.float64(0.09383105699758443), 'prop_2': 0.04613823772572775, 'prop_3': np.float64(0.1612445798599077), 'prop_4_normd': -0.0}, 'target_18': {'priority': 0.7497313798484234, 'prop_1': np.float64(0.3604780446018815), 'prop_2': 0.03587131139163423, 'prop_3': np.float64(0.8200124116089859), 'prop_4_normd': -0.0}, 'target_19': {'priority': 0.9805442159491671, 'prop_1': np.float64(0.41451646992278607), 'prop_2': 0.04667665260455525, 'prop_3': np.float64(0.6942713451718054), 'prop_4_normd': -0.0}, 'target_20': {'priority': 0.03991136638841264, 'prop_1': np.float64(0.23408773086379167), 'prop_2': 0.015533976925185709, 'prop_3': np.float64(0.8199341930043369), 'prop_4_normd': -0.0}, 'target_21': {'priority': 0.26235271811805483, 'prop_1': np.float64(0.5129722649159048), 'prop_2': 0.03231234505292314, 'prop_3': np.float64(0.029457382565175542), 'prop_4_normd': -0.0}, 'target_22': {'priority': 0.8196046614443331, 'prop_1': np.float64(0.4988363753234679), 'prop_2': 0.030312113015886676, 'prop_3': np.float64(0.30343026194187606), 'prop_4_normd': -0.0}, 'target_23': {'priority': 0.46276603873931077, 'prop_1': np.float64(1.0), 'prop_2': 0.045180213382882306, 'prop_3': np.float64(0.6637320369176662), 'prop_4_normd': -0.0}, 'target_24': {'priority': 0.037250365029927957, 'prop_1': np.float64(0.3439577153571095), 'prop_2': 0.025910567458145323, 'prop_3': np.float64(0.9129731977113796), 'prop_4_normd': -0.0}, 'target_25': {'priority': 0.3259141704285431, 'prop_1': np.float64(0.5199010432150852), 'prop_2': 0.03754898592439353, 'prop_3': np.float64(0.5272524355632425), 'prop_4_normd': -0.0}, 'target_26': {'priority': 0.04378385210563185, 'prop_1': np.float64(0.937908630597671), 'prop_2': 0.0426031789212556, 'prop_3': np.float64(0.3210983082763837), 'prop_4_normd': -0.0}, 'target_27': {'priority': 0.7381309703287549, 'prop_1': np.float64(0.09373763077297367), 'prop_2': 0.03891319765444636, 'prop_3': np.float64(0.5193452798319762), 'prop_4_normd': -0.0}, 'target_28': {'priority': 0.2506051552479428, 'prop_1': np.float64(0.007938825204702099), 'prop_2': 0.027876990892668638, 'prop_3': np.float64(0.7951250769591794), 'prop_4_normd': -0.0}, 'target_29': {'priority': 0.22514616870331983, 'prop_1': np.float64(0.7635125768985891), 'prop_2': 0.03432249049424255, 'prop_3': np.float64(0.8819122066054487), 'prop_4_normd': -0.0}, 'target_30': {'priority': 0.5916045176099362, 'prop_1': np.float64(0.986511671806355), 'prop_2': 0.014134319095275428, 'prop_3': np.float64(0.6941055087647237), 'prop_4_normd': -0.0}, 'target_31': {'priority': 0.7292463467060817, 'prop_1': np.float64(0.9797106455916805), 'prop_2': 0.010118036996200824, 'prop_3': np.float64(0.025061979079314286), 'prop_4_normd': -0.0}}
time: 0.0
sat_props: {'omega_BP_P_normd': array([-0.0009353 , 0.00013679, -0.00555712]), 'c_hat_P': array([-0.62090234, -0.77574872, -0.11266858]), 'r_BN_P_normd': array([ 0.70555395, -0.52189728, 0.62476866]), 'v_BN_P_normd': array([ 0.71579288, 0.48386635, -0.40415273]), 'battery_charge_fraction': 0.9190121511873899, 'solar_angle_norm': np.float64(0.1668252941401964)}
eclipse: [np.float64(3450.0), np.float64(5580.0)]
target: {'target_0': {'priority': 0.805208197948648, 'prop_1': np.float64(0.09383105699758443), 'prop_2': 0.04613823772572775, 'prop_3': np.float64(0.1612445798599077), 'prop_4_normd': -0.0}, 'target_1': {'priority': 0.7497313798484234, 'prop_1': np.float64(0.3604780446018815), 'prop_2': 0.03587131139163423, 'prop_3': np.float64(0.8200124116089859), 'prop_4_normd': -0.0}, 'target_2': {'priority': 0.7173916012578099, 'prop_1': np.float64(0.8863059027468658), 'prop_2': 0.012931923436395706, 'prop_3': np.float64(0.05440340594992644), 'prop_4_normd': -0.0}, 'target_3': {'priority': 0.26235271811805483, 'prop_1': np.float64(0.5129722649159048), 'prop_2': 0.03231234505292314, 'prop_3': np.float64(0.029457382565175542), 'prop_4_normd': -0.0}, 'target_4': {'priority': 0.03991136638841264, 'prop_1': np.float64(0.23408773086379167), 'prop_2': 0.015533976925185709, 'prop_3': np.float64(0.8199341930043369), 'prop_4_normd': -0.0}, 'target_5': {'priority': 0.8196046614443331, 'prop_1': np.float64(0.4988363753234679), 'prop_2': 0.030312113015886676, 'prop_3': np.float64(0.30343026194187606), 'prop_4_normd': -0.0}, 'target_6': {'priority': 0.7000607792577789, 'prop_1': np.float64(0.4829764658302107), 'prop_2': 0.03178383502501577, 'prop_3': np.float64(0.19473317834468695), 'prop_4_normd': -0.0}, 'target_7': {'priority': 0.3259141704285431, 'prop_1': np.float64(0.5199010432150852), 'prop_2': 0.03754898592439353, 'prop_3': np.float64(0.5272524355632425), 'prop_4_normd': -0.0}, 'target_8': {'priority': 0.7221357962714954, 'prop_1': np.float64(0.019968299691167667), 'prop_2': 0.02604344280682401, 'prop_3': np.float64(0.38785146140506727), 'prop_4_normd': -0.0}, 'target_9': {'priority': 0.4835917916297542, 'prop_1': np.float64(0.913436309172294), 'prop_2': 0.01059668894457722, 'prop_3': np.float64(0.7520339085714534), 'prop_4_normd': -0.0}, 'target_10': {'priority': 0.9687687000530214, 'prop_1': np.float64(0.04310639017389428), 'prop_2': 0.03184705964968918, 'prop_3': np.float64(0.7663874813688322), 'prop_4_normd': -0.0}, 'target_11': {'priority': 0.9869428157422727, 'prop_1': np.float64(0.9234254203774177), 'prop_2': 0.02396237933175835, 'prop_3': np.float64(0.7687839143003268), 'prop_4_normd': -0.0}, 'target_12': {'priority': 0.7769440488059227, 'prop_1': np.float64(0.6392408345840034), 'prop_2': 0.036315282561394296, 'prop_3': np.float64(0.18789831613493962), 'prop_4_normd': -0.0}, 'target_13': {'priority': 0.5916045176099362, 'prop_1': np.float64(0.986511671806355), 'prop_2': 0.014134319095275428, 'prop_3': np.float64(0.6941055087647237), 'prop_4_normd': -0.0}, 'target_14': {'priority': 0.7292463467060817, 'prop_1': np.float64(0.9797106455916805), 'prop_2': 0.010118036996200824, 'prop_3': np.float64(0.025061979079314286), 'prop_4_normd': -0.0}, 'target_15': {'priority': 0.05042726354739102, 'prop_1': np.float64(0.1576196993220855), 'prop_2': 0.04388301495485157, 'prop_3': np.float64(0.2594337423004949), 'prop_4_normd': -0.0}, 'target_16': {'priority': 0.8800825118012181, 'prop_1': np.float64(0.7868728038549432), 'prop_2': 0.019911788841816942, 'prop_3': np.float64(0.2647465358054633), 'prop_4_normd': -0.0}, 'target_17': {'priority': 0.21181857950000504, 'prop_1': np.float64(0.9480782461961496), 'prop_2': 0.028875591319252027, 'prop_3': np.float64(0.7421749505743108), 'prop_4_normd': -0.0}, 'target_18': {'priority': 0.9133660347840165, 'prop_1': np.float64(0.29673639279290726), 'prop_2': 0.024091418088455566, 'prop_3': np.float64(0.7856607996483989), 'prop_4_normd': -0.0}, 'target_19': {'priority': 0.2079916135544887, 'prop_1': np.float64(0.7610042016491474), 'prop_2': 0.013217314655802635, 'prop_3': np.float64(0.48891637360577356), 'prop_4_normd': -0.0}, 'target_20': {'priority': 0.26228034066291006, 'prop_1': np.float64(0.9906468951013733), 'prop_2': 0.034570454343737976, 'prop_3': np.float64(0.41633751387091944), 'prop_4_normd': -0.0}, 'target_21': {'priority': 0.35956003090269617, 'prop_1': np.float64(0.8320764780986386), 'prop_2': 0.021487965487092246, 'prop_3': np.float64(0.18687857295910767), 'prop_4_normd': -0.0}, 'target_22': {'priority': 0.8062810977532414, 'prop_1': np.float64(0.993087334103627), 'prop_2': 0.04039141292626358, 'prop_3': np.float64(0.1338283099451153), 'prop_4_normd': -0.0}, 'target_23': {'priority': 0.23496779092483888, 'prop_1': np.float64(0.10352768256473872), 'prop_2': 0.019004809416638367, 'prop_3': np.float64(0.9070521064346198), 'prop_4_normd': -0.0}, 'target_24': {'priority': 0.9084785837974596, 'prop_1': np.float64(0.43108763475725725), 'prop_2': 0.03674322509969044, 'prop_3': np.float64(0.39407021486585936), 'prop_4_normd': -0.0}, 'target_25': {'priority': 0.14496672914401532, 'prop_1': np.float64(0.9895850113173721), 'prop_2': 0.010494811575373313, 'prop_3': np.float64(0.6539661898898557), 'prop_4_normd': -0.0}, 'target_26': {'priority': 0.5483734835622996, 'prop_1': np.float64(0.796681140436383), 'prop_2': 0.04180854061885682, 'prop_3': np.float64(0.3926113063554198), 'prop_4_normd': -0.0}, 'target_27': {'priority': 0.14617982678851893, 'prop_1': np.float64(0.07497897872331492), 'prop_2': 0.04145229760473127, 'prop_3': np.float64(0.8268282910245495), 'prop_4_normd': -0.0}, 'target_28': {'priority': 0.896280250540614, 'prop_1': np.float64(0.6766577821581528), 'prop_2': 0.04767304843877054, 'prop_3': np.float64(0.1847325271180294), 'prop_4_normd': -0.0}, 'target_29': {'priority': 0.0049630880386400955, 'prop_1': np.float64(0.19606435330027705), 'prop_2': 0.027604291185150863, 'prop_3': np.float64(0.2635404384939651), 'prop_4_normd': -0.0}, 'target_30': {'priority': 0.15620152606605864, 'prop_1': np.float64(0.5028512122335517), 'prop_2': 0.04719820746652589, 'prop_3': np.float64(0.8908624986437262), 'prop_4_normd': -0.0}, 'target_31': {'priority': 0.6090567297571149, 'prop_1': np.float64(0.9397514493066356), 'prop_2': 0.018680123293104596, 'prop_3': np.float64(0.2759228456536764), 'prop_4_normd': -0.0}}
time: 0.0
sat_props: {'omega_BP_P_normd': array([ 6.57732265e-05, 9.19824452e-04, -4.73177270e-03]), 'c_hat_P': array([-0.61330439, 0.78887935, 0.03907804]), 'r_BN_P_normd': array([ 0.98403843, 0.3786073 , -0.22100657]), 'v_BN_P_normd': array([-0.36873357, 0.56350011, -0.67646293]), 'battery_charge_fraction': 0.8735675970708932, 'solar_angle_norm': np.float64(0.5888053710771793)}
eclipse: [np.float64(2310.0), np.float64(4440.0)]
target: {'target_0': {'priority': 0.26228034066291006, 'prop_1': np.float64(0.9906468951013733), 'prop_2': 0.034570454343737976, 'prop_3': np.float64(0.41633751387091944), 'prop_4_normd': -0.0}, 'target_1': {'priority': 0.35956003090269617, 'prop_1': np.float64(0.8320764780986386), 'prop_2': 0.021487965487092246, 'prop_3': np.float64(0.18687857295910767), 'prop_4_normd': -0.0}, 'target_2': {'priority': 0.8062810977532414, 'prop_1': np.float64(0.993087334103627), 'prop_2': 0.04039141292626358, 'prop_3': np.float64(0.1338283099451153), 'prop_4_normd': -0.0}, 'target_3': {'priority': 0.23496779092483888, 'prop_1': np.float64(0.10352768256473872), 'prop_2': 0.019004809416638367, 'prop_3': np.float64(0.9070521064346198), 'prop_4_normd': -0.0}, 'target_4': {'priority': 0.9084785837974596, 'prop_1': np.float64(0.43108763475725725), 'prop_2': 0.03674322509969044, 'prop_3': np.float64(0.39407021486585936), 'prop_4_normd': -0.0}, 'target_5': {'priority': 0.14496672914401532, 'prop_1': np.float64(0.9895850113173721), 'prop_2': 0.010494811575373313, 'prop_3': np.float64(0.6539661898898557), 'prop_4_normd': -0.0}, 'target_6': {'priority': 0.5483734835622996, 'prop_1': np.float64(0.796681140436383), 'prop_2': 0.04180854061885682, 'prop_3': np.float64(0.3926113063554198), 'prop_4_normd': -0.0}, 'target_7': {'priority': 0.14617982678851893, 'prop_1': np.float64(0.07497897872331492), 'prop_2': 0.04145229760473127, 'prop_3': np.float64(0.8268282910245495), 'prop_4_normd': -0.0}, 'target_8': {'priority': 0.896280250540614, 'prop_1': np.float64(0.6766577821581528), 'prop_2': 0.04767304843877054, 'prop_3': np.float64(0.1847325271180294), 'prop_4_normd': -0.0}, 'target_9': {'priority': 0.0049630880386400955, 'prop_1': np.float64(0.19606435330027705), 'prop_2': 0.027604291185150863, 'prop_3': np.float64(0.2635404384939651), 'prop_4_normd': -0.0}, 'target_10': {'priority': 0.15620152606605864, 'prop_1': np.float64(0.5028512122335517), 'prop_2': 0.04719820746652589, 'prop_3': np.float64(0.8908624986437262), 'prop_4_normd': -0.0}, 'target_11': {'priority': 0.6090567297571149, 'prop_1': np.float64(0.9397514493066356), 'prop_2': 0.018680123293104596, 'prop_3': np.float64(0.2759228456536764), 'prop_4_normd': -0.0}, 'target_12': {'priority': 0.7178310765496564, 'prop_1': np.float64(0.008717087366691814), 'prop_2': 0.04077086254773631, 'prop_3': np.float64(0.4970973840371545), 'prop_4_normd': -0.0}, 'target_13': {'priority': 0.8967933004986205, 'prop_1': np.float64(0.7482609280415848), 'prop_2': 0.03476544328302366, 'prop_3': np.float64(0.6835321610084802), 'prop_4_normd': -0.0}, 'target_14': {'priority': 0.543689316316815, 'prop_1': np.float64(0.9812848248636226), 'prop_2': 0.027779619705700302, 'prop_3': np.float64(0.5481930510991878), 'prop_4_normd': -0.0}, 'target_15': {'priority': 0.754909559150052, 'prop_1': np.float64(0.05757597235871913), 'prop_2': 0.03729929464921535, 'prop_3': np.float64(0.284165822702533), 'prop_4_normd': -0.0}, 'target_16': {'priority': 0.5148170269813278, 'prop_1': np.float64(0.98277564071416), 'prop_2': 0.047297086415085086, 'prop_3': np.float64(0.48700099507113837), 'prop_4_normd': -0.0}, 'target_17': {'priority': 0.33363421409005134, 'prop_1': np.float64(0.27963666684608807), 'prop_2': 0.015448025913752838, 'prop_3': np.float64(0.35524598852016775), 'prop_4_normd': -0.0}, 'target_18': {'priority': 0.15554516992643075, 'prop_1': np.float64(0.44856007038705614), 'prop_2': 0.03462561443516386, 'prop_3': np.float64(0.041177643202259424), 'prop_4_normd': -0.0}, 'target_19': {'priority': 0.9754007045026568, 'prop_1': np.float64(0.20622308574436016), 'prop_2': 0.04771903579898489, 'prop_3': np.float64(0.2097060094346733), 'prop_4_normd': -0.0}, 'target_20': {'priority': 0.06327147616333118, 'prop_1': np.float64(0.913162122598643), 'prop_2': 0.015400618290328318, 'prop_3': np.float64(0.8438779456824926), 'prop_4_normd': -0.0}, 'target_21': {'priority': 0.952831123720716, 'prop_1': np.float64(0.5425823625818398), 'prop_2': 0.04391279805025721, 'prop_3': np.float64(0.1188596248776597), 'prop_4_normd': -0.0}, 'target_22': {'priority': 0.1984435827220441, 'prop_1': np.float64(0.9993930622647624), 'prop_2': 0.018418751683138883, 'prop_3': np.float64(0.8733160501738085), 'prop_4_normd': -0.0}, 'target_23': {'priority': 0.6081052486615345, 'prop_1': np.float64(0.6666874839765461), 'prop_2': 0.04756378419886552, 'prop_3': np.float64(0.3751647110694418), 'prop_4_normd': -0.0}, 'target_24': {'priority': 0.8604551371804029, 'prop_1': np.float64(0.08057499070803986), 'prop_2': 0.04071241908237248, 'prop_3': np.float64(0.609432855870325), 'prop_4_normd': -0.0}, 'target_25': {'priority': 0.33343926079085895, 'prop_1': np.float64(0.7085651414432226), 'prop_2': 0.013267662106720101, 'prop_3': np.float64(0.09019785855427226), 'prop_4_normd': -0.0}, 'target_26': {'priority': 0.16416909415169478, 'prop_1': np.float64(0.2807892061289123), 'prop_2': 0.013750744690519361, 'prop_3': np.float64(0.189459753332757), 'prop_4_normd': -0.0}, 'target_27': {'priority': 0.905810716682313, 'prop_1': np.float64(0.7660194147598671), 'prop_2': 0.04318851039188519, 'prop_3': np.float64(0.1304886896445085), 'prop_4_normd': -0.0}, 'target_28': {'priority': 0.39927138950055974, 'prop_1': np.float64(1.0), 'prop_2': 0.029637926540067736, 'prop_3': np.float64(0.7333017121319036), 'prop_4_normd': -0.0}, 'target_29': {'priority': 0.5778706973732319, 'prop_1': np.float64(0.6245550082437898), 'prop_2': 0.04978325134312043, 'prop_3': np.float64(0.8122073231245674), 'prop_4_normd': -0.0}, 'target_30': {'priority': 0.05629366991581264, 'prop_1': np.float64(0.5809683193452809), 'prop_2': 0.01729131801779895, 'prop_3': np.float64(0.6992764929868548), 'prop_4_normd': -0.0}, 'target_31': {'priority': 0.43088704356158114, 'prop_1': np.float64(0.6325466948493413), 'prop_2': 0.029827103012583775, 'prop_3': np.float64(0.712024016779776), 'prop_4_normd': -0.0}}
time: 0.0
sat_props: {'omega_BP_P_normd': array([-0.0010775 , 0.0033747 , -0.00368788]), 'c_hat_P': array([-0.8447729 , -0.50942475, 0.16384496]), 'r_BN_P_normd': array([-0.09738475, 0.75588946, -0.76135823]), 'v_BN_P_normd': array([-0.94368276, -0.13560413, -0.01392436]), 'battery_charge_fraction': 0.8166400946366469, 'solar_angle_norm': np.float64(0.1541904664169785)}
eclipse: [np.float64(1200.0), np.float64(3300.0)]
target: {'target_0': {'priority': 0.15620152606605864, 'prop_1': np.float64(0.5028512122335517), 'prop_2': 0.04719820746652589, 'prop_3': np.float64(0.8908624986437262), 'prop_4_normd': -0.0}, 'target_1': {'priority': 0.9560067989183784, 'prop_1': np.float64(0.6758726802999104), 'prop_2': 0.04782848860703626, 'prop_3': np.float64(0.6757920368735708), 'prop_4_normd': -0.0}, 'target_2': {'priority': 0.6090567297571149, 'prop_1': np.float64(0.9397514493066356), 'prop_2': 0.018680123293104596, 'prop_3': np.float64(0.2759228456536764), 'prop_4_normd': -0.0}, 'target_3': {'priority': 0.9397564003482999, 'prop_1': np.float64(0.864162539013529), 'prop_2': 0.04083485710529246, 'prop_3': np.float64(0.05956535587203046), 'prop_4_normd': -0.0}, 'target_4': {'priority': 0.8967933004986205, 'prop_1': np.float64(0.7482609280415848), 'prop_2': 0.03476544328302366, 'prop_3': np.float64(0.6835321610084802), 'prop_4_normd': -0.0}, 'target_5': {'priority': 0.9274083923453597, 'prop_1': np.float64(0.05006799490865553), 'prop_2': 0.011088498014595083, 'prop_3': np.float64(0.09727868149321972), 'prop_4_normd': -0.0}, 'target_6': {'priority': 0.08492005718652906, 'prop_1': np.float64(0.7122220944171351), 'prop_2': 0.02256226819031263, 'prop_3': np.float64(0.6194570106002709), 'prop_4_normd': -0.0}, 'target_7': {'priority': 0.543689316316815, 'prop_1': np.float64(0.9812848248636226), 'prop_2': 0.027779619705700302, 'prop_3': np.float64(0.5481930510991878), 'prop_4_normd': -0.0}, 'target_8': {'priority': 0.7178310765496564, 'prop_1': np.float64(0.008717087366691814), 'prop_2': 0.04077086254773631, 'prop_3': np.float64(0.4970973840371545), 'prop_4_normd': -0.0}, 'target_9': {'priority': 0.754909559150052, 'prop_1': np.float64(0.05757597235871913), 'prop_2': 0.03729929464921535, 'prop_3': np.float64(0.284165822702533), 'prop_4_normd': -0.0}, 'target_10': {'priority': 0.26129816366655456, 'prop_1': np.float64(0.9801329950029055), 'prop_2': 0.014209014650960264, 'prop_3': np.float64(0.09732109242334332), 'prop_4_normd': -0.0}, 'target_11': {'priority': 0.7511786558834868, 'prop_1': np.float64(0.14609372533908693), 'prop_2': 0.04326569997609207, 'prop_3': np.float64(0.14539193088453728), 'prop_4_normd': -0.0}, 'target_12': {'priority': 0.33363421409005134, 'prop_1': np.float64(0.27963666684608807), 'prop_2': 0.015448025913752838, 'prop_3': np.float64(0.35524598852016775), 'prop_4_normd': -0.0}, 'target_13': {'priority': 0.7838738265919503, 'prop_1': np.float64(0.1120603312737106), 'prop_2': 0.015208583258170937, 'prop_3': np.float64(0.8104452357493993), 'prop_4_normd': -0.0}, 'target_14': {'priority': 0.15554516992643075, 'prop_1': np.float64(0.44856007038705614), 'prop_2': 0.03462561443516386, 'prop_3': np.float64(0.041177643202259424), 'prop_4_normd': -0.0}, 'target_15': {'priority': 0.9754007045026568, 'prop_1': np.float64(0.20622308574436016), 'prop_2': 0.04771903579898489, 'prop_3': np.float64(0.2097060094346733), 'prop_4_normd': -0.0}, 'target_16': {'priority': 0.4596153545251349, 'prop_1': np.float64(1.0), 'prop_2': 0.020307800243842836, 'prop_3': np.float64(0.5140122128212462), 'prop_4_normd': -0.0}, 'target_17': {'priority': 0.3659991252731889, 'prop_1': np.float64(0.05409862818622294), 'prop_2': 0.01687746524189312, 'prop_3': np.float64(0.7375854209483653), 'prop_4_normd': -0.0}, 'target_18': {'priority': 0.1984435827220441, 'prop_1': np.float64(0.9993930622647624), 'prop_2': 0.018418751683138883, 'prop_3': np.float64(0.8733160501738085), 'prop_4_normd': -0.0}, 'target_19': {'priority': 0.17225514293500632, 'prop_1': np.float64(0.8385972978367822), 'prop_2': 0.04929686890520145, 'prop_3': np.float64(0.5221241207594288), 'prop_4_normd': -0.0}, 'target_20': {'priority': 0.8604551371804029, 'prop_1': np.float64(0.08057499070803986), 'prop_2': 0.04071241908237248, 'prop_3': np.float64(0.609432855870325), 'prop_4_normd': -0.0}, 'target_21': {'priority': 0.40742501090364514, 'prop_1': np.float64(0.5399153179893333), 'prop_2': 0.030880862025583225, 'prop_3': np.float64(0.8899055693352789), 'prop_4_normd': -0.0}, 'target_22': {'priority': 0.16416909415169478, 'prop_1': np.float64(0.2807892061289123), 'prop_2': 0.013750744690519361, 'prop_3': np.float64(0.189459753332757), 'prop_4_normd': -0.0}, 'target_23': {'priority': 0.39927138950055974, 'prop_1': np.float64(1.0), 'prop_2': 0.029637926540067736, 'prop_3': np.float64(0.7333017121319036), 'prop_4_normd': -0.0}, 'target_24': {'priority': 0.5778706973732319, 'prop_1': np.float64(0.6245550082437898), 'prop_2': 0.04978325134312043, 'prop_3': np.float64(0.8122073231245674), 'prop_4_normd': -0.0}, 'target_25': {'priority': 0.05629366991581264, 'prop_1': np.float64(0.5809683193452809), 'prop_2': 0.01729131801779895, 'prop_3': np.float64(0.6992764929868548), 'prop_4_normd': -0.0}, 'target_26': {'priority': 0.43088704356158114, 'prop_1': np.float64(0.6325466948493413), 'prop_2': 0.029827103012583775, 'prop_3': np.float64(0.712024016779776), 'prop_4_normd': -0.0}, 'target_27': {'priority': 0.7462625306251898, 'prop_1': np.float64(0.2982597519032414), 'prop_2': 0.045024292039336875, 'prop_3': np.float64(0.44346734103754687), 'prop_4_normd': -0.0}, 'target_28': {'priority': 0.7841923371031474, 'prop_1': np.float64(0.9591233826139078), 'prop_2': 0.037755865811717484, 'prop_3': np.float64(0.9093112695308485), 'prop_4_normd': -0.0}, 'target_29': {'priority': 0.613105381090001, 'prop_1': np.float64(0.590160027737857), 'prop_2': 0.031337283935696104, 'prop_3': np.float64(0.8510975679307113), 'prop_4_normd': -0.0}, 'target_30': {'priority': 0.5852822100268925, 'prop_1': np.float64(0.36990893176639794), 'prop_2': 0.04653269597866705, 'prop_3': np.float64(0.4456852642768419), 'prop_4_normd': -0.0}, 'target_31': {'priority': 0.8518922703837282, 'prop_1': np.float64(0.3895111648188495), 'prop_2': 0.017828837989348107, 'prop_3': np.float64(0.007061709337917654), 'prop_4_normd': -0.0}}
time: 0.0
sat_props: {'omega_BP_P_normd': array([ 0.00134838, -0.0029125 , -0.00098499]), 'c_hat_P': array([-0.5665049 , -0.81904639, 0.09074805]), 'r_BN_P_normd': array([-1.04422552, 0.08855808, -0.2495387 ]), 'v_BN_P_normd': array([-0.21449445, -0.64730808, 0.6678572 ]), 'battery_charge_fraction': 0.8141227526530871, 'solar_angle_norm': np.float64(0.09988599840507909)}
eclipse: [np.float64(60.00000000000001), np.float64(2190.0)]
target: {'target_0': {'priority': 0.4596153545251349, 'prop_1': np.float64(1.0), 'prop_2': 0.020307800243842836, 'prop_3': np.float64(0.5140122128212462), 'prop_4_normd': -0.0}, 'target_1': {'priority': 0.3659991252731889, 'prop_1': np.float64(0.05409862818622294), 'prop_2': 0.01687746524189312, 'prop_3': np.float64(0.7375854209483653), 'prop_4_normd': -0.0}, 'target_2': {'priority': 0.17225514293500632, 'prop_1': np.float64(0.8385972978367822), 'prop_2': 0.04929686890520145, 'prop_3': np.float64(0.5221241207594288), 'prop_4_normd': -0.0}, 'target_3': {'priority': 0.40742501090364514, 'prop_1': np.float64(0.5399153179893333), 'prop_2': 0.030880862025583225, 'prop_3': np.float64(0.8899055693352789), 'prop_4_normd': -0.0}, 'target_4': {'priority': 0.15094914837038043, 'prop_1': np.float64(0.1600098968039353), 'prop_2': 0.0372480349396054, 'prop_3': np.float64(0.4679935866084606), 'prop_4_normd': -0.0}, 'target_5': {'priority': 0.4373081987605446, 'prop_1': np.float64(0.16656956766685047), 'prop_2': 0.026836967671334234, 'prop_3': np.float64(0.1323442213766992), 'prop_4_normd': -0.0}, 'target_6': {'priority': 0.43088704356158114, 'prop_1': np.float64(0.6325466948493413), 'prop_2': 0.029827103012583775, 'prop_3': np.float64(0.712024016779776), 'prop_4_normd': -0.0}, 'target_7': {'priority': 0.9974710312400171, 'prop_1': np.float64(1.0), 'prop_2': 0.023556982195548692, 'prop_3': np.float64(0.015946379549076115), 'prop_4_normd': -0.0}, 'target_8': {'priority': 0.7462625306251898, 'prop_1': np.float64(0.2982597519032414), 'prop_2': 0.045024292039336875, 'prop_3': np.float64(0.44346734103754687), 'prop_4_normd': -0.0}, 'target_9': {'priority': 0.7841923371031474, 'prop_1': np.float64(0.9591233826139078), 'prop_2': 0.037755865811717484, 'prop_3': np.float64(0.9093112695308485), 'prop_4_normd': -0.0}, 'target_10': {'priority': 0.613105381090001, 'prop_1': np.float64(0.590160027737857), 'prop_2': 0.031337283935696104, 'prop_3': np.float64(0.8510975679307113), 'prop_4_normd': -0.0}, 'target_11': {'priority': 0.5852822100268925, 'prop_1': np.float64(0.36990893176639794), 'prop_2': 0.04653269597866705, 'prop_3': np.float64(0.4456852642768419), 'prop_4_normd': -0.0}, 'target_12': {'priority': 0.34000304360297495, 'prop_1': np.float64(0.9944847066186256), 'prop_2': 0.03393163135966621, 'prop_3': np.float64(0.47590147868624155), 'prop_4_normd': -0.0}, 'target_13': {'priority': 0.23110739788422052, 'prop_1': np.float64(0.6773821240549803), 'prop_2': 0.017984788259031905, 'prop_3': np.float64(0.47193060176014956), 'prop_4_normd': -0.0}, 'target_14': {'priority': 0.18100605976414696, 'prop_1': np.float64(1.0), 'prop_2': 0.011879918201780573, 'prop_3': np.float64(0.5109681565409651), 'prop_4_normd': -0.0}, 'target_15': {'priority': 0.7053880626885703, 'prop_1': np.float64(0.23103685455589726), 'prop_2': 0.012802744584004837, 'prop_3': np.float64(0.5448547507690691), 'prop_4_normd': -0.0}, 'target_16': {'priority': 0.1633664559021203, 'prop_1': np.float64(1.0), 'prop_2': 0.020608850788857196, 'prop_3': np.float64(0.5387060943662177), 'prop_4_normd': -0.0}, 'target_17': {'priority': 0.5809659624528973, 'prop_1': np.float64(0.13729744380072872), 'prop_2': 0.012742529830350166, 'prop_3': np.float64(0.9044564966391249), 'prop_4_normd': -0.0}, 'target_18': {'priority': 0.9672643792272313, 'prop_1': np.float64(0.6771252894737922), 'prop_2': 0.043546720561153066, 'prop_3': np.float64(0.01327414045488771), 'prop_4_normd': -0.0}, 'target_19': {'priority': 0.03177482425911071, 'prop_1': np.float64(0.9188487053805751), 'prop_2': 0.012359745287068721, 'prop_3': np.float64(0.6244352067126765), 'prop_4_normd': -0.0}, 'target_20': {'priority': 0.1620597486265063, 'prop_1': np.float64(0.32471532540988063), 'prop_2': 0.021931235486235705, 'prop_3': np.float64(0.6855506082056277), 'prop_4_normd': -0.0}, 'target_21': {'priority': 0.053247230445791494, 'prop_1': np.float64(0.465036271289076), 'prop_2': 0.03563025242548773, 'prop_3': np.float64(0.9025594456524167), 'prop_4_normd': -0.0}, 'target_22': {'priority': 0.4330199859612206, 'prop_1': np.float64(1.0), 'prop_2': 0.020218306152100317, 'prop_3': np.float64(0.6702366946572057), 'prop_4_normd': -0.0}, 'target_23': {'priority': 0.3011615633479109, 'prop_1': np.float64(0.18844447543725398), 'prop_2': 0.04545257905252125, 'prop_3': np.float64(0.06768644938605572), 'prop_4_normd': -0.0}, 'target_24': {'priority': 0.8395413208814804, 'prop_1': np.float64(0.6431795157724476), 'prop_2': 0.017677605544106918, 'prop_3': np.float64(0.4728944248799916), 'prop_4_normd': -0.0}, 'target_25': {'priority': 0.28542099633679585, 'prop_1': np.float64(0.0), 'prop_2': 0.03282052579591975, 'prop_3': np.float64(0.6527384073426662), 'prop_4_normd': -0.0}, 'target_26': {'priority': 0.7378480194092552, 'prop_1': np.float64(0.5791299721901717), 'prop_2': 0.041116455683144884, 'prop_3': np.float64(0.3477342839272196), 'prop_4_normd': -0.0}, 'target_27': {'priority': 0.6309456070754336, 'prop_1': np.float64(0.739476692944099), 'prop_2': 0.049961295436929204, 'prop_3': np.float64(0.5204203695786651), 'prop_4_normd': -0.0}, 'target_28': {'priority': 0.18951471677506737, 'prop_1': np.float64(1.0), 'prop_2': 0.028045202951577725, 'prop_3': np.float64(0.6864588826656022), 'prop_4_normd': -0.0}, 'target_29': {'priority': 0.829892142068991, 'prop_1': np.float64(0.051031544545620415), 'prop_2': 0.012951927671282034, 'prop_3': np.float64(0.9184774474430497), 'prop_4_normd': -0.0}, 'target_30': {'priority': 0.6245099616003051, 'prop_1': np.float64(0.6786198581781225), 'prop_2': 0.029146511530274165, 'prop_3': np.float64(0.8356293281937733), 'prop_4_normd': -0.0}, 'target_31': {'priority': 0.9805442159491671, 'prop_1': np.float64(0.41451646992278607), 'prop_2': 0.04667665260455525, 'prop_3': np.float64(0.6942713451718054), 'prop_4_normd': -0.0}}
time: 0.0
Then, run the simulation until timeout or agent failure.
[12]:
count = 0
while True:
if count == 0:
# Vector with an action for each satellite (we can pass different actions for each satellite)
# Tasking all satellites to charge (tasking None as the first action will raise a warning)
action_dict = {sat_i.name: 0 for sat_i in env.satellites}
else:
# Tasking random actions
action_dict = {sat_i.name: np.random.randint(0, 32) for sat_i in env.satellites}
count += 1
observation, reward, terminated, truncated, info = env.step(action_dict)
if all(terminated.values()) or all(truncated.values()):
print("Episode complete.")
break
2025-05-09 15:44:56,113 gym INFO <0.00> === STARTING STEP ===
2025-05-09 15:44:56,113 sats.satellite.EO-0 INFO <0.00> EO-0: action_charge tasked for 60.0 seconds
2025-05-09 15:44:56,114 sats.satellite.EO-0 INFO <0.00> EO-0: setting timed terminal event at 60.0
2025-05-09 15:44:56,115 sats.satellite.EO-1 INFO <0.00> EO-1: action_charge tasked for 60.0 seconds
2025-05-09 15:44:56,115 sats.satellite.EO-1 INFO <0.00> EO-1: setting timed terminal event at 60.0
2025-05-09 15:44:56,116 sats.satellite.EO-2 INFO <0.00> EO-2: action_charge tasked for 60.0 seconds
2025-05-09 15:44:56,117 sats.satellite.EO-2 INFO <0.00> EO-2: setting timed terminal event at 60.0
2025-05-09 15:44:56,118 sats.satellite.EO-3 INFO <0.00> EO-3: action_charge tasked for 60.0 seconds
2025-05-09 15:44:56,118 sats.satellite.EO-3 INFO <0.00> EO-3: setting timed terminal event at 60.0
2025-05-09 15:44:56,119 sats.satellite.EO-4 INFO <0.00> EO-4: action_charge tasked for 60.0 seconds
2025-05-09 15:44:56,119 sats.satellite.EO-4 INFO <0.00> EO-4: setting timed terminal event at 60.0
2025-05-09 15:44:56,231 sats.satellite.EO-0 INFO <60.00> EO-0: timed termination at 60.0 for action_charge
2025-05-09 15:44:56,231 sats.satellite.EO-1 INFO <60.00> EO-1: timed termination at 60.0 for action_charge
2025-05-09 15:44:56,231 sats.satellite.EO-2 INFO <60.00> EO-2: timed termination at 60.0 for action_charge
2025-05-09 15:44:56,232 sats.satellite.EO-3 INFO <60.00> EO-3: timed termination at 60.0 for action_charge
2025-05-09 15:44:56,232 sats.satellite.EO-4 INFO <60.00> EO-4: timed termination at 60.0 for action_charge
2025-05-09 15:44:56,237 data.base INFO <60.00> Total reward: {}
2025-05-09 15:44:56,238 sats.satellite.EO-0 INFO <60.00> EO-0: Satellite EO-0 requires retasking
2025-05-09 15:44:56,238 sats.satellite.EO-1 INFO <60.00> EO-1: Satellite EO-1 requires retasking
2025-05-09 15:44:56,239 sats.satellite.EO-2 INFO <60.00> EO-2: Satellite EO-2 requires retasking
2025-05-09 15:44:56,239 sats.satellite.EO-3 INFO <60.00> EO-3: Satellite EO-3 requires retasking
2025-05-09 15:44:56,239 sats.satellite.EO-4 INFO <60.00> EO-4: Satellite EO-4 requires retasking
2025-05-09 15:44:56,260 gym INFO <60.00> Step reward: {}
2025-05-09 15:44:56,264 gym INFO <60.00> === STARTING STEP ===
2025-05-09 15:44:56,265 sats.satellite.EO-0 INFO <60.00> EO-0: target index 5 tasked
2025-05-09 15:44:56,265 sats.satellite.EO-0 INFO <60.00> EO-0: Target(tgt-446) tasked for imaging
2025-05-09 15:44:56,267 sats.satellite.EO-0 INFO <60.00> EO-0: Target(tgt-446) window enabled: 409.1 to 540.4
2025-05-09 15:44:56,267 sats.satellite.EO-0 INFO <60.00> EO-0: setting timed terminal event at 540.4
2025-05-09 15:44:56,268 sats.satellite.EO-1 INFO <60.00> EO-1: target index 18 tasked
2025-05-09 15:44:56,269 sats.satellite.EO-1 INFO <60.00> EO-1: Target(tgt-471) tasked for imaging
2025-05-09 15:44:56,270 sats.satellite.EO-1 INFO <60.00> EO-1: Target(tgt-471) window enabled: 1453.8 to 1558.6
2025-05-09 15:44:56,271 sats.satellite.EO-1 INFO <60.00> EO-1: setting timed terminal event at 1558.6
2025-05-09 15:44:56,272 sats.satellite.EO-2 INFO <60.00> EO-2: target index 5 tasked
2025-05-09 15:44:56,272 sats.satellite.EO-2 INFO <60.00> EO-2: Target(tgt-533) tasked for imaging
2025-05-09 15:44:56,274 sats.satellite.EO-2 INFO <60.00> EO-2: Target(tgt-533) window enabled: 835.2 to 958.4
2025-05-09 15:44:56,274 sats.satellite.EO-2 INFO <60.00> EO-2: setting timed terminal event at 958.4
2025-05-09 15:44:56,275 sats.satellite.EO-3 INFO <60.00> EO-3: target index 16 tasked
2025-05-09 15:44:56,275 sats.satellite.EO-3 INFO <60.00> EO-3: Target(tgt-366) tasked for imaging
2025-05-09 15:44:56,277 sats.satellite.EO-3 INFO <60.00> EO-3: Target(tgt-366) window enabled: 1169.7 to 1288.2
2025-05-09 15:44:56,277 sats.satellite.EO-3 INFO <60.00> EO-3: setting timed terminal event at 1288.2
2025-05-09 15:44:56,278 sats.satellite.EO-4 INFO <60.00> EO-4: target index 28 tasked
2025-05-09 15:44:56,279 sats.satellite.EO-4 INFO <60.00> EO-4: Target(tgt-970) tasked for imaging
2025-05-09 15:44:56,280 sats.satellite.EO-4 INFO <60.00> EO-4: Target(tgt-970) window enabled: 2360.3 to 2483.2
2025-05-09 15:44:56,280 sats.satellite.EO-4 INFO <60.00> EO-4: setting timed terminal event at 2483.2
2025-05-09 15:44:56,842 sim.simulator INFO <360.00> Max step duration reached
2025-05-09 15:44:56,847 data.base INFO <360.00> Total reward: {}
2025-05-09 15:44:56,854 sats.satellite.EO-4 INFO <360.00> EO-4: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-05-09 15:44:56,892 gym INFO <360.00> Step reward: {}
2025-05-09 15:44:56,896 gym INFO <360.00> === STARTING STEP ===
2025-05-09 15:44:56,897 sats.satellite.EO-0 INFO <360.00> EO-0: target index 7 tasked
2025-05-09 15:44:56,897 sats.satellite.EO-0 INFO <360.00> EO-0: Target(tgt-865) tasked for imaging
2025-05-09 15:44:56,899 sats.satellite.EO-0 INFO <360.00> EO-0: Target(tgt-865) window enabled: 967.9 to 1061.8
2025-05-09 15:44:56,899 sats.satellite.EO-0 INFO <360.00> EO-0: setting timed terminal event at 1061.8
2025-05-09 15:44:56,900 sats.satellite.EO-1 INFO <360.00> EO-1: target index 30 tasked
2025-05-09 15:44:56,901 sats.satellite.EO-1 INFO <360.00> EO-1: Target(tgt-900) tasked for imaging
2025-05-09 15:44:56,902 sats.satellite.EO-1 INFO <360.00> EO-1: Target(tgt-900) window enabled: 2686.0 to 2816.3
2025-05-09 15:44:56,902 sats.satellite.EO-1 INFO <360.00> EO-1: setting timed terminal event at 2816.3
2025-05-09 15:44:56,903 sats.satellite.EO-2 INFO <360.00> EO-2: target index 12 tasked
2025-05-09 15:44:56,904 sats.satellite.EO-2 INFO <360.00> EO-2: Target(tgt-684) tasked for imaging
2025-05-09 15:44:56,905 sats.satellite.EO-2 INFO <360.00> EO-2: Target(tgt-684) window enabled: 1555.4 to 1617.7
2025-05-09 15:44:56,905 sats.satellite.EO-2 INFO <360.00> EO-2: setting timed terminal event at 1617.7
2025-05-09 15:44:56,906 sats.satellite.EO-3 INFO <360.00> EO-3: target index 12 tasked
2025-05-09 15:44:56,907 sats.satellite.EO-3 INFO <360.00> EO-3: Target(tgt-536) tasked for imaging
2025-05-09 15:44:56,908 sats.satellite.EO-3 INFO <360.00> EO-3: Target(tgt-536) window enabled: 1040.7 to 1172.3
2025-05-09 15:44:56,908 sats.satellite.EO-3 INFO <360.00> EO-3: setting timed terminal event at 1172.3
2025-05-09 15:44:56,909 sats.satellite.EO-4 INFO <360.00> EO-4: target index 6 tasked
2025-05-09 15:44:56,910 sats.satellite.EO-4 INFO <360.00> EO-4: Target(tgt-433) tasked for imaging
2025-05-09 15:44:56,912 sats.satellite.EO-4 INFO <360.00> EO-4: Target(tgt-433) window enabled: 835.7 to 939.2
2025-05-09 15:44:56,912 sats.satellite.EO-4 INFO <360.00> EO-4: setting timed terminal event at 939.2
2025-05-09 15:44:57,478 sim.simulator INFO <660.00> Max step duration reached
2025-05-09 15:44:57,482 data.base INFO <660.00> Total reward: {}
2025-05-09 15:44:57,486 sats.satellite.EO-1 INFO <660.00> EO-1: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-05-09 15:44:57,524 sats.satellite.EO-2 INFO <660.00> EO-2: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-05-09 15:44:57,571 gym INFO <660.00> Step reward: {}
2025-05-09 15:44:57,575 gym INFO <660.00> === STARTING STEP ===
2025-05-09 15:44:57,576 sats.satellite.EO-0 INFO <660.00> EO-0: target index 21 tasked
2025-05-09 15:44:57,576 sats.satellite.EO-0 INFO <660.00> EO-0: Target(tgt-496) tasked for imaging
2025-05-09 15:44:57,578 sats.satellite.EO-0 INFO <660.00> EO-0: Target(tgt-496) window enabled: 2159.5 to 2285.9
2025-05-09 15:44:57,578 sats.satellite.EO-0 INFO <660.00> EO-0: setting timed terminal event at 2285.9
2025-05-09 15:44:57,579 sats.satellite.EO-1 INFO <660.00> EO-1: target index 29 tasked
2025-05-09 15:44:57,580 sats.satellite.EO-1 INFO <660.00> EO-1: Target(tgt-216) tasked for imaging
2025-05-09 15:44:57,581 sats.satellite.EO-1 INFO <660.00> EO-1: Target(tgt-216) window enabled: 3003.0 to 3131.3
2025-05-09 15:44:57,581 sats.satellite.EO-1 INFO <660.00> EO-1: setting timed terminal event at 3131.3
2025-05-09 15:44:57,582 sats.satellite.EO-2 INFO <660.00> EO-2: target index 7 tasked
2025-05-09 15:44:57,583 sats.satellite.EO-2 INFO <660.00> EO-2: Target(tgt-950) tasked for imaging
2025-05-09 15:44:57,584 sats.satellite.EO-2 INFO <660.00> EO-2: Target(tgt-950) window enabled: 971.3 to 1099.8
2025-05-09 15:44:57,585 sats.satellite.EO-2 INFO <660.00> EO-2: setting timed terminal event at 1099.8
2025-05-09 15:44:57,585 sats.satellite.EO-3 INFO <660.00> EO-3: target index 28 tasked
2025-05-09 15:44:57,586 sats.satellite.EO-3 INFO <660.00> EO-3: Target(tgt-902) tasked for imaging
2025-05-09 15:44:57,587 sats.satellite.EO-3 INFO <660.00> EO-3: Target(tgt-902) window enabled: 2495.9 to 2626.8
2025-05-09 15:44:57,588 sats.satellite.EO-3 INFO <660.00> EO-3: setting timed terminal event at 2626.8
2025-05-09 15:44:57,589 sats.satellite.EO-4 INFO <660.00> EO-4: target index 17 tasked
2025-05-09 15:44:57,589 sats.satellite.EO-4 INFO <660.00> EO-4: Target(tgt-597) tasked for imaging
2025-05-09 15:44:57,590 sats.satellite.EO-4 INFO <660.00> EO-4: Target(tgt-597) window enabled: 1729.0 to 1828.9
2025-05-09 15:44:57,591 sats.satellite.EO-4 INFO <660.00> EO-4: setting timed terminal event at 1828.9
2025-05-09 15:44:58,165 sim.simulator INFO <960.00> Max step duration reached
2025-05-09 15:44:58,169 data.base INFO <960.00> Total reward: {}
2025-05-09 15:44:58,172 sats.satellite.EO-0 INFO <960.00> EO-0: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-05-09 15:44:58,246 gym INFO <960.00> Step reward: {}
2025-05-09 15:44:58,251 gym INFO <960.00> === STARTING STEP ===
2025-05-09 15:44:58,251 sats.satellite.EO-0 INFO <960.00> EO-0: target index 4 tasked
2025-05-09 15:44:58,252 sats.satellite.EO-0 INFO <960.00> EO-0: Target(tgt-966) tasked for imaging
2025-05-09 15:44:58,254 sats.satellite.EO-0 INFO <960.00> EO-0: Target(tgt-966) window enabled: 1110.6 to 1223.2
2025-05-09 15:44:58,254 sats.satellite.EO-0 INFO <960.00> EO-0: setting timed terminal event at 1223.2
2025-05-09 15:44:58,255 sats.satellite.EO-1 INFO <960.00> EO-1: target index 16 tasked
2025-05-09 15:44:58,255 sats.satellite.EO-1 INFO <960.00> EO-1: Target(tgt-533) tasked for imaging
2025-05-09 15:44:58,257 sats.satellite.EO-1 INFO <960.00> EO-1: Target(tgt-533) window enabled: 2032.1 to 2140.3
2025-05-09 15:44:58,257 sats.satellite.EO-1 INFO <960.00> EO-1: setting timed terminal event at 2140.3
2025-05-09 15:44:58,258 sats.satellite.EO-2 INFO <960.00> EO-2: target index 5 tasked
2025-05-09 15:44:58,259 sats.satellite.EO-2 INFO <960.00> EO-2: Target(tgt-221) tasked for imaging
2025-05-09 15:44:58,260 sats.satellite.EO-2 INFO <960.00> EO-2: Target(tgt-221) window enabled: 1275.9 to 1395.2
2025-05-09 15:44:58,260 sats.satellite.EO-2 INFO <960.00> EO-2: setting timed terminal event at 1395.2
2025-05-09 15:44:58,261 sats.satellite.EO-3 INFO <960.00> EO-3: target index 4 tasked
2025-05-09 15:44:58,262 sats.satellite.EO-3 INFO <960.00> EO-3: Target(tgt-481) tasked for imaging
2025-05-09 15:44:58,263 sats.satellite.EO-3 INFO <960.00> EO-3: Target(tgt-481) window enabled: 1117.1 to 1246.8
2025-05-09 15:44:58,263 sats.satellite.EO-3 INFO <960.00> EO-3: setting timed terminal event at 1246.8
2025-05-09 15:44:58,264 sats.satellite.EO-4 INFO <960.00> EO-4: target index 5 tasked
2025-05-09 15:44:58,265 sats.satellite.EO-4 INFO <960.00> EO-4: Target(tgt-633) tasked for imaging
2025-05-09 15:44:58,266 sats.satellite.EO-4 INFO <960.00> EO-4: Target(tgt-633) window enabled: 1373.2 to 1440.9
2025-05-09 15:44:58,267 sats.satellite.EO-4 INFO <960.00> EO-4: setting timed terminal event at 1440.9
2025-05-09 15:44:58,563 sats.satellite.EO-0 INFO <1112.00> EO-0: imaged Target(tgt-966)
2025-05-09 15:44:58,567 data.base INFO <1112.00> Total reward: {}
2025-05-09 15:44:58,568 sats.satellite.EO-0 INFO <1112.00> EO-0: Satellite EO-0 requires retasking
2025-05-09 15:44:58,579 sats.satellite.EO-1 INFO <1112.00> EO-1: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-05-09 15:44:58,614 sats.satellite.EO-2 INFO <1112.00> EO-2: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-05-09 15:44:58,655 sats.satellite.EO-3 INFO <1112.00> EO-3: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-05-09 15:44:58,688 sats.satellite.EO-4 INFO <1112.00> EO-4: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-05-09 15:44:58,732 gym INFO <1112.00> Step reward: {}
2025-05-09 15:44:58,737 gym INFO <1112.00> === STARTING STEP ===
2025-05-09 15:44:58,737 sats.satellite.EO-0 INFO <1112.00> EO-0: target index 20 tasked
2025-05-09 15:44:58,738 sats.satellite.EO-0 INFO <1112.00> EO-0: Target(tgt-97) tasked for imaging
2025-05-09 15:44:58,739 sats.satellite.EO-0 INFO <1112.00> EO-0: Target(tgt-97) window enabled: 2388.5 to 2511.4
2025-05-09 15:44:58,740 sats.satellite.EO-0 INFO <1112.00> EO-0: setting timed terminal event at 2511.4
2025-05-09 15:44:58,741 sats.satellite.EO-1 INFO <1112.00> EO-1: target index 28 tasked
2025-05-09 15:44:58,741 sats.satellite.EO-1 INFO <1112.00> EO-1: Target(tgt-940) tasked for imaging
2025-05-09 15:44:58,742 sats.satellite.EO-1 INFO <1112.00> EO-1: Target(tgt-940) window enabled: 3653.1 to 3730.8
2025-05-09 15:44:58,743 sats.satellite.EO-1 INFO <1112.00> EO-1: setting timed terminal event at 3730.8
2025-05-09 15:44:58,744 sats.satellite.EO-2 INFO <1112.00> EO-2: target index 28 tasked
2025-05-09 15:44:58,745 sats.satellite.EO-2 INFO <1112.00> EO-2: Target(tgt-546) tasked for imaging
2025-05-09 15:44:58,746 sats.satellite.EO-2 INFO <1112.00> EO-2: Target(tgt-546) window enabled: 3462.7 to 3536.4
2025-05-09 15:44:58,746 sats.satellite.EO-2 INFO <1112.00> EO-2: setting timed terminal event at 3536.4
2025-05-09 15:44:58,747 sats.satellite.EO-3 INFO <1112.00> EO-3: target index 14 tasked
2025-05-09 15:44:58,747 sats.satellite.EO-3 INFO <1112.00> EO-3: Target(tgt-433) tasked for imaging
2025-05-09 15:44:58,749 sats.satellite.EO-3 INFO <1112.00> EO-3: Target(tgt-433) window enabled: 2009.1 to 2140.6
2025-05-09 15:44:58,749 sats.satellite.EO-3 INFO <1112.00> EO-3: setting timed terminal event at 2140.6
2025-05-09 15:44:58,750 sats.satellite.EO-4 INFO <1112.00> EO-4: target index 15 tasked
2025-05-09 15:44:58,751 sats.satellite.EO-4 INFO <1112.00> EO-4: Target(tgt-966) tasked for imaging
2025-05-09 15:44:58,752 sats.satellite.EO-4 INFO <1112.00> EO-4: Target(tgt-966) window enabled: 2287.8 to 2415.7
2025-05-09 15:44:58,752 sats.satellite.EO-4 INFO <1112.00> EO-4: setting timed terminal event at 2415.7
2025-05-09 15:44:59,328 sim.simulator INFO <1412.00> Max step duration reached
2025-05-09 15:44:59,332 data.base INFO <1412.00> Total reward: {}
2025-05-09 15:44:59,351 sats.satellite.EO-3 INFO <1412.00> EO-3: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-05-09 15:44:59,385 gym INFO <1412.00> Step reward: {}
2025-05-09 15:44:59,389 gym INFO <1412.00> === STARTING STEP ===
2025-05-09 15:44:59,390 sats.satellite.EO-0 INFO <1412.00> EO-0: target index 27 tasked
2025-05-09 15:44:59,390 sats.satellite.EO-0 INFO <1412.00> EO-0: Target(tgt-427) tasked for imaging
2025-05-09 15:44:59,392 sats.satellite.EO-0 INFO <1412.00> EO-0: Target(tgt-427) window enabled: 3161.0 to 3282.2
2025-05-09 15:44:59,392 sats.satellite.EO-0 INFO <1412.00> EO-0: setting timed terminal event at 3282.2
2025-05-09 15:44:59,393 sats.satellite.EO-1 INFO <1412.00> EO-1: target index 7 tasked
2025-05-09 15:44:59,394 sats.satellite.EO-1 INFO <1412.00> EO-1: Target(tgt-342) tasked for imaging
2025-05-09 15:44:59,395 sats.satellite.EO-1 INFO <1412.00> EO-1: Target(tgt-342) window enabled: 1945.5 to 2075.8
2025-05-09 15:44:59,395 sats.satellite.EO-1 INFO <1412.00> EO-1: setting timed terminal event at 2075.8
2025-05-09 15:44:59,396 sats.satellite.EO-2 INFO <1412.00> EO-2: target index 4 tasked
2025-05-09 15:44:59,397 sats.satellite.EO-2 INFO <1412.00> EO-2: Target(tgt-216) tasked for imaging
2025-05-09 15:44:59,398 sats.satellite.EO-2 INFO <1412.00> EO-2: Target(tgt-216) window enabled: 1823.3 to 1936.9
2025-05-09 15:44:59,398 sats.satellite.EO-2 INFO <1412.00> EO-2: setting timed terminal event at 1936.9
2025-05-09 15:44:59,399 sats.satellite.EO-3 INFO <1412.00> EO-3: target index 11 tasked
2025-05-09 15:44:59,400 sats.satellite.EO-3 INFO <1412.00> EO-3: Target(tgt-512) tasked for imaging
2025-05-09 15:44:59,401 sats.satellite.EO-3 INFO <1412.00> EO-3: Target(tgt-512) window enabled: 2412.8 to 2467.6
2025-05-09 15:44:59,402 sats.satellite.EO-3 INFO <1412.00> EO-3: setting timed terminal event at 2467.6
2025-05-09 15:44:59,403 sats.satellite.EO-4 INFO <1412.00> EO-4: target index 13 tasked
2025-05-09 15:44:59,403 sats.satellite.EO-4 INFO <1412.00> EO-4: Target(tgt-970) tasked for imaging
2025-05-09 15:44:59,405 sats.satellite.EO-4 INFO <1412.00> EO-4: Target(tgt-970) window enabled: 2360.3 to 2483.2
2025-05-09 15:44:59,405 sats.satellite.EO-4 INFO <1412.00> EO-4: setting timed terminal event at 2483.2
2025-05-09 15:44:59,989 sim.simulator INFO <1712.00> Max step duration reached
2025-05-09 15:44:59,993 data.base INFO <1712.00> Total reward: {}
2025-05-09 15:44:59,995 sats.satellite.EO-0 INFO <1712.00> EO-0: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-05-09 15:45:00,028 sats.satellite.EO-1 INFO <1712.00> EO-1: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-05-09 15:45:00,067 sats.satellite.EO-3 INFO <1712.00> EO-3: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-05-09 15:45:00,103 sats.satellite.EO-4 INFO <1712.00> EO-4: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-05-09 15:45:00,145 gym INFO <1712.00> Step reward: {}
2025-05-09 15:45:00,150 gym INFO <1712.00> === STARTING STEP ===
2025-05-09 15:45:00,151 sats.satellite.EO-0 INFO <1712.00> EO-0: target index 20 tasked
2025-05-09 15:45:00,151 sats.satellite.EO-0 INFO <1712.00> EO-0: Target(tgt-441) tasked for imaging
2025-05-09 15:45:00,153 sats.satellite.EO-0 INFO <1712.00> EO-0: Target(tgt-441) window enabled: 3068.7 to 3160.4
2025-05-09 15:45:00,153 sats.satellite.EO-0 INFO <1712.00> EO-0: setting timed terminal event at 3160.4
2025-05-09 15:45:00,154 sats.satellite.EO-1 INFO <1712.00> EO-1: target index 22 tasked
2025-05-09 15:45:00,155 sats.satellite.EO-1 INFO <1712.00> EO-1: Target(tgt-80) tasked for imaging
2025-05-09 15:45:00,156 sats.satellite.EO-1 INFO <1712.00> EO-1: Target(tgt-80) window enabled: 3675.1 to 3781.6
2025-05-09 15:45:00,157 sats.satellite.EO-1 INFO <1712.00> EO-1: setting timed terminal event at 3781.6
2025-05-09 15:45:00,158 sats.satellite.EO-2 INFO <1712.00> EO-2: target index 18 tasked
2025-05-09 15:45:00,158 sats.satellite.EO-2 INFO <1712.00> EO-2: Target(tgt-91) tasked for imaging
2025-05-09 15:45:00,160 sats.satellite.EO-2 INFO <1712.00> EO-2: Target(tgt-91) window enabled: 3250.2 to 3279.0
2025-05-09 15:45:00,160 sats.satellite.EO-2 INFO <1712.00> EO-2: setting timed terminal event at 3279.0
2025-05-09 15:45:00,161 sats.satellite.EO-3 INFO <1712.00> EO-3: action_charge tasked for 60.0 seconds
2025-05-09 15:45:00,162 sats.satellite.EO-3 INFO <1712.00> EO-3: setting timed terminal event at 1772.0
2025-05-09 15:45:00,163 sats.satellite.EO-4 INFO <1712.00> EO-4: target index 6 tasked
2025-05-09 15:45:00,163 sats.satellite.EO-4 INFO <1712.00> EO-4: Target(tgt-543) tasked for imaging
2025-05-09 15:45:00,165 sats.satellite.EO-4 INFO <1712.00> EO-4: Target(tgt-543) window enabled: 2171.9 to 2297.1
2025-05-09 15:45:00,165 sats.satellite.EO-4 INFO <1712.00> EO-4: setting timed terminal event at 2297.1
2025-05-09 15:45:00,283 sats.satellite.EO-3 INFO <1772.00> EO-3: timed termination at 1772.0 for action_charge
2025-05-09 15:45:00,288 data.base INFO <1772.00> Total reward: {}
2025-05-09 15:45:00,288 sats.satellite.EO-3 INFO <1772.00> EO-3: Satellite EO-3 requires retasking
2025-05-09 15:45:00,298 gym INFO <1772.00> Step reward: {}
2025-05-09 15:45:00,302 gym INFO <1772.00> === STARTING STEP ===
2025-05-09 15:45:00,303 sats.satellite.EO-0 INFO <1772.00> EO-0: target index 25 tasked
2025-05-09 15:45:00,303 sats.satellite.EO-0 INFO <1772.00> EO-0: Target(tgt-292) tasked for imaging
2025-05-09 15:45:00,305 sats.satellite.EO-0 INFO <1772.00> EO-0: Target(tgt-292) window enabled: 3304.2 to 3418.9
2025-05-09 15:45:00,306 sats.satellite.EO-0 INFO <1772.00> EO-0: setting timed terminal event at 3418.9
2025-05-09 15:45:00,307 sats.satellite.EO-1 INFO <1772.00> EO-1: target index 18 tasked
2025-05-09 15:45:00,307 sats.satellite.EO-1 INFO <1772.00> EO-1: Target(tgt-28) tasked for imaging
2025-05-09 15:45:00,308 sats.satellite.EO-1 INFO <1772.00> EO-1: Target(tgt-28) window enabled: 3496.4 to 3624.1
2025-05-09 15:45:00,309 sats.satellite.EO-1 INFO <1772.00> EO-1: setting timed terminal event at 3624.1
2025-05-09 15:45:00,310 sats.satellite.EO-2 INFO <1772.00> EO-2: target index 3 tasked
2025-05-09 15:45:00,310 sats.satellite.EO-2 INFO <1772.00> EO-2: Target(tgt-704) tasked for imaging
2025-05-09 15:45:00,312 sats.satellite.EO-2 INFO <1772.00> EO-2: Target(tgt-704) window enabled: 2141.1 to 2269.1
2025-05-09 15:45:00,312 sats.satellite.EO-2 INFO <1772.00> EO-2: setting timed terminal event at 2269.1
2025-05-09 15:45:00,313 sats.satellite.EO-3 INFO <1772.00> EO-3: target index 27 tasked
2025-05-09 15:45:00,314 sats.satellite.EO-3 INFO <1772.00> EO-3: Target(tgt-961) tasked for imaging
2025-05-09 15:45:00,315 sats.satellite.EO-3 INFO <1772.00> EO-3: Target(tgt-961) window enabled: 4210.2 to 4256.8
2025-05-09 15:45:00,316 sats.satellite.EO-3 INFO <1772.00> EO-3: setting timed terminal event at 4256.8
2025-05-09 15:45:00,317 sats.satellite.EO-4 INFO <1772.00> EO-4: action_charge tasked for 60.0 seconds
2025-05-09 15:45:00,317 sats.satellite.EO-4 INFO <1772.00> EO-4: setting timed terminal event at 1832.0
2025-05-09 15:45:00,439 sats.satellite.EO-4 INFO <1832.00> EO-4: timed termination at 1832.0 for action_charge
2025-05-09 15:45:00,443 data.base INFO <1832.00> Total reward: {}
2025-05-09 15:45:00,443 sats.satellite.EO-4 INFO <1832.00> EO-4: Satellite EO-4 requires retasking
2025-05-09 15:45:00,454 gym INFO <1832.00> Step reward: {}
2025-05-09 15:45:00,458 gym INFO <1832.00> === STARTING STEP ===
2025-05-09 15:45:00,459 sats.satellite.EO-0 INFO <1832.00> EO-0: target index 26 tasked
2025-05-09 15:45:00,459 sats.satellite.EO-0 INFO <1832.00> EO-0: Target(tgt-26) tasked for imaging
2025-05-09 15:45:00,461 sats.satellite.EO-0 INFO <1832.00> EO-0: Target(tgt-26) window enabled: 3395.5 to 3446.9
2025-05-09 15:45:00,461 sats.satellite.EO-0 INFO <1832.00> EO-0: setting timed terminal event at 3446.9
2025-05-09 15:45:00,462 sats.satellite.EO-1 INFO <1832.00> EO-1: target index 18 tasked
2025-05-09 15:45:00,463 sats.satellite.EO-1 INFO <1832.00> EO-1: Target(tgt-28) window enabled: 3496.4 to 3624.1
2025-05-09 15:45:00,464 sats.satellite.EO-1 INFO <1832.00> EO-1: setting timed terminal event at 3624.1
2025-05-09 15:45:00,465 sats.satellite.EO-2 INFO <1832.00> EO-2: target index 22 tasked
2025-05-09 15:45:00,465 sats.satellite.EO-2 INFO <1832.00> EO-2: Target(tgt-444) tasked for imaging
2025-05-09 15:45:00,467 sats.satellite.EO-2 INFO <1832.00> EO-2: Target(tgt-444) window enabled: 3424.0 to 3483.3
2025-05-09 15:45:00,467 sats.satellite.EO-2 INFO <1832.00> EO-2: setting timed terminal event at 3483.3
2025-05-09 15:45:00,468 sats.satellite.EO-3 INFO <1832.00> EO-3: target index 30 tasked
2025-05-09 15:45:00,468 sats.satellite.EO-3 INFO <1832.00> EO-3: Target(tgt-875) tasked for imaging
2025-05-09 15:45:00,470 sats.satellite.EO-3 INFO <1832.00> EO-3: Target(tgt-875) window enabled: 4277.0 to 4325.1
2025-05-09 15:45:00,470 sats.satellite.EO-3 INFO <1832.00> EO-3: setting timed terminal event at 4325.1
2025-05-09 15:45:00,471 sats.satellite.EO-4 INFO <1832.00> EO-4: target index 14 tasked
2025-05-09 15:45:00,471 sats.satellite.EO-4 INFO <1832.00> EO-4: Target(tgt-655) tasked for imaging
2025-05-09 15:45:00,473 sats.satellite.EO-4 INFO <1832.00> EO-4: Target(tgt-655) window enabled: 3199.8 to 3326.6
2025-05-09 15:45:00,473 sats.satellite.EO-4 INFO <1832.00> EO-4: setting timed terminal event at 3326.6
2025-05-09 15:45:01,043 sim.simulator INFO <2132.00> Max step duration reached
2025-05-09 15:45:01,047 data.base INFO <2132.00> Total reward: {}
2025-05-09 15:45:01,050 sats.satellite.EO-0 INFO <2132.00> EO-0: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-05-09 15:45:01,087 sats.satellite.EO-0 INFO <2132.00> EO-0: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-05-09 15:45:01,135 sats.satellite.EO-1 INFO <2132.00> EO-1: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-05-09 15:45:01,181 gym INFO <2132.00> Step reward: {}
2025-05-09 15:45:01,185 gym INFO <2132.00> === STARTING STEP ===
2025-05-09 15:45:01,185 sats.satellite.EO-0 INFO <2132.00> EO-0: target index 21 tasked
2025-05-09 15:45:01,186 sats.satellite.EO-0 INFO <2132.00> EO-0: Target(tgt-349) tasked for imaging
2025-05-09 15:45:01,188 sats.satellite.EO-0 INFO <2132.00> EO-0: Target(tgt-349) window enabled: 3472.7 to 3596.3
2025-05-09 15:45:01,188 sats.satellite.EO-0 INFO <2132.00> EO-0: setting timed terminal event at 3596.3
2025-05-09 15:45:01,189 sats.satellite.EO-1 INFO <2132.00> EO-1: target index 15 tasked
2025-05-09 15:45:01,190 sats.satellite.EO-1 INFO <2132.00> EO-1: Target(tgt-28) window enabled: 3496.4 to 3624.1
2025-05-09 15:45:01,191 sats.satellite.EO-1 INFO <2132.00> EO-1: setting timed terminal event at 3624.1
2025-05-09 15:45:01,192 sats.satellite.EO-2 INFO <2132.00> EO-2: target index 3 tasked
2025-05-09 15:45:01,192 sats.satellite.EO-2 INFO <2132.00> EO-2: Target(tgt-137) tasked for imaging
2025-05-09 15:45:01,193 sats.satellite.EO-2 INFO <2132.00> EO-2: Target(tgt-137) window enabled: 2253.8 to 2354.0
2025-05-09 15:45:01,194 sats.satellite.EO-2 INFO <2132.00> EO-2: setting timed terminal event at 2354.0
2025-05-09 15:45:01,195 sats.satellite.EO-3 INFO <2132.00> EO-3: target index 6 tasked
2025-05-09 15:45:01,196 sats.satellite.EO-3 INFO <2132.00> EO-3: Target(tgt-676) tasked for imaging
2025-05-09 15:45:01,197 sats.satellite.EO-3 INFO <2132.00> EO-3: Target(tgt-676) window enabled: 2413.1 to 2541.6
2025-05-09 15:45:01,198 sats.satellite.EO-3 INFO <2132.00> EO-3: setting timed terminal event at 2541.6
2025-05-09 15:45:01,198 sats.satellite.EO-4 INFO <2132.00> EO-4: target index 14 tasked
2025-05-09 15:45:01,199 sats.satellite.EO-4 INFO <2132.00> EO-4: Target(tgt-616) tasked for imaging
2025-05-09 15:45:01,201 sats.satellite.EO-4 INFO <2132.00> EO-4: Target(tgt-616) window enabled: 3256.7 to 3355.6
2025-05-09 15:45:01,201 sats.satellite.EO-4 INFO <2132.00> EO-4: setting timed terminal event at 3355.6
2025-05-09 15:45:01,436 sats.satellite.EO-2 INFO <2255.00> EO-2: imaged Target(tgt-137)
2025-05-09 15:45:01,441 data.base INFO <2255.00> Total reward: {'EO-2': np.float64(0.0008577206104491057)}
2025-05-09 15:45:01,442 sats.satellite.EO-2 INFO <2255.00> EO-2: Satellite EO-2 requires retasking
2025-05-09 15:45:01,447 sats.satellite.EO-2 INFO <2255.00> EO-2: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-05-09 15:45:01,493 gym INFO <2255.00> Step reward: {'EO-2': np.float64(0.0008577206104491057)}
2025-05-09 15:45:01,498 gym INFO <2255.00> === STARTING STEP ===
2025-05-09 15:45:01,499 sats.satellite.EO-0 INFO <2255.00> EO-0: target index 29 tasked
2025-05-09 15:45:01,499 sats.satellite.EO-0 INFO <2255.00> EO-0: Target(tgt-277) tasked for imaging
2025-05-09 15:45:01,501 sats.satellite.EO-0 INFO <2255.00> EO-0: Target(tgt-277) window enabled: 5128.8 to 5259.8
2025-05-09 15:45:01,501 sats.satellite.EO-0 INFO <2255.00> EO-0: setting timed terminal event at 5259.8
2025-05-09 15:45:01,502 sats.satellite.EO-1 INFO <2255.00> EO-1: target index 23 tasked
2025-05-09 15:45:01,503 sats.satellite.EO-1 INFO <2255.00> EO-1: Target(tgt-170) tasked for imaging
2025-05-09 15:45:01,504 sats.satellite.EO-1 INFO <2255.00> EO-1: Target(tgt-170) window enabled: 4601.7 to 4678.4
2025-05-09 15:45:01,505 sats.satellite.EO-1 INFO <2255.00> EO-1: setting timed terminal event at 4678.4
2025-05-09 15:45:01,506 sats.satellite.EO-2 INFO <2255.00> EO-2: target index 10 tasked
2025-05-09 15:45:01,506 sats.satellite.EO-2 INFO <2255.00> EO-2: Target(tgt-797) tasked for imaging
2025-05-09 15:45:01,508 sats.satellite.EO-2 INFO <2255.00> EO-2: Target(tgt-797) window enabled: 2698.5 to 2825.8
2025-05-09 15:45:01,508 sats.satellite.EO-2 INFO <2255.00> EO-2: setting timed terminal event at 2825.8
2025-05-09 15:45:01,509 sats.satellite.EO-3 INFO <2255.00> EO-3: target index 17 tasked
2025-05-09 15:45:01,510 sats.satellite.EO-3 INFO <2255.00> EO-3: Target(tgt-792) tasked for imaging
2025-05-09 15:45:01,511 sats.satellite.EO-3 INFO <2255.00> EO-3: Target(tgt-792) window enabled: 3522.0 to 3583.1
2025-05-09 15:45:01,511 sats.satellite.EO-3 INFO <2255.00> EO-3: setting timed terminal event at 3583.1
2025-05-09 15:45:01,512 sats.satellite.EO-4 INFO <2255.00> EO-4: target index 1 tasked
2025-05-09 15:45:01,513 sats.satellite.EO-4 INFO <2255.00> EO-4: Target(tgt-161) tasked for imaging
2025-05-09 15:45:01,514 sats.satellite.EO-4 INFO <2255.00> EO-4: Target(tgt-161) window enabled: 2218.7 to 2291.5
2025-05-09 15:45:01,514 sats.satellite.EO-4 INFO <2255.00> EO-4: setting timed terminal event at 2291.5
2025-05-09 15:45:01,589 sats.satellite.EO-4 INFO <2291.50> EO-4: timed termination at 2291.5 for Target(tgt-161) window
2025-05-09 15:45:01,593 data.base INFO <2291.50> Total reward: {}
2025-05-09 15:45:01,594 sats.satellite.EO-4 INFO <2291.50> EO-4: Satellite EO-4 requires retasking
2025-05-09 15:45:01,597 sats.satellite.EO-0 INFO <2291.50> EO-0: Finding opportunity windows from 5400.00 to 6000.00 seconds
2025-05-09 15:45:01,644 gym INFO <2291.50> Step reward: {}
2025-05-09 15:45:01,648 gym INFO <2291.50> === STARTING STEP ===
2025-05-09 15:45:01,649 sats.satellite.EO-0 INFO <2291.50> EO-0: target index 8 tasked
2025-05-09 15:45:01,649 sats.satellite.EO-0 INFO <2291.50> EO-0: Target(tgt-921) tasked for imaging
2025-05-09 15:45:01,651 sats.satellite.EO-0 INFO <2291.50> EO-0: Target(tgt-921) window enabled: 2670.3 to 2799.6
2025-05-09 15:45:01,651 sats.satellite.EO-0 INFO <2291.50> EO-0: setting timed terminal event at 2799.6
2025-05-09 15:45:01,652 sats.satellite.EO-1 INFO <2291.50> EO-1: target index 24 tasked
2025-05-09 15:45:01,653 sats.satellite.EO-1 INFO <2291.50> EO-1: Target(tgt-512) tasked for imaging
2025-05-09 15:45:01,654 sats.satellite.EO-1 INFO <2291.50> EO-1: Target(tgt-512) window enabled: 4746.0 to 4873.8
2025-05-09 15:45:01,654 sats.satellite.EO-1 INFO <2291.50> EO-1: setting timed terminal event at 4873.8
2025-05-09 15:45:01,655 sats.satellite.EO-2 INFO <2291.50> EO-2: target index 6 tasked
2025-05-09 15:45:01,656 sats.satellite.EO-2 INFO <2291.50> EO-2: Target(tgt-80) tasked for imaging
2025-05-09 15:45:01,657 sats.satellite.EO-2 INFO <2291.50> EO-2: Target(tgt-80) window enabled: 2480.4 to 2602.3
2025-05-09 15:45:01,658 sats.satellite.EO-2 INFO <2291.50> EO-2: setting timed terminal event at 2602.3
2025-05-09 15:45:01,658 sats.satellite.EO-3 INFO <2291.50> EO-3: target index 19 tasked
2025-05-09 15:45:01,659 sats.satellite.EO-3 INFO <2291.50> EO-3: Target(tgt-671) tasked for imaging
2025-05-09 15:45:01,660 sats.satellite.EO-3 INFO <2291.50> EO-3: Target(tgt-671) window enabled: 3631.3 to 3763.3
2025-05-09 15:45:01,661 sats.satellite.EO-3 INFO <2291.50> EO-3: setting timed terminal event at 3763.3
2025-05-09 15:45:01,662 sats.satellite.EO-4 INFO <2291.50> EO-4: target index 8 tasked
2025-05-09 15:45:01,662 sats.satellite.EO-4 INFO <2291.50> EO-4: Target(tgt-674) tasked for imaging
2025-05-09 15:45:01,663 sats.satellite.EO-4 INFO <2291.50> EO-4: Target(tgt-674) window enabled: 3009.1 to 3130.2
2025-05-09 15:45:01,664 sats.satellite.EO-4 INFO <2291.50> EO-4: setting timed terminal event at 3130.2
2025-05-09 15:45:02,026 sats.satellite.EO-2 INFO <2481.50> EO-2: imaged Target(tgt-80)
2025-05-09 15:45:02,031 data.base INFO <2481.50> Total reward: {'EO-2': np.float64(0.08840927015116723)}
2025-05-09 15:45:02,031 sats.satellite.EO-2 INFO <2481.50> EO-2: Satellite EO-2 requires retasking
2025-05-09 15:45:02,049 sats.satellite.EO-3 INFO <2481.50> EO-3: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-05-09 15:45:02,092 gym INFO <2481.50> Step reward: {'EO-2': np.float64(0.08840927015116723)}
2025-05-09 15:45:02,096 gym INFO <2481.50> === STARTING STEP ===
2025-05-09 15:45:02,097 sats.satellite.EO-0 INFO <2481.50> EO-0: target index 22 tasked
2025-05-09 15:45:02,097 sats.satellite.EO-0 INFO <2481.50> EO-0: Target(tgt-675) tasked for imaging
2025-05-09 15:45:02,099 sats.satellite.EO-0 INFO <2481.50> EO-0: Target(tgt-675) window enabled: 4061.6 to 4192.0
2025-05-09 15:45:02,100 sats.satellite.EO-0 INFO <2481.50> EO-0: setting timed terminal event at 4192.0
2025-05-09 15:45:02,101 sats.satellite.EO-1 INFO <2481.50> EO-1: target index 24 tasked
2025-05-09 15:45:02,101 sats.satellite.EO-1 INFO <2481.50> EO-1: Target(tgt-676) tasked for imaging
2025-05-09 15:45:02,102 sats.satellite.EO-1 INFO <2481.50> EO-1: Target(tgt-676) window enabled: 4791.4 to 4913.1
2025-05-09 15:45:02,103 sats.satellite.EO-1 INFO <2481.50> EO-1: setting timed terminal event at 4913.1
2025-05-09 15:45:02,104 sats.satellite.EO-2 INFO <2481.50> EO-2: target index 4 tasked
2025-05-09 15:45:02,104 sats.satellite.EO-2 INFO <2481.50> EO-2: Target(tgt-302) tasked for imaging
2025-05-09 15:45:02,106 sats.satellite.EO-2 INFO <2481.50> EO-2: Target(tgt-302) window enabled: 2622.9 to 2720.1
2025-05-09 15:45:02,106 sats.satellite.EO-2 INFO <2481.50> EO-2: setting timed terminal event at 2720.1
2025-05-09 15:45:02,107 sats.satellite.EO-3 INFO <2481.50> EO-3: target index 28 tasked
2025-05-09 15:45:02,108 sats.satellite.EO-3 INFO <2481.50> EO-3: Target(tgt-710) tasked for imaging
2025-05-09 15:45:02,109 sats.satellite.EO-3 INFO <2481.50> EO-3: Target(tgt-710) window enabled: 4612.5 to 4729.9
2025-05-09 15:45:02,110 sats.satellite.EO-3 INFO <2481.50> EO-3: setting timed terminal event at 4729.9
2025-05-09 15:45:02,110 sats.satellite.EO-4 INFO <2481.50> EO-4: target index 16 tasked
2025-05-09 15:45:02,111 sats.satellite.EO-4 INFO <2481.50> EO-4: Target(tgt-113) tasked for imaging
2025-05-09 15:45:02,112 sats.satellite.EO-4 INFO <2481.50> EO-4: Target(tgt-113) window enabled: 3639.1 to 3766.2
2025-05-09 15:45:02,113 sats.satellite.EO-4 INFO <2481.50> EO-4: setting timed terminal event at 3766.2
2025-05-09 15:45:02,391 sats.satellite.EO-2 INFO <2624.00> EO-2: imaged Target(tgt-302)
2025-05-09 15:45:02,396 data.base INFO <2624.00> Total reward: {'EO-2': np.float64(0.0957016530027815)}
2025-05-09 15:45:02,397 sats.satellite.EO-2 INFO <2624.00> EO-2: Satellite EO-2 requires retasking
2025-05-09 15:45:02,402 sats.satellite.EO-2 INFO <2624.00> EO-2: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-05-09 15:45:02,443 sats.satellite.EO-4 INFO <2624.00> EO-4: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-05-09 15:45:02,477 gym INFO <2624.00> Step reward: {'EO-2': np.float64(0.0957016530027815)}
2025-05-09 15:45:02,482 gym INFO <2624.00> === STARTING STEP ===
2025-05-09 15:45:02,482 sats.satellite.EO-0 INFO <2624.00> EO-0: target index 24 tasked
2025-05-09 15:45:02,483 sats.satellite.EO-0 INFO <2624.00> EO-0: Target(tgt-277) tasked for imaging
2025-05-09 15:45:02,484 sats.satellite.EO-0 INFO <2624.00> EO-0: Target(tgt-277) window enabled: 5128.8 to 5259.8
2025-05-09 15:45:02,485 sats.satellite.EO-0 INFO <2624.00> EO-0: setting timed terminal event at 5259.8
2025-05-09 15:45:02,486 sats.satellite.EO-1 INFO <2624.00> EO-1: target index 13 tasked
2025-05-09 15:45:02,486 sats.satellite.EO-1 INFO <2624.00> EO-1: Target(tgt-773) tasked for imaging
2025-05-09 15:45:02,487 sats.satellite.EO-1 INFO <2624.00> EO-1: Target(tgt-773) window enabled: 3791.8 to 3919.7
2025-05-09 15:45:02,488 sats.satellite.EO-1 INFO <2624.00> EO-1: setting timed terminal event at 3919.7
2025-05-09 15:45:02,489 sats.satellite.EO-2 INFO <2624.00> EO-2: target index 9 tasked
2025-05-09 15:45:02,489 sats.satellite.EO-2 INFO <2624.00> EO-2: Target(tgt-433) tasked for imaging
2025-05-09 15:45:02,491 sats.satellite.EO-2 INFO <2624.00> EO-2: Target(tgt-433) window enabled: 3216.8 to 3298.0
2025-05-09 15:45:02,491 sats.satellite.EO-2 INFO <2624.00> EO-2: setting timed terminal event at 3298.0
2025-05-09 15:45:02,492 sats.satellite.EO-3 INFO <2624.00> EO-3: target index 0 tasked
2025-05-09 15:45:02,493 sats.satellite.EO-3 INFO <2624.00> EO-3: Target(tgt-235) tasked for imaging
2025-05-09 15:45:02,494 sats.satellite.EO-3 INFO <2624.00> EO-3: Target(tgt-235) window enabled: 2520.7 to 2625.6
2025-05-09 15:45:02,494 sats.satellite.EO-3 INFO <2624.00> EO-3: setting timed terminal event at 2625.6
2025-05-09 15:45:02,495 sats.satellite.EO-4 INFO <2624.00> EO-4: target index 26 tasked
2025-05-09 15:45:02,495 sats.satellite.EO-4 INFO <2624.00> EO-4: Target(tgt-292) tasked for imaging
2025-05-09 15:45:02,497 sats.satellite.EO-4 INFO <2624.00> EO-4: Target(tgt-292) window enabled: 4487.8 to 4601.0
2025-05-09 15:45:02,497 sats.satellite.EO-4 INFO <2624.00> EO-4: setting timed terminal event at 4601.0
2025-05-09 15:45:02,505 sats.satellite.EO-3 INFO <2626.00> EO-3: timed termination at 2625.6 for Target(tgt-235) window
2025-05-09 15:45:02,510 data.base INFO <2626.00> Total reward: {}
2025-05-09 15:45:02,511 sats.satellite.EO-3 INFO <2626.00> EO-3: Satellite EO-3 requires retasking
2025-05-09 15:45:02,521 gym INFO <2626.00> Step reward: {}
2025-05-09 15:45:02,526 gym INFO <2626.00> === STARTING STEP ===
2025-05-09 15:45:02,526 sats.satellite.EO-0 INFO <2626.00> EO-0: target index 12 tasked
2025-05-09 15:45:02,527 sats.satellite.EO-0 INFO <2626.00> EO-0: Target(tgt-292) tasked for imaging
2025-05-09 15:45:02,529 sats.satellite.EO-0 INFO <2626.00> EO-0: Target(tgt-292) window enabled: 3304.2 to 3418.9
2025-05-09 15:45:02,529 sats.satellite.EO-0 INFO <2626.00> EO-0: setting timed terminal event at 3418.9
2025-05-09 15:45:02,530 sats.satellite.EO-1 INFO <2626.00> EO-1: target index 0 tasked
2025-05-09 15:45:02,530 sats.satellite.EO-1 INFO <2626.00> EO-1: Target(tgt-271) tasked for imaging
2025-05-09 15:45:02,532 sats.satellite.EO-1 INFO <2626.00> EO-1: Target(tgt-271) window enabled: 2723.7 to 2776.8
2025-05-09 15:45:02,532 sats.satellite.EO-1 INFO <2626.00> EO-1: setting timed terminal event at 2776.8
2025-05-09 15:45:02,533 sats.satellite.EO-2 INFO <2626.00> EO-2: target index 24 tasked
2025-05-09 15:45:02,534 sats.satellite.EO-2 INFO <2626.00> EO-2: Target(tgt-1018) tasked for imaging
2025-05-09 15:45:02,536 sats.satellite.EO-2 INFO <2626.00> EO-2: Target(tgt-1018) window enabled: 4513.7 to 4589.8
2025-05-09 15:45:02,536 sats.satellite.EO-2 INFO <2626.00> EO-2: setting timed terminal event at 4589.8
2025-05-09 15:45:02,537 sats.satellite.EO-3 INFO <2626.00> EO-3: target index 7 tasked
2025-05-09 15:45:02,538 sats.satellite.EO-3 INFO <2626.00> EO-3: Target(tgt-314) tasked for imaging
2025-05-09 15:45:02,539 sats.satellite.EO-3 INFO <2626.00> EO-3: Target(tgt-314) window enabled: 3172.9 to 3290.3
2025-05-09 15:45:02,539 sats.satellite.EO-3 INFO <2626.00> EO-3: setting timed terminal event at 3290.3
2025-05-09 15:45:02,540 sats.satellite.EO-4 INFO <2626.00> EO-4: target index 13 tasked
2025-05-09 15:45:02,541 sats.satellite.EO-4 INFO <2626.00> EO-4: Target(tgt-97) tasked for imaging
2025-05-09 15:45:02,542 sats.satellite.EO-4 INFO <2626.00> EO-4: Target(tgt-97) window enabled: 3571.0 to 3687.8
2025-05-09 15:45:02,542 sats.satellite.EO-4 INFO <2626.00> EO-4: setting timed terminal event at 3687.8
2025-05-09 15:45:02,737 sats.satellite.EO-1 INFO <2725.00> EO-1: imaged Target(tgt-271)
2025-05-09 15:45:02,742 data.base INFO <2725.00> Total reward: {'EO-1': np.float64(0.004597230086921116)}
2025-05-09 15:45:02,743 sats.satellite.EO-1 INFO <2725.00> EO-1: Satellite EO-1 requires retasking
2025-05-09 15:45:02,745 sats.satellite.EO-0 INFO <2725.00> EO-0: Finding opportunity windows from 6000.00 to 6600.00 seconds
2025-05-09 15:45:02,808 sats.satellite.EO-3 INFO <2725.00> EO-3: Finding opportunity windows from 5400.00 to 6000.00 seconds
2025-05-09 15:45:02,845 gym INFO <2725.00> Step reward: {'EO-1': np.float64(0.004597230086921116)}
2025-05-09 15:45:02,849 gym INFO <2725.00> === STARTING STEP ===
2025-05-09 15:45:02,850 sats.satellite.EO-0 INFO <2725.00> EO-0: target index 15 tasked
2025-05-09 15:45:02,850 sats.satellite.EO-0 INFO <2725.00> EO-0: Target(tgt-675) tasked for imaging
2025-05-09 15:45:02,852 sats.satellite.EO-0 INFO <2725.00> EO-0: Target(tgt-675) window enabled: 4061.6 to 4192.0
2025-05-09 15:45:02,853 sats.satellite.EO-0 INFO <2725.00> EO-0: setting timed terminal event at 4192.0
2025-05-09 15:45:02,854 sats.satellite.EO-1 INFO <2725.00> EO-1: target index 2 tasked
2025-05-09 15:45:02,854 sats.satellite.EO-1 INFO <2725.00> EO-1: Target(tgt-675) tasked for imaging
2025-05-09 15:45:02,856 sats.satellite.EO-1 INFO <2725.00> EO-1: Target(tgt-675) window enabled: 2888.4 to 2986.9
2025-05-09 15:45:02,856 sats.satellite.EO-1 INFO <2725.00> EO-1: setting timed terminal event at 2986.9
2025-05-09 15:45:02,857 sats.satellite.EO-2 INFO <2725.00> EO-2: target index 22 tasked
2025-05-09 15:45:02,857 sats.satellite.EO-2 INFO <2725.00> EO-2: Target(tgt-314) tasked for imaging
2025-05-09 15:45:02,859 sats.satellite.EO-2 INFO <2725.00> EO-2: Target(tgt-314) window enabled: 4375.4 to 4439.6
2025-05-09 15:45:02,859 sats.satellite.EO-2 INFO <2725.00> EO-2: setting timed terminal event at 4439.6
2025-05-09 15:45:02,860 sats.satellite.EO-3 INFO <2725.00> EO-3: target index 30 tasked
2025-05-09 15:45:02,860 sats.satellite.EO-3 INFO <2725.00> EO-3: Target(tgt-756) tasked for imaging
2025-05-09 15:45:02,862 sats.satellite.EO-3 INFO <2725.00> EO-3: Target(tgt-756) window enabled: 5363.3 to 5441.2
2025-05-09 15:45:02,862 sats.satellite.EO-3 INFO <2725.00> EO-3: setting timed terminal event at 5441.2
2025-05-09 15:45:02,863 sats.satellite.EO-4 INFO <2725.00> EO-4: target index 27 tasked
2025-05-09 15:45:02,864 sats.satellite.EO-4 INFO <2725.00> EO-4: Target(tgt-950) tasked for imaging
2025-05-09 15:45:02,865 sats.satellite.EO-4 INFO <2725.00> EO-4: Target(tgt-950) window enabled: 4533.8 to 4659.9
2025-05-09 15:45:02,866 sats.satellite.EO-4 INFO <2725.00> EO-4: setting timed terminal event at 4659.9
2025-05-09 15:45:03,112 data.base INFO <2850.00> Total reward: {}
2025-05-09 15:45:03,116 sats.satellite.EO-1 INFO <2850.00> EO-1: Finding opportunity windows from 5400.00 to 6000.00 seconds
2025-05-09 15:45:03,151 sats.satellite.EO-2 INFO <2850.00> EO-2: Finding opportunity windows from 5400.00 to 6000.00 seconds
2025-05-09 15:45:03,188 gym INFO <2850.00> Step reward: {}
2025-05-09 15:45:03,189 gym INFO <2850.00> Episode truncated: ['EO-0', 'EO-1', 'EO-2', 'EO-3', 'EO-4']
Episode complete.
After the running the simulation, we can check the reward, number of imaged targets that were covered by clouds and that were not covered by clouds (according to the threshold set in the rewarder).
[13]:
print("Total reward:", env.unwrapped.rewarder.cum_reward)
print("Number of total images taken:", len(env.unwrapped.rewarder.data.imaged))
print(
"Number of imaged targets (once or more):",
len(set(env.unwrapped.rewarder.data.imaged)),
)
print(
"Number of re-images:",
len(env.unwrapped.rewarder.data.imaged)
- len(set(env.unwrapped.rewarder.data.imaged)),
)
print(
"Number of completely imaged targets:",
len(env.unwrapped.rewarder.data.imaged_complete),
)
Total reward: {'EO-0': np.float64(0.0), 'EO-1': np.float64(0.004597230086921116), 'EO-2': np.float64(0.1849686437643978), 'EO-3': 0.0, 'EO-4': 0.0}
Number of total images taken: 5
Number of imaged targets (once or more): 5
Number of re-images: 0
Number of completely imaged targets: 0
Check Training with RLlib PPO for an example on how to train the agent in this environment.