Orbit Propagation Calculator: Kepler, J2 Drift and Satellite Passes
Propagate orbital elements with Kepler’s equation and secular J2 drift. Animate a ground track and predict observer elevation, rise, peak and set times.
Find a satellite’s future position from six classical orbital elements and an epoch. This orbit propagation calculator solves Kepler’s equation, rotates the result into Earth-centred inertial coordinates, then accounts for Earth rotation to produce Earth-fixed coordinates and a latitude–longitude subpoint. Engineers and students can compare an ideal two-body orbit with the secular drift caused by Earth’s oblateness.
Set up an orbit
Enter the semi-major axis, eccentricity, inclination, right ascension of the ascending node (RAAN), argument of perigee, and mean anomaly at the epoch. Angles refer to an equatorial inertial frame approximated as the mean equator and equinox of date. The epoch uses a calendar date and decimal hours in UTC: 12:30 is 12.5 hours. The default orbit is an illustrative low Earth orbit, not a live satellite.
“Start after epoch” places the beginning of the ground track and pass search before or after the element epoch. Select the time after that start to answer “where will the satellite be?” Read its UTC time, inertial and Earth-fixed coordinates, geodetic latitude, longitude, and ellipsoidal altitude. Press play to move the satellite around the orbit and along the ground track. The orbit drawing is a view in the orbital plane; it does not show the plane’s orientation in space.
Predict a pass
Set the observer’s geodetic latitude, east-positive longitude, and height above the WGS-84 ellipsoid. Choose an elevation mask and search duration. The satellite pass prediction table lists each interval above that mask, including start, maximum elevation, and end times in UTC. Passes are grouped by their start date in UTC, with compact HH:mm:ss event times. A +1d or +2d suffix marks a later date within that pass. An asterisk (*) marks a search-window edge rather than a true rise or set. Azimuths run clockwise from north and appear in a separate table with matching start times. A blank table means no qualifying pass was found in that window.
The elevation chart includes the satellite below the horizon so you can see why a near miss does not qualify. These are geometric opportunities, not predictions of visual visibility: sunlight, eclipses, darkness, clouds, terrain and obstructions are not evaluated.
Understand the drift
Enable J2 to include first-order secular changes in RAAN, perigee argument, and mean anomaly. The drift chart compares the accumulated angular changes with a reference solar node rate. The calculated sun-synchronous inclination is a useful sign and magnitude check; it does not establish a local solar crossing time.
This ground track calculator holds semi-major axis, eccentricity and inclination fixed. It omits drag, manoeuvres, short-period J2 motion, higher harmonics, lunar and solar gravity, and radiation pressure. Treat pass times as approximate, especially far from the epoch. TLEs contain model-specific mean elements: copying their fields here is an illustration, and operational TLE prediction requires SGP4 and the correct TEME frame conversion. No TLE parser or SGP4 implementation is included.
How it is calculated
The mean elements are propagated analytically, then Kepler’s equation is solved by a bracketed Newton iteration. With and , the first-order rates are
Rates use unperturbed to retain first order in J2; multiplying the plane rates by the corrected mean motion would add second-order terms. Disabling J2 sets all three corrections to zero. The method follows Vallado’s secular element treatment and the open SatelliteToolbox algorithm, truncated consistently to first order.
At elapsed time , update linearly. Newton solves with a residual below rad (50-iteration safeguard). Perifocal coordinates are and ; the standard active rotation gives ECI coordinates. A GMST rotation gives ECEF. Eight fixed-point ellipsoid iterations give WGS-84 geodetic latitude and altitude. Observer ECEF coordinates are subtracted and rotated to east–north–up to obtain range, azimuth and geometric elevation.
The pass search samples elevation on the advanced time interval. Each sampled local maximum is refined by bounded optimisation, including maxima between samples whose samples lie below the mask. Brent root finding locates the mask crossings on either side. Search-window boundaries above the mask are retained and labelled. The table's peak is the maximum within that window. Ground-track samples are evenly spaced in eccentric anomaly and mapped back to time, which resolves fast perigee motion better than a uniform-time display. The elevation chart adds 121 samples around each detected pass and includes its refined peak. Ground-track paths are split at ±180° longitude.
The published FreeFlyer example supplies km³/s², km and . WGS-84 observer geometry uses km and from NGA.
Assumptions
Earth-centred bound ellipses with perigee at least 100 km above the equatorial surface. Input elements must be consistent mean elements for this secular model, or osculating elements for the two-body option. UTC is treated as UT1 for Earth rotation. The equatorial inertial frame is approximated as mean-of-date; precession, nutation, polar motion and Earth-orientation corrections are omitted. Observer height is ellipsoidal, not height above mean sea level. Elevation is unrefracted above the local ellipsoid tangent plane.
Where it applies
This is a secular J2 / Kepler planning and teaching model, not SGP4 or a numerical force-model ephemeris. Long- and short-period perturbations, atmospheric drag, higher harmonics, third bodies, manoeuvres and radiation pressure are absent. Errors can accumulate into large along-track and pass-time errors; use fresh elements and a validated propagator for tracking operations. The displayed Keplerian speed and conserved specific energy belong to the instantaneous fixed-a, fixed-e ellipse; they are not the derivative and full potential energy of a perturbed trajectory.
RAAN is conventional at equatorial inclinations, and perigee is conventional for a circular orbit; the combined orientation still produces a position. The sun-synchronous target is the published example's 0.98562625°/day; a blank inclination means the requested node rate is infeasible at this a and e. It does not test eclipse, local solar time or mission feasibility.
The ground track has 361 intervals per mean-anomaly cycle by default, sampled in eccentric anomaly. Its lines are sampled directly, without smoothing the trajectory. Pass scanning uses 60 s by default, followed by continuous peak and crossing refinement; very narrow or multiple peaks inside a scan interval can still be missed, especially on eccentric orbits. Reduce the advanced interval and confirm convergence near grazing events. The input condition limits the scan interval near perigee, but is not a mathematical guarantee of detecting every tangent event. Exactly tangent, zero-duration contacts are excluded. At exact zenith, azimuth is indeterminate; at a geographic pole longitude defines the horizontal bearing convention. Passes above the mask at a search boundary are clipped and marked with an asterisk (*). Schedule times are grouped by UTC start date; +1d or +2d denotes a later date within a pass. A pass table describes geometric elevation only; terrain, refraction, sunlight and communications link budgets are not included.
References
- Vallado, D. A., Fundamentals of Astrodynamics and Applications, fifth edition (2022); example 2-1 and open companion verification values: https://github.com/CelesTrak/fundamentals-of-astrodynamics/blob/main/software/python/tests/astro/twobody/test_newton.py
- a.i. solutions, FreeFlyer University Guide, J2 Perturbation, 7000 km sun-synchronous worked example: https://ai-solutions.com/_freeflyeruniversityguide/j2_perturbation.htm
- SatelliteToolboxPropagators, J2 analytical orbit propagator, equations and references to Vallado (fourth edition, 2013) and Kozai (1959): https://github.com/JuliaSpace/SatelliteToolboxPropagators.jl/blob/main/docs/src/man/propagators/j2.md
- Kelso, T. S., Orbital Coordinate Systems II (1995), sidereal time and observer look angles: https://celestrak.org/columns/v02n02/ ; III (1996), ellipsoidal Earth and Mir worked example: https://celestrak.org/columns/v02n03/
- NGA, WGS-84 defining parameters: https://earth-info.nga.mil/index.php?action=wgs84&dir=wgs84
- Kelso, T. S., Frequently Asked Questions: Two-Line Element Set Format (1998): https://celestrak.org/columns/v04n03/ ; model compatibility: https://celestrak.org/columns/v04n05/
Inputs
| Input | Symbol | Unit | Default |
|---|---|---|---|
| Semi-major axis | a_orbit | km | 7000 |
| Eccentricity | ecc | 0.01 | |
| Inclination | incl | deg | 51.6 |
| RAAN at epoch | raan0 | deg | 40 |
| Argument of perigee at epoch | argp0 | deg | 30 |
| Mean anomaly at epoch | mean0 | deg | 0 |
| Include secular J2 drift | j2_on | true | |
| Epoch year (UTC) | epoch_year | 2025 | |
| Epoch month | epoch_month | 1 | |
| Epoch day of month | epoch_day | 1 | |
| Epoch time since midnight UTC | epoch_hour | h | 0 |
| Start after epoch | start_day | day | 0 |
| Time after propagation start | t_show | min | 200 |
| Ground-track periods | track_orbits | 3 | |
| Observer geodetic latitude North is positive. | site_lat | deg | 40 |
| Observer longitude East is positive. | site_lon | deg | -75 |
| Observer ellipsoidal height | site_height | m | 0 |
| Minimum pass elevation | el_mask | deg | 10 |
| Pass-search window | search_hours | h | 24 |
| Pass-search sampling interval Peaks and horizon crossings are refined between samples. | scan_dt | s | 60 |
| Track points per period | track_points | 361 |
Results
With the default inputs above, the calc gives:
| Result | Value |
|---|---|
| Query UTC | 2025-01-01 03:20:00 UTC |
| Subsatellite geodetic latitude | 38.4 deg |
| Subsatellite longitude | -73.024 deg |
| Satellite ellipsoidal altitude | 564.932 km |
| Observer elevation | 64.406 deg |
| Observer azimuth clockwise from north | 135.518 deg |
| Observer slant range | 620.65 km |
| Current elevation mask | Above elevation mask |
| ECI x | 1,131.46 km |
| ECI y | 5,328.91 km |
| ECI z | 4,291.25 km |
| ECEF x | 1,590.59 km |
| ECEF y | -5,210.32 km |
| ECEF z | 4,291.25 km |
| Mean-anomaly period | 97.132 min |
| Perigee above equatorial radius | 551.863 km |
| Apogee above equatorial radius | 691.863 km |
| Instantaneous Keplerian speed | 7.617 km/s |
| RAAN at query | 39.379 deg |
| Perigee argument at query | 30.464 deg |
| RAAN drift per day | -4.46994 deg/day |
| Perigee drift per day | 3.3431 deg/day |
| Sun-synchronous inclination | 97.872 deg |
| Passes meeting the elevation mask | 6 |
| First pass after propagation start | 3.264 h |
| Propagation start UTC | 2025-01-01 00:00:00 UTC |
Checked against sources
Each case below was calculated by this calc and agrees with the value from its source (within the tolerance where one is shown).
Vallado example 2-1: elliptic Kepler solve
Source: Vallado, Fundamentals of Astrodynamics and Applications, fifth edition (2022), example 2-1; open companion Python tests test_newtonm. The signed true anomaly is represented here in 0…360°.
Inputs: Semi-major axis = 20,000 km; Eccentricity = 0.4; Mean anomaly at epoch = 235.4 deg; Time after propagation start = 0 min; Include secular J2 drift = no; the others as above.
| Result | Source | This calc |
|---|---|---|
| Newton eccentric-anomaly solution | 3.849 rad | 3.849 rad |
| True anomaly | 207.2 deg | 207.2 deg |
FreeFlyer 7000 km sun-synchronous example
Source: a.i. solutions, FreeFlyer University Guide, J2 Perturbation, calculating a Sun-Synchronous orbit: a = 7000 km, e = 0, i = 97.87377°, node rate 0.98562625°/day. Uses that example's μ, J2 and reference radius. https://ai-solutions.com/_freeflyeruniversityguide/j2_perturbation.htm
Inputs: Eccentricity = 0; Inclination = 97.874 deg; Time after propagation start = 0 min; the others as above.
| Result | Source | This calc |
|---|---|---|
| Sun-synchronous inclination | 97.874 deg | 97.874 deg |
| RAAN drift per day | 0.9856 deg/day | 0.9856 deg/day |
CelesTrak Mir subpoint and observer look angles
Source: Kelso, Orbital Coordinate Systems III (1996): Mir ECI = (-4400.594,1932.870,4760.712) km, 1995-11-18 12:46 UTC, observer 45°N 93°W. The article uses WGS-72; this calc uses WGS-84. The 5 m altitude tolerance allows the ellipsoid difference and rounded ECI inputs. https://celestrak.org/columns/v02n03/
Inputs: Observer geodetic latitude = 45 deg; Observer longitude = -93 deg; the others as above.
| Result | Source | This calc |
|---|---|---|
| Kelso reference subpoint latitude | 44.91 deg | 44.908 deg |
| Kelso reference subpoint longitude | -92.31 deg | -92.305 deg |
| Kelso reference subpoint altitude | 397.5 km | 397.5 km |
| Kelso reference elevation | 81.52 deg | 81.518 deg |
| Kelso reference azimuth | 100.4 deg | 100.4 deg |

Responses