Powered by AppSignal & Oban Pro

Conjunction Risk Assessment

examples/conjunction_alert.livemd

Conjunction Risk Assessment

Mix.install([
  {:orbis, path: ".."}
])

Introduction

This Livebook demonstrates how to use Orbis to assess the risk of a satellite conjunction using the CCSDS Conjunction Data Message (CDM) standard.

Load a CDM fixture

We’ll use a sample CDM in KVN (Keyword=Value Notation) format.

cdm_kvn = """
CCSDS_CDM_VERS                = 1.0
CREATION_DATE                 = 2010-03-12T22:31:12.000
ORIGINATOR                    = JSPOC
MESSAGE_ID                    = 201113719185
TCA                           = 2010-03-13T22:37:52.618
MISS_DISTANCE                 = 715 [m]
RELATIVE_SPEED                = 14762 [m/s]
COLLISION_PROBABILITY         = 4.835E-05
COLLISION_PROBABILITY_METHOD  = FOSTER-1992
OBJECT                        = OBJECT1
OBJECT_DESIGNATOR             = 12345
OBJECT_NAME                   = SATELLITE A
REF_FRAME                     = EME2000
X                             = 2570.097065 [km]
Y                             = 2244.654904 [km]
Z                             = 6281.497978 [km]
X_DOT                         = 4.418769571 [km/s]
Y_DOT                         = 4.833547743 [km/s]
Z_DOT                         = -3.526774282 [km/s]
CR_R                          = 4.142E+01 [m**2]
CT_R                          = -8.579E+00 [m**2]
CT_T                          = 2.533E+03 [m**2]
CN_R                          = -2.313E+01 [m**2]
CN_T                          = 1.336E+01 [m**2]
CN_N                          = 7.098E+01 [m**2]
OBJECT                        = OBJECT2
OBJECT_DESIGNATOR             = 30337
OBJECT_NAME                   = FENGYUN 1C DEB
REF_FRAME                     = EME2000
X                             = 2569.540800 [km]
Y                             = 2245.093614 [km]
Z                             = 6281.599946 [km]
X_DOT                         = -2.888612500 [km/s]
Y_DOT                         = -6.007247516 [km/s]
Z_DOT                         = 3.328770172 [km/s]
CR_R                          = 1.337E+03 [m**2]
CT_R                          = -4.806E+04 [m**2]
CT_T                          = 2.492E+06 [m**2]
CN_R                          = -3.298E+01 [m**2]
CN_T                          = -7.5888E+02 [m**2]
CN_N                          = 7.105E+01 [m**2]
"""

{:ok, cdm} = Orbis.CCSDS.CDM.parse(cdm_kvn)

Assess the Risk

We convert the CDM to collision parameters and compute the probability of collision (Pc).

# Assume a combined hard-body radius of 20 meters
cdm_with_hbr = %{cdm | hard_body_radius_m: 20.0}
params = Orbis.CCSDS.CDM.to_collision_params(cdm_with_hbr)

# Compute Pc using both methods
{:ok, res_ea} = Orbis.Collision.probability(params, method: :equal_area)
{:ok, res_num} = Orbis.Collision.probability(params, method: :numerical)

IO.puts("Miss distance: #{res_ea.miss_km} km")
IO.puts("Equal-area Pc: #{res_ea.pc}")
IO.puts("Numerical Pc:  #{res_num.pc}")

Catalog Screening

Orbis can also screen entire catalogs of objects for potential risk at a common epoch.

# Let's create a small synthetic catalog
objects = [
  %{id: "ISS", r: {2570.0, 2244.6, 6281.5}, v: {4.4, 4.8, -3.5}, cov: params.cov1, hard_body_radius_km: 0.05},
  %{id: "DEB1", r: {2569.5, 2245.1, 6281.6}, v: {-2.9, -6.0, 3.3}, cov: params.cov2, hard_body_radius_km: 0.01},
  %{id: "DEB2", r: {2571.0, 2243.0, 6280.0}, v: {-3.0, -5.5, 3.0}, cov: params.cov2, hard_body_radius_km: 0.01}
]

# Screen with a 10km miss threshold
results = Orbis.Screening.screen_catalog(objects, miss_threshold_km: 10.0)

# Display results
for res <- results do
  %{candidate: cand, collision: col} = res
  IO.puts("Conjunction: #{cand.id1} vs #{cand.id2} | Pc: #{col.pc} | Miss: #{cand.miss_km} km")
end