When is my satellite overhead? TLEs, SGP4, and pass prediction

How a Two-Line Element set and the SGP4 propagator become ground-station pass windows — AOS, LOS, elevation masks, max elevation — and why TLE freshness is the whole accuracy story.

ICARUS Engineering mission patch ICARUS Engineering 7 min read
  • ground-station
  • tle
  • sgp4
  • pass-prediction
  • orbital-mechanics
  • operations
A satellite pass arc over a ground station's sky dome — rising at AOS, culminating near 72 degrees elevation, and setting at LOS — computed from a TLE with SGP4.

A satellite in Low Earth Orbit (LEO) spends almost all of its life out of sight of any particular antenna. A typical station at mid latitudes gets a LEO spacecraft for a handful of passes a day, a few minutes each — and every downlink byte, every command, every ranging measurement has to fit inside those windows. Knowing exactly when they open and close is the most basic operational question there is, and the machinery that answers it is a punch-card-era data format and an analytic propagator from 1980 that both refuse to die, because they work.

This post walks the pipeline end to end: what a Two-Line Element set (TLE) actually is, what SGP4 does with it, how an inertial position becomes “rises at 22:14 UTC in the northwest, peaks at 50°,” and where the accuracy goes when the element set gets old. The worked numbers come from our new ground track & pass predictor, which runs the genuine SGP4 in your browser.

The TLE: a fitted description, not a measurement

A Two-Line Element set is exactly what the name says — two 69-character lines of fixed-column ASCII:

1 25544U 98067A   08264.51782528 -.00002182  00000-0 -11606-4 0  2927
2 25544  51.6416 247.4627 0006703 130.5360 325.0288 15.72125391563537

Line 1 carries identity and bookkeeping: catalog number (25544 — the International Space Station), international designator, the epoch (year 08, day-of-year 264.51782528 — the instant the elements describe), a first derivative of mean motion, and the B* drag term. Line 2 carries the orbit: inclination (51.6416°), right ascension of the ascending node, eccentricity (0.0006703, with an implied leading decimal), argument of perigee, mean anomaly, and mean motion — 15.72125391 revolutions per day, which is a 91.6-minute period. Each line ends in a mod-10 checksum, a relic of punch-card data hygiene that still catches transcription damage today.

The crucial subtlety is that these are mean elements, not instantaneous ones. Nobody measured the ISS’s semi-major axis; a least-squares fit crunched days of radar and optical tracking into the element values that make one specific analytic theory — SGP4 — reproduce the observations best. TLE values only mean something to SGP4. Feed them into a textbook Keplerian propagator, or a high-fidelity numerical integrator, and you inherit kilometres of error immediately, because you’ve taken numbers fitted to one model and evaluated them with another. TLE and SGP4 are two halves of one contract.

SGP4 in one paragraph

Simplified General Perturbations 4 (SGP4) is an analytic propagator: instead of numerically integrating accelerations step by step, it evaluates closed-form expressions for where the mean elements drift under the dominant perturbations — the secular and long-period effects of Earth’s oblateness (the J2 zonal harmonic and friends), plus a simple drag model driven by the TLE’s B* coefficient. For deep-space objects (period over 225 minutes) the SDP4 variant adds lunar-solar terms and resonance handling. Published as Spacetrack Report No. 3 in 1980 and consolidated into the reference implementation of Revisiting Spacetrack Report #3 (Vallado et al., 2006), it is fast — microseconds per evaluation — which is exactly what you want when a pass search needs tens of thousands of propagations. The output is a position and velocity in TEME (True Equator, Mean Equinox), a slightly idiosyncratic inertial frame that is itself part of the TLE/SGP4 contract.

Accuracy is the trade. Against a fresh element set, SGP4 is good to roughly a kilometre near epoch, with error growing on the order of 1–3 km per day as reality diverges from the fitted drag and the un-modelled perturbations accumulate. That number is the headline of the whole accuracy story, and we’ll come back to it.

From inertial position to “look northwest at 22:14”

A pass predictor needs three coordinate hops per time step:

TEME → ECEF. The satellite position is inertial; your antenna is bolted to a rotating planet. Rotating TEME by the Greenwich Mean Sidereal Time (GMST) angle gives the position in the Earth-Centered, Earth-Fixed (ECEF) frame, where ground coordinates live. Get GMST wrong by one second of time and every longitude shifts by ~460 m at the equator — time discipline is not optional.

