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."""
datastore_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.
[ ]:
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-03-26 15:49:51,992 gym INFO Resetting environment with seed=1
2025-03-26 15:49:51,996 scene.targets INFO Generating 1020 targets
2025-03-26 15:49:52,279 sats.satellite.EO-0 INFO <0.00> EO-0: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-03-26 15:49:52,317 sats.satellite.EO-1 INFO <0.00> EO-1: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-03-26 15:49:52,349 sats.satellite.EO-2 INFO <0.00> EO-2: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-03-26 15:49:52,379 sats.satellite.EO-3 INFO <0.00> EO-3: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-03-26 15:49:52,413 sats.satellite.EO-4 INFO <0.00> EO-4: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-03-26 15:49:52,474 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.5154094809633691)}
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.04354672056115306, '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.02021830615210032, '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.017677605544106915, '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.0499612954369292, '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.02704817412705326, '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.02804520295157772, '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.04613823772572774, '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.03031211301588668, '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.02591056745814532, 'prop_3': np.float64(0.9129731977113796), 'prop_4_normd': -0.0}, 'target_25': {'priority': 0.3259141704285431, 'prop_1': np.float64(0.5199010432150851), '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.04260317892125559, '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.02787699089266864, '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.04613823772572774, '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.03031211301588668, '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.5199010432150851), '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.2967363927929072), 'prop_2': 0.02409141808845557, '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.02760429118515086, '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.02760429118515086, '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.027779619705700306, 'prop_3': np.float64(0.5481930510991878), 'prop_4_normd': -0.0}, 'target_15': {'priority': 0.754909559150052, 'prop_1': np.float64(0.057575972358719134), '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.04729708641508508, '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.015448025913752836, '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.013267662106720103, '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.02963792654006774, '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.017291318017798953, '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.02982710301258378, '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.8166400946366471, '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.027779619705700306, '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.057575972358719134), '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.015448025913752836, '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.015208583258170939, '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.03088086202558322, '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.02963792654006774, '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.017291318017798953, '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.02982710301258378, '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.04653269597866704, '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.03088086202558322, '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.02982710301258378, '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.04653269597866704, '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.04354672056115306, '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.02021830615210032, '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.017677605544106915, '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.0499612954369292, '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.02804520295157772, '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.02914651153027417, '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-03-26 15:49:52,485 gym INFO <0.00> === STARTING STEP ===
2025-03-26 15:49:52,486 sats.satellite.EO-0 INFO <0.00> EO-0: action_charge tasked for 60.0 seconds
2025-03-26 15:49:52,486 sats.satellite.EO-0 INFO <0.00> EO-0: setting timed terminal event at 60.0
2025-03-26 15:49:52,487 sats.satellite.EO-1 INFO <0.00> EO-1: action_charge tasked for 60.0 seconds
2025-03-26 15:49:52,487 sats.satellite.EO-1 INFO <0.00> EO-1: setting timed terminal event at 60.0
2025-03-26 15:49:52,488 sats.satellite.EO-2 INFO <0.00> EO-2: action_charge tasked for 60.0 seconds
2025-03-26 15:49:52,488 sats.satellite.EO-2 INFO <0.00> EO-2: setting timed terminal event at 60.0
2025-03-26 15:49:52,489 sats.satellite.EO-3 INFO <0.00> EO-3: action_charge tasked for 60.0 seconds
2025-03-26 15:49:52,489 sats.satellite.EO-3 INFO <0.00> EO-3: setting timed terminal event at 60.0
2025-03-26 15:49:52,489 sats.satellite.EO-4 INFO <0.00> EO-4: action_charge tasked for 60.0 seconds
2025-03-26 15:49:52,490 sats.satellite.EO-4 INFO <0.00> EO-4: setting timed terminal event at 60.0
2025-03-26 15:49:52,528 sats.satellite.EO-0 INFO <60.00> EO-0: timed termination at 60.0 for action_charge
2025-03-26 15:49:52,529 sats.satellite.EO-1 INFO <60.00> EO-1: timed termination at 60.0 for action_charge
2025-03-26 15:49:52,529 sats.satellite.EO-2 INFO <60.00> EO-2: timed termination at 60.0 for action_charge
2025-03-26 15:49:52,529 sats.satellite.EO-3 INFO <60.00> EO-3: timed termination at 60.0 for action_charge
2025-03-26 15:49:52,530 sats.satellite.EO-4 INFO <60.00> EO-4: timed termination at 60.0 for action_charge
2025-03-26 15:49:52,533 data.base INFO <60.00> Total reward: {}
2025-03-26 15:49:52,533 sats.satellite.EO-0 INFO <60.00> EO-0: Satellite EO-0 requires retasking
2025-03-26 15:49:52,534 sats.satellite.EO-1 INFO <60.00> EO-1: Satellite EO-1 requires retasking
2025-03-26 15:49:52,534 sats.satellite.EO-2 INFO <60.00> EO-2: Satellite EO-2 requires retasking
2025-03-26 15:49:52,534 sats.satellite.EO-3 INFO <60.00> EO-3: Satellite EO-3 requires retasking
2025-03-26 15:49:52,534 sats.satellite.EO-4 INFO <60.00> EO-4: Satellite EO-4 requires retasking
2025-03-26 15:49:52,553 gym INFO <60.00> Step reward: {}
2025-03-26 15:49:52,555 gym INFO <60.00> === STARTING STEP ===
2025-03-26 15:49:52,555 sats.satellite.EO-0 INFO <60.00> EO-0: target index 5 tasked
2025-03-26 15:49:52,555 sats.satellite.EO-0 INFO <60.00> EO-0: Target(tgt-446) tasked for imaging
2025-03-26 15:49:52,556 sats.satellite.EO-0 INFO <60.00> EO-0: Target(tgt-446) window enabled: 409.1 to 540.4
2025-03-26 15:49:52,557 sats.satellite.EO-0 INFO <60.00> EO-0: setting timed terminal event at 540.4
2025-03-26 15:49:52,557 sats.satellite.EO-1 INFO <60.00> EO-1: target index 18 tasked
2025-03-26 15:49:52,557 sats.satellite.EO-1 INFO <60.00> EO-1: Target(tgt-471) tasked for imaging
2025-03-26 15:49:52,558 sats.satellite.EO-1 INFO <60.00> EO-1: Target(tgt-471) window enabled: 1453.8 to 1558.6
2025-03-26 15:49:52,558 sats.satellite.EO-1 INFO <60.00> EO-1: setting timed terminal event at 1558.6
2025-03-26 15:49:52,558 sats.satellite.EO-2 INFO <60.00> EO-2: target index 5 tasked
2025-03-26 15:49:52,559 sats.satellite.EO-2 INFO <60.00> EO-2: Target(tgt-533) tasked for imaging
2025-03-26 15:49:52,559 sats.satellite.EO-2 INFO <60.00> EO-2: Target(tgt-533) window enabled: 835.2 to 958.4
2025-03-26 15:49:52,559 sats.satellite.EO-2 INFO <60.00> EO-2: setting timed terminal event at 958.4
2025-03-26 15:49:52,560 sats.satellite.EO-3 INFO <60.00> EO-3: target index 16 tasked
2025-03-26 15:49:52,560 sats.satellite.EO-3 INFO <60.00> EO-3: Target(tgt-366) tasked for imaging
2025-03-26 15:49:52,561 sats.satellite.EO-3 INFO <60.00> EO-3: Target(tgt-366) window enabled: 1169.7 to 1288.2
2025-03-26 15:49:52,561 sats.satellite.EO-3 INFO <60.00> EO-3: setting timed terminal event at 1288.2
2025-03-26 15:49:52,561 sats.satellite.EO-4 INFO <60.00> EO-4: target index 28 tasked
2025-03-26 15:49:52,561 sats.satellite.EO-4 INFO <60.00> EO-4: Target(tgt-970) tasked for imaging
2025-03-26 15:49:52,562 sats.satellite.EO-4 INFO <60.00> EO-4: Target(tgt-970) window enabled: 2360.3 to 2483.2
2025-03-26 15:49:52,562 sats.satellite.EO-4 INFO <60.00> EO-4: setting timed terminal event at 2483.2
2025-03-26 15:49:52,761 sim.simulator INFO <360.00> Max step duration reached
2025-03-26 15:49:52,765 data.base INFO <360.00> Total reward: {}
2025-03-26 15:49:52,771 sats.satellite.EO-4 INFO <360.00> EO-4: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-03-26 15:49:52,794 gym INFO <360.00> Step reward: {}
2025-03-26 15:49:52,796 gym INFO <360.00> === STARTING STEP ===
2025-03-26 15:49:52,796 sats.satellite.EO-0 INFO <360.00> EO-0: target index 7 tasked
2025-03-26 15:49:52,797 sats.satellite.EO-0 INFO <360.00> EO-0: Target(tgt-865) tasked for imaging
2025-03-26 15:49:52,798 sats.satellite.EO-0 INFO <360.00> EO-0: Target(tgt-865) window enabled: 967.9 to 1061.8
2025-03-26 15:49:52,798 sats.satellite.EO-0 INFO <360.00> EO-0: setting timed terminal event at 1061.8
2025-03-26 15:49:52,798 sats.satellite.EO-1 INFO <360.00> EO-1: target index 30 tasked
2025-03-26 15:49:52,799 sats.satellite.EO-1 INFO <360.00> EO-1: Target(tgt-900) tasked for imaging
2025-03-26 15:49:52,800 sats.satellite.EO-1 INFO <360.00> EO-1: Target(tgt-900) window enabled: 2686.0 to 2816.3
2025-03-26 15:49:52,800 sats.satellite.EO-1 INFO <360.00> EO-1: setting timed terminal event at 2816.3
2025-03-26 15:49:52,800 sats.satellite.EO-2 INFO <360.00> EO-2: target index 12 tasked
2025-03-26 15:49:52,800 sats.satellite.EO-2 INFO <360.00> EO-2: Target(tgt-684) tasked for imaging
2025-03-26 15:49:52,801 sats.satellite.EO-2 INFO <360.00> EO-2: Target(tgt-684) window enabled: 1555.4 to 1617.7
2025-03-26 15:49:52,801 sats.satellite.EO-2 INFO <360.00> EO-2: setting timed terminal event at 1617.7
2025-03-26 15:49:52,802 sats.satellite.EO-3 INFO <360.00> EO-3: target index 12 tasked
2025-03-26 15:49:52,802 sats.satellite.EO-3 INFO <360.00> EO-3: Target(tgt-536) tasked for imaging
2025-03-26 15:49:52,802 sats.satellite.EO-3 INFO <360.00> EO-3: Target(tgt-536) window enabled: 1040.7 to 1172.3
2025-03-26 15:49:52,803 sats.satellite.EO-3 INFO <360.00> EO-3: setting timed terminal event at 1172.3
2025-03-26 15:49:52,803 sats.satellite.EO-4 INFO <360.00> EO-4: target index 6 tasked
2025-03-26 15:49:52,803 sats.satellite.EO-4 INFO <360.00> EO-4: Target(tgt-433) tasked for imaging
2025-03-26 15:49:52,804 sats.satellite.EO-4 INFO <360.00> EO-4: Target(tgt-433) window enabled: 835.7 to 939.2
2025-03-26 15:49:52,804 sats.satellite.EO-4 INFO <360.00> EO-4: setting timed terminal event at 939.2
2025-03-26 15:49:53,004 sim.simulator INFO <660.00> Max step duration reached
2025-03-26 15:49:53,007 data.base INFO <660.00> Total reward: {}
2025-03-26 15:49:53,010 sats.satellite.EO-1 INFO <660.00> EO-1: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-03-26 15:49:53,028 sats.satellite.EO-2 INFO <660.00> EO-2: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-03-26 15:49:53,050 gym INFO <660.00> Step reward: {}
2025-03-26 15:49:53,052 gym INFO <660.00> === STARTING STEP ===
2025-03-26 15:49:53,053 sats.satellite.EO-0 INFO <660.00> EO-0: target index 21 tasked
2025-03-26 15:49:53,053 sats.satellite.EO-0 INFO <660.00> EO-0: Target(tgt-496) tasked for imaging
2025-03-26 15:49:53,054 sats.satellite.EO-0 INFO <660.00> EO-0: Target(tgt-496) window enabled: 2159.5 to 2285.9
2025-03-26 15:49:53,054 sats.satellite.EO-0 INFO <660.00> EO-0: setting timed terminal event at 2285.9
2025-03-26 15:49:53,055 sats.satellite.EO-1 INFO <660.00> EO-1: target index 29 tasked
2025-03-26 15:49:53,055 sats.satellite.EO-1 INFO <660.00> EO-1: Target(tgt-216) tasked for imaging
2025-03-26 15:49:53,056 sats.satellite.EO-1 INFO <660.00> EO-1: Target(tgt-216) window enabled: 3003.0 to 3131.3
2025-03-26 15:49:53,056 sats.satellite.EO-1 INFO <660.00> EO-1: setting timed terminal event at 3131.3
2025-03-26 15:49:53,056 sats.satellite.EO-2 INFO <660.00> EO-2: target index 7 tasked
2025-03-26 15:49:53,056 sats.satellite.EO-2 INFO <660.00> EO-2: Target(tgt-950) tasked for imaging
2025-03-26 15:49:53,057 sats.satellite.EO-2 INFO <660.00> EO-2: Target(tgt-950) window enabled: 971.3 to 1099.8
2025-03-26 15:49:53,057 sats.satellite.EO-2 INFO <660.00> EO-2: setting timed terminal event at 1099.8
2025-03-26 15:49:53,058 sats.satellite.EO-3 INFO <660.00> EO-3: target index 28 tasked
2025-03-26 15:49:53,058 sats.satellite.EO-3 INFO <660.00> EO-3: Target(tgt-902) tasked for imaging
2025-03-26 15:49:53,059 sats.satellite.EO-3 INFO <660.00> EO-3: Target(tgt-902) window enabled: 2495.9 to 2626.8
2025-03-26 15:49:53,059 sats.satellite.EO-3 INFO <660.00> EO-3: setting timed terminal event at 2626.8
2025-03-26 15:49:53,059 sats.satellite.EO-4 INFO <660.00> EO-4: target index 17 tasked
2025-03-26 15:49:53,060 sats.satellite.EO-4 INFO <660.00> EO-4: Target(tgt-597) tasked for imaging
2025-03-26 15:49:53,060 sats.satellite.EO-4 INFO <660.00> EO-4: Target(tgt-597) window enabled: 1729.0 to 1828.9
2025-03-26 15:49:53,061 sats.satellite.EO-4 INFO <660.00> EO-4: setting timed terminal event at 1828.9
2025-03-26 15:49:53,261 sim.simulator INFO <960.00> Max step duration reached
2025-03-26 15:49:53,264 data.base INFO <960.00> Total reward: {}
2025-03-26 15:49:53,266 sats.satellite.EO-0 INFO <960.00> EO-0: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-03-26 15:49:53,289 gym INFO <960.00> Step reward: {}
2025-03-26 15:49:53,292 gym INFO <960.00> === STARTING STEP ===
2025-03-26 15:49:53,292 sats.satellite.EO-0 INFO <960.00> EO-0: target index 4 tasked
2025-03-26 15:49:53,292 sats.satellite.EO-0 INFO <960.00> EO-0: Target(tgt-966) tasked for imaging
2025-03-26 15:49:53,293 sats.satellite.EO-0 INFO <960.00> EO-0: Target(tgt-966) window enabled: 1110.6 to 1223.2
2025-03-26 15:49:53,294 sats.satellite.EO-0 INFO <960.00> EO-0: setting timed terminal event at 1223.2
2025-03-26 15:49:53,294 sats.satellite.EO-1 INFO <960.00> EO-1: target index 16 tasked
2025-03-26 15:49:53,294 sats.satellite.EO-1 INFO <960.00> EO-1: Target(tgt-533) tasked for imaging
2025-03-26 15:49:53,295 sats.satellite.EO-1 INFO <960.00> EO-1: Target(tgt-533) window enabled: 2032.1 to 2140.3
2025-03-26 15:49:53,295 sats.satellite.EO-1 INFO <960.00> EO-1: setting timed terminal event at 2140.3
2025-03-26 15:49:53,296 sats.satellite.EO-2 INFO <960.00> EO-2: target index 5 tasked
2025-03-26 15:49:53,296 sats.satellite.EO-2 INFO <960.00> EO-2: Target(tgt-221) tasked for imaging
2025-03-26 15:49:53,297 sats.satellite.EO-2 INFO <960.00> EO-2: Target(tgt-221) window enabled: 1275.9 to 1395.2
2025-03-26 15:49:53,297 sats.satellite.EO-2 INFO <960.00> EO-2: setting timed terminal event at 1395.2
2025-03-26 15:49:53,297 sats.satellite.EO-3 INFO <960.00> EO-3: target index 4 tasked
2025-03-26 15:49:53,298 sats.satellite.EO-3 INFO <960.00> EO-3: Target(tgt-481) tasked for imaging
2025-03-26 15:49:53,298 sats.satellite.EO-3 INFO <960.00> EO-3: Target(tgt-481) window enabled: 1117.1 to 1246.8
2025-03-26 15:49:53,299 sats.satellite.EO-3 INFO <960.00> EO-3: setting timed terminal event at 1246.8
2025-03-26 15:49:53,299 sats.satellite.EO-4 INFO <960.00> EO-4: target index 5 tasked
2025-03-26 15:49:53,299 sats.satellite.EO-4 INFO <960.00> EO-4: Target(tgt-633) tasked for imaging
2025-03-26 15:49:53,300 sats.satellite.EO-4 INFO <960.00> EO-4: Target(tgt-633) window enabled: 1373.2 to 1440.9
2025-03-26 15:49:53,300 sats.satellite.EO-4 INFO <960.00> EO-4: setting timed terminal event at 1440.9
2025-03-26 15:49:53,405 sats.satellite.EO-0 INFO <1112.00> EO-0: imaged Target(tgt-966)
2025-03-26 15:49:53,408 data.base INFO <1112.00> Total reward: {}
2025-03-26 15:49:53,409 sats.satellite.EO-0 INFO <1112.00> EO-0: Satellite EO-0 requires retasking
2025-03-26 15:49:53,420 sats.satellite.EO-1 INFO <1112.00> EO-1: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-03-26 15:49:53,439 sats.satellite.EO-2 INFO <1112.00> EO-2: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-03-26 15:49:53,458 sats.satellite.EO-3 INFO <1112.00> EO-3: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-03-26 15:49:53,476 sats.satellite.EO-4 INFO <1112.00> EO-4: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-03-26 15:49:53,496 gym INFO <1112.00> Step reward: {}
2025-03-26 15:49:53,498 gym INFO <1112.00> === STARTING STEP ===
2025-03-26 15:49:53,498 sats.satellite.EO-0 INFO <1112.00> EO-0: target index 20 tasked
2025-03-26 15:49:53,498 sats.satellite.EO-0 INFO <1112.00> EO-0: Target(tgt-97) tasked for imaging
2025-03-26 15:49:53,499 sats.satellite.EO-0 INFO <1112.00> EO-0: Target(tgt-97) window enabled: 2388.5 to 2511.4
2025-03-26 15:49:53,500 sats.satellite.EO-0 INFO <1112.00> EO-0: setting timed terminal event at 2511.4
2025-03-26 15:49:53,500 sats.satellite.EO-1 INFO <1112.00> EO-1: target index 28 tasked
2025-03-26 15:49:53,500 sats.satellite.EO-1 INFO <1112.00> EO-1: Target(tgt-940) tasked for imaging
2025-03-26 15:49:53,501 sats.satellite.EO-1 INFO <1112.00> EO-1: Target(tgt-940) window enabled: 3653.1 to 3730.8
2025-03-26 15:49:53,501 sats.satellite.EO-1 INFO <1112.00> EO-1: setting timed terminal event at 3730.8
2025-03-26 15:49:53,502 sats.satellite.EO-2 INFO <1112.00> EO-2: target index 28 tasked
2025-03-26 15:49:53,502 sats.satellite.EO-2 INFO <1112.00> EO-2: Target(tgt-546) tasked for imaging
2025-03-26 15:49:53,502 sats.satellite.EO-2 INFO <1112.00> EO-2: Target(tgt-546) window enabled: 3462.7 to 3536.4
2025-03-26 15:49:53,503 sats.satellite.EO-2 INFO <1112.00> EO-2: setting timed terminal event at 3536.4
2025-03-26 15:49:53,503 sats.satellite.EO-3 INFO <1112.00> EO-3: target index 14 tasked
2025-03-26 15:49:53,503 sats.satellite.EO-3 INFO <1112.00> EO-3: Target(tgt-433) tasked for imaging
2025-03-26 15:49:53,504 sats.satellite.EO-3 INFO <1112.00> EO-3: Target(tgt-433) window enabled: 2009.1 to 2140.6
2025-03-26 15:49:53,504 sats.satellite.EO-3 INFO <1112.00> EO-3: setting timed terminal event at 2140.6
2025-03-26 15:49:53,504 sats.satellite.EO-4 INFO <1112.00> EO-4: target index 15 tasked
2025-03-26 15:49:53,505 sats.satellite.EO-4 INFO <1112.00> EO-4: Target(tgt-966) tasked for imaging
2025-03-26 15:49:53,505 sats.satellite.EO-4 INFO <1112.00> EO-4: Target(tgt-966) window enabled: 2287.8 to 2415.7
2025-03-26 15:49:53,505 sats.satellite.EO-4 INFO <1112.00> EO-4: setting timed terminal event at 2415.7
2025-03-26 15:49:53,707 sim.simulator INFO <1412.00> Max step duration reached
2025-03-26 15:49:53,710 data.base INFO <1412.00> Total reward: {}
2025-03-26 15:49:53,729 sats.satellite.EO-3 INFO <1412.00> EO-3: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-03-26 15:49:53,749 gym INFO <1412.00> Step reward: {}
2025-03-26 15:49:53,751 gym INFO <1412.00> === STARTING STEP ===
2025-03-26 15:49:53,751 sats.satellite.EO-0 INFO <1412.00> EO-0: target index 27 tasked
2025-03-26 15:49:53,751 sats.satellite.EO-0 INFO <1412.00> EO-0: Target(tgt-427) tasked for imaging
2025-03-26 15:49:53,752 sats.satellite.EO-0 INFO <1412.00> EO-0: Target(tgt-427) window enabled: 3161.0 to 3282.2
2025-03-26 15:49:53,753 sats.satellite.EO-0 INFO <1412.00> EO-0: setting timed terminal event at 3282.2
2025-03-26 15:49:53,753 sats.satellite.EO-1 INFO <1412.00> EO-1: target index 7 tasked
2025-03-26 15:49:53,753 sats.satellite.EO-1 INFO <1412.00> EO-1: Target(tgt-342) tasked for imaging
2025-03-26 15:49:53,754 sats.satellite.EO-1 INFO <1412.00> EO-1: Target(tgt-342) window enabled: 1945.5 to 2075.8
2025-03-26 15:49:53,754 sats.satellite.EO-1 INFO <1412.00> EO-1: setting timed terminal event at 2075.8
2025-03-26 15:49:53,755 sats.satellite.EO-2 INFO <1412.00> EO-2: target index 4 tasked
2025-03-26 15:49:53,755 sats.satellite.EO-2 INFO <1412.00> EO-2: Target(tgt-216) tasked for imaging
2025-03-26 15:49:53,755 sats.satellite.EO-2 INFO <1412.00> EO-2: Target(tgt-216) window enabled: 1823.3 to 1936.9
2025-03-26 15:49:53,756 sats.satellite.EO-2 INFO <1412.00> EO-2: setting timed terminal event at 1936.9
2025-03-26 15:49:53,756 sats.satellite.EO-3 INFO <1412.00> EO-3: target index 11 tasked
2025-03-26 15:49:53,757 sats.satellite.EO-3 INFO <1412.00> EO-3: Target(tgt-512) tasked for imaging
2025-03-26 15:49:53,758 sats.satellite.EO-3 INFO <1412.00> EO-3: Target(tgt-512) window enabled: 2412.8 to 2467.6
2025-03-26 15:49:53,758 sats.satellite.EO-3 INFO <1412.00> EO-3: setting timed terminal event at 2467.6
2025-03-26 15:49:53,758 sats.satellite.EO-4 INFO <1412.00> EO-4: target index 13 tasked
2025-03-26 15:49:53,759 sats.satellite.EO-4 INFO <1412.00> EO-4: Target(tgt-970) tasked for imaging
2025-03-26 15:49:53,760 sats.satellite.EO-4 INFO <1412.00> EO-4: Target(tgt-970) window enabled: 2360.3 to 2483.2
2025-03-26 15:49:53,760 sats.satellite.EO-4 INFO <1412.00> EO-4: setting timed terminal event at 2483.2
2025-03-26 15:49:53,955 sim.simulator INFO <1712.00> Max step duration reached
2025-03-26 15:49:53,958 data.base INFO <1712.00> Total reward: {}
2025-03-26 15:49:53,960 sats.satellite.EO-0 INFO <1712.00> EO-0: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-03-26 15:49:53,977 sats.satellite.EO-1 INFO <1712.00> EO-1: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-03-26 15:49:53,995 sats.satellite.EO-3 INFO <1712.00> EO-3: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-03-26 15:49:54,014 sats.satellite.EO-4 INFO <1712.00> EO-4: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-03-26 15:49:54,033 gym INFO <1712.00> Step reward: {}
2025-03-26 15:49:54,035 gym INFO <1712.00> === STARTING STEP ===
2025-03-26 15:49:54,035 sats.satellite.EO-0 INFO <1712.00> EO-0: target index 20 tasked
2025-03-26 15:49:54,036 sats.satellite.EO-0 INFO <1712.00> EO-0: Target(tgt-441) tasked for imaging
2025-03-26 15:49:54,037 sats.satellite.EO-0 INFO <1712.00> EO-0: Target(tgt-441) window enabled: 3068.7 to 3160.4
2025-03-26 15:49:54,037 sats.satellite.EO-0 INFO <1712.00> EO-0: setting timed terminal event at 3160.4
2025-03-26 15:49:54,038 sats.satellite.EO-1 INFO <1712.00> EO-1: target index 22 tasked
2025-03-26 15:49:54,038 sats.satellite.EO-1 INFO <1712.00> EO-1: Target(tgt-80) tasked for imaging
2025-03-26 15:49:54,038 sats.satellite.EO-1 INFO <1712.00> EO-1: Target(tgt-80) window enabled: 3675.1 to 3781.6
2025-03-26 15:49:54,039 sats.satellite.EO-1 INFO <1712.00> EO-1: setting timed terminal event at 3781.6
2025-03-26 15:49:54,039 sats.satellite.EO-2 INFO <1712.00> EO-2: target index 18 tasked
2025-03-26 15:49:54,039 sats.satellite.EO-2 INFO <1712.00> EO-2: Target(tgt-91) tasked for imaging
2025-03-26 15:49:54,040 sats.satellite.EO-2 INFO <1712.00> EO-2: Target(tgt-91) window enabled: 3250.2 to 3279.0
2025-03-26 15:49:54,040 sats.satellite.EO-2 INFO <1712.00> EO-2: setting timed terminal event at 3279.0
2025-03-26 15:49:54,040 sats.satellite.EO-3 INFO <1712.00> EO-3: action_charge tasked for 60.0 seconds
2025-03-26 15:49:54,040 sats.satellite.EO-3 INFO <1712.00> EO-3: setting timed terminal event at 1772.0
2025-03-26 15:49:54,041 sats.satellite.EO-4 INFO <1712.00> EO-4: target index 6 tasked
2025-03-26 15:49:54,041 sats.satellite.EO-4 INFO <1712.00> EO-4: Target(tgt-543) tasked for imaging
2025-03-26 15:49:54,042 sats.satellite.EO-4 INFO <1712.00> EO-4: Target(tgt-543) window enabled: 2171.9 to 2297.1
2025-03-26 15:49:54,042 sats.satellite.EO-4 INFO <1712.00> EO-4: setting timed terminal event at 2297.1
2025-03-26 15:49:54,082 sats.satellite.EO-3 INFO <1772.00> EO-3: timed termination at 1772.0 for action_charge
2025-03-26 15:49:54,085 data.base INFO <1772.00> Total reward: {}
2025-03-26 15:49:54,086 sats.satellite.EO-3 INFO <1772.00> EO-3: Satellite EO-3 requires retasking
2025-03-26 15:49:54,092 gym INFO <1772.00> Step reward: {}
2025-03-26 15:49:54,094 gym INFO <1772.00> === STARTING STEP ===
2025-03-26 15:49:54,095 sats.satellite.EO-0 INFO <1772.00> EO-0: target index 25 tasked
2025-03-26 15:49:54,095 sats.satellite.EO-0 INFO <1772.00> EO-0: Target(tgt-292) tasked for imaging
2025-03-26 15:49:54,096 sats.satellite.EO-0 INFO <1772.00> EO-0: Target(tgt-292) window enabled: 3304.2 to 3418.9
2025-03-26 15:49:54,096 sats.satellite.EO-0 INFO <1772.00> EO-0: setting timed terminal event at 3418.9
2025-03-26 15:49:54,096 sats.satellite.EO-1 INFO <1772.00> EO-1: target index 18 tasked
2025-03-26 15:49:54,097 sats.satellite.EO-1 INFO <1772.00> EO-1: Target(tgt-28) tasked for imaging
2025-03-26 15:49:54,097 sats.satellite.EO-1 INFO <1772.00> EO-1: Target(tgt-28) window enabled: 3496.4 to 3624.1
2025-03-26 15:49:54,098 sats.satellite.EO-1 INFO <1772.00> EO-1: setting timed terminal event at 3624.1
2025-03-26 15:49:54,098 sats.satellite.EO-2 INFO <1772.00> EO-2: target index 3 tasked
2025-03-26 15:49:54,098 sats.satellite.EO-2 INFO <1772.00> EO-2: Target(tgt-704) tasked for imaging
2025-03-26 15:49:54,099 sats.satellite.EO-2 INFO <1772.00> EO-2: Target(tgt-704) window enabled: 2141.1 to 2269.1
2025-03-26 15:49:54,099 sats.satellite.EO-2 INFO <1772.00> EO-2: setting timed terminal event at 2269.1
2025-03-26 15:49:54,100 sats.satellite.EO-3 INFO <1772.00> EO-3: target index 27 tasked
2025-03-26 15:49:54,100 sats.satellite.EO-3 INFO <1772.00> EO-3: Target(tgt-961) tasked for imaging
2025-03-26 15:49:54,101 sats.satellite.EO-3 INFO <1772.00> EO-3: Target(tgt-961) window enabled: 4210.2 to 4256.8
2025-03-26 15:49:54,101 sats.satellite.EO-3 INFO <1772.00> EO-3: setting timed terminal event at 4256.8
2025-03-26 15:49:54,101 sats.satellite.EO-4 INFO <1772.00> EO-4: action_charge tasked for 60.0 seconds
2025-03-26 15:49:54,102 sats.satellite.EO-4 INFO <1772.00> EO-4: setting timed terminal event at 1832.0
2025-03-26 15:49:54,143 sats.satellite.EO-4 INFO <1832.00> EO-4: timed termination at 1832.0 for action_charge
2025-03-26 15:49:54,146 data.base INFO <1832.00> Total reward: {}
2025-03-26 15:49:54,147 sats.satellite.EO-4 INFO <1832.00> EO-4: Satellite EO-4 requires retasking
2025-03-26 15:49:54,153 gym INFO <1832.00> Step reward: {}
2025-03-26 15:49:54,155 gym INFO <1832.00> === STARTING STEP ===
2025-03-26 15:49:54,155 sats.satellite.EO-0 INFO <1832.00> EO-0: target index 26 tasked
2025-03-26 15:49:54,156 sats.satellite.EO-0 INFO <1832.00> EO-0: Target(tgt-26) tasked for imaging
2025-03-26 15:49:54,157 sats.satellite.EO-0 INFO <1832.00> EO-0: Target(tgt-26) window enabled: 3395.5 to 3446.9
2025-03-26 15:49:54,157 sats.satellite.EO-0 INFO <1832.00> EO-0: setting timed terminal event at 3446.9
2025-03-26 15:49:54,157 sats.satellite.EO-1 INFO <1832.00> EO-1: target index 18 tasked
2025-03-26 15:49:54,158 sats.satellite.EO-1 INFO <1832.00> EO-1: Target(tgt-28) window enabled: 3496.4 to 3624.1
2025-03-26 15:49:54,158 sats.satellite.EO-1 INFO <1832.00> EO-1: setting timed terminal event at 3624.1
2025-03-26 15:49:54,159 sats.satellite.EO-2 INFO <1832.00> EO-2: target index 22 tasked
2025-03-26 15:49:54,159 sats.satellite.EO-2 INFO <1832.00> EO-2: Target(tgt-444) tasked for imaging
2025-03-26 15:49:54,160 sats.satellite.EO-2 INFO <1832.00> EO-2: Target(tgt-444) window enabled: 3424.0 to 3483.3
2025-03-26 15:49:54,160 sats.satellite.EO-2 INFO <1832.00> EO-2: setting timed terminal event at 3483.3
2025-03-26 15:49:54,160 sats.satellite.EO-3 INFO <1832.00> EO-3: target index 30 tasked
2025-03-26 15:49:54,161 sats.satellite.EO-3 INFO <1832.00> EO-3: Target(tgt-875) tasked for imaging
2025-03-26 15:49:54,161 sats.satellite.EO-3 INFO <1832.00> EO-3: Target(tgt-875) window enabled: 4277.0 to 4325.1
2025-03-26 15:49:54,162 sats.satellite.EO-3 INFO <1832.00> EO-3: setting timed terminal event at 4325.1
2025-03-26 15:49:54,162 sats.satellite.EO-4 INFO <1832.00> EO-4: target index 14 tasked
2025-03-26 15:49:54,162 sats.satellite.EO-4 INFO <1832.00> EO-4: Target(tgt-655) tasked for imaging
2025-03-26 15:49:54,163 sats.satellite.EO-4 INFO <1832.00> EO-4: Target(tgt-655) window enabled: 3199.8 to 3326.6
2025-03-26 15:49:54,163 sats.satellite.EO-4 INFO <1832.00> EO-4: setting timed terminal event at 3326.6
2025-03-26 15:49:54,358 sim.simulator INFO <2132.00> Max step duration reached
2025-03-26 15:49:54,361 data.base INFO <2132.00> Total reward: {}
2025-03-26 15:49:54,363 sats.satellite.EO-0 INFO <2132.00> EO-0: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-03-26 15:49:54,379 sats.satellite.EO-0 INFO <2132.00> EO-0: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-03-26 15:49:54,396 sats.satellite.EO-1 INFO <2132.00> EO-1: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-03-26 15:49:54,417 gym INFO <2132.00> Step reward: {}
2025-03-26 15:49:54,419 gym INFO <2132.00> === STARTING STEP ===
2025-03-26 15:49:54,419 sats.satellite.EO-0 INFO <2132.00> EO-0: target index 21 tasked
2025-03-26 15:49:54,419 sats.satellite.EO-0 INFO <2132.00> EO-0: Target(tgt-349) tasked for imaging
2025-03-26 15:49:54,420 sats.satellite.EO-0 INFO <2132.00> EO-0: Target(tgt-349) window enabled: 3472.7 to 3596.3
2025-03-26 15:49:54,421 sats.satellite.EO-0 INFO <2132.00> EO-0: setting timed terminal event at 3596.3
2025-03-26 15:49:54,421 sats.satellite.EO-1 INFO <2132.00> EO-1: target index 15 tasked
2025-03-26 15:49:54,422 sats.satellite.EO-1 INFO <2132.00> EO-1: Target(tgt-28) window enabled: 3496.4 to 3624.1
2025-03-26 15:49:54,422 sats.satellite.EO-1 INFO <2132.00> EO-1: setting timed terminal event at 3624.1
2025-03-26 15:49:54,422 sats.satellite.EO-2 INFO <2132.00> EO-2: target index 3 tasked
2025-03-26 15:49:54,423 sats.satellite.EO-2 INFO <2132.00> EO-2: Target(tgt-137) tasked for imaging
2025-03-26 15:49:54,423 sats.satellite.EO-2 INFO <2132.00> EO-2: Target(tgt-137) window enabled: 2253.8 to 2354.0
2025-03-26 15:49:54,424 sats.satellite.EO-2 INFO <2132.00> EO-2: setting timed terminal event at 2354.0
2025-03-26 15:49:54,424 sats.satellite.EO-3 INFO <2132.00> EO-3: target index 6 tasked
2025-03-26 15:49:54,424 sats.satellite.EO-3 INFO <2132.00> EO-3: Target(tgt-676) tasked for imaging
2025-03-26 15:49:54,425 sats.satellite.EO-3 INFO <2132.00> EO-3: Target(tgt-676) window enabled: 2413.1 to 2541.6
2025-03-26 15:49:54,425 sats.satellite.EO-3 INFO <2132.00> EO-3: setting timed terminal event at 2541.6
2025-03-26 15:49:54,425 sats.satellite.EO-4 INFO <2132.00> EO-4: target index 14 tasked
2025-03-26 15:49:54,425 sats.satellite.EO-4 INFO <2132.00> EO-4: Target(tgt-616) tasked for imaging
2025-03-26 15:49:54,426 sats.satellite.EO-4 INFO <2132.00> EO-4: Target(tgt-616) window enabled: 3256.7 to 3355.6
2025-03-26 15:49:54,426 sats.satellite.EO-4 INFO <2132.00> EO-4: setting timed terminal event at 3355.6
2025-03-26 15:49:54,507 sats.satellite.EO-2 INFO <2255.00> EO-2: imaged Target(tgt-137)
2025-03-26 15:49:54,511 data.base INFO <2255.00> Total reward: {'EO-2': np.float64(0.0008577206104491057)}
2025-03-26 15:49:54,511 sats.satellite.EO-2 INFO <2255.00> EO-2: Satellite EO-2 requires retasking
2025-03-26 15:49:54,515 sats.satellite.EO-2 INFO <2255.00> EO-2: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-03-26 15:49:54,541 gym INFO <2255.00> Step reward: {'EO-2': np.float64(0.0008577206104491057)}
2025-03-26 15:49:54,543 gym INFO <2255.00> === STARTING STEP ===
2025-03-26 15:49:54,544 sats.satellite.EO-0 INFO <2255.00> EO-0: target index 29 tasked
2025-03-26 15:49:54,544 sats.satellite.EO-0 INFO <2255.00> EO-0: Target(tgt-277) tasked for imaging
2025-03-26 15:49:54,545 sats.satellite.EO-0 INFO <2255.00> EO-0: Target(tgt-277) window enabled: 5128.8 to 5259.8
2025-03-26 15:49:54,545 sats.satellite.EO-0 INFO <2255.00> EO-0: setting timed terminal event at 5259.8
2025-03-26 15:49:54,546 sats.satellite.EO-1 INFO <2255.00> EO-1: target index 23 tasked
2025-03-26 15:49:54,546 sats.satellite.EO-1 INFO <2255.00> EO-1: Target(tgt-170) tasked for imaging
2025-03-26 15:49:54,546 sats.satellite.EO-1 INFO <2255.00> EO-1: Target(tgt-170) window enabled: 4601.7 to 4678.4
2025-03-26 15:49:54,547 sats.satellite.EO-1 INFO <2255.00> EO-1: setting timed terminal event at 4678.4
2025-03-26 15:49:54,547 sats.satellite.EO-2 INFO <2255.00> EO-2: target index 10 tasked
2025-03-26 15:49:54,547 sats.satellite.EO-2 INFO <2255.00> EO-2: Target(tgt-797) tasked for imaging
2025-03-26 15:49:54,548 sats.satellite.EO-2 INFO <2255.00> EO-2: Target(tgt-797) window enabled: 2698.5 to 2825.8
2025-03-26 15:49:54,548 sats.satellite.EO-2 INFO <2255.00> EO-2: setting timed terminal event at 2825.8
2025-03-26 15:49:54,548 sats.satellite.EO-3 INFO <2255.00> EO-3: target index 17 tasked
2025-03-26 15:49:54,549 sats.satellite.EO-3 INFO <2255.00> EO-3: Target(tgt-792) tasked for imaging
2025-03-26 15:49:54,549 sats.satellite.EO-3 INFO <2255.00> EO-3: Target(tgt-792) window enabled: 3522.0 to 3583.1
2025-03-26 15:49:54,549 sats.satellite.EO-3 INFO <2255.00> EO-3: setting timed terminal event at 3583.1
2025-03-26 15:49:54,550 sats.satellite.EO-4 INFO <2255.00> EO-4: target index 1 tasked
2025-03-26 15:49:54,550 sats.satellite.EO-4 INFO <2255.00> EO-4: Target(tgt-161) tasked for imaging
2025-03-26 15:49:54,551 sats.satellite.EO-4 INFO <2255.00> EO-4: Target(tgt-161) window enabled: 2218.7 to 2291.5
2025-03-26 15:49:54,551 sats.satellite.EO-4 INFO <2255.00> EO-4: setting timed terminal event at 2291.5
2025-03-26 15:49:54,578 sats.satellite.EO-4 INFO <2291.50> EO-4: timed termination at 2291.5 for Target(tgt-161) window
2025-03-26 15:49:54,581 data.base INFO <2291.50> Total reward: {}
2025-03-26 15:49:54,581 sats.satellite.EO-4 INFO <2291.50> EO-4: Satellite EO-4 requires retasking
2025-03-26 15:49:54,583 sats.satellite.EO-0 INFO <2291.50> EO-0: Finding opportunity windows from 5400.00 to 6000.00 seconds
2025-03-26 15:49:54,605 gym INFO <2291.50> Step reward: {}
2025-03-26 15:49:54,607 gym INFO <2291.50> === STARTING STEP ===
2025-03-26 15:49:54,607 sats.satellite.EO-0 INFO <2291.50> EO-0: target index 8 tasked
2025-03-26 15:49:54,608 sats.satellite.EO-0 INFO <2291.50> EO-0: Target(tgt-921) tasked for imaging
2025-03-26 15:49:54,609 sats.satellite.EO-0 INFO <2291.50> EO-0: Target(tgt-921) window enabled: 2670.3 to 2799.6
2025-03-26 15:49:54,609 sats.satellite.EO-0 INFO <2291.50> EO-0: setting timed terminal event at 2799.6
2025-03-26 15:49:54,609 sats.satellite.EO-1 INFO <2291.50> EO-1: target index 24 tasked
2025-03-26 15:49:54,609 sats.satellite.EO-1 INFO <2291.50> EO-1: Target(tgt-512) tasked for imaging
2025-03-26 15:49:54,610 sats.satellite.EO-1 INFO <2291.50> EO-1: Target(tgt-512) window enabled: 4746.0 to 4873.8
2025-03-26 15:49:54,611 sats.satellite.EO-1 INFO <2291.50> EO-1: setting timed terminal event at 4873.8
2025-03-26 15:49:54,611 sats.satellite.EO-2 INFO <2291.50> EO-2: target index 6 tasked
2025-03-26 15:49:54,611 sats.satellite.EO-2 INFO <2291.50> EO-2: Target(tgt-80) tasked for imaging
2025-03-26 15:49:54,612 sats.satellite.EO-2 INFO <2291.50> EO-2: Target(tgt-80) window enabled: 2480.4 to 2602.3
2025-03-26 15:49:54,612 sats.satellite.EO-2 INFO <2291.50> EO-2: setting timed terminal event at 2602.3
2025-03-26 15:49:54,613 sats.satellite.EO-3 INFO <2291.50> EO-3: target index 19 tasked
2025-03-26 15:49:54,613 sats.satellite.EO-3 INFO <2291.50> EO-3: Target(tgt-671) tasked for imaging
2025-03-26 15:49:54,613 sats.satellite.EO-3 INFO <2291.50> EO-3: Target(tgt-671) window enabled: 3631.3 to 3763.3
2025-03-26 15:49:54,614 sats.satellite.EO-3 INFO <2291.50> EO-3: setting timed terminal event at 3763.3
2025-03-26 15:49:54,614 sats.satellite.EO-4 INFO <2291.50> EO-4: target index 8 tasked
2025-03-26 15:49:54,614 sats.satellite.EO-4 INFO <2291.50> EO-4: Target(tgt-674) tasked for imaging
2025-03-26 15:49:54,615 sats.satellite.EO-4 INFO <2291.50> EO-4: Target(tgt-674) window enabled: 3009.1 to 3130.2
2025-03-26 15:49:54,615 sats.satellite.EO-4 INFO <2291.50> EO-4: setting timed terminal event at 3130.2
2025-03-26 15:49:54,738 sats.satellite.EO-2 INFO <2481.50> EO-2: imaged Target(tgt-80)
2025-03-26 15:49:54,742 data.base INFO <2481.50> Total reward: {'EO-2': np.float64(0.08840927015116723)}
2025-03-26 15:49:54,742 sats.satellite.EO-2 INFO <2481.50> EO-2: Satellite EO-2 requires retasking
2025-03-26 15:49:54,759 sats.satellite.EO-3 INFO <2481.50> EO-3: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-03-26 15:49:54,777 gym INFO <2481.50> Step reward: {'EO-2': np.float64(0.08840927015116723)}
2025-03-26 15:49:54,779 gym INFO <2481.50> === STARTING STEP ===
2025-03-26 15:49:54,779 sats.satellite.EO-0 INFO <2481.50> EO-0: target index 22 tasked
2025-03-26 15:49:54,779 sats.satellite.EO-0 INFO <2481.50> EO-0: Target(tgt-675) tasked for imaging
2025-03-26 15:49:54,780 sats.satellite.EO-0 INFO <2481.50> EO-0: Target(tgt-675) window enabled: 4061.6 to 4192.0
2025-03-26 15:49:54,780 sats.satellite.EO-0 INFO <2481.50> EO-0: setting timed terminal event at 4192.0
2025-03-26 15:49:54,781 sats.satellite.EO-1 INFO <2481.50> EO-1: target index 24 tasked
2025-03-26 15:49:54,781 sats.satellite.EO-1 INFO <2481.50> EO-1: Target(tgt-676) tasked for imaging
2025-03-26 15:49:54,782 sats.satellite.EO-1 INFO <2481.50> EO-1: Target(tgt-676) window enabled: 4791.4 to 4913.1
2025-03-26 15:49:54,782 sats.satellite.EO-1 INFO <2481.50> EO-1: setting timed terminal event at 4913.1
2025-03-26 15:49:54,782 sats.satellite.EO-2 INFO <2481.50> EO-2: target index 4 tasked
2025-03-26 15:49:54,783 sats.satellite.EO-2 INFO <2481.50> EO-2: Target(tgt-302) tasked for imaging
2025-03-26 15:49:54,783 sats.satellite.EO-2 INFO <2481.50> EO-2: Target(tgt-302) window enabled: 2622.9 to 2720.1
2025-03-26 15:49:54,784 sats.satellite.EO-2 INFO <2481.50> EO-2: setting timed terminal event at 2720.1
2025-03-26 15:49:54,784 sats.satellite.EO-3 INFO <2481.50> EO-3: target index 28 tasked
2025-03-26 15:49:54,784 sats.satellite.EO-3 INFO <2481.50> EO-3: Target(tgt-710) tasked for imaging
2025-03-26 15:49:54,785 sats.satellite.EO-3 INFO <2481.50> EO-3: Target(tgt-710) window enabled: 4612.5 to 4729.9
2025-03-26 15:49:54,785 sats.satellite.EO-3 INFO <2481.50> EO-3: setting timed terminal event at 4729.9
2025-03-26 15:49:54,785 sats.satellite.EO-4 INFO <2481.50> EO-4: target index 16 tasked
2025-03-26 15:49:54,785 sats.satellite.EO-4 INFO <2481.50> EO-4: Target(tgt-113) tasked for imaging
2025-03-26 15:49:54,786 sats.satellite.EO-4 INFO <2481.50> EO-4: Target(tgt-113) window enabled: 3639.1 to 3766.2
2025-03-26 15:49:54,786 sats.satellite.EO-4 INFO <2481.50> EO-4: setting timed terminal event at 3766.2
2025-03-26 15:49:54,965 sats.satellite.EO-2 INFO <2624.00> EO-2: imaged Target(tgt-302)
2025-03-26 15:49:54,968 data.base INFO <2624.00> Total reward: {'EO-2': np.float64(0.0957016530027815)}
2025-03-26 15:49:54,969 sats.satellite.EO-2 INFO <2624.00> EO-2: Satellite EO-2 requires retasking
2025-03-26 15:49:54,973 sats.satellite.EO-2 INFO <2624.00> EO-2: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-03-26 15:49:54,992 sats.satellite.EO-4 INFO <2624.00> EO-4: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-03-26 15:49:55,010 gym INFO <2624.00> Step reward: {'EO-2': np.float64(0.0957016530027815)}
2025-03-26 15:49:55,012 gym INFO <2624.00> === STARTING STEP ===
2025-03-26 15:49:55,012 sats.satellite.EO-0 INFO <2624.00> EO-0: target index 24 tasked
2025-03-26 15:49:55,012 sats.satellite.EO-0 INFO <2624.00> EO-0: Target(tgt-277) tasked for imaging
2025-03-26 15:49:55,013 sats.satellite.EO-0 INFO <2624.00> EO-0: Target(tgt-277) window enabled: 5128.8 to 5259.8
2025-03-26 15:49:55,014 sats.satellite.EO-0 INFO <2624.00> EO-0: setting timed terminal event at 5259.8
2025-03-26 15:49:55,014 sats.satellite.EO-1 INFO <2624.00> EO-1: target index 13 tasked
2025-03-26 15:49:55,014 sats.satellite.EO-1 INFO <2624.00> EO-1: Target(tgt-773) tasked for imaging
2025-03-26 15:49:55,015 sats.satellite.EO-1 INFO <2624.00> EO-1: Target(tgt-773) window enabled: 3791.8 to 3919.7
2025-03-26 15:49:55,015 sats.satellite.EO-1 INFO <2624.00> EO-1: setting timed terminal event at 3919.7
2025-03-26 15:49:55,015 sats.satellite.EO-2 INFO <2624.00> EO-2: target index 9 tasked
2025-03-26 15:49:55,016 sats.satellite.EO-2 INFO <2624.00> EO-2: Target(tgt-433) tasked for imaging
2025-03-26 15:49:55,016 sats.satellite.EO-2 INFO <2624.00> EO-2: Target(tgt-433) window enabled: 3216.8 to 3298.0
2025-03-26 15:49:55,016 sats.satellite.EO-2 INFO <2624.00> EO-2: setting timed terminal event at 3298.0
2025-03-26 15:49:55,017 sats.satellite.EO-3 INFO <2624.00> EO-3: target index 0 tasked
2025-03-26 15:49:55,017 sats.satellite.EO-3 INFO <2624.00> EO-3: Target(tgt-235) tasked for imaging
2025-03-26 15:49:55,018 sats.satellite.EO-3 INFO <2624.00> EO-3: Target(tgt-235) window enabled: 2520.7 to 2625.6
2025-03-26 15:49:55,018 sats.satellite.EO-3 INFO <2624.00> EO-3: setting timed terminal event at 2625.6
2025-03-26 15:49:55,018 sats.satellite.EO-4 INFO <2624.00> EO-4: target index 26 tasked
2025-03-26 15:49:55,019 sats.satellite.EO-4 INFO <2624.00> EO-4: Target(tgt-292) tasked for imaging
2025-03-26 15:49:55,019 sats.satellite.EO-4 INFO <2624.00> EO-4: Target(tgt-292) window enabled: 4487.8 to 4601.0
2025-03-26 15:49:55,020 sats.satellite.EO-4 INFO <2624.00> EO-4: setting timed terminal event at 4601.0
2025-03-26 15:49:55,023 sats.satellite.EO-3 INFO <2626.00> EO-3: timed termination at 2625.6 for Target(tgt-235) window
2025-03-26 15:49:55,026 data.base INFO <2626.00> Total reward: {}
2025-03-26 15:49:55,027 sats.satellite.EO-3 INFO <2626.00> EO-3: Satellite EO-3 requires retasking
2025-03-26 15:49:55,035 gym INFO <2626.00> Step reward: {}
2025-03-26 15:49:55,037 gym INFO <2626.00> === STARTING STEP ===
2025-03-26 15:49:55,037 sats.satellite.EO-0 INFO <2626.00> EO-0: target index 12 tasked
2025-03-26 15:49:55,038 sats.satellite.EO-0 INFO <2626.00> EO-0: Target(tgt-292) tasked for imaging
2025-03-26 15:49:55,039 sats.satellite.EO-0 INFO <2626.00> EO-0: Target(tgt-292) window enabled: 3304.2 to 3418.9
2025-03-26 15:49:55,039 sats.satellite.EO-0 INFO <2626.00> EO-0: setting timed terminal event at 3418.9
2025-03-26 15:49:55,039 sats.satellite.EO-1 INFO <2626.00> EO-1: target index 0 tasked
2025-03-26 15:49:55,040 sats.satellite.EO-1 INFO <2626.00> EO-1: Target(tgt-271) tasked for imaging
2025-03-26 15:49:55,040 sats.satellite.EO-1 INFO <2626.00> EO-1: Target(tgt-271) window enabled: 2723.7 to 2776.8
2025-03-26 15:49:55,041 sats.satellite.EO-1 INFO <2626.00> EO-1: setting timed terminal event at 2776.8
2025-03-26 15:49:55,041 sats.satellite.EO-2 INFO <2626.00> EO-2: target index 24 tasked
2025-03-26 15:49:55,041 sats.satellite.EO-2 INFO <2626.00> EO-2: Target(tgt-1018) tasked for imaging
2025-03-26 15:49:55,042 sats.satellite.EO-2 INFO <2626.00> EO-2: Target(tgt-1018) window enabled: 4513.7 to 4589.8
2025-03-26 15:49:55,042 sats.satellite.EO-2 INFO <2626.00> EO-2: setting timed terminal event at 4589.8
2025-03-26 15:49:55,042 sats.satellite.EO-3 INFO <2626.00> EO-3: target index 7 tasked
2025-03-26 15:49:55,043 sats.satellite.EO-3 INFO <2626.00> EO-3: Target(tgt-314) tasked for imaging
2025-03-26 15:49:55,043 sats.satellite.EO-3 INFO <2626.00> EO-3: Target(tgt-314) window enabled: 3172.9 to 3290.3
2025-03-26 15:49:55,043 sats.satellite.EO-3 INFO <2626.00> EO-3: setting timed terminal event at 3290.3
2025-03-26 15:49:55,044 sats.satellite.EO-4 INFO <2626.00> EO-4: target index 13 tasked
2025-03-26 15:49:55,044 sats.satellite.EO-4 INFO <2626.00> EO-4: Target(tgt-97) tasked for imaging
2025-03-26 15:49:55,045 sats.satellite.EO-4 INFO <2626.00> EO-4: Target(tgt-97) window enabled: 3571.0 to 3687.8
2025-03-26 15:49:55,045 sats.satellite.EO-4 INFO <2626.00> EO-4: setting timed terminal event at 3687.8
2025-03-26 15:49:55,112 sats.satellite.EO-1 INFO <2725.00> EO-1: imaged Target(tgt-271)
2025-03-26 15:49:55,115 data.base INFO <2725.00> Total reward: {'EO-1': np.float64(0.004597230086921116)}
2025-03-26 15:49:55,116 sats.satellite.EO-1 INFO <2725.00> EO-1: Satellite EO-1 requires retasking
2025-03-26 15:49:55,117 sats.satellite.EO-0 INFO <2725.00> EO-0: Finding opportunity windows from 6000.00 to 6600.00 seconds
2025-03-26 15:49:55,137 sats.satellite.EO-3 INFO <2725.00> EO-3: Finding opportunity windows from 5400.00 to 6000.00 seconds
2025-03-26 15:49:55,157 gym INFO <2725.00> Step reward: {'EO-1': np.float64(0.004597230086921116)}
2025-03-26 15:49:55,159 gym INFO <2725.00> === STARTING STEP ===
2025-03-26 15:49:55,159 sats.satellite.EO-0 INFO <2725.00> EO-0: target index 15 tasked
2025-03-26 15:49:55,159 sats.satellite.EO-0 INFO <2725.00> EO-0: Target(tgt-675) tasked for imaging
2025-03-26 15:49:55,160 sats.satellite.EO-0 INFO <2725.00> EO-0: Target(tgt-675) window enabled: 4061.6 to 4192.0
2025-03-26 15:49:55,161 sats.satellite.EO-0 INFO <2725.00> EO-0: setting timed terminal event at 4192.0
2025-03-26 15:49:55,161 sats.satellite.EO-1 INFO <2725.00> EO-1: target index 2 tasked
2025-03-26 15:49:55,161 sats.satellite.EO-1 INFO <2725.00> EO-1: Target(tgt-675) tasked for imaging
2025-03-26 15:49:55,162 sats.satellite.EO-1 INFO <2725.00> EO-1: Target(tgt-675) window enabled: 2888.4 to 2986.9
2025-03-26 15:49:55,162 sats.satellite.EO-1 INFO <2725.00> EO-1: setting timed terminal event at 2986.9
2025-03-26 15:49:55,163 sats.satellite.EO-2 INFO <2725.00> EO-2: target index 22 tasked
2025-03-26 15:49:55,163 sats.satellite.EO-2 INFO <2725.00> EO-2: Target(tgt-314) tasked for imaging
2025-03-26 15:49:55,164 sats.satellite.EO-2 INFO <2725.00> EO-2: Target(tgt-314) window enabled: 4375.4 to 4439.6
2025-03-26 15:49:55,164 sats.satellite.EO-2 INFO <2725.00> EO-2: setting timed terminal event at 4439.6
2025-03-26 15:49:55,164 sats.satellite.EO-3 INFO <2725.00> EO-3: target index 30 tasked
2025-03-26 15:49:55,165 sats.satellite.EO-3 INFO <2725.00> EO-3: Target(tgt-756) tasked for imaging
2025-03-26 15:49:55,165 sats.satellite.EO-3 INFO <2725.00> EO-3: Target(tgt-756) window enabled: 5363.3 to 5441.2
2025-03-26 15:49:55,166 sats.satellite.EO-3 INFO <2725.00> EO-3: setting timed terminal event at 5441.2
2025-03-26 15:49:55,166 sats.satellite.EO-4 INFO <2725.00> EO-4: target index 27 tasked
2025-03-26 15:49:55,166 sats.satellite.EO-4 INFO <2725.00> EO-4: Target(tgt-950) tasked for imaging
2025-03-26 15:49:55,167 sats.satellite.EO-4 INFO <2725.00> EO-4: Target(tgt-950) window enabled: 4533.8 to 4659.9
2025-03-26 15:49:55,167 sats.satellite.EO-4 INFO <2725.00> EO-4: setting timed terminal event at 4659.9
2025-03-26 15:49:55,251 data.base INFO <2850.00> Total reward: {}
2025-03-26 15:49:55,253 sats.satellite.EO-1 INFO <2850.00> EO-1: Finding opportunity windows from 5400.00 to 6000.00 seconds
2025-03-26 15:49:55,268 sats.satellite.EO-2 INFO <2850.00> EO-2: Finding opportunity windows from 5400.00 to 6000.00 seconds
2025-03-26 15:49:55,288 gym INFO <2850.00> Step reward: {}
2025-03-26 15:49:55,289 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.