Skip to content

usersatellite_gateway_to_constellation

cosmica.topology.usersatellite_gateway_to_constellation

__all__ module-attribute

__all__ = ['HybridUS2CG2CTopologyBuilder']

logger module-attribute

logger = getLogger(__name__)

HybridUS2CG2CTopologyBuilder

HybridUS2CG2CTopologyBuilder(
    max_distance: float = float("inf"),
    max_relative_angular_velocity: float = float("inf"),
    sun_exclusion_angle: float = 0.0,
)

Hybrid topology builder for user satellites and ground stations to constellation.

This builder combines the functionality of MaxConnectionTimeUS2CTopologyBuilder and MaxVisibilityHandOverG2CTopologyBuilder. It prioritizes user satellite connections and then optimizes ground station connections based on maximum visibility duration.

For user satellites, constraints include distance, sun exclusion angle, and relative angular velocity. For ground stations, constraints include elevation angle and sun exclusion angle.

Source code in src/cosmica/topology/usersatellite_gateway_to_constellation.py
34
35
36
37
38
39
40
41
42
def __init__(
    self,
    max_distance: float = float("inf"),
    max_relative_angular_velocity: float = float("inf"),
    sun_exclusion_angle: float = 0.0,
) -> None:
    self.max_distance = max_distance
    self.max_relative_angular_velocity = max_relative_angular_velocity
    self.sun_exclusion_angle = sun_exclusion_angle

max_distance instance-attribute

max_distance = max_distance

max_relative_angular_velocity instance-attribute

max_relative_angular_velocity = (
    max_relative_angular_velocity
)

sun_exclusion_angle instance-attribute

sun_exclusion_angle = sun_exclusion_angle

build

build(
    *,
    constellation: SatelliteConstellation,
    user_satellites: Collection[UserSatellite],
    ground_nodes: Collection[
        Gateway | StationaryOnGroundUser
    ],
    dynamics_data: DynamicsData
) -> list[Graph]

Build hybrid topology connecting user satellites and ground stations to constellation.

Source code in src/cosmica/topology/usersatellite_gateway_to_constellation.py
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
def build(
    self,
    *,
    constellation: SatelliteConstellation,
    user_satellites: Collection[UserSatellite],
    ground_nodes: Collection[Gateway | StationaryOnGroundUser],
    dynamics_data: DynamicsData,
) -> list[nx.Graph]:
    """Build hybrid topology connecting user satellites and ground stations to constellation."""
    logger.info(
        f"Building hybrid topology for {len(user_satellites)} user satellites and {len(ground_nodes)} ground nodes",
    )
    logger.info(f"Number of time steps: {len(dynamics_data.time)}")

    user_satellites = list(user_satellites)
    ground_nodes = list(ground_nodes)
    constellation_satellites = list(constellation.satellites)

    n_time = len(dynamics_data.time)

    # Calculate user satellite visibility
    logger.info("Calculating user satellite visibility...")
    user_visibility = self._calculate_user_satellite_visibility(
        user_satellites,
        constellation_satellites,
        dynamics_data,
    )

    # Calculate ground node visibility
    logger.info("Calculating ground node visibility...")
    ground_visibility = self._calculate_ground_visibility(
        ground_nodes,
        constellation_satellites,
        dynamics_data,
    )

    # Calculate remaining connection time for user satellites
    user_remaining_connection_time = self._calculate_remaining_connection_time(user_visibility)

    # Calculate remaining visibility time for ground nodes
    ground_remaining_visibility_time = self._calculate_remaining_connection_time(ground_visibility)

    # Initialize connection tracking
    user_connections: dict[int, int] = {}  # user_idx -> constellation_satellite_idx
    ground_connections: dict[int, int] = {}  # ground_idx -> constellation_satellite_idx

    # Build topology for each time step
    logger.info("Building topology graphs for each time step...")
    graphs = []
    for time_idx in tqdm(range(n_time), desc="Building topology graphs"):
        graph = self._build_graph_at_time(
            time_idx,
            constellation_satellites,
            user_satellites,
            ground_nodes,
            user_visibility,
            ground_visibility,
            user_remaining_connection_time,
            ground_remaining_visibility_time,
            user_connections,
            ground_connections,
        )
        graphs.append(graph)

    return graphs