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

\[\begin{split}R = \begin{cases} \rho_i & \text{if } c_{p_i} \leq c_{\text{thr}_i} \\ 0 & \text{otherwise.} \end{cases}\end{split}\]

where \(\rho_i\) is priority, \(c_{p_i}\) is the true cloud coverage, and \(c_{\text{thr}_i}\) is the reward_threshold for target \(i\). For a case where the reward is linearly proportional to the cloud coverage, see Cloud Environment

[3]:
from typing import TYPE_CHECKING

if TYPE_CHECKING:  # pragma: no cover
    from bsk_rl.scene.targets import (
        Target,
    )


class CloudImageBinaryData(UniqueImageData):
    """DataType for unique images of targets."""

    def __init__(
        self,
        imaged: Optional[list["Target"]] = None,
        duplicates: int = 0,
        known: Optional[list["Target"]] = None,
        cloud_covered: Optional[list["Target"]] = None,
        cloud_free: Optional[list["Target"]] = None,
    ) -> None:
        """Construct unit of data to record unique images.

        Keeps track of ``imaged`` targets, a count of ``duplicates`` (i.e. images that
        were not rewarded due to the target already having been imaged), and all
        ``known`` targets in the environment. It also keeps track of which targets are considered
        ``cloud_covered`` and ``cloud_free`` based on the specified threshold.

        Args:
            imaged: List of targets that are known to be imaged.
            duplicates: Count of target imaging duplication.
            known: List of targets that are known to exist (imaged and unimaged).
            cloud_covered: List of imaged targets that are known to be cloud covered.
            cloud_free: List of imaged targets that are known to be cloud free.
        """
        super().__init__(imaged=imaged, duplicates=duplicates, known=known)
        if cloud_covered is None:
            cloud_covered = []
        if cloud_free is None:
            cloud_free = []
        self.cloud_covered = list(set(cloud_covered))
        self.cloud_free = list(set(cloud_free))

    def __add__(self, other: "CloudImageBinaryData") -> "CloudImageBinaryData":
        """Combine two units of data.

        Args:
            other: Another unit of data to combine with this one.

        Returns:
            Combined unit of data.
        """

        imaged = list(set(self.imaged + other.imaged))
        duplicates = (
            self.duplicates
            + other.duplicates
            + len(self.imaged)
            + len(other.imaged)
            - len(imaged)
        )
        known = list(set(self.known + other.known))
        cloud_covered = list(set(self.cloud_covered + other.cloud_covered))
        cloud_free = list(set(self.cloud_free + other.cloud_free))

        return self.__class__(
            imaged=imaged,
            duplicates=duplicates,
            known=known,
            cloud_covered=cloud_covered,
            cloud_free=cloud_free,
        )


class CloudImageBinaryDataStore(UniqueImageStore):
    """DataStore for unique images of targets."""

    data_type = CloudImageBinaryData

    def compare_log_states(
        self, old_state: np.ndarray, new_state: np.ndarray
    ) -> CloudImageBinaryData:
        """Check for an increase in logged data to identify new images.

        Args:
            old_state: older storedData from satellite storage unit
            new_state: newer storedData from satellite storage unit

        Returns:
            list: Targets imaged at new_state that were unimaged at old_state
        """
        update_idx = np.where(new_state - old_state > 0)[0]
        imaged = []
        for idx in update_idx:
            message = self.satellite.dynamics.storageUnit.storageUnitDataOutMsg
            target_id = message.read().storedDataName[int(idx)]
            imaged.append(
                [target for target in self.data.known if target.id == target_id][0]
            )

        cloud_covered = []
        cloud_free = []
        for target in imaged:
            cloud_coverage = target.cloud_cover_true
            if cloud_coverage > target.reward_threshold:
                cloud_covered.append(target)
            else:
                cloud_free.append(target)

        return CloudImageBinaryData(
            imaged=imaged, cloud_covered=cloud_covered, cloud_free=cloud_free
        )


class CloudImageBinaryRewarder(UniqueImageReward):
    """DataManager for rewarding unique images."""

    data_store_type = CloudImageBinaryDataStore

    def calculate_reward(
        self, new_data_dict: dict[str, CloudImageBinaryData]
    ) -> dict[str, float]:
        """Reward new each unique image once using self.reward_fn().

        Args:
            new_data_dict: Record of new images for each satellite

        Returns:
            reward: Cumulative reward across satellites for one step
        """
        reward = {}

        for sat_id, new_data in new_data_dict.items():
            reward[sat_id] = 0.0
            for target in new_data.cloud_free:
                reward[sat_id] += self.reward_fn(target.priority)

        for new_data in new_data_dict.values():
            self.data += new_data
        return reward


# Define the reward function as a function of the priority of the target and the cloud cover
def reward_function_binary(priority):
    return priority


# Uncomment this line and comment the reward in the cell below to use the binary reward function
# rewarder = CloudImageBinaryRewarder(reward_fn=reward_function_binary)

Making a Rewarder Considering Cloud Coverage for the Re-imaging Case

If the target is deemed occluded by clouds, it won’t be tasked again in the single-picture case. However, the problem can be formulated in terms of the probability of observing the target (\(\text{P}(S=1)\), represented by the variable belief in the code) given the number of pictures and time difference between pictures (\(\delta t_i\)). Thus, a new rewarder named CloudImageProbabilityRewarder is created to accommodate this new formulation, as well as a new reward function.

The reward function accounts for the desired success probability threshold for each target (\(\theta_{\text{thr}_i}\), represented by reward_threshold in the code) and has a tunable parameter \(\alpha\in[0,1]\):

