pyiod is a modular and extensible Python library for simulating and evaluating initial orbit determination (IOD) methods. It includes classical and modern algorithms, as well as original ones, along with structured Jupyter notebooks for Monte Carlo-based sensitivity analyses.
This project was developed as part of João Brites Master's thesis in Engineering Physics at the Faculty of Engineering (FEUP) and the Faculty of Sciences (FCUP) of the University of Porto.
This package provides a comprehensive toolbox to perform and analyze the first step in orbit determination pipelines — the recovery of satellite trajectories from a limited set of observations.
The library is organized around three main components:
Basic orbital mechanics algorithms for:
- Solving Kepler's Equation.
- Computing the Lagrange Coefficients and their time derivatives.
- Orbit propagation.
- Conversion between state vectors and classical orbital elements.
Functions that support measurement simulation and coordinate transformation:
- Add realistic noise to synthetic angle/range observations.
- Compute observer positions in the geocentric equatorial frame.
- Determine line-of-sight vectors and observation feasibility.
- Derive ground tracks and perform altitude-based visibility studies.
- Function helpers for celestial mechanics
- Data treatment
A curated and expandable collection of IOD solvers:
-
Angles-Only IOD:
- Classical methods: Gauss, Laplace.
- Modern methods: Gooding.
- Original method.
-
Position-Only IOD:
- Classical: Gibbs and Herrick-Gibbs.
- Original method.
-
Lambert Problem Solvers:
- Classical: Universal variables formulation.
- Modern: Gooding, Izzo, and Arora–Russell solvers.
- Original method.
-
Variants:
- Range and range-rate based solvers for hybrid scenarios.
pyiod/
├── initial_orbit_determination/
│ ├── celestial_mechanics/ # Orbital mechanics tools
│ ├── constants/ # Physical constants
│ ├── helpers/ # Noise, observation geometry, feasibility etc
│ └── iod_methods/ # Core IOD methods (standard and novel)
├── notebooks/ # Jupyter notebooks for testing & visualization
├── paper/ # JOSS/academic paper material
├── data/ # TODO: for when using real measurement data
└── requirements.txt # Python dependenciesThis work was funded under the 'New Space Portugal' Agenda, no. C644936537-00000046, investment project no. 11, financed by the PRR – Recovery and Resilience Plan and by the European Union – NextGeneration EU.
This work was funded by the European Union – NextGenerationEU. Views and opinions expressed are those of the author(s) only and do not necessarily reflect those of the European Union or the European Commission. Neither the European Union nor the European Commission can be held responsible for them.
See REFERENCES.md for a complete list of cited works.