Satellite Orbit Propagator

Predict where any satellite will be, minute by minute

Undergraduate Orbital Mechanics 3–5 weeks
Last reviewed: March 2026

Overview

There are over 10,000 active satellites orbiting Earth right now, and someone has to know where each one is at every moment. Orbit propagation — predicting a satellite's future position from its current state — is one of the foundational skills in space engineering.

In this project, you'll build an orbit propagator from first principles. Starting with Keplerian two-body mechanics, you'll implement the equations of motion, add J2 perturbation (Earth's oblateness), and validate your predictions against real satellite tracking data from NORAD.

You can use either Python (with NumPy/SciPy) or MATLAB — both are standard tools for orbital mechanics work. By the end, you'll be able to input a satellite's orbital elements and predict its position days into the future.

What You'll Learn

  • Implement the two-body equations of motion and numerical integration (RK4)
  • Convert between orbital elements and Cartesian state vectors
  • Add J2 perturbation to model Earth's oblateness
  • Parse TLE (Two-Line Element) data from NORAD/CelesTrak
  • Validate propagated positions against real tracking data
  • Visualize orbits in 3D and ground tracks on a world map

Step-by-Step Guide

1

Implement Two-Body Equations of Motion

Start with Newton's law of gravitation: a = -μ/r³ × r, where μ is Earth's gravitational parameter (3.986×10¹⁴ m³/s²). Implement a 4th-order Runge-Kutta (RK4) integrator to propagate the state vector [x, y, z, vx, vy, vz] forward in time.

Test with a known circular orbit at 400 km altitude (ISS-like). The period should be about 92.6 minutes. If your propagated orbit drifts or energy isn't conserved, debug your integrator.

2

Add Orbital Element Conversions

Implement functions to convert between classical orbital elements (a, e, i, Ω, ω, ν) and Cartesian state vectors (r, v). This lets you initialize orbits from standard catalog data and interpret results intuitively.

Test edge cases: circular orbits (e≈0), equatorial orbits (i≈0), and the singularities that classical elements have in these cases.

3

Add J2 Perturbation

Earth isn't a perfect sphere — it bulges at the equator. The J2 perturbation is the dominant gravitational perturbation and causes two important effects: nodal regression (Ω drifts) and apsidal precession (ω rotates).

Add the J2 acceleration to your equations of motion. J2 = 1.08263×10⁻³. Propagate a polar orbit and verify that the right ascension of ascending node (RAAN) regresses at the predicted rate.

4

Parse Real TLE Data

Download Two-Line Element (TLE) data for the ISS from CelesTrak. Write a parser that extracts the orbital elements from the TLE format. Convert the mean elements to osculating elements for your propagator.

For a simpler approach, use the SGP4 algorithm (available as a Python library) as a reference to compare against your propagator.

5

Propagate and Validate

Propagate the ISS orbit forward 24 hours using your code. Compare your predicted position against the actual ISS position from CelesTrak or NASA's Horizons system.

Quantify the error: How far off is your prediction after 1 orbit? After 10 orbits? After 24 hours? Without drag modeling, your error will grow — this shows you why atmospheric drag matters for LEO satellites.

6

Visualize the Results

Create a 3D orbit visualization using matplotlib's 3D plotting or a library like Plotly. Show the orbit around an Earth sphere with the ground track projected below.

Plot the ground track on a 2D world map. For the ISS, you should see the distinctive sinusoidal pattern shifting westward with each orbit due to Earth's rotation.

Go Further

Expand your orbital mechanics capabilities:

  • Add atmospheric drag — implement an exponential atmosphere model and see how it affects LEO orbit lifetime
  • Implement Hohmann transfers — calculate and simulate orbital maneuvers between two orbits
  • Build a conjunction assessment tool — compare propagated orbits of two objects and calculate closest approach
  • Try Ansys STK — set up the same scenario in STK and compare with your from-scratch results