Relative Orbital Elements (ROE) provide a quasi-nonsingular mean description of the relative motion between two satellites in close proximity. ROE are particularly useful for formation flying and proximity operations, where maintaining specific relative geometries is important.
Unlike instantaneous Cartesian relative states (like RTN coordinates), ROE describe the relative orbit using orbital elements, meaning that only a single element, the relative longitude \(d\lambda\), is quickly changing over time. This makes ROE ideal for long-term formation design and control.
The ROE vector contains six dimensionless or angular elements that are constructed from the classical orbital elements of the chief and deputy satellites:
Nonsingularity: ROE remain well-defined for circular and near-circular orbits, unlike classical orbital elements which become singular as eccentricity approaches zero.
Periodic Orbits: Specific ROE configurations produce periodic or quasi-periodic relative orbits:
Setting \(\delta a = 0\) prevents along-track drift
The eccentricity vector components (\(\delta e_x\), \(\delta e_y\)) control in-plane motion
The inclination vector components (\(\delta i_x\), \(\delta i_y\)) control cross-track motion
The state_oe_to_roe function converts the classical orbital elements of a chief and deputy satellite into ROE. This is useful when you have two satellite orbits and want to analyze their relative motion characteristics.
importbraheasbhimportnumpyasnpbh.initialize_eop()# Define chief satellite orbital elements# LEO orbit: 700 km altitude, nearly circular, sun-synchronous inclinationoe_chief=np.array([bh.R_EARTH+700e3,# Semi-major axis (m)0.001,# Eccentricity97.8,# Inclination (deg)15.0,# Right ascension of ascending node (deg)30.0,# Argument of perigee (deg)45.0,# Mean anomaly (deg)])# Define deputy satellite with small orbital element differences# This creates a quasi-periodic relative orbitoe_deputy=np.array([bh.R_EARTH+701e3,# 1 km higher semi-major axis0.0015,# Slightly higher eccentricity97.85,# 0.05° higher inclination15.05,# Small RAAN difference30.05,# Small argument of perigee difference45.05,# Small mean anomaly difference])# Convert to Relative Orbital Elements (ROE)roe=bh.state_oe_to_roe(oe_chief,oe_deputy,bh.AngleFormat.DEGREES)print("Relative Orbital Elements (ROE):")print(f"da (relative SMA): {roe[0]:.6e}")print(f"dλ (relative mean long): {roe[1]:.6f}°")print(f"dex (rel ecc x-comp): {roe[2]:.6e}")print(f"dey (rel ecc y-comp): {roe[3]:.6e}")print(f"dix (rel inc x-comp): {roe[4]:.6f}°")print(f"diy (rel inc y-comp): {roe[5]:.6f}°")# Relative Orbital Elements (ROE):# da (relative SMA): 1.412801e-4# dλ (relative mean long): 0.093214°# dex (rel ecc x-comp): 4.323577e-4# dey (rel ecc y-comp): 2.511333e-4# dix (rel inc x-comp): 0.050000°# diy (rel inc y-comp): 0.049537°
usebraheasbh;usenalgebraasna;fnmain(){bh::initialize_eop().unwrap();// Define chief satellite orbital elements// LEO orbit: 700 km altitude, nearly circular, sun-synchronous inclinationletoe_chief=na::SVector::<f64,6>::new(bh::R_EARTH+700e3,// Semi-major axis (m)0.001,// Eccentricity97.8,// Inclination (deg)15.0,// Right ascension of ascending node (deg)30.0,// Argument of perigee (deg)45.0// Mean anomaly (deg));// Define deputy satellite with small orbital element differences// This creates a quasi-periodic relative orbitletoe_deputy=na::SVector::<f64,6>::new(bh::R_EARTH+701e3,// 1 km higher semi-major axis0.0015,// Slightly higher eccentricity97.85,// 0.05° higher inclination15.05,// Small RAAN difference30.05,// Small argument of perigee difference45.05// Small mean anomaly difference);// Convert to Relative Orbital Elements (ROE)letroe=bh::state_oe_to_roe(oe_chief,oe_deputy,bh::AngleFormat::Degrees);println!("Relative Orbital Elements (ROE):");println!("da (relative SMA): {:.6e}",roe[0]);println!("dλ (relative mean long): {:.6}°",roe[1]);println!("dex (rel ecc x-comp): {:.6e}",roe[2]);println!("dey (rel ecc y-comp): {:.6e}",roe[3]);println!("dix (rel inc x-comp): {:.6}°",roe[4]);println!("diy (rel inc y-comp): {:.6}°",roe[5]);// Relative Orbital Elements (ROE):// da (relative SMA): 1.412801e-4// dλ (relative mean long): 0.093214°// dex (rel ecc x-comp): 4.323577e-4// dey (rel ecc y-comp): 2.511333e-4// dix (rel inc x-comp): 0.050000°// diy (rel inc y-comp): 0.049537°}
The state_roe_to_oe function performs the inverse operation: given the chief's orbital elements and the desired ROE, it computes the deputy's orbital elements. This is essential for:
Initializing formation flying missions with desired relative geometries
Retargeting maneuvers to achieve new relative configurations
Propagating relative orbits using element-based propagators
importbraheasbhimportnumpyasnpbh.initialize_eop()# Define chief satellite orbital elements# LEO orbit: 700 km altitude, nearly circular, sun-synchronous inclinationoe_chief=np.array([bh.R_EARTH+700e3,# Semi-major axis (m)0.001,# Eccentricity97.8,# Inclination (deg)15.0,# Right ascension of ascending node (deg)30.0,# Argument of perigee (deg)45.0,# Mean anomaly (deg)])# Define Relative Orbital Elements (ROE)# These describe a quasi-periodic relative orbitroe=np.array([1.412801e-4,# da: Relative semi-major axis0.093214,# dλ: Relative mean longitude (deg)4.323577e-4,# dex: x-component of relative eccentricity vector2.511333e-4,# dey: y-component of relative eccentricity vector0.050000,# dix: x-component of relative inclination vector (deg)0.049537,# diy: y-component of relative inclination vector (deg)])# Convert to deputy satellite orbital elementsoe_deputy=bh.state_roe_to_oe(oe_chief,roe,bh.AngleFormat.DEGREES)print("Deputy Satellite Orbital Elements:")print(f"Semi-major axis: {oe_deputy[0]:.3f} m ({(oe_deputy[0]-bh.R_EARTH)/1000:.1f} km alt)")print(f"Eccentricity: {oe_deputy[1]:.6f}")print(f"Inclination: {oe_deputy[2]:.4f}°")print(f"RAAN: {oe_deputy[3]:.4f}°")print(f"Arg of perigee: {oe_deputy[4]:.4f}°")print(f"Mean anomaly: {oe_deputy[5]:.4f}°")# Deputy Satellite Orbital Elements:# Semi-major axis: 7079136.300 m (701.0 km alt)# Eccentricity: 0.001500# Inclination: 97.8500°# RAAN: 15.0500°# Arg of perigee: 30.0500°# Mean anomaly: 45.0500°
usebraheasbh;usenalgebraasna;fnmain(){bh::initialize_eop().unwrap();// Define chief satellite orbital elements// LEO orbit: 700 km altitude, nearly circular, sun-synchronous inclinationletoe_chief=na::SVector::<f64,6>::new(bh::R_EARTH+700e3,// Semi-major axis (m)0.001,// Eccentricity97.8,// Inclination (deg)15.0,// Right ascension of ascending node (deg)30.0,// Argument of perigee (deg)45.0// Mean anomaly (deg));// Define Relative Orbital Elements (ROE)// These describe a quasi-periodic relative orbitletroe=na::SVector::<f64,6>::new(1.412801e-4,// da: Relative semi-major axis0.093214,// dλ: Relative mean longitude (deg)4.323577e-4,// dex: x-component of relative eccentricity vector2.511333e-4,// dey: y-component of relative eccentricity vector0.050000,// dix: x-component of relative inclination vector (deg)0.049537// diy: y-component of relative inclination vector (deg));// Convert to deputy satellite orbital elementsletoe_deputy=bh::state_roe_to_oe(oe_chief,roe,bh::AngleFormat::Degrees);println!("Deputy Satellite Orbital Elements:");println!("Semi-major axis: {:.3} m ({:.1} km alt)",oe_deputy[0],(oe_deputy[0]-bh::R_EARTH)/1000.0);println!("Eccentricity: {:.6}",oe_deputy[1]);println!("Inclination: {:.4}°",oe_deputy[2]);println!("RAAN: {:.4}°",oe_deputy[3]);println!("Arg of perigee: {:.4}°",oe_deputy[4]);println!("Mean anomaly: {:.4}°",oe_deputy[5]);// Deputy Satellite Orbital Elements:// Semi-major axis: 7079136.300 m (701.0 km alt)// Eccentricity: 0.001500// Inclination: 97.8500°// RAAN: 15.0500°// Arg of perigee: 30.0500°// Mean anomaly: 45.0500°}
In many practical applications, satellite states are available as Cartesian ECI vectors rather than orbital elements. The state_eci_to_roe function provides a convenient way to compute ROE directly from the ECI states of the chief and deputy satellites, internally handling the conversion to orbital elements.