ECEF → sub-satellite point. Converting the ECEF vector to geodetic latitude, longitude, and altitude on the ellipsoid gives the point directly beneath the spacecraft. String those points over time and you have the ground track — the familiar sinusoid-on-a-map, drifting westward each orbit because the Earth turns ~22.5° beneath a 90-minute orbit.

ECEF → look angles. Subtract the station’s ECEF position from the satellite’s, rotate the difference into the station’s local horizon frame (south-east-up, the standard topocentric transform), and read out azimuth, elevation, and slant range. Elevation is the number that decides everything: the satellite is trackable when its elevation is at or above your elevation mask.

A pass is a contiguous interval with elevation above the mask. Its three landmarks:

  • AOS (Acquisition of Signal) — the rising mask crossing,
  • TCA (Time of Closest Approach) — the elevation peak, where slant range is minimum and the signal is strongest,
  • LOS (Loss of Signal) — the falling crossing.

The predictor samples elevation on a fixed grid across the search window, interpolates the exact crossing times, and refines the peak numerically. Sampling every 30 s and interpolating gets AOS/LOS to within a second or two — far inside the error the TLE itself contributes.

The elevation mask, and why most passes are bad

The mask is not bureaucratic conservatism. Below ~5–10° elevation you are fighting terrain and buildings, a much longer slant path through the troposphere, multipath off the ground, and — decisive for the link budget — range. At 10° elevation a 550 km satellite is ~1,800 km away; at zenith it’s 550 km. That factor of ~3.3 in range is ~10 dB of free-space path loss, the difference between a comfortable margin and no margin (work it through in the link-budget post). Doppler is also at its worst at low elevation, where the range rate peaks — around ±10 kHz at UHF, ±50 kHz at S-band, all of which your radio has to chase.

Geometry also stacks the deck: pass peak elevations are far from uniformly distributed. High-elevation passes require the ground track to cross nearly overhead, so they’re rare — most passes graze the edge of your visibility circle and peak low. Plan capacity on the distribution your mask actually yields, not on the postcard 85° pass.

Two worked examples from the pass predictor, using its bundled historical element sets (deterministic on purpose — same inputs, same passes, forever):

ScenarioMaskPasses / 24 hTotal contact
ISS-class (51.6°) over Bangalore (13°N)10°3~12 min
700 km sun-synchronous (98.2°) over Svalbard (78°N)15~143 min
Same sun-sync bird over Bangalore3~30 min

That last comparison is the whole ground-segment siting argument in one table. A polar station sits inside the visibility circle of every orbit of a high-inclination satellite — all ~15 daily orbits converge over the poles — while a low-latitude station catches the same spacecraft only when the ground track happens to sweep past. It is why Earth-observation operators pay for Svalbard and Troll, and why a 51.6° ISS-inclination orbit gives its best service to mid-latitude stations — its ground track never goes poleward of 51.6°, so stations in the high sixties and beyond never see it clear a sensible mask at all.

Where the accuracy goes

Everything above is sub-second geometry. The error budget is dominated by one input:

TLE age. At 1–3 km/day of position drift, a week-old element set can time a pass tens of seconds off; a month-old one is geometry practice, not a schedule. For LEO operations, refresh elements every day or two from CelesTrak or Space-Track, and treat anything older than about two weeks as expired (the tool flags exactly this).

Drag weather. B* is a fitted constant, but the thermosphere is not constant — a geomagnetic storm can multiply density overnight, and every satellite’s along-track error grows until the next element fit absorbs it. Storm weeks are when your AOS predictions wobble most.

Maneuvers. SGP4 knows nothing about them. A spacecraft that burned yesterday is flying a different orbit than its last TLE until the catalog re-fits — if you operate the spacecraft, use your own post-maneuver elements, not the public catalog’s.

None of this makes the TLE/SGP4 stack obsolete — for scheduling antenna time, aiming a handheld Yagi, or sizing a downlink budget, seconds-level pass timing from free, universally published data is exactly the right tool. When you need better (conjunction assessment, laser ranging), you graduate to operator ephemerides and numerical propagation. For everything else, two lines of 1960s ASCII still run the world’s ground segments.

Try it on your own station

The ground track & pass predictor runs the reference-faithful SGP4 entirely in your browser: paste a current TLE, drop in your station’s coordinates and mask, and read off AOS/LOS/TCA, peak elevation, and azimuths per pass, with the ground track and your station’s visibility circle drawn on a world grid. Pair the pass durations with the onboard data budget tool to see whether your downlink actually closes over a real contact schedule — and if it doesn’t, the fix is usually a better mask, a better site, or a better link budget.

On this page

— Ground Control, Jul 2026

Read next