COLA Maneuver Designer#

The Satcat SDK supports integration with Satcat’s Collision Avoidance (COLA) Maneuver Designer. This allows you to generate tradespaces of thousands of maneuver options over varying maneuver time and delta-V options to select a maneuver which both adequately mitigates the risk of collision and works with your mission’s operational constraints.

Choosing a CDM#

Each COLA maneuver variant is based on a given original CDM, whose risk the Maneuver Designer will aim to mitigate. When creating a COLA maneuver variant, you can identify risky CDMs which require mitigation planning using the Events system.

For most users, we recommend configuring automatic generation of COLA Maneuver Projects in your Group’s settings in the Satcat Control Center. This allows Satcat to automatically pre-generate COLA Maneuver Projects when Satcat receives or generates a CDM, so that maneuver tradespaces are already prepared when you need to begin maneuver planning.

Maneuver Projects and Variants#

Maneuver Designer Projects and Variants can also be programmatically created using Satcat SDK:

from satcat.sdk.maneuvers import models as maneuver_models
...
# Create a new empty project
project = client.cola_maneuvers.create_project()

# Assuming "CDM-S12345" is the CDM key of an upcoming CDM
cdm = client.events.get_conjunction("CDM-S12345")

# Create a new COLA Variant for a known CDM using the default configuration (in-track impulsive maneuvers)
variant = client.cola_maneuvers.create_variant_for_project(project.id, maneuver_models.ColaManeuverVariantConfiguration(
    original_conjunction_id=cdm.id,
))

# Wait for the server to process the Variant
variant = client.cola_maneuvers.await_variant_completion(variant.id)

High-Fidelity Maneuver plans#

The maneuver tradespace rapidly generates thousands of maneuver options using a second-order approximation method. This maneuver tradespace helps to quickly identify a suitable maneuver candidate. Once a candidate is chosen, we recommend generating a High-Fidelity (Hifi) maneuver plan using the selected parameters before performing the maneuver.

Satcat propagates high-fidelity maneuver plans using a comprehensive force model and realistic covariance propagation to refine the estimate of the post-maneuver CDM risk metrics. In addition, high-fidelity maneuver plans produce predictive ephemerides which can be screened using the Satcat Screener to ensure that the plan does not result in new conjunctions with other objects in the catalog.

# To generate a hifi maneuver plan from the tradespace point in row 12, column 39 (for example):
tradespace_row = variant.tradespace_data[12]
tradespace_point = tradespace_row.points[39]

# Create a new Hifi maneuver plan from the maneuver parameters of the selected tradespace point
plan_parameters = maneuver_models.TimestampedSimpleManeuverPlanParameters(
    time_utc=tradespace_row.time_utc, **tradespace_point,
)
plan = client.cola_maneuvers.create_hifi_plan(
    project_id,
    variant_id,
    plan_parameters
)

# Wait for the server to process the Plan
plan = client.cola_maneuvers.await_hifi_plan_completion(plan)

Once a Hifi Plan is complete, Satcat will automatically generate a THEORETICAL Designation CDM with recomputed risk metrics from the original conjunction. This gives insight into the changes in the conjunction event’s risk metrics if the selected maneuver were to be performed. .. code-block:: python

theoretical_cdm = client.events.get_conjunction(plan.conjunction_id) print(f”Theoretical CDM key: {theoretical_cdm.cdm_key}”) print(f”Theoretical CDM Pc: {theoretical_cdm.collision_probability:.3E}”) print(f”Theoretical CDM miss distance: {theoretical_cdm.miss_distance_km:.3f} km”)

Screening High-Fidelity Maneuver plans#

High-fidelity plans also automatically generate a THEORETICAL-designated predictive ephemeris which is immediately available in the Satcat Ephemeris Repository. This can be used to create and run a full catalog screening to identify any unforeseen tertiary conjunctions before performing the maneuver.

from satcat.sdk.screening import models as screening_models
...

# Create a screening using the Hifi Plan's predictive ephemeris as the primary data source
screening = client.screening.create_screening(
    primaries=[screening_models.Screenable(plan.ephemeris_id)],
    add_best_secondary_catalog=True, # Screen against the 18SDS SP Ephemeris catalog (no covariance)
    add_operational_ephemeris_repository=True, # Screen against Satcat's Operational catalog of O/O ephemeris (typically includes covariance)
    submit=True # Immediately submit the screening for processing
)

# Wait for the screening to complete
screening = client.screening.await_screening_completion(screening)

# List any conjunctions which were detected by the screening which meet some arbitrary risk criteria
tertiary_conjunctions = client.screening.list_conjunctions(
    filters=[
        # Only retrieve CDMs which either had Pc greater than 1E-4 or miss distance less than 10km (for example)
        dict(op='or', value=[
            dict(field='collision_probability', op='ge', value=1E-4),
            dict(field='miss_distance_km', op='le', value=10)
        ])
    ]
)

print(f"Detected {len(tertiary_conjunctions)} high-risk tertiary conjunctions from hifi maneuver plan {plan.id}")

Finally, if the maneuver plan meets your mission’s planning criteria, you can use the opm_content attribute to access a pre-generated CCSDS OPM with the maneuver plan parameters populated.

opm_file_content = plan.opm_content