\[\begin{split}R = \begin{cases} \rho_i\alpha_i\Delta \text{P}(S=1) + \rho_i(1 - \alpha) & \text{ if } \text{P}_i(S=1) \geq \theta_{\text{thr}_i} \\ \rho_i\alpha_i\Delta \text{P}(S=1) & \text{ otherwise.} \end{cases}\end{split}\]
[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:

\[\text{P}^{(k+1)}(S=1) = 1 - \text{P}^{(k)}(S=1)\bar{c}_{f_i}\]

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

\[g^{(k)}_{f_i} = (1-c^{(k)}_{f_i})\beta(\delta t_i)\]

where \(\beta\) is given by a sigmoid

\[\beta(\delta t) = \frac{1}{\eta_3+e^{-\eta_1(\frac{\delta t}{\tau}-\eta_2)}}\]

and

\[\bar{c}_{f_i} = 1 - g_{f_i}^{(k)}\]

leading to:

\[\text{P}^{(k+1)}(S=1) = \text{P}^{(k)}(S=1) + (1-\text{P}^{(k)}(S=1))(1-c^{(k)}_{f_i})\beta(\delta t_i)\]
[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.

  • Observations:

    • 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.

  • Actions:

    • Charge: Enter a sun-pointing charging mode for 60 seconds.

    • Image: Image target from upcoming 32 targets

  • Dynamics model: FullFeaturedDynModel is used and a property, angle between sun and solar panel, is added.

  • Flight software model: SteeringImagerFSWModel is used.

[6]:
class CustomSatComposed(sats.ImagingSatellite):
    observation_spec = [
        obs.SatProperties(
            dict(prop="omega_BP_P", norm=0.03),
            dict(prop="c_hat_P"),
            dict(prop="r_BN_P", norm=orbitalMotion.REQ_EARTH * 1e3),
            dict(prop="v_BN_P", norm=7616.5),
            dict(prop="battery_charge_fraction"),
            dict(prop="solar_angle_norm"),
        ),
        obs.Eclipse(),
        obs.OpportunityProperties(
            dict(prop="priority"),
            dict(
                fn=lambda sat, opp: opp["object"].cloud_cover_forecast
            ),  # Cloud coverage forecast (percentage of the area covered by clouds)
            dict(
                fn=lambda sat, opp: opp["object"].cloud_cover_sigma
            ),  # Confidence on the cloud coverage forecast
            # dict(fn=lambda sat, opp: opp["object"].reward_threshold),   #Reward threshold for each target. Uncomment if using variable threshold
            dict(
                fn=lambda sat, opp: opp["object"].belief[1]
            ),  # Probability of successfully imaging the target. Used only in the re-imaging case
            dict(
                fn=lambda sat, opp: opp["object"].prev_obs, norm=5700
            ),  # Previous observation time. Used only in the re-imaging case
            type="target",
            n_ahead_observe=32,
        ),
        obs.Time(),
    ]

    action_spec = [
        act.Charge(duration=60.0),
        act.Image(n_ahead_image=32),
    ]

    # Modified the constructor to include the belief update function
    def __init__(self, *args, belief_update_func=None, **kwargs) -> None:
        super().__init__(*args, **kwargs)
        self.belief_update_func = belief_update_func

    class CustomDynModel(dyn.FullFeaturedDynModel):
        @property
        def solar_angle_norm(self) -> float:
            sun_vec_N = (
                self.world.gravFactory.spiceObject.planetStateOutMsgs[
                    self.world.sun_index
                ]
                .read()
                .PositionVector
            )
            sun_vec_N_hat = sun_vec_N / np.linalg.norm(sun_vec_N)
            solar_panel_vec_B = np.array([0, 0, -1])  # Not default configuration
            mat = np.transpose(self.BN)
            solar_panel_vec_N = np.matmul(mat, solar_panel_vec_B)
            error_angle = np.arccos(np.dot(solar_panel_vec_N, sun_vec_N_hat))

            return error_angle / np.pi

    dyn_type = CustomDynModel
    fsw_type = fsw.SteeringImagerFSWModel

It is necessary to add a filter to remove targets that reached the success threshold from the targets list when re-imaging is allowed such that:

[7]:
def belief_threshold_filter(opportunity):
    if opportunity["type"] == "target":
        return (
            True
            if opportunity["object"].belief[1] < opportunity["object"].reward_threshold
            else False
        )
    return True

When instantiating a satellite, these parameters can be overriden with a constant or rerandomized every time the environment is reset using the sat_args dictionary.

[8]:
dataStorageCapacity = 20 * 8e6 * 100
sat_args = CustomSatComposed.default_sat_args(
    imageAttErrorRequirement=0.01,
    imageRateErrorRequirement=0.01,
    batteryStorageCapacity=80.0 * 3600 * 2,
    storedCharge_Init=lambda: np.random.uniform(0.4, 1.0) * 80.0 * 3600 * 2,
    u_max=0.2,
    K1=0.5,
    nHat_B=np.array([0, 0, -1]),
    imageTargetMinimumElevation=np.radians(45),
    rwBasePower=20,
    maxWheelSpeed=1500,
    storageInit=lambda: np.random.randint(
        0 * dataStorageCapacity,
        0.01 * dataStorageCapacity,
    ),  # Initialize storage use close to zero
    wheelSpeeds=lambda: np.random.uniform(
        -1, 1, 3
    ),  # Initialize reaction wheel speeds close to zero
    dataStorageCapacity=dataStorageCapacity,  # Large storage to avoid filling up in three orbits
)

Initializing and Interacting with the Environment

For this example, we will be using the multi-agent ConstellationTasking environment. Along with passing the satellite that we configured, the environment takes a scenario, which defines the environment the satellite is acting in, and a rewarder, which defines how data collected from the scenario is rewarded.

[9]:
from bsk_rl.utils.orbital import walker_delta_args

sat_arg_randomizer = walker_delta_args(
    altitude=500.0, n_planes=1, inc=45, clustersize=5, clusterspacing=72
)

satellites = [
    CustomSatComposed(f"EO-{i}", sat_args, belief_update_func=belief_update_func)
    for i in range(5)
]

# Add filter to satellites to remove targets that have already reached the belief threshold
for sat in satellites:
    sat.add_access_filter(belief_threshold_filter)

env = ConstellationTasking(
    satellites=satellites,
    world_type=world.GroundStationWorldModel,
    world_args=world.GroundStationWorldModel.default_world_args(),
    scenario=scenario,
    rewarder=rewarder,
    sat_arg_randomizer=sat_arg_randomizer,
    sim_rate=0.5,
    max_step_duration=300.0,
    time_limit=95 * 60 / 2,  # half orbit
    log_level="INFO",
    failure_penalty=0.0,
    # disable_env_checker=True,  # For debugging
)

First, reset the environment. It is possible to specify the seed when resetting the environment.

[10]:
observation, info = env.reset(seed=1)
2025-05-13 19:51:10,757 gym                            INFO       Resetting environment with seed=1
2025-05-13 19:51:10,760 scene.targets                  INFO       Generating 1020 targets
2025-05-13 19:51:11,028 sats.satellite.EO-0            INFO       <0.00> EO-0: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-05-13 19:51:11,105 sats.satellite.EO-1            INFO       <0.00> EO-1: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-05-13 19:51:11,176 sats.satellite.EO-2            INFO       <0.00> EO-2: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-05-13 19:51:11,259 sats.satellite.EO-3            INFO       <0.00> EO-3: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-05-13 19:51:11,347 sats.satellite.EO-4            INFO       <0.00> EO-4: Finding opportunity windows from 0.00 to 2850.00 seconds
2025-05-13 19:51:11,452 gym                            INFO       <0.00> Environment reset

It is possible to print out the actions and observations. The composed satellite action_description returns a human-readable action map each satellite has the same action space and similar observation space.

[11]:
print("Actions:", env.satellites[0].action_description, "\n")
print("States:", env.unwrapped.satellites[0].observation_description, "\n")

# Using the composed satellite features also provides a human-readable state:
for satellite in env.unwrapped.satellites:
    for k, v in satellite.observation_builder.obs_dict().items():
        print(f"{k}:  {v}")
Actions: ['action_charge', 'action_image_0', 'action_image_1', 'action_image_2', 'action_image_3', 'action_image_4', 'action_image_5', 'action_image_6', 'action_image_7', 'action_image_8', 'action_image_9', 'action_image_10', 'action_image_11', 'action_image_12', 'action_image_13', 'action_image_14', 'action_image_15', 'action_image_16', 'action_image_17', 'action_image_18', 'action_image_19', 'action_image_20', 'action_image_21', 'action_image_22', 'action_image_23', 'action_image_24', 'action_image_25', 'action_image_26', 'action_image_27', 'action_image_28', 'action_image_29', 'action_image_30', 'action_image_31']

States: [np.str_('sat_props.omega_BP_P_normd[0]'), np.str_('sat_props.omega_BP_P_normd[1]'), np.str_('sat_props.omega_BP_P_normd[2]'), np.str_('sat_props.c_hat_P[0]'), np.str_('sat_props.c_hat_P[1]'), np.str_('sat_props.c_hat_P[2]'), np.str_('sat_props.r_BN_P_normd[0]'), np.str_('sat_props.r_BN_P_normd[1]'), np.str_('sat_props.r_BN_P_normd[2]'), np.str_('sat_props.v_BN_P_normd[0]'), np.str_('sat_props.v_BN_P_normd[1]'), np.str_('sat_props.v_BN_P_normd[2]'), np.str_('sat_props.battery_charge_fraction'), np.str_('sat_props.solar_angle_norm'), np.str_('eclipse[0]'), np.str_('eclipse[1]'), np.str_('target.target_0.priority'), np.str_('target.target_0.prop_1'), np.str_('target.target_0.prop_2'), np.str_('target.target_0.prop_3'), np.str_('target.target_0.prop_4_normd'), np.str_('target.target_1.priority'), np.str_('target.target_1.prop_1'), np.str_('target.target_1.prop_2'), np.str_('target.target_1.prop_3'), np.str_('target.target_1.prop_4_normd'), np.str_('target.target_2.priority'), np.str_('target.target_2.prop_1'), np.str_('target.target_2.prop_2'), np.str_('target.target_2.prop_3'), np.str_('target.target_2.prop_4_normd'), np.str_('target.target_3.priority'), np.str_('target.target_3.prop_1'), np.str_('target.target_3.prop_2'), np.str_('target.target_3.prop_3'), np.str_('target.target_3.prop_4_normd'), np.str_('target.target_4.priority'), np.str_('target.target_4.prop_1'), np.str_('target.target_4.prop_2'), np.str_('target.target_4.prop_3'), np.str_('target.target_4.prop_4_normd'), np.str_('target.target_5.priority'), np.str_('target.target_5.prop_1'), np.str_('target.target_5.prop_2'), np.str_('target.target_5.prop_3'), np.str_('target.target_5.prop_4_normd'), np.str_('target.target_6.priority'), np.str_('target.target_6.prop_1'), np.str_('target.target_6.prop_2'), np.str_('target.target_6.prop_3'), np.str_('target.target_6.prop_4_normd'), np.str_('target.target_7.priority'), np.str_('target.target_7.prop_1'), np.str_('target.target_7.prop_2'), np.str_('target.target_7.prop_3'), np.str_('target.target_7.prop_4_normd'), np.str_('target.target_8.priority'), np.str_('target.target_8.prop_1'), np.str_('target.target_8.prop_2'), np.str_('target.target_8.prop_3'), np.str_('target.target_8.prop_4_normd'), np.str_('target.target_9.priority'), np.str_('target.target_9.prop_1'), np.str_('target.target_9.prop_2'), np.str_('target.target_9.prop_3'), np.str_('target.target_9.prop_4_normd'), np.str_('target.target_10.priority'), np.str_('target.target_10.prop_1'), np.str_('target.target_10.prop_2'), np.str_('target.target_10.prop_3'), np.str_('target.target_10.prop_4_normd'), np.str_('target.target_11.priority'), np.str_('target.target_11.prop_1'), np.str_('target.target_11.prop_2'), np.str_('target.target_11.prop_3'), np.str_('target.target_11.prop_4_normd'), np.str_('target.target_12.priority'), np.str_('target.target_12.prop_1'), np.str_('target.target_12.prop_2'), np.str_('target.target_12.prop_3'), np.str_('target.target_12.prop_4_normd'), np.str_('target.target_13.priority'), np.str_('target.target_13.prop_1'), np.str_('target.target_13.prop_2'), np.str_('target.target_13.prop_3'), np.str_('target.target_13.prop_4_normd'), np.str_('target.target_14.priority'), np.str_('target.target_14.prop_1'), np.str_('target.target_14.prop_2'), np.str_('target.target_14.prop_3'), np.str_('target.target_14.prop_4_normd'), np.str_('target.target_15.priority'), np.str_('target.target_15.prop_1'), np.str_('target.target_15.prop_2'), np.str_('target.target_15.prop_3'), np.str_('target.target_15.prop_4_normd'), np.str_('target.target_16.priority'), np.str_('target.target_16.prop_1'), np.str_('target.target_16.prop_2'), np.str_('target.target_16.prop_3'), np.str_('target.target_16.prop_4_normd'), np.str_('target.target_17.priority'), np.str_('target.target_17.prop_1'), np.str_('target.target_17.prop_2'), np.str_('target.target_17.prop_3'), np.str_('target.target_17.prop_4_normd'), np.str_('target.target_18.priority'), np.str_('target.target_18.prop_1'), np.str_('target.target_18.prop_2'), np.str_('target.target_18.prop_3'), np.str_('target.target_18.prop_4_normd'), np.str_('target.target_19.priority'), np.str_('target.target_19.prop_1'), np.str_('target.target_19.prop_2'), np.str_('target.target_19.prop_3'), np.str_('target.target_19.prop_4_normd'), np.str_('target.target_20.priority'), np.str_('target.target_20.prop_1'), np.str_('target.target_20.prop_2'), np.str_('target.target_20.prop_3'), np.str_('target.target_20.prop_4_normd'), np.str_('target.target_21.priority'), np.str_('target.target_21.prop_1'), np.str_('target.target_21.prop_2'), np.str_('target.target_21.prop_3'), np.str_('target.target_21.prop_4_normd'), np.str_('target.target_22.priority'), np.str_('target.target_22.prop_1'), np.str_('target.target_22.prop_2'), np.str_('target.target_22.prop_3'), np.str_('target.target_22.prop_4_normd'), np.str_('target.target_23.priority'), np.str_('target.target_23.prop_1'), np.str_('target.target_23.prop_2'), np.str_('target.target_23.prop_3'), np.str_('target.target_23.prop_4_normd'), np.str_('target.target_24.priority'), np.str_('target.target_24.prop_1'), np.str_('target.target_24.prop_2'), np.str_('target.target_24.prop_3'), np.str_('target.target_24.prop_4_normd'), np.str_('target.target_25.priority'), np.str_('target.target_25.prop_1'), np.str_('target.target_25.prop_2'), np.str_('target.target_25.prop_3'), np.str_('target.target_25.prop_4_normd'), np.str_('target.target_26.priority'), np.str_('target.target_26.prop_1'), np.str_('target.target_26.prop_2'), np.str_('target.target_26.prop_3'), np.str_('target.target_26.prop_4_normd'), np.str_('target.target_27.priority'), np.str_('target.target_27.prop_1'), np.str_('target.target_27.prop_2'), np.str_('target.target_27.prop_3'), np.str_('target.target_27.prop_4_normd'), np.str_('target.target_28.priority'), np.str_('target.target_28.prop_1'), np.str_('target.target_28.prop_2'), np.str_('target.target_28.prop_3'), np.str_('target.target_28.prop_4_normd'), np.str_('target.target_29.priority'), np.str_('target.target_29.prop_1'), np.str_('target.target_29.prop_2'), np.str_('target.target_29.prop_3'), np.str_('target.target_29.prop_4_normd'), np.str_('target.target_30.priority'), np.str_('target.target_30.prop_1'), np.str_('target.target_30.prop_2'), np.str_('target.target_30.prop_3'), np.str_('target.target_30.prop_4_normd'), np.str_('target.target_31.priority'), np.str_('target.target_31.prop_1'), np.str_('target.target_31.prop_2'), np.str_('target.target_31.prop_3'), np.str_('target.target_31.prop_4_normd'), np.str_('time')]

sat_props:  {'omega_BP_P_normd': array([-0.00350386,  0.00198976, -0.00368761]), 'c_hat_P': array([-0.58085052,  0.0322632 , -0.81337061]), 'r_BN_P_normd': array([-0.54798211, -0.70115756,  0.60713484]), 'v_BN_P_normd': array([ 0.8111179 , -0.26445426,  0.42668281]), 'battery_charge_fraction': 0.5117561268266025, 'solar_angle_norm': np.float64(0.5154094809633692)}
eclipse:  [np.float64(4590.0), np.float64(1050.0)]
target:  {'target_0': {'priority': 0.23110739788422052, 'prop_1': np.float64(0.6773821240549803), 'prop_2': 0.017984788259031905, 'prop_3': np.float64(0.47193060176014956), 'prop_4_normd': -0.0}, 'target_1': {'priority': 0.7053880626885703, 'prop_1': np.float64(0.23103685455589726), 'prop_2': 0.012802744584004837, 'prop_3': np.float64(0.5448547507690691), 'prop_4_normd': -0.0}, 'target_2': {'priority': 0.1633664559021203, 'prop_1': np.float64(1.0), 'prop_2': 0.020608850788857196, 'prop_3': np.float64(0.5387060943662177), 'prop_4_normd': -0.0}, 'target_3': {'priority': 0.9672643792272313, 'prop_1': np.float64(0.6771252894737922), 'prop_2': 0.043546720561153066, 'prop_3': np.float64(0.01327414045488771), 'prop_4_normd': -0.0}, 'target_4': {'priority': 0.03177482425911071, 'prop_1': np.float64(0.9188487053805751), 'prop_2': 0.012359745287068721, 'prop_3': np.float64(0.6244352067126765), 'prop_4_normd': -0.0}, 'target_5': {'priority': 0.1620597486265063, 'prop_1': np.float64(0.32471532540988063), 'prop_2': 0.021931235486235705, 'prop_3': np.float64(0.6855506082056277), 'prop_4_normd': -0.0}, 'target_6': {'priority': 0.053247230445791494, 'prop_1': np.float64(0.465036271289076), 'prop_2': 0.03563025242548773, 'prop_3': np.float64(0.9025594456524167), 'prop_4_normd': -0.0}, 'target_7': {'priority': 0.4330199859612206, 'prop_1': np.float64(1.0), 'prop_2': 0.020218306152100317, 'prop_3': np.float64(0.6702366946572057), 'prop_4_normd': -0.0}, 'target_8': {'priority': 0.3011615633479109, 'prop_1': np.float64(0.18844447543725398), 'prop_2': 0.04545257905252125, 'prop_3': np.float64(0.06768644938605572), 'prop_4_normd': -0.0}, 'target_9': {'priority': 0.8395413208814804, 'prop_1': np.float64(0.6431795157724476), 'prop_2': 0.017677605544106918, 'prop_3': np.float64(0.4728944248799916), 'prop_4_normd': -0.0}, 'target_10': {'priority': 0.204358127861885, 'prop_1': np.float64(0.7343889025097664), 'prop_2': 0.04130035476650628, 'prop_3': np.float64(0.594948373774243), 'prop_4_normd': -0.0}, 'target_11': {'priority': 0.28542099633679585, 'prop_1': np.float64(0.0), 'prop_2': 0.03282052579591975, 'prop_3': np.float64(0.6527384073426662), 'prop_4_normd': -0.0}, 'target_12': {'priority': 0.6309456070754336, 'prop_1': np.float64(0.739476692944099), 'prop_2': 0.049961295436929204, 'prop_3': np.float64(0.5204203695786651), 'prop_4_normd': -0.0}, 'target_13': {'priority': 0.7378480194092552, 'prop_1': np.float64(0.5791299721901717), 'prop_2': 0.041116455683144884, 'prop_3': np.float64(0.3477342839272196), 'prop_4_normd': -0.0}, 'target_14': {'priority': 0.9753392450721888, 'prop_1': np.float64(0.9604974429840596), 'prop_2': 0.027048174127053265, 'prop_3': np.float64(0.3223324395696421), 'prop_4_normd': -0.0}, 'target_15': {'priority': 0.18951471677506737, 'prop_1': np.float64(1.0), 'prop_2': 0.028045202951577725, 'prop_3': np.float64(0.6864588826656022), 'prop_4_normd': -0.0}, 'target_16': {'priority': 0.829892142068991, 'prop_1': np.float64(0.051031544545620415), 'prop_2': 0.012951927671282034, 'prop_3': np.float64(0.9184774474430497), 'prop_4_normd': -0.0}, 'target_17': {'priority': 0.805208197948648, 'prop_1': np.float64(0.09383105699758443), 'prop_2': 0.04613823772572775, 'prop_3': np.float64(0.1612445798599077), 'prop_4_normd': -0.0}, 'target_18': {'priority': 0.7497313798484234, 'prop_1': np.float64(0.3604780446018815), 'prop_2': 0.03587131139163423, 'prop_3': np.float64(0.8200124116089859), 'prop_4_normd': -0.0}, 'target_19': {'priority': 0.9805442159491671, 'prop_1': np.float64(0.41451646992278607), 'prop_2': 0.04667665260455525, 'prop_3': np.float64(0.6942713451718054), 'prop_4_normd': -0.0}, 'target_20': {'priority': 0.03991136638841264, 'prop_1': np.float64(0.23408773086379167), 'prop_2': 0.015533976925185709, 'prop_3': np.float64(0.8199341930043369), 'prop_4_normd': -0.0}, 'target_21': {'priority': 0.26235271811805483, 'prop_1': np.float64(0.5129722649159048), 'prop_2': 0.03231234505292314, 'prop_3': np.float64(0.029457382565175542), 'prop_4_normd': -0.0}, 'target_22': {'priority': 0.8196046614443331, 'prop_1': np.float64(0.4988363753234679), 'prop_2': 0.030312113015886676, 'prop_3': np.float64(0.30343026194187606), 'prop_4_normd': -0.0}, 'target_23': {'priority': 0.46276603873931077, 'prop_1': np.float64(1.0), 'prop_2': 0.045180213382882306, 'prop_3': np.float64(0.6637320369176662), 'prop_4_normd': -0.0}, 'target_24': {'priority': 0.037250365029927957, 'prop_1': np.float64(0.3439577153571095), 'prop_2': 0.025910567458145323, 'prop_3': np.float64(0.9129731977113796), 'prop_4_normd': -0.0}, 'target_25': {'priority': 0.3259141704285431, 'prop_1': np.float64(0.5199010432150852), 'prop_2': 0.03754898592439353, 'prop_3': np.float64(0.5272524355632425), 'prop_4_normd': -0.0}, 'target_26': {'priority': 0.04378385210563185, 'prop_1': np.float64(0.937908630597671), 'prop_2': 0.0426031789212556, 'prop_3': np.float64(0.3210983082763837), 'prop_4_normd': -0.0}, 'target_27': {'priority': 0.7381309703287549, 'prop_1': np.float64(0.09373763077297367), 'prop_2': 0.03891319765444636, 'prop_3': np.float64(0.5193452798319762), 'prop_4_normd': -0.0}, 'target_28': {'priority': 0.2506051552479428, 'prop_1': np.float64(0.007938825204702099), 'prop_2': 0.027876990892668638, 'prop_3': np.float64(0.7951250769591794), 'prop_4_normd': -0.0}, 'target_29': {'priority': 0.22514616870331983, 'prop_1': np.float64(0.7635125768985891), 'prop_2': 0.03432249049424255, 'prop_3': np.float64(0.8819122066054487), 'prop_4_normd': -0.0}, 'target_30': {'priority': 0.5916045176099362, 'prop_1': np.float64(0.986511671806355), 'prop_2': 0.014134319095275428, 'prop_3': np.float64(0.6941055087647237), 'prop_4_normd': -0.0}, 'target_31': {'priority': 0.7292463467060817, 'prop_1': np.float64(0.9797106455916805), 'prop_2': 0.010118036996200824, 'prop_3': np.float64(0.025061979079314286), 'prop_4_normd': -0.0}}
time:  0.0
sat_props:  {'omega_BP_P_normd': array([-0.0009353 ,  0.00013679, -0.00555712]), 'c_hat_P': array([-0.62090234, -0.77574872, -0.11266858]), 'r_BN_P_normd': array([ 0.70555395, -0.52189728,  0.62476866]), 'v_BN_P_normd': array([ 0.71579288,  0.48386635, -0.40415273]), 'battery_charge_fraction': 0.9190121511873899, 'solar_angle_norm': np.float64(0.1668252941401964)}
eclipse:  [np.float64(3450.0), np.float64(5580.0)]
target:  {'target_0': {'priority': 0.805208197948648, 'prop_1': np.float64(0.09383105699758443), 'prop_2': 0.04613823772572775, 'prop_3': np.float64(0.1612445798599077), 'prop_4_normd': -0.0}, 'target_1': {'priority': 0.7497313798484234, 'prop_1': np.float64(0.3604780446018815), 'prop_2': 0.03587131139163423, 'prop_3': np.float64(0.8200124116089859), 'prop_4_normd': -0.0}, 'target_2': {'priority': 0.7173916012578099, 'prop_1': np.float64(0.8863059027468658), 'prop_2': 0.012931923436395706, 'prop_3': np.float64(0.05440340594992644), 'prop_4_normd': -0.0}, 'target_3': {'priority': 0.26235271811805483, 'prop_1': np.float64(0.5129722649159048), 'prop_2': 0.03231234505292314, 'prop_3': np.float64(0.029457382565175542), 'prop_4_normd': -0.0}, 'target_4': {'priority': 0.03991136638841264, 'prop_1': np.float64(0.23408773086379167), 'prop_2': 0.015533976925185709, 'prop_3': np.float64(0.8199341930043369), 'prop_4_normd': -0.0}, 'target_5': {'priority': 0.8196046614443331, 'prop_1': np.float64(0.4988363753234679), 'prop_2': 0.030312113015886676, 'prop_3': np.float64(0.30343026194187606), 'prop_4_normd': -0.0}, 'target_6': {'priority': 0.7000607792577789, 'prop_1': np.float64(0.4829764658302107), 'prop_2': 0.03178383502501577, 'prop_3': np.float64(0.19473317834468695), 'prop_4_normd': -0.0}, 'target_7': {'priority': 0.3259141704285431, 'prop_1': np.float64(0.5199010432150852), 'prop_2': 0.03754898592439353, 'prop_3': np.float64(0.5272524355632425), 'prop_4_normd': -0.0}, 'target_8': {'priority': 0.7221357962714954, 'prop_1': np.float64(0.019968299691167667), 'prop_2': 0.02604344280682401, 'prop_3': np.float64(0.38785146140506727), 'prop_4_normd': -0.0}, 'target_9': {'priority': 0.4835917916297542, 'prop_1': np.float64(0.913436309172294), 'prop_2': 0.01059668894457722, 'prop_3': np.float64(0.7520339085714534), 'prop_4_normd': -0.0}, 'target_10': {'priority': 0.9687687000530214, 'prop_1': np.float64(0.04310639017389428), 'prop_2': 0.03184705964968918, 'prop_3': np.float64(0.7663874813688322), 'prop_4_normd': -0.0}, 'target_11': {'priority': 0.9869428157422727, 'prop_1': np.float64(0.9234254203774177), 'prop_2': 0.02396237933175835, 'prop_3': np.float64(0.7687839143003268), 'prop_4_normd': -0.0}, 'target_12': {'priority': 0.7769440488059227, 'prop_1': np.float64(0.6392408345840034), 'prop_2': 0.036315282561394296, 'prop_3': np.float64(0.18789831613493962), 'prop_4_normd': -0.0}, 'target_13': {'priority': 0.5916045176099362, 'prop_1': np.float64(0.986511671806355), 'prop_2': 0.014134319095275428, 'prop_3': np.float64(0.6941055087647237), 'prop_4_normd': -0.0}, 'target_14': {'priority': 0.7292463467060817, 'prop_1': np.float64(0.9797106455916805), 'prop_2': 0.010118036996200824, 'prop_3': np.float64(0.025061979079314286), 'prop_4_normd': -0.0}, 'target_15': {'priority': 0.05042726354739102, 'prop_1': np.float64(0.1576196993220855), 'prop_2': 0.04388301495485157, 'prop_3': np.float64(0.2594337423004949), 'prop_4_normd': -0.0}, 'target_16': {'priority': 0.8800825118012181, 'prop_1': np.float64(0.7868728038549432), 'prop_2': 0.019911788841816942, 'prop_3': np.float64(0.2647465358054633), 'prop_4_normd': -0.0}, 'target_17': {'priority': 0.21181857950000504, 'prop_1': np.float64(0.9480782461961496), 'prop_2': 0.028875591319252027, 'prop_3': np.float64(0.7421749505743108), 'prop_4_normd': -0.0}, 'target_18': {'priority': 0.9133660347840165, 'prop_1': np.float64(0.29673639279290726), 'prop_2': 0.024091418088455566, 'prop_3': np.float64(0.7856607996483989), 'prop_4_normd': -0.0}, 'target_19': {'priority': 0.2079916135544887, 'prop_1': np.float64(0.7610042016491474), 'prop_2': 0.013217314655802635, 'prop_3': np.float64(0.48891637360577356), 'prop_4_normd': -0.0}, 'target_20': {'priority': 0.26228034066291006, 'prop_1': np.float64(0.9906468951013733), 'prop_2': 0.034570454343737976, 'prop_3': np.float64(0.41633751387091944), 'prop_4_normd': -0.0}, 'target_21': {'priority': 0.35956003090269617, 'prop_1': np.float64(0.8320764780986386), 'prop_2': 0.021487965487092246, 'prop_3': np.float64(0.18687857295910767), 'prop_4_normd': -0.0}, 'target_22': {'priority': 0.8062810977532414, 'prop_1': np.float64(0.993087334103627), 'prop_2': 0.04039141292626358, 'prop_3': np.float64(0.1338283099451153), 'prop_4_normd': -0.0}, 'target_23': {'priority': 0.23496779092483888, 'prop_1': np.float64(0.10352768256473872), 'prop_2': 0.019004809416638367, 'prop_3': np.float64(0.9070521064346198), 'prop_4_normd': -0.0}, 'target_24': {'priority': 0.9084785837974596, 'prop_1': np.float64(0.43108763475725725), 'prop_2': 0.03674322509969044, 'prop_3': np.float64(0.39407021486585936), 'prop_4_normd': -0.0}, 'target_25': {'priority': 0.14496672914401532, 'prop_1': np.float64(0.9895850113173721), 'prop_2': 0.010494811575373313, 'prop_3': np.float64(0.6539661898898557), 'prop_4_normd': -0.0}, 'target_26': {'priority': 0.5483734835622996, 'prop_1': np.float64(0.796681140436383), 'prop_2': 0.04180854061885682, 'prop_3': np.float64(0.3926113063554198), 'prop_4_normd': -0.0}, 'target_27': {'priority': 0.14617982678851893, 'prop_1': np.float64(0.07497897872331492), 'prop_2': 0.04145229760473127, 'prop_3': np.float64(0.8268282910245495), 'prop_4_normd': -0.0}, 'target_28': {'priority': 0.896280250540614, 'prop_1': np.float64(0.6766577821581528), 'prop_2': 0.04767304843877054, 'prop_3': np.float64(0.1847325271180294), 'prop_4_normd': -0.0}, 'target_29': {'priority': 0.0049630880386400955, 'prop_1': np.float64(0.19606435330027705), 'prop_2': 0.027604291185150863, 'prop_3': np.float64(0.2635404384939651), 'prop_4_normd': -0.0}, 'target_30': {'priority': 0.15620152606605864, 'prop_1': np.float64(0.5028512122335517), 'prop_2': 0.04719820746652589, 'prop_3': np.float64(0.8908624986437262), 'prop_4_normd': -0.0}, 'target_31': {'priority': 0.6090567297571149, 'prop_1': np.float64(0.9397514493066356), 'prop_2': 0.018680123293104596, 'prop_3': np.float64(0.2759228456536764), 'prop_4_normd': -0.0}}
time:  0.0
sat_props:  {'omega_BP_P_normd': array([ 6.57732265e-05,  9.19824452e-04, -4.73177270e-03]), 'c_hat_P': array([-0.61330439,  0.78887935,  0.03907804]), 'r_BN_P_normd': array([ 0.98403843,  0.3786073 , -0.22100657]), 'v_BN_P_normd': array([-0.36873357,  0.56350011, -0.67646293]), 'battery_charge_fraction': 0.8735675970708932, 'solar_angle_norm': np.float64(0.5888053710771793)}
eclipse:  [np.float64(2310.0), np.float64(4440.0)]
target:  {'target_0': {'priority': 0.26228034066291006, 'prop_1': np.float64(0.9906468951013733), 'prop_2': 0.034570454343737976, 'prop_3': np.float64(0.41633751387091944), 'prop_4_normd': -0.0}, 'target_1': {'priority': 0.35956003090269617, 'prop_1': np.float64(0.8320764780986386), 'prop_2': 0.021487965487092246, 'prop_3': np.float64(0.18687857295910767), 'prop_4_normd': -0.0}, 'target_2': {'priority': 0.8062810977532414, 'prop_1': np.float64(0.993087334103627), 'prop_2': 0.04039141292626358, 'prop_3': np.float64(0.1338283099451153), 'prop_4_normd': -0.0}, 'target_3': {'priority': 0.23496779092483888, 'prop_1': np.float64(0.10352768256473872), 'prop_2': 0.019004809416638367, 'prop_3': np.float64(0.9070521064346198), 'prop_4_normd': -0.0}, 'target_4': {'priority': 0.9084785837974596, 'prop_1': np.float64(0.43108763475725725), 'prop_2': 0.03674322509969044, 'prop_3': np.float64(0.39407021486585936), 'prop_4_normd': -0.0}, 'target_5': {'priority': 0.14496672914401532, 'prop_1': np.float64(0.9895850113173721), 'prop_2': 0.010494811575373313, 'prop_3': np.float64(0.6539661898898557), 'prop_4_normd': -0.0}, 'target_6': {'priority': 0.5483734835622996, 'prop_1': np.float64(0.796681140436383), 'prop_2': 0.04180854061885682, 'prop_3': np.float64(0.3926113063554198), 'prop_4_normd': -0.0}, 'target_7': {'priority': 0.14617982678851893, 'prop_1': np.float64(0.07497897872331492), 'prop_2': 0.04145229760473127, 'prop_3': np.float64(0.8268282910245495), 'prop_4_normd': -0.0}, 'target_8': {'priority': 0.896280250540614, 'prop_1': np.float64(0.6766577821581528), 'prop_2': 0.04767304843877054, 'prop_3': np.float64(0.1847325271180294), 'prop_4_normd': -0.0}, 'target_9': {'priority': 0.0049630880386400955, 'prop_1': np.float64(0.19606435330027705), 'prop_2': 0.027604291185150863, 'prop_3': np.float64(0.2635404384939651), 'prop_4_normd': -0.0}, 'target_10': {'priority': 0.15620152606605864, 'prop_1': np.float64(0.5028512122335517), 'prop_2': 0.04719820746652589, 'prop_3': np.float64(0.8908624986437262), 'prop_4_normd': -0.0}, 'target_11': {'priority': 0.6090567297571149, 'prop_1': np.float64(0.9397514493066356), 'prop_2': 0.018680123293104596, 'prop_3': np.float64(0.2759228456536764), 'prop_4_normd': -0.0}, 'target_12': {'priority': 0.7178310765496564, 'prop_1': np.float64(0.008717087366691814), 'prop_2': 0.04077086254773631, 'prop_3': np.float64(0.4970973840371545), 'prop_4_normd': -0.0}, 'target_13': {'priority': 0.8967933004986205, 'prop_1': np.float64(0.7482609280415848), 'prop_2': 0.03476544328302366, 'prop_3': np.float64(0.6835321610084802), 'prop_4_normd': -0.0}, 'target_14': {'priority': 0.543689316316815, 'prop_1': np.float64(0.9812848248636226), 'prop_2': 0.027779619705700302, 'prop_3': np.float64(0.5481930510991878), 'prop_4_normd': -0.0}, 'target_15': {'priority': 0.754909559150052, 'prop_1': np.float64(0.05757597235871913), 'prop_2': 0.03729929464921535, 'prop_3': np.float64(0.284165822702533), 'prop_4_normd': -0.0}, 'target_16': {'priority': 0.5148170269813278, 'prop_1': np.float64(0.98277564071416), 'prop_2': 0.047297086415085086, 'prop_3': np.float64(0.48700099507113837), 'prop_4_normd': -0.0}, 'target_17': {'priority': 0.33363421409005134, 'prop_1': np.float64(0.27963666684608807), 'prop_2': 0.015448025913752838, 'prop_3': np.float64(0.35524598852016775), 'prop_4_normd': -0.0}, 'target_18': {'priority': 0.15554516992643075, 'prop_1': np.float64(0.44856007038705614), 'prop_2': 0.03462561443516386, 'prop_3': np.float64(0.041177643202259424), 'prop_4_normd': -0.0}, 'target_19': {'priority': 0.9754007045026568, 'prop_1': np.float64(0.20622308574436016), 'prop_2': 0.04771903579898489, 'prop_3': np.float64(0.2097060094346733), 'prop_4_normd': -0.0}, 'target_20': {'priority': 0.06327147616333118, 'prop_1': np.float64(0.913162122598643), 'prop_2': 0.015400618290328318, 'prop_3': np.float64(0.8438779456824926), 'prop_4_normd': -0.0}, 'target_21': {'priority': 0.952831123720716, 'prop_1': np.float64(0.5425823625818398), 'prop_2': 0.04391279805025721, 'prop_3': np.float64(0.1188596248776597), 'prop_4_normd': -0.0}, 'target_22': {'priority': 0.1984435827220441, 'prop_1': np.float64(0.9993930622647624), 'prop_2': 0.018418751683138883, 'prop_3': np.float64(0.8733160501738085), 'prop_4_normd': -0.0}, 'target_23': {'priority': 0.6081052486615345, 'prop_1': np.float64(0.6666874839765461), 'prop_2': 0.04756378419886552, 'prop_3': np.float64(0.3751647110694418), 'prop_4_normd': -0.0}, 'target_24': {'priority': 0.8604551371804029, 'prop_1': np.float64(0.08057499070803986), 'prop_2': 0.04071241908237248, 'prop_3': np.float64(0.609432855870325), 'prop_4_normd': -0.0}, 'target_25': {'priority': 0.33343926079085895, 'prop_1': np.float64(0.7085651414432226), 'prop_2': 0.013267662106720101, 'prop_3': np.float64(0.09019785855427226), 'prop_4_normd': -0.0}, 'target_26': {'priority': 0.16416909415169478, 'prop_1': np.float64(0.2807892061289123), 'prop_2': 0.013750744690519361, 'prop_3': np.float64(0.189459753332757), 'prop_4_normd': -0.0}, 'target_27': {'priority': 0.905810716682313, 'prop_1': np.float64(0.7660194147598671), 'prop_2': 0.04318851039188519, 'prop_3': np.float64(0.1304886896445085), 'prop_4_normd': -0.0}, 'target_28': {'priority': 0.39927138950055974, 'prop_1': np.float64(1.0), 'prop_2': 0.029637926540067736, 'prop_3': np.float64(0.7333017121319036), 'prop_4_normd': -0.0}, 'target_29': {'priority': 0.5778706973732319, 'prop_1': np.float64(0.6245550082437898), 'prop_2': 0.04978325134312043, 'prop_3': np.float64(0.8122073231245674), 'prop_4_normd': -0.0}, 'target_30': {'priority': 0.05629366991581264, 'prop_1': np.float64(0.5809683193452809), 'prop_2': 0.01729131801779895, 'prop_3': np.float64(0.6992764929868548), 'prop_4_normd': -0.0}, 'target_31': {'priority': 0.43088704356158114, 'prop_1': np.float64(0.6325466948493413), 'prop_2': 0.029827103012583775, 'prop_3': np.float64(0.712024016779776), 'prop_4_normd': -0.0}}
time:  0.0
sat_props:  {'omega_BP_P_normd': array([-0.0010775 ,  0.0033747 , -0.00368788]), 'c_hat_P': array([-0.8447729 , -0.50942475,  0.16384496]), 'r_BN_P_normd': array([-0.09738475,  0.75588946, -0.76135823]), 'v_BN_P_normd': array([-0.94368276, -0.13560413, -0.01392436]), 'battery_charge_fraction': 0.8166400946366469, 'solar_angle_norm': np.float64(0.1541904664169785)}
eclipse:  [np.float64(1200.0), np.float64(3300.0)]
target:  {'target_0': {'priority': 0.15620152606605864, 'prop_1': np.float64(0.5028512122335517), 'prop_2': 0.04719820746652589, 'prop_3': np.float64(0.8908624986437262), 'prop_4_normd': -0.0}, 'target_1': {'priority': 0.9560067989183784, 'prop_1': np.float64(0.6758726802999104), 'prop_2': 0.04782848860703626, 'prop_3': np.float64(0.6757920368735708), 'prop_4_normd': -0.0}, 'target_2': {'priority': 0.6090567297571149, 'prop_1': np.float64(0.9397514493066356), 'prop_2': 0.018680123293104596, 'prop_3': np.float64(0.2759228456536764), 'prop_4_normd': -0.0}, 'target_3': {'priority': 0.9397564003482999, 'prop_1': np.float64(0.864162539013529), 'prop_2': 0.04083485710529246, 'prop_3': np.float64(0.05956535587203046), 'prop_4_normd': -0.0}, 'target_4': {'priority': 0.8967933004986205, 'prop_1': np.float64(0.7482609280415848), 'prop_2': 0.03476544328302366, 'prop_3': np.float64(0.6835321610084802), 'prop_4_normd': -0.0}, 'target_5': {'priority': 0.9274083923453597, 'prop_1': np.float64(0.05006799490865553), 'prop_2': 0.011088498014595083, 'prop_3': np.float64(0.09727868149321972), 'prop_4_normd': -0.0}, 'target_6': {'priority': 0.08492005718652906, 'prop_1': np.float64(0.7122220944171351), 'prop_2': 0.02256226819031263, 'prop_3': np.float64(0.6194570106002709), 'prop_4_normd': -0.0}, 'target_7': {'priority': 0.543689316316815, 'prop_1': np.float64(0.9812848248636226), 'prop_2': 0.027779619705700302, 'prop_3': np.float64(0.5481930510991878), 'prop_4_normd': -0.0}, 'target_8': {'priority': 0.7178310765496564, 'prop_1': np.float64(0.008717087366691814), 'prop_2': 0.04077086254773631, 'prop_3': np.float64(0.4970973840371545), 'prop_4_normd': -0.0}, 'target_9': {'priority': 0.754909559150052, 'prop_1': np.float64(0.05757597235871913), 'prop_2': 0.03729929464921535, 'prop_3': np.float64(0.284165822702533), 'prop_4_normd': -0.0}, 'target_10': {'priority': 0.26129816366655456, 'prop_1': np.float64(0.9801329950029055), 'prop_2': 0.014209014650960264, 'prop_3': np.float64(0.09732109242334332), 'prop_4_normd': -0.0}, 'target_11': {'priority': 0.7511786558834868, 'prop_1': np.float64(0.14609372533908693), 'prop_2': 0.04326569997609207, 'prop_3': np.float64(0.14539193088453728), 'prop_4_normd': -0.0}, 'target_12': {'priority': 0.33363421409005134, 'prop_1': np.float64(0.27963666684608807), 'prop_2': 0.015448025913752838, 'prop_3': np.float64(0.35524598852016775), 'prop_4_normd': -0.0}, 'target_13': {'priority': 0.7838738265919503, 'prop_1': np.float64(0.1120603312737106), 'prop_2': 0.015208583258170937, 'prop_3': np.float64(0.8104452357493993), 'prop_4_normd': -0.0}, 'target_14': {'priority': 0.15554516992643075, 'prop_1': np.float64(0.44856007038705614), 'prop_2': 0.03462561443516386, 'prop_3': np.float64(0.041177643202259424), 'prop_4_normd': -0.0}, 'target_15': {'priority': 0.9754007045026568, 'prop_1': np.float64(0.20622308574436016), 'prop_2': 0.04771903579898489, 'prop_3': np.float64(0.2097060094346733), 'prop_4_normd': -0.0}, 'target_16': {'priority': 0.4596153545251349, 'prop_1': np.float64(1.0), 'prop_2': 0.020307800243842836, 'prop_3': np.float64(0.5140122128212462), 'prop_4_normd': -0.0}, 'target_17': {'priority': 0.3659991252731889, 'prop_1': np.float64(0.05409862818622294), 'prop_2': 0.01687746524189312, 'prop_3': np.float64(0.7375854209483653), 'prop_4_normd': -0.0}, 'target_18': {'priority': 0.1984435827220441, 'prop_1': np.float64(0.9993930622647624), 'prop_2': 0.018418751683138883, 'prop_3': np.float64(0.8733160501738085), 'prop_4_normd': -0.0}, 'target_19': {'priority': 0.17225514293500632, 'prop_1': np.float64(0.8385972978367822), 'prop_2': 0.04929686890520145, 'prop_3': np.float64(0.5221241207594288), 'prop_4_normd': -0.0}, 'target_20': {'priority': 0.8604551371804029, 'prop_1': np.float64(0.08057499070803986), 'prop_2': 0.04071241908237248, 'prop_3': np.float64(0.609432855870325), 'prop_4_normd': -0.0}, 'target_21': {'priority': 0.40742501090364514, 'prop_1': np.float64(0.5399153179893333), 'prop_2': 0.030880862025583225, 'prop_3': np.float64(0.8899055693352789), 'prop_4_normd': -0.0}, 'target_22': {'priority': 0.16416909415169478, 'prop_1': np.float64(0.2807892061289123), 'prop_2': 0.013750744690519361, 'prop_3': np.float64(0.189459753332757), 'prop_4_normd': -0.0}, 'target_23': {'priority': 0.39927138950055974, 'prop_1': np.float64(1.0), 'prop_2': 0.029637926540067736, 'prop_3': np.float64(0.7333017121319036), 'prop_4_normd': -0.0}, 'target_24': {'priority': 0.5778706973732319, 'prop_1': np.float64(0.6245550082437898), 'prop_2': 0.04978325134312043, 'prop_3': np.float64(0.8122073231245674), 'prop_4_normd': -0.0}, 'target_25': {'priority': 0.05629366991581264, 'prop_1': np.float64(0.5809683193452809), 'prop_2': 0.01729131801779895, 'prop_3': np.float64(0.6992764929868548), 'prop_4_normd': -0.0}, 'target_26': {'priority': 0.43088704356158114, 'prop_1': np.float64(0.6325466948493413), 'prop_2': 0.029827103012583775, 'prop_3': np.float64(0.712024016779776), 'prop_4_normd': -0.0}, 'target_27': {'priority': 0.7462625306251898, 'prop_1': np.float64(0.2982597519032414), 'prop_2': 0.045024292039336875, 'prop_3': np.float64(0.44346734103754687), 'prop_4_normd': -0.0}, 'target_28': {'priority': 0.7841923371031474, 'prop_1': np.float64(0.9591233826139078), 'prop_2': 0.037755865811717484, 'prop_3': np.float64(0.9093112695308485), 'prop_4_normd': -0.0}, 'target_29': {'priority': 0.613105381090001, 'prop_1': np.float64(0.590160027737857), 'prop_2': 0.031337283935696104, 'prop_3': np.float64(0.8510975679307113), 'prop_4_normd': -0.0}, 'target_30': {'priority': 0.5852822100268925, 'prop_1': np.float64(0.36990893176639794), 'prop_2': 0.04653269597866705, 'prop_3': np.float64(0.4456852642768419), 'prop_4_normd': -0.0}, 'target_31': {'priority': 0.8518922703837282, 'prop_1': np.float64(0.3895111648188495), 'prop_2': 0.017828837989348107, 'prop_3': np.float64(0.007061709337917654), 'prop_4_normd': -0.0}}
time:  0.0
sat_props:  {'omega_BP_P_normd': array([ 0.00134838, -0.0029125 , -0.00098499]), 'c_hat_P': array([-0.5665049 , -0.81904639,  0.09074805]), 'r_BN_P_normd': array([-1.04422552,  0.08855808, -0.2495387 ]), 'v_BN_P_normd': array([-0.21449445, -0.64730808,  0.6678572 ]), 'battery_charge_fraction': 0.8141227526530871, 'solar_angle_norm': np.float64(0.09988599840507909)}
eclipse:  [np.float64(60.00000000000001), np.float64(2190.0)]
target:  {'target_0': {'priority': 0.4596153545251349, 'prop_1': np.float64(1.0), 'prop_2': 0.020307800243842836, 'prop_3': np.float64(0.5140122128212462), 'prop_4_normd': -0.0}, 'target_1': {'priority': 0.3659991252731889, 'prop_1': np.float64(0.05409862818622294), 'prop_2': 0.01687746524189312, 'prop_3': np.float64(0.7375854209483653), 'prop_4_normd': -0.0}, 'target_2': {'priority': 0.17225514293500632, 'prop_1': np.float64(0.8385972978367822), 'prop_2': 0.04929686890520145, 'prop_3': np.float64(0.5221241207594288), 'prop_4_normd': -0.0}, 'target_3': {'priority': 0.40742501090364514, 'prop_1': np.float64(0.5399153179893333), 'prop_2': 0.030880862025583225, 'prop_3': np.float64(0.8899055693352789), 'prop_4_normd': -0.0}, 'target_4': {'priority': 0.15094914837038043, 'prop_1': np.float64(0.1600098968039353), 'prop_2': 0.0372480349396054, 'prop_3': np.float64(0.4679935866084606), 'prop_4_normd': -0.0}, 'target_5': {'priority': 0.4373081987605446, 'prop_1': np.float64(0.16656956766685047), 'prop_2': 0.026836967671334234, 'prop_3': np.float64(0.1323442213766992), 'prop_4_normd': -0.0}, 'target_6': {'priority': 0.43088704356158114, 'prop_1': np.float64(0.6325466948493413), 'prop_2': 0.029827103012583775, 'prop_3': np.float64(0.712024016779776), 'prop_4_normd': -0.0}, 'target_7': {'priority': 0.9974710312400171, 'prop_1': np.float64(1.0), 'prop_2': 0.023556982195548692, 'prop_3': np.float64(0.015946379549076115), 'prop_4_normd': -0.0}, 'target_8': {'priority': 0.7462625306251898, 'prop_1': np.float64(0.2982597519032414), 'prop_2': 0.045024292039336875, 'prop_3': np.float64(0.44346734103754687), 'prop_4_normd': -0.0}, 'target_9': {'priority': 0.7841923371031474, 'prop_1': np.float64(0.9591233826139078), 'prop_2': 0.037755865811717484, 'prop_3': np.float64(0.9093112695308485), 'prop_4_normd': -0.0}, 'target_10': {'priority': 0.613105381090001, 'prop_1': np.float64(0.590160027737857), 'prop_2': 0.031337283935696104, 'prop_3': np.float64(0.8510975679307113), 'prop_4_normd': -0.0}, 'target_11': {'priority': 0.5852822100268925, 'prop_1': np.float64(0.36990893176639794), 'prop_2': 0.04653269597866705, 'prop_3': np.float64(0.4456852642768419), 'prop_4_normd': -0.0}, 'target_12': {'priority': 0.34000304360297495, 'prop_1': np.float64(0.9944847066186256), 'prop_2': 0.03393163135966621, 'prop_3': np.float64(0.47590147868624155), 'prop_4_normd': -0.0}, 'target_13': {'priority': 0.23110739788422052, 'prop_1': np.float64(0.6773821240549803), 'prop_2': 0.017984788259031905, 'prop_3': np.float64(0.47193060176014956), 'prop_4_normd': -0.0}, 'target_14': {'priority': 0.18100605976414696, 'prop_1': np.float64(1.0), 'prop_2': 0.011879918201780573, 'prop_3': np.float64(0.5109681565409651), 'prop_4_normd': -0.0}, 'target_15': {'priority': 0.7053880626885703, 'prop_1': np.float64(0.23103685455589726), 'prop_2': 0.012802744584004837, 'prop_3': np.float64(0.5448547507690691), 'prop_4_normd': -0.0}, 'target_16': {'priority': 0.1633664559021203, 'prop_1': np.float64(1.0), 'prop_2': 0.020608850788857196, 'prop_3': np.float64(0.5387060943662177), 'prop_4_normd': -0.0}, 'target_17': {'priority': 0.5809659624528973, 'prop_1': np.float64(0.13729744380072872), 'prop_2': 0.012742529830350166, 'prop_3': np.float64(0.9044564966391249), 'prop_4_normd': -0.0}, 'target_18': {'priority': 0.9672643792272313, 'prop_1': np.float64(0.6771252894737922), 'prop_2': 0.043546720561153066, 'prop_3': np.float64(0.01327414045488771), 'prop_4_normd': -0.0}, 'target_19': {'priority': 0.03177482425911071, 'prop_1': np.float64(0.9188487053805751), 'prop_2': 0.012359745287068721, 'prop_3': np.float64(0.6244352067126765), 'prop_4_normd': -0.0}, 'target_20': {'priority': 0.1620597486265063, 'prop_1': np.float64(0.32471532540988063), 'prop_2': 0.021931235486235705, 'prop_3': np.float64(0.6855506082056277), 'prop_4_normd': -0.0}, 'target_21': {'priority': 0.053247230445791494, 'prop_1': np.float64(0.465036271289076), 'prop_2': 0.03563025242548773, 'prop_3': np.float64(0.9025594456524167), 'prop_4_normd': -0.0}, 'target_22': {'priority': 0.4330199859612206, 'prop_1': np.float64(1.0), 'prop_2': 0.020218306152100317, 'prop_3': np.float64(0.6702366946572057), 'prop_4_normd': -0.0}, 'target_23': {'priority': 0.3011615633479109, 'prop_1': np.float64(0.18844447543725398), 'prop_2': 0.04545257905252125, 'prop_3': np.float64(0.06768644938605572), 'prop_4_normd': -0.0}, 'target_24': {'priority': 0.8395413208814804, 'prop_1': np.float64(0.6431795157724476), 'prop_2': 0.017677605544106918, 'prop_3': np.float64(0.4728944248799916), 'prop_4_normd': -0.0}, 'target_25': {'priority': 0.28542099633679585, 'prop_1': np.float64(0.0), 'prop_2': 0.03282052579591975, 'prop_3': np.float64(0.6527384073426662), 'prop_4_normd': -0.0}, 'target_26': {'priority': 0.7378480194092552, 'prop_1': np.float64(0.5791299721901717), 'prop_2': 0.041116455683144884, 'prop_3': np.float64(0.3477342839272196), 'prop_4_normd': -0.0}, 'target_27': {'priority': 0.6309456070754336, 'prop_1': np.float64(0.739476692944099), 'prop_2': 0.049961295436929204, 'prop_3': np.float64(0.5204203695786651), 'prop_4_normd': -0.0}, 'target_28': {'priority': 0.18951471677506737, 'prop_1': np.float64(1.0), 'prop_2': 0.028045202951577725, 'prop_3': np.float64(0.6864588826656022), 'prop_4_normd': -0.0}, 'target_29': {'priority': 0.829892142068991, 'prop_1': np.float64(0.051031544545620415), 'prop_2': 0.012951927671282034, 'prop_3': np.float64(0.9184774474430497), 'prop_4_normd': -0.0}, 'target_30': {'priority': 0.6245099616003051, 'prop_1': np.float64(0.6786198581781225), 'prop_2': 0.029146511530274165, 'prop_3': np.float64(0.8356293281937733), 'prop_4_normd': -0.0}, 'target_31': {'priority': 0.9805442159491671, 'prop_1': np.float64(0.41451646992278607), 'prop_2': 0.04667665260455525, 'prop_3': np.float64(0.6942713451718054), 'prop_4_normd': -0.0}}
time:  0.0

Then, run the simulation until timeout or agent failure.

[12]:
count = 0
while True:
    if count == 0:
        # Vector with an action for each satellite (we can pass different actions for each satellite)
        # Tasking all satellites to charge (tasking None as the first action will raise a warning)
        action_dict = {sat_i.name: 0 for sat_i in env.satellites}
    else:
        # Tasking random actions
        action_dict = {sat_i.name: np.random.randint(0, 32) for sat_i in env.satellites}
    count += 1

    observation, reward, terminated, truncated, info = env.step(action_dict)

    if all(terminated.values()) or all(truncated.values()):
        print("Episode complete.")
        break
2025-05-13 19:51:11,468 gym                            INFO       <0.00> === STARTING STEP ===
2025-05-13 19:51:11,468 sats.satellite.EO-0            INFO       <0.00> EO-0: action_charge tasked for 60.0 seconds
2025-05-13 19:51:11,469 sats.satellite.EO-0            INFO       <0.00> EO-0: setting timed terminal event at 60.0
2025-05-13 19:51:11,470 sats.satellite.EO-1            INFO       <0.00> EO-1: action_charge tasked for 60.0 seconds
2025-05-13 19:51:11,470 sats.satellite.EO-1            INFO       <0.00> EO-1: setting timed terminal event at 60.0
2025-05-13 19:51:11,471 sats.satellite.EO-2            INFO       <0.00> EO-2: action_charge tasked for 60.0 seconds
2025-05-13 19:51:11,472 sats.satellite.EO-2            INFO       <0.00> EO-2: setting timed terminal event at 60.0
2025-05-13 19:51:11,473 sats.satellite.EO-3            INFO       <0.00> EO-3: action_charge tasked for 60.0 seconds
2025-05-13 19:51:11,473 sats.satellite.EO-3            INFO       <0.00> EO-3: setting timed terminal event at 60.0
2025-05-13 19:51:11,474 sats.satellite.EO-4            INFO       <0.00> EO-4: action_charge tasked for 60.0 seconds
2025-05-13 19:51:11,475 sats.satellite.EO-4            INFO       <0.00> EO-4: setting timed terminal event at 60.0
2025-05-13 19:51:11,586 sats.satellite.EO-0            INFO       <60.00> EO-0: timed termination at 60.0 for action_charge
2025-05-13 19:51:11,586 sats.satellite.EO-1            INFO       <60.00> EO-1: timed termination at 60.0 for action_charge
2025-05-13 19:51:11,587 sats.satellite.EO-2            INFO       <60.00> EO-2: timed termination at 60.0 for action_charge
2025-05-13 19:51:11,588 sats.satellite.EO-3            INFO       <60.00> EO-3: timed termination at 60.0 for action_charge
2025-05-13 19:51:11,588 sats.satellite.EO-4            INFO       <60.00> EO-4: timed termination at 60.0 for action_charge
2025-05-13 19:51:11,592 data.base                      INFO       <60.00> Total reward: {}
2025-05-13 19:51:11,593 sats.satellite.EO-0            INFO       <60.00> EO-0: Satellite EO-0 requires retasking
2025-05-13 19:51:11,593 sats.satellite.EO-1            INFO       <60.00> EO-1: Satellite EO-1 requires retasking
2025-05-13 19:51:11,594 sats.satellite.EO-2            INFO       <60.00> EO-2: Satellite EO-2 requires retasking
2025-05-13 19:51:11,594 sats.satellite.EO-3            INFO       <60.00> EO-3: Satellite EO-3 requires retasking
2025-05-13 19:51:11,595 sats.satellite.EO-4            INFO       <60.00> EO-4: Satellite EO-4 requires retasking
2025-05-13 19:51:11,614 gym                            INFO       <60.00> Step reward: {}
2025-05-13 19:51:11,619 gym                            INFO       <60.00> === STARTING STEP ===
2025-05-13 19:51:11,619 sats.satellite.EO-0            INFO       <60.00> EO-0: target index 5 tasked
2025-05-13 19:51:11,620 sats.satellite.EO-0            INFO       <60.00> EO-0: Target(tgt-446) tasked for imaging
2025-05-13 19:51:11,621 sats.satellite.EO-0            INFO       <60.00> EO-0: Target(tgt-446) window enabled: 409.1 to 540.4
2025-05-13 19:51:11,622 sats.satellite.EO-0            INFO       <60.00> EO-0: setting timed terminal event at 540.4
2025-05-13 19:51:11,623 sats.satellite.EO-1            INFO       <60.00> EO-1: target index 18 tasked
2025-05-13 19:51:11,623 sats.satellite.EO-1            INFO       <60.00> EO-1: Target(tgt-471) tasked for imaging
2025-05-13 19:51:11,624 sats.satellite.EO-1            INFO       <60.00> EO-1: Target(tgt-471) window enabled: 1453.8 to 1558.6
2025-05-13 19:51:11,625 sats.satellite.EO-1            INFO       <60.00> EO-1: setting timed terminal event at 1558.6
2025-05-13 19:51:11,626 sats.satellite.EO-2            INFO       <60.00> EO-2: target index 5 tasked
2025-05-13 19:51:11,627 sats.satellite.EO-2            INFO       <60.00> EO-2: Target(tgt-533) tasked for imaging
2025-05-13 19:51:11,628 sats.satellite.EO-2            INFO       <60.00> EO-2: Target(tgt-533) window enabled: 835.2 to 958.4
2025-05-13 19:51:11,628 sats.satellite.EO-2            INFO       <60.00> EO-2: setting timed terminal event at 958.4
2025-05-13 19:51:11,629 sats.satellite.EO-3            INFO       <60.00> EO-3: target index 16 tasked
2025-05-13 19:51:11,630 sats.satellite.EO-3            INFO       <60.00> EO-3: Target(tgt-366) tasked for imaging
2025-05-13 19:51:11,631 sats.satellite.EO-3            INFO       <60.00> EO-3: Target(tgt-366) window enabled: 1169.7 to 1288.2
2025-05-13 19:51:11,632 sats.satellite.EO-3            INFO       <60.00> EO-3: setting timed terminal event at 1288.2
2025-05-13 19:51:11,632 sats.satellite.EO-4            INFO       <60.00> EO-4: target index 28 tasked
2025-05-13 19:51:11,633 sats.satellite.EO-4            INFO       <60.00> EO-4: Target(tgt-970) tasked for imaging
2025-05-13 19:51:11,634 sats.satellite.EO-4            INFO       <60.00> EO-4: Target(tgt-970) window enabled: 2360.3 to 2483.2
2025-05-13 19:51:11,635 sats.satellite.EO-4            INFO       <60.00> EO-4: setting timed terminal event at 2483.2
2025-05-13 19:51:12,212 sim.simulator                  INFO       <360.00> Max step duration reached
2025-05-13 19:51:12,216 data.base                      INFO       <360.00> Total reward: {}
2025-05-13 19:51:12,223 sats.satellite.EO-4            INFO       <360.00> EO-4: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-05-13 19:51:12,276 gym                            INFO       <360.00> Step reward: {}
2025-05-13 19:51:12,280 gym                            INFO       <360.00> === STARTING STEP ===
2025-05-13 19:51:12,280 sats.satellite.EO-0            INFO       <360.00> EO-0: target index 7 tasked
2025-05-13 19:51:12,281 sats.satellite.EO-0            INFO       <360.00> EO-0: Target(tgt-865) tasked for imaging
2025-05-13 19:51:12,282 sats.satellite.EO-0            INFO       <360.00> EO-0: Target(tgt-865) window enabled: 967.9 to 1061.8
2025-05-13 19:51:12,283 sats.satellite.EO-0            INFO       <360.00> EO-0: setting timed terminal event at 1061.8
2025-05-13 19:51:12,284 sats.satellite.EO-1            INFO       <360.00> EO-1: target index 30 tasked
2025-05-13 19:51:12,284 sats.satellite.EO-1            INFO       <360.00> EO-1: Target(tgt-900) tasked for imaging
2025-05-13 19:51:12,285 sats.satellite.EO-1            INFO       <360.00> EO-1: Target(tgt-900) window enabled: 2686.0 to 2816.3
2025-05-13 19:51:12,286 sats.satellite.EO-1            INFO       <360.00> EO-1: setting timed terminal event at 2816.3
2025-05-13 19:51:12,287 sats.satellite.EO-2            INFO       <360.00> EO-2: target index 12 tasked
2025-05-13 19:51:12,287 sats.satellite.EO-2            INFO       <360.00> EO-2: Target(tgt-684) tasked for imaging
2025-05-13 19:51:12,288 sats.satellite.EO-2            INFO       <360.00> EO-2: Target(tgt-684) window enabled: 1555.4 to 1617.7
2025-05-13 19:51:12,289 sats.satellite.EO-2            INFO       <360.00> EO-2: setting timed terminal event at 1617.7
2025-05-13 19:51:12,290 sats.satellite.EO-3            INFO       <360.00> EO-3: target index 12 tasked
2025-05-13 19:51:12,290 sats.satellite.EO-3            INFO       <360.00> EO-3: Target(tgt-536) tasked for imaging
2025-05-13 19:51:12,292 sats.satellite.EO-3            INFO       <360.00> EO-3: Target(tgt-536) window enabled: 1040.7 to 1172.3
2025-05-13 19:51:12,292 sats.satellite.EO-3            INFO       <360.00> EO-3: setting timed terminal event at 1172.3
2025-05-13 19:51:12,293 sats.satellite.EO-4            INFO       <360.00> EO-4: target index 6 tasked
2025-05-13 19:51:12,294 sats.satellite.EO-4            INFO       <360.00> EO-4: Target(tgt-433) tasked for imaging
2025-05-13 19:51:12,295 sats.satellite.EO-4            INFO       <360.00> EO-4: Target(tgt-433) window enabled: 835.7 to 939.2
2025-05-13 19:51:12,295 sats.satellite.EO-4            INFO       <360.00> EO-4: setting timed terminal event at 939.2
2025-05-13 19:51:12,864 sim.simulator                  INFO       <660.00> Max step duration reached
2025-05-13 19:51:12,868 data.base                      INFO       <660.00> Total reward: {}
2025-05-13 19:51:12,871 sats.satellite.EO-1            INFO       <660.00> EO-1: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-05-13 19:51:12,912 sats.satellite.EO-2            INFO       <660.00> EO-2: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-05-13 19:51:12,960 gym                            INFO       <660.00> Step reward: {}
2025-05-13 19:51:12,964 gym                            INFO       <660.00> === STARTING STEP ===
2025-05-13 19:51:12,965 sats.satellite.EO-0            INFO       <660.00> EO-0: target index 21 tasked
2025-05-13 19:51:12,965 sats.satellite.EO-0            INFO       <660.00> EO-0: Target(tgt-496) tasked for imaging
2025-05-13 19:51:12,966 sats.satellite.EO-0            INFO       <660.00> EO-0: Target(tgt-496) window enabled: 2159.5 to 2285.9
2025-05-13 19:51:12,967 sats.satellite.EO-0            INFO       <660.00> EO-0: setting timed terminal event at 2285.9
2025-05-13 19:51:12,968 sats.satellite.EO-1            INFO       <660.00> EO-1: target index 29 tasked
2025-05-13 19:51:12,968 sats.satellite.EO-1            INFO       <660.00> EO-1: Target(tgt-216) tasked for imaging
2025-05-13 19:51:12,969 sats.satellite.EO-1            INFO       <660.00> EO-1: Target(tgt-216) window enabled: 3003.0 to 3131.3
2025-05-13 19:51:12,970 sats.satellite.EO-1            INFO       <660.00> EO-1: setting timed terminal event at 3131.3
2025-05-13 19:51:12,970 sats.satellite.EO-2            INFO       <660.00> EO-2: target index 7 tasked
2025-05-13 19:51:12,971 sats.satellite.EO-2            INFO       <660.00> EO-2: Target(tgt-950) tasked for imaging
2025-05-13 19:51:12,973 sats.satellite.EO-2            INFO       <660.00> EO-2: Target(tgt-950) window enabled: 971.3 to 1099.8
2025-05-13 19:51:12,973 sats.satellite.EO-2            INFO       <660.00> EO-2: setting timed terminal event at 1099.8
2025-05-13 19:51:12,974 sats.satellite.EO-3            INFO       <660.00> EO-3: target index 28 tasked
2025-05-13 19:51:12,975 sats.satellite.EO-3            INFO       <660.00> EO-3: Target(tgt-902) tasked for imaging
2025-05-13 19:51:12,976 sats.satellite.EO-3            INFO       <660.00> EO-3: Target(tgt-902) window enabled: 2495.9 to 2626.8
2025-05-13 19:51:12,976 sats.satellite.EO-3            INFO       <660.00> EO-3: setting timed terminal event at 2626.8
2025-05-13 19:51:12,977 sats.satellite.EO-4            INFO       <660.00> EO-4: target index 17 tasked
2025-05-13 19:51:12,978 sats.satellite.EO-4            INFO       <660.00> EO-4: Target(tgt-597) tasked for imaging
2025-05-13 19:51:12,979 sats.satellite.EO-4            INFO       <660.00> EO-4: Target(tgt-597) window enabled: 1729.0 to 1828.9
2025-05-13 19:51:12,980 sats.satellite.EO-4            INFO       <660.00> EO-4: setting timed terminal event at 1828.9
2025-05-13 19:51:13,545 sim.simulator                  INFO       <960.00> Max step duration reached
2025-05-13 19:51:13,548 data.base                      INFO       <960.00> Total reward: {}
2025-05-13 19:51:13,551 sats.satellite.EO-0            INFO       <960.00> EO-0: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-05-13 19:51:13,591 gym                            INFO       <960.00> Step reward: {}
2025-05-13 19:51:13,596 gym                            INFO       <960.00> === STARTING STEP ===
2025-05-13 19:51:13,596 sats.satellite.EO-0            INFO       <960.00> EO-0: target index 4 tasked
2025-05-13 19:51:13,597 sats.satellite.EO-0            INFO       <960.00> EO-0: Target(tgt-966) tasked for imaging
2025-05-13 19:51:13,598 sats.satellite.EO-0            INFO       <960.00> EO-0: Target(tgt-966) window enabled: 1110.6 to 1223.2
2025-05-13 19:51:13,599 sats.satellite.EO-0            INFO       <960.00> EO-0: setting timed terminal event at 1223.2
2025-05-13 19:51:13,599 sats.satellite.EO-1            INFO       <960.00> EO-1: target index 16 tasked
2025-05-13 19:51:13,600 sats.satellite.EO-1            INFO       <960.00> EO-1: Target(tgt-533) tasked for imaging
2025-05-13 19:51:13,601 sats.satellite.EO-1            INFO       <960.00> EO-1: Target(tgt-533) window enabled: 2032.1 to 2140.3
2025-05-13 19:51:13,602 sats.satellite.EO-1            INFO       <960.00> EO-1: setting timed terminal event at 2140.3
2025-05-13 19:51:13,603 sats.satellite.EO-2            INFO       <960.00> EO-2: target index 5 tasked
2025-05-13 19:51:13,604 sats.satellite.EO-2            INFO       <960.00> EO-2: Target(tgt-221) tasked for imaging
2025-05-13 19:51:13,605 sats.satellite.EO-2            INFO       <960.00> EO-2: Target(tgt-221) window enabled: 1275.9 to 1395.2
2025-05-13 19:51:13,605 sats.satellite.EO-2            INFO       <960.00> EO-2: setting timed terminal event at 1395.2
2025-05-13 19:51:13,606 sats.satellite.EO-3            INFO       <960.00> EO-3: target index 4 tasked
2025-05-13 19:51:13,607 sats.satellite.EO-3            INFO       <960.00> EO-3: Target(tgt-481) tasked for imaging
2025-05-13 19:51:13,608 sats.satellite.EO-3            INFO       <960.00> EO-3: Target(tgt-481) window enabled: 1117.1 to 1246.8
2025-05-13 19:51:13,608 sats.satellite.EO-3            INFO       <960.00> EO-3: setting timed terminal event at 1246.8
2025-05-13 19:51:13,609 sats.satellite.EO-4            INFO       <960.00> EO-4: target index 5 tasked
2025-05-13 19:51:13,609 sats.satellite.EO-4            INFO       <960.00> EO-4: Target(tgt-633) tasked for imaging
2025-05-13 19:51:13,610 sats.satellite.EO-4            INFO       <960.00> EO-4: Target(tgt-633) window enabled: 1373.2 to 1440.9
2025-05-13 19:51:13,611 sats.satellite.EO-4            INFO       <960.00> EO-4: setting timed terminal event at 1440.9
2025-05-13 19:51:13,895 sats.satellite.EO-0            INFO       <1112.00> EO-0: imaged Target(tgt-966)
2025-05-13 19:51:13,900 data.base                      INFO       <1112.00> Total reward: {}
2025-05-13 19:51:13,901 sats.satellite.EO-0            INFO       <1112.00> EO-0: Satellite EO-0 requires retasking
2025-05-13 19:51:13,912 sats.satellite.EO-1            INFO       <1112.00> EO-1: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-05-13 19:51:13,963 sats.satellite.EO-2            INFO       <1112.00> EO-2: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-05-13 19:51:14,031 sats.satellite.EO-3            INFO       <1112.00> EO-3: Finding opportunity windows from 3000.00 to 3600.00 seconds
2025-05-13 19:51:14,066 sats.satellite.EO-4            INFO       <1112.00> EO-4: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-05-13 19:51:14,122 gym                            INFO       <1112.00> Step reward: {}
2025-05-13 19:51:14,126 gym                            INFO       <1112.00> === STARTING STEP ===
2025-05-13 19:51:14,127 sats.satellite.EO-0            INFO       <1112.00> EO-0: target index 20 tasked
2025-05-13 19:51:14,127 sats.satellite.EO-0            INFO       <1112.00> EO-0: Target(tgt-97) tasked for imaging
2025-05-13 19:51:14,129 sats.satellite.EO-0            INFO       <1112.00> EO-0: Target(tgt-97) window enabled: 2388.5 to 2511.4
2025-05-13 19:51:14,129 sats.satellite.EO-0            INFO       <1112.00> EO-0: setting timed terminal event at 2511.4
2025-05-13 19:51:14,130 sats.satellite.EO-1            INFO       <1112.00> EO-1: target index 28 tasked
2025-05-13 19:51:14,131 sats.satellite.EO-1            INFO       <1112.00> EO-1: Target(tgt-940) tasked for imaging
2025-05-13 19:51:14,132 sats.satellite.EO-1            INFO       <1112.00> EO-1: Target(tgt-940) window enabled: 3653.1 to 3730.8
2025-05-13 19:51:14,133 sats.satellite.EO-1            INFO       <1112.00> EO-1: setting timed terminal event at 3730.8
2025-05-13 19:51:14,133 sats.satellite.EO-2            INFO       <1112.00> EO-2: target index 28 tasked
2025-05-13 19:51:14,134 sats.satellite.EO-2            INFO       <1112.00> EO-2: Target(tgt-546) tasked for imaging
2025-05-13 19:51:14,136 sats.satellite.EO-2            INFO       <1112.00> EO-2: Target(tgt-546) window enabled: 3462.7 to 3536.4
2025-05-13 19:51:14,136 sats.satellite.EO-2            INFO       <1112.00> EO-2: setting timed terminal event at 3536.4
2025-05-13 19:51:14,137 sats.satellite.EO-3            INFO       <1112.00> EO-3: target index 14 tasked
2025-05-13 19:51:14,137 sats.satellite.EO-3            INFO       <1112.00> EO-3: Target(tgt-433) tasked for imaging
2025-05-13 19:51:14,139 sats.satellite.EO-3            INFO       <1112.00> EO-3: Target(tgt-433) window enabled: 2009.1 to 2140.6
2025-05-13 19:51:14,139 sats.satellite.EO-3            INFO       <1112.00> EO-3: setting timed terminal event at 2140.6
2025-05-13 19:51:14,140 sats.satellite.EO-4            INFO       <1112.00> EO-4: target index 15 tasked
2025-05-13 19:51:14,140 sats.satellite.EO-4            INFO       <1112.00> EO-4: Target(tgt-966) tasked for imaging
2025-05-13 19:51:14,141 sats.satellite.EO-4            INFO       <1112.00> EO-4: Target(tgt-966) window enabled: 2287.8 to 2415.7
2025-05-13 19:51:14,142 sats.satellite.EO-4            INFO       <1112.00> EO-4: setting timed terminal event at 2415.7
2025-05-13 19:51:14,706 sim.simulator                  INFO       <1412.00> Max step duration reached
2025-05-13 19:51:14,710 data.base                      INFO       <1412.00> Total reward: {}
2025-05-13 19:51:14,730 sats.satellite.EO-3            INFO       <1412.00> EO-3: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-05-13 19:51:14,765 gym                            INFO       <1412.00> Step reward: {}
2025-05-13 19:51:14,769 gym                            INFO       <1412.00> === STARTING STEP ===
2025-05-13 19:51:14,769 sats.satellite.EO-0            INFO       <1412.00> EO-0: target index 27 tasked
2025-05-13 19:51:14,770 sats.satellite.EO-0            INFO       <1412.00> EO-0: Target(tgt-427) tasked for imaging
2025-05-13 19:51:14,771 sats.satellite.EO-0            INFO       <1412.00> EO-0: Target(tgt-427) window enabled: 3161.0 to 3282.2
2025-05-13 19:51:14,772 sats.satellite.EO-0            INFO       <1412.00> EO-0: setting timed terminal event at 3282.2
2025-05-13 19:51:14,772 sats.satellite.EO-1            INFO       <1412.00> EO-1: target index 7 tasked
2025-05-13 19:51:14,773 sats.satellite.EO-1            INFO       <1412.00> EO-1: Target(tgt-342) tasked for imaging
2025-05-13 19:51:14,774 sats.satellite.EO-1            INFO       <1412.00> EO-1: Target(tgt-342) window enabled: 1945.5 to 2075.8
2025-05-13 19:51:14,774 sats.satellite.EO-1            INFO       <1412.00> EO-1: setting timed terminal event at 2075.8
2025-05-13 19:51:14,776 sats.satellite.EO-2            INFO       <1412.00> EO-2: target index 4 tasked
2025-05-13 19:51:14,776 sats.satellite.EO-2            INFO       <1412.00> EO-2: Target(tgt-216) tasked for imaging
2025-05-13 19:51:14,777 sats.satellite.EO-2            INFO       <1412.00> EO-2: Target(tgt-216) window enabled: 1823.3 to 1936.9
2025-05-13 19:51:14,778 sats.satellite.EO-2            INFO       <1412.00> EO-2: setting timed terminal event at 1936.9
2025-05-13 19:51:14,778 sats.satellite.EO-3            INFO       <1412.00> EO-3: target index 11 tasked
2025-05-13 19:51:14,779 sats.satellite.EO-3            INFO       <1412.00> EO-3: Target(tgt-512) tasked for imaging
2025-05-13 19:51:14,780 sats.satellite.EO-3            INFO       <1412.00> EO-3: Target(tgt-512) window enabled: 2412.8 to 2467.6
2025-05-13 19:51:14,781 sats.satellite.EO-3            INFO       <1412.00> EO-3: setting timed terminal event at 2467.6
2025-05-13 19:51:14,782 sats.satellite.EO-4            INFO       <1412.00> EO-4: target index 13 tasked
2025-05-13 19:51:14,783 sats.satellite.EO-4            INFO       <1412.00> EO-4: Target(tgt-970) tasked for imaging
2025-05-13 19:51:14,784 sats.satellite.EO-4            INFO       <1412.00> EO-4: Target(tgt-970) window enabled: 2360.3 to 2483.2
2025-05-13 19:51:14,784 sats.satellite.EO-4            INFO       <1412.00> EO-4: setting timed terminal event at 2483.2
2025-05-13 19:51:15,350 sim.simulator                  INFO       <1712.00> Max step duration reached
2025-05-13 19:51:15,354 data.base                      INFO       <1712.00> Total reward: {}
2025-05-13 19:51:15,356 sats.satellite.EO-0            INFO       <1712.00> EO-0: Finding opportunity windows from 3600.00 to 4200.00 seconds
2025-05-13 19:51:15,396 sats.satellite.EO-1            INFO       <1712.00> EO-1: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-05-13 19:51:15,429 sats.satellite.EO-3            INFO       <1712.00> EO-3: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-05-13 19:51:15,471 sats.satellite.EO-4            INFO       <1712.00> EO-4: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-05-13 19:51:15,515 gym                            INFO       <1712.00> Step reward: {}
2025-05-13 19:51:15,519 gym                            INFO       <1712.00> === STARTING STEP ===
2025-05-13 19:51:15,519 sats.satellite.EO-0            INFO       <1712.00> EO-0: target index 20 tasked
2025-05-13 19:51:15,520 sats.satellite.EO-0            INFO       <1712.00> EO-0: Target(tgt-441) tasked for imaging
2025-05-13 19:51:15,521 sats.satellite.EO-0            INFO       <1712.00> EO-0: Target(tgt-441) window enabled: 3068.7 to 3160.4
2025-05-13 19:51:15,522 sats.satellite.EO-0            INFO       <1712.00> EO-0: setting timed terminal event at 3160.4
2025-05-13 19:51:15,523 sats.satellite.EO-1            INFO       <1712.00> EO-1: target index 22 tasked
2025-05-13 19:51:15,523 sats.satellite.EO-1            INFO       <1712.00> EO-1: Target(tgt-80) tasked for imaging
2025-05-13 19:51:15,524 sats.satellite.EO-1            INFO       <1712.00> EO-1: Target(tgt-80) window enabled: 3675.1 to 3781.6
2025-05-13 19:51:15,525 sats.satellite.EO-1            INFO       <1712.00> EO-1: setting timed terminal event at 3781.6
2025-05-13 19:51:15,526 sats.satellite.EO-2            INFO       <1712.00> EO-2: target index 18 tasked
2025-05-13 19:51:15,526 sats.satellite.EO-2            INFO       <1712.00> EO-2: Target(tgt-91) tasked for imaging
2025-05-13 19:51:15,528 sats.satellite.EO-2            INFO       <1712.00> EO-2: Target(tgt-91) window enabled: 3250.2 to 3279.0
2025-05-13 19:51:15,528 sats.satellite.EO-2            INFO       <1712.00> EO-2: setting timed terminal event at 3279.0
2025-05-13 19:51:15,529 sats.satellite.EO-3            INFO       <1712.00> EO-3: action_charge tasked for 60.0 seconds
2025-05-13 19:51:15,529 sats.satellite.EO-3            INFO       <1712.00> EO-3: setting timed terminal event at 1772.0
2025-05-13 19:51:15,530 sats.satellite.EO-4            INFO       <1712.00> EO-4: target index 6 tasked
2025-05-13 19:51:15,531 sats.satellite.EO-4            INFO       <1712.00> EO-4: Target(tgt-543) tasked for imaging
2025-05-13 19:51:15,532 sats.satellite.EO-4            INFO       <1712.00> EO-4: Target(tgt-543) window enabled: 2171.9 to 2297.1
2025-05-13 19:51:15,533 sats.satellite.EO-4            INFO       <1712.00> EO-4: setting timed terminal event at 2297.1
2025-05-13 19:51:15,649 sats.satellite.EO-3            INFO       <1772.00> EO-3: timed termination at 1772.0 for action_charge
2025-05-13 19:51:15,652 data.base                      INFO       <1772.00> Total reward: {}
2025-05-13 19:51:15,653 sats.satellite.EO-3            INFO       <1772.00> EO-3: Satellite EO-3 requires retasking
2025-05-13 19:51:15,662 gym                            INFO       <1772.00> Step reward: {}
2025-05-13 19:51:15,666 gym                            INFO       <1772.00> === STARTING STEP ===
2025-05-13 19:51:15,667 sats.satellite.EO-0            INFO       <1772.00> EO-0: target index 25 tasked
2025-05-13 19:51:15,667 sats.satellite.EO-0            INFO       <1772.00> EO-0: Target(tgt-292) tasked for imaging
2025-05-13 19:51:15,669 sats.satellite.EO-0            INFO       <1772.00> EO-0: Target(tgt-292) window enabled: 3304.2 to 3418.9
2025-05-13 19:51:15,669 sats.satellite.EO-0            INFO       <1772.00> EO-0: setting timed terminal event at 3418.9
2025-05-13 19:51:15,670 sats.satellite.EO-1            INFO       <1772.00> EO-1: target index 18 tasked
2025-05-13 19:51:15,671 sats.satellite.EO-1            INFO       <1772.00> EO-1: Target(tgt-28) tasked for imaging
2025-05-13 19:51:15,672 sats.satellite.EO-1            INFO       <1772.00> EO-1: Target(tgt-28) window enabled: 3496.4 to 3624.1
2025-05-13 19:51:15,673 sats.satellite.EO-1            INFO       <1772.00> EO-1: setting timed terminal event at 3624.1
2025-05-13 19:51:15,674 sats.satellite.EO-2            INFO       <1772.00> EO-2: target index 3 tasked
2025-05-13 19:51:15,674 sats.satellite.EO-2            INFO       <1772.00> EO-2: Target(tgt-704) tasked for imaging
2025-05-13 19:51:15,675 sats.satellite.EO-2            INFO       <1772.00> EO-2: Target(tgt-704) window enabled: 2141.1 to 2269.1
2025-05-13 19:51:15,676 sats.satellite.EO-2            INFO       <1772.00> EO-2: setting timed terminal event at 2269.1
2025-05-13 19:51:15,676 sats.satellite.EO-3            INFO       <1772.00> EO-3: target index 27 tasked
2025-05-13 19:51:15,677 sats.satellite.EO-3            INFO       <1772.00> EO-3: Target(tgt-961) tasked for imaging
2025-05-13 19:51:15,678 sats.satellite.EO-3            INFO       <1772.00> EO-3: Target(tgt-961) window enabled: 4210.2 to 4256.8
2025-05-13 19:51:15,679 sats.satellite.EO-3            INFO       <1772.00> EO-3: setting timed terminal event at 4256.8
2025-05-13 19:51:15,680 sats.satellite.EO-4            INFO       <1772.00> EO-4: action_charge tasked for 60.0 seconds
2025-05-13 19:51:15,680 sats.satellite.EO-4            INFO       <1772.00> EO-4: setting timed terminal event at 1832.0
2025-05-13 19:51:15,798 sats.satellite.EO-4            INFO       <1832.00> EO-4: timed termination at 1832.0 for action_charge
2025-05-13 19:51:15,802 data.base                      INFO       <1832.00> Total reward: {}
2025-05-13 19:51:15,802 sats.satellite.EO-4            INFO       <1832.00> EO-4: Satellite EO-4 requires retasking
2025-05-13 19:51:15,812 gym                            INFO       <1832.00> Step reward: {}
2025-05-13 19:51:15,816 gym                            INFO       <1832.00> === STARTING STEP ===
2025-05-13 19:51:15,816 sats.satellite.EO-0            INFO       <1832.00> EO-0: target index 26 tasked
2025-05-13 19:51:15,817 sats.satellite.EO-0            INFO       <1832.00> EO-0: Target(tgt-26) tasked for imaging
2025-05-13 19:51:15,818 sats.satellite.EO-0            INFO       <1832.00> EO-0: Target(tgt-26) window enabled: 3395.5 to 3446.9
2025-05-13 19:51:15,819 sats.satellite.EO-0            INFO       <1832.00> EO-0: setting timed terminal event at 3446.9
2025-05-13 19:51:15,820 sats.satellite.EO-1            INFO       <1832.00> EO-1: target index 18 tasked
2025-05-13 19:51:15,821 sats.satellite.EO-1            INFO       <1832.00> EO-1: Target(tgt-28) window enabled: 3496.4 to 3624.1
2025-05-13 19:51:15,821 sats.satellite.EO-1            INFO       <1832.00> EO-1: setting timed terminal event at 3624.1
2025-05-13 19:51:15,822 sats.satellite.EO-2            INFO       <1832.00> EO-2: target index 22 tasked
2025-05-13 19:51:15,823 sats.satellite.EO-2            INFO       <1832.00> EO-2: Target(tgt-444) tasked for imaging
2025-05-13 19:51:15,824 sats.satellite.EO-2            INFO       <1832.00> EO-2: Target(tgt-444) window enabled: 3424.0 to 3483.3
2025-05-13 19:51:15,824 sats.satellite.EO-2            INFO       <1832.00> EO-2: setting timed terminal event at 3483.3
2025-05-13 19:51:15,825 sats.satellite.EO-3            INFO       <1832.00> EO-3: target index 30 tasked
2025-05-13 19:51:15,826 sats.satellite.EO-3            INFO       <1832.00> EO-3: Target(tgt-875) tasked for imaging
2025-05-13 19:51:15,827 sats.satellite.EO-3            INFO       <1832.00> EO-3: Target(tgt-875) window enabled: 4277.0 to 4325.1
2025-05-13 19:51:15,828 sats.satellite.EO-3            INFO       <1832.00> EO-3: setting timed terminal event at 4325.1
2025-05-13 19:51:15,828 sats.satellite.EO-4            INFO       <1832.00> EO-4: target index 14 tasked
2025-05-13 19:51:15,829 sats.satellite.EO-4            INFO       <1832.00> EO-4: Target(tgt-655) tasked for imaging
2025-05-13 19:51:15,830 sats.satellite.EO-4            INFO       <1832.00> EO-4: Target(tgt-655) window enabled: 3199.8 to 3326.6
2025-05-13 19:51:15,831 sats.satellite.EO-4            INFO       <1832.00> EO-4: setting timed terminal event at 3326.6
2025-05-13 19:51:16,393 sim.simulator                  INFO       <2132.00> Max step duration reached
2025-05-13 19:51:16,397 data.base                      INFO       <2132.00> Total reward: {}
2025-05-13 19:51:16,400 sats.satellite.EO-0            INFO       <2132.00> EO-0: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-05-13 19:51:16,437 sats.satellite.EO-0            INFO       <2132.00> EO-0: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-05-13 19:51:16,468 sats.satellite.EO-1            INFO       <2132.00> EO-1: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-05-13 19:51:16,512 gym                            INFO       <2132.00> Step reward: {}
2025-05-13 19:51:16,516 gym                            INFO       <2132.00> === STARTING STEP ===
2025-05-13 19:51:16,517 sats.satellite.EO-0            INFO       <2132.00> EO-0: target index 21 tasked
2025-05-13 19:51:16,517 sats.satellite.EO-0            INFO       <2132.00> EO-0: Target(tgt-349) tasked for imaging
2025-05-13 19:51:16,519 sats.satellite.EO-0            INFO       <2132.00> EO-0: Target(tgt-349) window enabled: 3472.7 to 3596.3
2025-05-13 19:51:16,519 sats.satellite.EO-0            INFO       <2132.00> EO-0: setting timed terminal event at 3596.3
2025-05-13 19:51:16,520 sats.satellite.EO-1            INFO       <2132.00> EO-1: target index 15 tasked
2025-05-13 19:51:16,522 sats.satellite.EO-1            INFO       <2132.00> EO-1: Target(tgt-28) window enabled: 3496.4 to 3624.1
2025-05-13 19:51:16,522 sats.satellite.EO-1            INFO       <2132.00> EO-1: setting timed terminal event at 3624.1
2025-05-13 19:51:16,523 sats.satellite.EO-2            INFO       <2132.00> EO-2: target index 3 tasked
2025-05-13 19:51:16,523 sats.satellite.EO-2            INFO       <2132.00> EO-2: Target(tgt-137) tasked for imaging
2025-05-13 19:51:16,524 sats.satellite.EO-2            INFO       <2132.00> EO-2: Target(tgt-137) window enabled: 2253.8 to 2354.0
2025-05-13 19:51:16,526 sats.satellite.EO-2            INFO       <2132.00> EO-2: setting timed terminal event at 2354.0
2025-05-13 19:51:16,526 sats.satellite.EO-3            INFO       <2132.00> EO-3: target index 6 tasked
2025-05-13 19:51:16,527 sats.satellite.EO-3            INFO       <2132.00> EO-3: Target(tgt-676) tasked for imaging
2025-05-13 19:51:16,528 sats.satellite.EO-3            INFO       <2132.00> EO-3: Target(tgt-676) window enabled: 2413.1 to 2541.6
2025-05-13 19:51:16,528 sats.satellite.EO-3            INFO       <2132.00> EO-3: setting timed terminal event at 2541.6
2025-05-13 19:51:16,529 sats.satellite.EO-4            INFO       <2132.00> EO-4: target index 14 tasked
2025-05-13 19:51:16,530 sats.satellite.EO-4            INFO       <2132.00> EO-4: Target(tgt-616) tasked for imaging
2025-05-13 19:51:16,531 sats.satellite.EO-4            INFO       <2132.00> EO-4: Target(tgt-616) window enabled: 3256.7 to 3355.6
2025-05-13 19:51:16,532 sats.satellite.EO-4            INFO       <2132.00> EO-4: setting timed terminal event at 3355.6
2025-05-13 19:51:16,771 sats.satellite.EO-2            INFO       <2255.00> EO-2: imaged Target(tgt-137)
2025-05-13 19:51:16,775 data.base                      INFO       <2255.00> Total reward: {'EO-2': np.float64(0.0008577206104491057)}
2025-05-13 19:51:16,776 sats.satellite.EO-2            INFO       <2255.00> EO-2: Satellite EO-2 requires retasking
2025-05-13 19:51:16,781 sats.satellite.EO-2            INFO       <2255.00> EO-2: Finding opportunity windows from 4200.00 to 4800.00 seconds
2025-05-13 19:51:16,828 gym                            INFO       <2255.00> Step reward: {'EO-2': np.float64(0.0008577206104491057)}
2025-05-13 19:51:16,832 gym                            INFO       <2255.00> === STARTING STEP ===
2025-05-13 19:51:16,833 sats.satellite.EO-0            INFO       <2255.00> EO-0: target index 29 tasked
2025-05-13 19:51:16,833 sats.satellite.EO-0            INFO       <2255.00> EO-0: Target(tgt-277) tasked for imaging
2025-05-13 19:51:16,835 sats.satellite.EO-0            INFO       <2255.00> EO-0: Target(tgt-277) window enabled: 5128.8 to 5259.8
2025-05-13 19:51:16,835 sats.satellite.EO-0            INFO       <2255.00> EO-0: setting timed terminal event at 5259.8
2025-05-13 19:51:16,836 sats.satellite.EO-1            INFO       <2255.00> EO-1: target index 23 tasked
2025-05-13 19:51:16,837 sats.satellite.EO-1            INFO       <2255.00> EO-1: Target(tgt-170) tasked for imaging
2025-05-13 19:51:16,838 sats.satellite.EO-1            INFO       <2255.00> EO-1: Target(tgt-170) window enabled: 4601.7 to 4678.4
2025-05-13 19:51:16,838 sats.satellite.EO-1            INFO       <2255.00> EO-1: setting timed terminal event at 4678.4
2025-05-13 19:51:16,839 sats.satellite.EO-2            INFO       <2255.00> EO-2: target index 10 tasked
2025-05-13 19:51:16,840 sats.satellite.EO-2            INFO       <2255.00> EO-2: Target(tgt-797) tasked for imaging
2025-05-13 19:51:16,841 sats.satellite.EO-2            INFO       <2255.00> EO-2: Target(tgt-797) window enabled: 2698.5 to 2825.8
2025-05-13 19:51:16,841 sats.satellite.EO-2            INFO       <2255.00> EO-2: setting timed terminal event at 2825.8
2025-05-13 19:51:16,842 sats.satellite.EO-3            INFO       <2255.00> EO-3: target index 17 tasked
2025-05-13 19:51:16,843 sats.satellite.EO-3            INFO       <2255.00> EO-3: Target(tgt-792) tasked for imaging
2025-05-13 19:51:16,844 sats.satellite.EO-3            INFO       <2255.00> EO-3: Target(tgt-792) window enabled: 3522.0 to 3583.1
2025-05-13 19:51:16,845 sats.satellite.EO-3            INFO       <2255.00> EO-3: setting timed terminal event at 3583.1
2025-05-13 19:51:16,846 sats.satellite.EO-4            INFO       <2255.00> EO-4: target index 1 tasked
2025-05-13 19:51:16,846 sats.satellite.EO-4            INFO       <2255.00> EO-4: Target(tgt-161) tasked for imaging
2025-05-13 19:51:16,847 sats.satellite.EO-4            INFO       <2255.00> EO-4: Target(tgt-161) window enabled: 2218.7 to 2291.5
2025-05-13 19:51:16,848 sats.satellite.EO-4            INFO       <2255.00> EO-4: setting timed terminal event at 2291.5
2025-05-13 19:51:16,922 sats.satellite.EO-4            INFO       <2291.50> EO-4: timed termination at 2291.5 for Target(tgt-161) window
2025-05-13 19:51:16,926 data.base                      INFO       <2291.50> Total reward: {}
2025-05-13 19:51:16,926 sats.satellite.EO-4            INFO       <2291.50> EO-4: Satellite EO-4 requires retasking
2025-05-13 19:51:16,929 sats.satellite.EO-0            INFO       <2291.50> EO-0: Finding opportunity windows from 5400.00 to 6000.00 seconds
2025-05-13 19:51:16,998 gym                            INFO       <2291.50> Step reward: {}
2025-05-13 19:51:17,002 gym                            INFO       <2291.50> === STARTING STEP ===
2025-05-13 19:51:17,003 sats.satellite.EO-0            INFO       <2291.50> EO-0: target index 8 tasked
2025-05-13 19:51:17,004 sats.satellite.EO-0            INFO       <2291.50> EO-0: Target(tgt-921) tasked for imaging
2025-05-13 19:51:17,005 sats.satellite.EO-0            INFO       <2291.50> EO-0: Target(tgt-921) window enabled: 2670.3 to 2799.6
2025-05-13 19:51:17,005 sats.satellite.EO-0            INFO       <2291.50> EO-0: setting timed terminal event at 2799.6
2025-05-13 19:51:17,007 sats.satellite.EO-1            INFO       <2291.50> EO-1: target index 24 tasked
2025-05-13 19:51:17,007 sats.satellite.EO-1            INFO       <2291.50> EO-1: Target(tgt-512) tasked for imaging
2025-05-13 19:51:17,008 sats.satellite.EO-1            INFO       <2291.50> EO-1: Target(tgt-512) window enabled: 4746.0 to 4873.8
2025-05-13 19:51:17,008 sats.satellite.EO-1            INFO       <2291.50> EO-1: setting timed terminal event at 4873.8
2025-05-13 19:51:17,009 sats.satellite.EO-2            INFO       <2291.50> EO-2: target index 6 tasked
2025-05-13 19:51:17,010 sats.satellite.EO-2            INFO       <2291.50> EO-2: Target(tgt-80) tasked for imaging
2025-05-13 19:51:17,011 sats.satellite.EO-2            INFO       <2291.50> EO-2: Target(tgt-80) window enabled: 2480.4 to 2602.3
2025-05-13 19:51:17,011 sats.satellite.EO-2            INFO       <2291.50> EO-2: setting timed terminal event at 2602.3
2025-05-13 19:51:17,012 sats.satellite.EO-3            INFO       <2291.50> EO-3: target index 19 tasked
2025-05-13 19:51:17,014 sats.satellite.EO-3            INFO       <2291.50> EO-3: Target(tgt-671) tasked for imaging
2025-05-13 19:51:17,014 sats.satellite.EO-3            INFO       <2291.50> EO-3: Target(tgt-671) window enabled: 3631.3 to 3763.3
2025-05-13 19:51:17,015 sats.satellite.EO-3            INFO       <2291.50> EO-3: setting timed terminal event at 3763.3
2025-05-13 19:51:17,016 sats.satellite.EO-4            INFO       <2291.50> EO-4: target index 8 tasked
2025-05-13 19:51:17,016 sats.satellite.EO-4            INFO       <2291.50> EO-4: Target(tgt-674) tasked for imaging
2025-05-13 19:51:17,018 sats.satellite.EO-4            INFO       <2291.50> EO-4: Target(tgt-674) window enabled: 3009.1 to 3130.2
2025-05-13 19:51:17,018 sats.satellite.EO-4            INFO       <2291.50> EO-4: setting timed terminal event at 3130.2
2025-05-13 19:51:17,379 sats.satellite.EO-2            INFO       <2481.50> EO-2: imaged Target(tgt-80)
2025-05-13 19:51:17,383 data.base                      INFO       <2481.50> Total reward: {'EO-2': np.float64(0.08840927015116723)}
2025-05-13 19:51:17,384 sats.satellite.EO-2            INFO       <2481.50> EO-2: Satellite EO-2 requires retasking
2025-05-13 19:51:17,402 sats.satellite.EO-3            INFO       <2481.50> EO-3: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-05-13 19:51:17,436 gym                            INFO       <2481.50> Step reward: {'EO-2': np.float64(0.08840927015116723)}
2025-05-13 19:51:17,441 gym                            INFO       <2481.50> === STARTING STEP ===
2025-05-13 19:51:17,441 sats.satellite.EO-0            INFO       <2481.50> EO-0: target index 22 tasked
2025-05-13 19:51:17,441 sats.satellite.EO-0            INFO       <2481.50> EO-0: Target(tgt-675) tasked for imaging
2025-05-13 19:51:17,443 sats.satellite.EO-0            INFO       <2481.50> EO-0: Target(tgt-675) window enabled: 4061.6 to 4192.0
2025-05-13 19:51:17,443 sats.satellite.EO-0            INFO       <2481.50> EO-0: setting timed terminal event at 4192.0
2025-05-13 19:51:17,444 sats.satellite.EO-1            INFO       <2481.50> EO-1: target index 24 tasked
2025-05-13 19:51:17,444 sats.satellite.EO-1            INFO       <2481.50> EO-1: Target(tgt-676) tasked for imaging
2025-05-13 19:51:17,446 sats.satellite.EO-1            INFO       <2481.50> EO-1: Target(tgt-676) window enabled: 4791.4 to 4913.1
2025-05-13 19:51:17,446 sats.satellite.EO-1            INFO       <2481.50> EO-1: setting timed terminal event at 4913.1
2025-05-13 19:51:17,447 sats.satellite.EO-2            INFO       <2481.50> EO-2: target index 4 tasked
2025-05-13 19:51:17,448 sats.satellite.EO-2            INFO       <2481.50> EO-2: Target(tgt-302) tasked for imaging
2025-05-13 19:51:17,449 sats.satellite.EO-2            INFO       <2481.50> EO-2: Target(tgt-302) window enabled: 2622.9 to 2720.1
2025-05-13 19:51:17,450 sats.satellite.EO-2            INFO       <2481.50> EO-2: setting timed terminal event at 2720.1
2025-05-13 19:51:17,450 sats.satellite.EO-3            INFO       <2481.50> EO-3: target index 28 tasked
2025-05-13 19:51:17,451 sats.satellite.EO-3            INFO       <2481.50> EO-3: Target(tgt-710) tasked for imaging
2025-05-13 19:51:17,453 sats.satellite.EO-3            INFO       <2481.50> EO-3: Target(tgt-710) window enabled: 4612.5 to 4729.9
2025-05-13 19:51:17,453 sats.satellite.EO-3            INFO       <2481.50> EO-3: setting timed terminal event at 4729.9
2025-05-13 19:51:17,454 sats.satellite.EO-4            INFO       <2481.50> EO-4: target index 16 tasked
2025-05-13 19:51:17,454 sats.satellite.EO-4            INFO       <2481.50> EO-4: Target(tgt-113) tasked for imaging
2025-05-13 19:51:17,456 sats.satellite.EO-4            INFO       <2481.50> EO-4: Target(tgt-113) window enabled: 3639.1 to 3766.2
2025-05-13 19:51:17,456 sats.satellite.EO-4            INFO       <2481.50> EO-4: setting timed terminal event at 3766.2
2025-05-13 19:51:17,732 sats.satellite.EO-2            INFO       <2624.00> EO-2: imaged Target(tgt-302)
2025-05-13 19:51:17,736 data.base                      INFO       <2624.00> Total reward: {'EO-2': np.float64(0.0957016530027815)}
2025-05-13 19:51:17,737 sats.satellite.EO-2            INFO       <2624.00> EO-2: Satellite EO-2 requires retasking
2025-05-13 19:51:17,741 sats.satellite.EO-2            INFO       <2624.00> EO-2: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-05-13 19:51:17,782 sats.satellite.EO-4            INFO       <2624.00> EO-4: Finding opportunity windows from 4800.00 to 5400.00 seconds
2025-05-13 19:51:17,815 gym                            INFO       <2624.00> Step reward: {'EO-2': np.float64(0.0957016530027815)}
2025-05-13 19:51:17,819 gym                            INFO       <2624.00> === STARTING STEP ===
2025-05-13 19:51:17,820 sats.satellite.EO-0            INFO       <2624.00> EO-0: target index 24 tasked
2025-05-13 19:51:17,820 sats.satellite.EO-0            INFO       <2624.00> EO-0: Target(tgt-277) tasked for imaging
2025-05-13 19:51:17,821 sats.satellite.EO-0            INFO       <2624.00> EO-0: Target(tgt-277) window enabled: 5128.8 to 5259.8
2025-05-13 19:51:17,822 sats.satellite.EO-0            INFO       <2624.00> EO-0: setting timed terminal event at 5259.8
2025-05-13 19:51:17,823 sats.satellite.EO-1            INFO       <2624.00> EO-1: target index 13 tasked
2025-05-13 19:51:17,823 sats.satellite.EO-1            INFO       <2624.00> EO-1: Target(tgt-773) tasked for imaging
2025-05-13 19:51:17,824 sats.satellite.EO-1            INFO       <2624.00> EO-1: Target(tgt-773) window enabled: 3791.8 to 3919.7
2025-05-13 19:51:17,825 sats.satellite.EO-1            INFO       <2624.00> EO-1: setting timed terminal event at 3919.7
2025-05-13 19:51:17,827 sats.satellite.EO-2            INFO       <2624.00> EO-2: target index 9 tasked
2025-05-13 19:51:17,827 sats.satellite.EO-2            INFO       <2624.00> EO-2: Target(tgt-433) tasked for imaging
2025-05-13 19:51:17,829 sats.satellite.EO-2            INFO       <2624.00> EO-2: Target(tgt-433) window enabled: 3216.8 to 3298.0
2025-05-13 19:51:17,829 sats.satellite.EO-2            INFO       <2624.00> EO-2: setting timed terminal event at 3298.0
2025-05-13 19:51:17,830 sats.satellite.EO-3            INFO       <2624.00> EO-3: target index 0 tasked
2025-05-13 19:51:17,831 sats.satellite.EO-3            INFO       <2624.00> EO-3: Target(tgt-235) tasked for imaging
2025-05-13 19:51:17,832 sats.satellite.EO-3            INFO       <2624.00> EO-3: Target(tgt-235) window enabled: 2520.7 to 2625.6
2025-05-13 19:51:17,832 sats.satellite.EO-3            INFO       <2624.00> EO-3: setting timed terminal event at 2625.6
2025-05-13 19:51:17,833 sats.satellite.EO-4            INFO       <2624.00> EO-4: target index 26 tasked
2025-05-13 19:51:17,834 sats.satellite.EO-4            INFO       <2624.00> EO-4: Target(tgt-292) tasked for imaging
2025-05-13 19:51:17,835 sats.satellite.EO-4            INFO       <2624.00> EO-4: Target(tgt-292) window enabled: 4487.8 to 4601.0
2025-05-13 19:51:17,835 sats.satellite.EO-4            INFO       <2624.00> EO-4: setting timed terminal event at 4601.0
2025-05-13 19:51:17,843 sats.satellite.EO-3            INFO       <2626.00> EO-3: timed termination at 2625.6 for Target(tgt-235) window
2025-05-13 19:51:17,847 data.base                      INFO       <2626.00> Total reward: {}
2025-05-13 19:51:17,847 sats.satellite.EO-3            INFO       <2626.00> EO-3: Satellite EO-3 requires retasking
2025-05-13 19:51:17,857 gym                            INFO       <2626.00> Step reward: {}
2025-05-13 19:51:17,861 gym                            INFO       <2626.00> === STARTING STEP ===
2025-05-13 19:51:17,862 sats.satellite.EO-0            INFO       <2626.00> EO-0: target index 12 tasked
2025-05-13 19:51:17,862 sats.satellite.EO-0            INFO       <2626.00> EO-0: Target(tgt-292) tasked for imaging
2025-05-13 19:51:17,864 sats.satellite.EO-0            INFO       <2626.00> EO-0: Target(tgt-292) window enabled: 3304.2 to 3418.9
2025-05-13 19:51:17,864 sats.satellite.EO-0            INFO       <2626.00> EO-0: setting timed terminal event at 3418.9
2025-05-13 19:51:17,865 sats.satellite.EO-1            INFO       <2626.00> EO-1: target index 0 tasked
2025-05-13 19:51:17,865 sats.satellite.EO-1            INFO       <2626.00> EO-1: Target(tgt-271) tasked for imaging
2025-05-13 19:51:17,867 sats.satellite.EO-1            INFO       <2626.00> EO-1: Target(tgt-271) window enabled: 2723.7 to 2776.8
2025-05-13 19:51:17,867 sats.satellite.EO-1            INFO       <2626.00> EO-1: setting timed terminal event at 2776.8
2025-05-13 19:51:17,868 sats.satellite.EO-2            INFO       <2626.00> EO-2: target index 24 tasked
2025-05-13 19:51:17,869 sats.satellite.EO-2            INFO       <2626.00> EO-2: Target(tgt-1018) tasked for imaging
2025-05-13 19:51:17,870 sats.satellite.EO-2            INFO       <2626.00> EO-2: Target(tgt-1018) window enabled: 4513.7 to 4589.8
2025-05-13 19:51:17,870 sats.satellite.EO-2            INFO       <2626.00> EO-2: setting timed terminal event at 4589.8
2025-05-13 19:51:17,871 sats.satellite.EO-3            INFO       <2626.00> EO-3: target index 7 tasked
2025-05-13 19:51:17,872 sats.satellite.EO-3            INFO       <2626.00> EO-3: Target(tgt-314) tasked for imaging
2025-05-13 19:51:17,873 sats.satellite.EO-3            INFO       <2626.00> EO-3: Target(tgt-314) window enabled: 3172.9 to 3290.3
2025-05-13 19:51:17,874 sats.satellite.EO-3            INFO       <2626.00> EO-3: setting timed terminal event at 3290.3
2025-05-13 19:51:17,874 sats.satellite.EO-4            INFO       <2626.00> EO-4: target index 13 tasked
2025-05-13 19:51:17,875 sats.satellite.EO-4            INFO       <2626.00> EO-4: Target(tgt-97) tasked for imaging
2025-05-13 19:51:17,876 sats.satellite.EO-4            INFO       <2626.00> EO-4: Target(tgt-97) window enabled: 3571.0 to 3687.8
2025-05-13 19:51:17,877 sats.satellite.EO-4            INFO       <2626.00> EO-4: setting timed terminal event at 3687.8
2025-05-13 19:51:18,064 sats.satellite.EO-1            INFO       <2725.00> EO-1: imaged Target(tgt-271)
2025-05-13 19:51:18,068 data.base                      INFO       <2725.00> Total reward: {'EO-1': np.float64(0.004597230086921116)}
2025-05-13 19:51:18,068 sats.satellite.EO-1            INFO       <2725.00> EO-1: Satellite EO-1 requires retasking
2025-05-13 19:51:18,071 sats.satellite.EO-0            INFO       <2725.00> EO-0: Finding opportunity windows from 6000.00 to 6600.00 seconds
2025-05-13 19:51:18,115 sats.satellite.EO-3            INFO       <2725.00> EO-3: Finding opportunity windows from 5400.00 to 6000.00 seconds
2025-05-13 19:51:18,165 gym                            INFO       <2725.00> Step reward: {'EO-1': np.float64(0.004597230086921116)}
2025-05-13 19:51:18,169 gym                            INFO       <2725.00> === STARTING STEP ===
2025-05-13 19:51:18,170 sats.satellite.EO-0            INFO       <2725.00> EO-0: target index 15 tasked
2025-05-13 19:51:18,170 sats.satellite.EO-0            INFO       <2725.00> EO-0: Target(tgt-675) tasked for imaging
2025-05-13 19:51:18,172 sats.satellite.EO-0            INFO       <2725.00> EO-0: Target(tgt-675) window enabled: 4061.6 to 4192.0
2025-05-13 19:51:18,172 sats.satellite.EO-0            INFO       <2725.00> EO-0: setting timed terminal event at 4192.0
2025-05-13 19:51:18,173 sats.satellite.EO-1            INFO       <2725.00> EO-1: target index 2 tasked
2025-05-13 19:51:18,173 sats.satellite.EO-1            INFO       <2725.00> EO-1: Target(tgt-675) tasked for imaging
2025-05-13 19:51:18,174 sats.satellite.EO-1            INFO       <2725.00> EO-1: Target(tgt-675) window enabled: 2888.4 to 2986.9
2025-05-13 19:51:18,175 sats.satellite.EO-1            INFO       <2725.00> EO-1: setting timed terminal event at 2986.9
2025-05-13 19:51:18,177 sats.satellite.EO-2            INFO       <2725.00> EO-2: target index 22 tasked
2025-05-13 19:51:18,177 sats.satellite.EO-2            INFO       <2725.00> EO-2: Target(tgt-314) tasked for imaging
2025-05-13 19:51:18,179 sats.satellite.EO-2            INFO       <2725.00> EO-2: Target(tgt-314) window enabled: 4375.4 to 4439.6
2025-05-13 19:51:18,179 sats.satellite.EO-2            INFO       <2725.00> EO-2: setting timed terminal event at 4439.6
2025-05-13 19:51:18,180 sats.satellite.EO-3            INFO       <2725.00> EO-3: target index 30 tasked
2025-05-13 19:51:18,180 sats.satellite.EO-3            INFO       <2725.00> EO-3: Target(tgt-756) tasked for imaging
2025-05-13 19:51:18,182 sats.satellite.EO-3            INFO       <2725.00> EO-3: Target(tgt-756) window enabled: 5363.3 to 5441.2
2025-05-13 19:51:18,182 sats.satellite.EO-3            INFO       <2725.00> EO-3: setting timed terminal event at 5441.2
2025-05-13 19:51:18,183 sats.satellite.EO-4            INFO       <2725.00> EO-4: target index 27 tasked
2025-05-13 19:51:18,183 sats.satellite.EO-4            INFO       <2725.00> EO-4: Target(tgt-950) tasked for imaging
2025-05-13 19:51:18,185 sats.satellite.EO-4            INFO       <2725.00> EO-4: Target(tgt-950) window enabled: 4533.8 to 4659.9
2025-05-13 19:51:18,185 sats.satellite.EO-4            INFO       <2725.00> EO-4: setting timed terminal event at 4659.9
2025-05-13 19:51:18,422 data.base                      INFO       <2850.00> Total reward: {}
2025-05-13 19:51:18,426 sats.satellite.EO-1            INFO       <2850.00> EO-1: Finding opportunity windows from 5400.00 to 6000.00 seconds
2025-05-13 19:51:18,460 sats.satellite.EO-2            INFO       <2850.00> EO-2: Finding opportunity windows from 5400.00 to 6000.00 seconds
2025-05-13 19:51:18,508 gym                            INFO       <2850.00> Step reward: {}
2025-05-13 19:51:18,508 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.