Skip to main content
Glama
orbits.py6.57 kB
"""Orbital mechanics tools for the Aerospace MCP server.""" import json import logging logger = logging.getLogger(__name__) def elements_to_state_vector(orbital_elements: dict) -> str: """Convert orbital elements to state vector in J2000 frame. Args: orbital_elements: Dict with orbital elements (semi_major_axis_m, eccentricity, etc.) Returns: JSON string with state vector components """ try: from ..integrations.orbits import ( OrbitElements, ) from ..integrations.orbits import ( elements_to_state_vector as _elements_to_state, ) elements = OrbitElements(**orbital_elements) result = _elements_to_state(elements) return json.dumps( { "position_m": { "x": result.position_m[0], "y": result.position_m[1], "z": result.position_m[2], }, "velocity_ms": { "x": result.velocity_ms[0], "y": result.velocity_ms[1], "z": result.velocity_ms[2], }, "reference_frame": "J2000", "units": {"position": "meters", "velocity": "m/s"}, }, indent=2, ) except ImportError: return "Orbital mechanics not available - install orbital packages" except Exception as e: logger.error(f"Elements to state vector error: {str(e)}", exc_info=True) return f"Elements to state vector error: {str(e)}" def state_vector_to_elements(state_vector: dict) -> str: """Convert state vector to classical orbital elements. Args: state_vector: Dict with position_m and velocity_ms arrays Returns: JSON string with orbital elements """ try: from ..integrations.orbits import ( StateVector, ) from ..integrations.orbits import ( state_vector_to_elements as _state_to_elements, ) state = StateVector(**state_vector) result = _state_to_elements(state) return json.dumps( { "semi_major_axis_m": result.semi_major_axis_m, "eccentricity": result.eccentricity, "inclination_deg": result.inclination_deg, "raan_deg": result.raan_deg, "arg_perigee_deg": result.arg_perigee_deg, "true_anomaly_deg": result.true_anomaly_deg, "epoch_utc": result.epoch_utc, }, indent=2, ) except ImportError: return "Orbital mechanics not available - install orbital packages" except Exception as e: logger.error(f"State vector to elements error: {str(e)}", exc_info=True) return f"State vector to elements error: {str(e)}" def propagate_orbit_j2( initial_state: dict, propagation_time_s: float, time_step_s: float = 60.0 ) -> str: """Propagate orbit with J2 perturbations using numerical integration. Args: initial_state: Initial orbital state (elements or state vector) propagation_time_s: Propagation time in seconds time_step_s: Integration time step in seconds Returns: JSON string with propagated state """ try: from ..integrations.orbits import propagate_orbit_j2 as _propagate result = _propagate(initial_state, propagation_time_s, time_step_s) return json.dumps(result, indent=2) except ImportError: return "Orbit propagation not available - install orbital packages" except Exception as e: logger.error(f"Orbit propagation error: {str(e)}", exc_info=True) return f"Orbit propagation error: {str(e)}" def calculate_ground_track( orbital_state: dict, duration_s: float, time_step_s: float = 60.0 ) -> str: """Calculate ground track from orbital state vectors. Args: orbital_state: Orbital state (elements or state vector) duration_s: Duration for ground track calculation in seconds time_step_s: Time step for ground track points in seconds Returns: JSON string with ground track coordinates """ try: from ..integrations.orbits import calculate_ground_track as _ground_track result = _ground_track(orbital_state, duration_s, time_step_s) return json.dumps(result, indent=2) except ImportError: return "Ground track calculation not available - install orbital packages" except Exception as e: logger.error(f"Ground track error: {str(e)}", exc_info=True) return f"Ground track error: {str(e)}" def hohmann_transfer(r1_m: float, r2_m: float) -> str: """Calculate Hohmann transfer orbit parameters between two circular orbits. Args: r1_m: Initial orbit radius in meters r2_m: Final orbit radius in meters Returns: JSON string with transfer orbit parameters """ try: from ..integrations.orbits import hohmann_transfer as _hohmann result = _hohmann(r1_m, r2_m) return json.dumps(result, indent=2) except ImportError: return "Transfer orbit calculation not available - install orbital packages" except Exception as e: logger.error(f"Hohmann transfer error: {str(e)}", exc_info=True) return f"Hohmann transfer error: {str(e)}" def orbital_rendezvous_planning( chaser_elements: dict, target_elements: dict, rendezvous_options: dict | None = None ) -> str: """Plan orbital rendezvous maneuvers between two spacecraft. Args: chaser_elements: Chaser spacecraft orbital elements target_elements: Target spacecraft orbital elements rendezvous_options: Optional rendezvous planning parameters Returns: JSON string with rendezvous plan """ try: from ..integrations.orbits import ( OrbitElements, ) from ..integrations.orbits import ( orbital_rendezvous_planning as _rendezvous, ) chaser = OrbitElements(**chaser_elements) target = OrbitElements(**target_elements) result = _rendezvous(chaser, target, rendezvous_options or {}) return json.dumps(result, indent=2) except ImportError: return "Rendezvous planning not available - install orbital packages" except Exception as e: logger.error(f"Rendezvous planning error: {str(e)}", exc_info=True) return f"Rendezvous planning error: {str(e)}"

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cheesejaguar/aerospace-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server