import math
import numpy as np
from Basilisk.utilities import orbitalMotion
from benchmarks.comparative.implementations.basilisk.base import (
build_task_result,
time_iterations,
)
MU_EARTH = 3.986004418e14
def _oe_brahe_to_basilisk(oe_deg) -> "orbitalMotion.ClassicElements":
a, e, i_deg, raan_deg, argp_deg, M_deg = oe_deg
M = math.radians(M_deg)
E = orbitalMotion.M2E(M, e)
f = orbitalMotion.E2f(E, e)
oe = orbitalMotion.ClassicElements()
oe.a = a
oe.e = e
oe.i = math.radians(i_deg)
oe.Omega = math.radians(raan_deg)
oe.omega = math.radians(argp_deg)
oe.f = f
return oe
def _oe_basilisk_to_brahe(oe) -> list[float]:
E = orbitalMotion.f2E(oe.f, oe.e)
M = orbitalMotion.E2M(E, oe.e)
return [
float(oe.a),
float(oe.e),
math.degrees(float(oe.i)),
math.degrees(float(oe.Omega)),
math.degrees(float(oe.omega)),
math.degrees(M),
]
def keplerian_to_cartesian(params: dict, iterations: int):
bsk_elements = [_oe_brahe_to_basilisk(oe) for oe in params["elements"]]
def run():
results = []
for oe in bsk_elements:
r, v = orbitalMotion.elem2rv(MU_EARTH, oe)
results.append([float(r[0]), float(r[1]), float(r[2]),
float(v[0]), float(v[1]), float(v[2])])
return results
times, results = time_iterations(run, iterations)
return build_task_result(
"orbits.keplerian_to_cartesian", iterations, times, results
)
def cartesian_to_keplerian(params: dict, iterations: int):
states = [np.array(s, dtype=float) for s in params["states"]]
def run():
return [
orbitalMotion.rv2elem(MU_EARTH, s[:3], s[3:6])
for s in states
]
times, native_results = time_iterations(run, iterations)
results = [_oe_basilisk_to_brahe(oe) for oe in native_results]
return build_task_result(
"orbits.cartesian_to_keplerian", iterations, times, results
)