Skip to content

Relative Orbital Elements (ROE)

An alternative to describing relative motion in the RTN frame is to use Quasi-Nonsingular Relative Orbital Elements (ROE). While RTN coordinates oscillate rapidly with orbital position, ROE components vary slowly (secular and long-period only), making them well-suited for formation design and station-keeping.

The ROE vector \(\delta\boldsymbol{\alpha} = [da,\; d\lambda,\; de_x,\; de_y,\; di_x,\; di_y]\) is defined as:

Component Definition Units
\(da\) \((a_d - a_c) / a_c\) dimensionless
\(d\lambda\) \((u_d - u_c) + (\Omega_d - \Omega_c) \cos i_c\) rad (or deg)
\(de_x\) \(e_d \cos\omega_d - e_c \cos\omega_c\) dimensionless
\(de_y\) \(e_d \sin\omega_d - e_c \sin\omega_c\) dimensionless
\(di_x\) \(i_d - i_c\) rad (or deg)
\(di_y\) \((\Omega_d - \Omega_c) \sin i_c\) rad (or deg)

where \(u = M + \omega\) is the argument of latitude.

OE to ROE

state_oe_to_roe computes the ROE from chief and deputy Keplerian elements:

import jax.numpy as jnp
from astrojax.constants import R_EARTH
from astrojax.relative_motion import state_oe_to_roe

oe_chief = jnp.array([R_EARTH + 700e3, 0.001, 97.8, 15.0, 30.0, 45.0])
oe_deputy = jnp.array([R_EARTH + 701e3, 0.0015, 97.85, 15.05, 30.05, 45.05])

roe = state_oe_to_roe(oe_chief, oe_deputy, use_degrees=True)

The inverse, state_roe_to_oe, recovers the deputy's orbital elements from the chief elements and the ROE:

from astrojax.relative_motion import state_roe_to_oe

oe_deputy_recovered = state_roe_to_oe(oe_chief, roe, use_degrees=True)

ECI to ROE

For convenience, state_eci_to_roe and state_roe_to_eci compose the ECI\(\leftrightarrow\)KOE and OE\(\leftrightarrow\)ROE transformations, allowing direct conversion between ECI state vectors and ROE:

from astrojax.coordinates import state_koe_to_eci
from astrojax.relative_motion import state_eci_to_roe, state_roe_to_eci

x_chief = state_koe_to_eci(oe_chief, use_degrees=True)
x_deputy = state_koe_to_eci(oe_deputy, use_degrees=True)

roe = state_eci_to_roe(x_chief, x_deputy, use_degrees=True)
x_deputy_recovered = state_roe_to_eci(x_chief, roe, use_degrees=True)