Why the Simulated Sky Doesn't Quite Match the Real Sky
A plain-language guide to the sources of error between where Curious Pilot draws a satellite and where you would actually see it among the stars.
Overview
Curious Pilot draws three things on the sky: stars, Solar System bodies (Sun, Moon, planets), and satellites. The first two are computed to better than one arcsecond — far smaller than a pixel at any reasonable zoom level. The error you sometimes see is almost entirely on the satellite side.
This document explains, in plain terms, where that error comes from and roughly how big it is. The factors are listed in order of how much they contribute, from most important to least.
Assumptions
The Error Factors, Most to Least Important
Simplified General Perturbations model #4 (SGP4) propagation error
Dominant — ~5 to 20 arcminEvery satellite in the U.S. catalog is described by a small set of orbital parameters. To compute where the satellite will be a few minutes or hours later, the simulator uses a 1970s-era physics model called the Simplified General Perturbations model #4, or SGP4. SGP4 is fast and standardized worldwide, but it is a simplified model: it approximates Earth's lumpy gravity, atmospheric drag, and the pull of the Sun and Moon. The full set of physics is too expensive to recompute for thousands of satellites in real time.
Two errors stack here:
- Fit error at the moment of publication: roughly 1 km from the start, baked into the published parameters.
- Drift over time: roughly 1 to 3 km per day for LEO satellites, dominated by unpredictable atmospheric drag (which depends on solar activity).
For a satellite directly overhead at 400 km altitude, 2 km of position error projects to about 17 arcminutes in the sky — a little more than half the width of a full Moon.
Residual atmospheric-refraction modeling error
Small — up to ~20 arcmin only at high altitude near the horizonEarth's atmosphere bends light. Because the atmosphere is denser near the surface, light rays from above curve gently downward, and an object appears higher in the sky than it geometrically is. This effect is essentially zero overhead and grows rapidly toward the horizon — reaching about 29 arcmin at the geometric horizon at sea level.
The simulator does apply atmospheric refraction to satellite positions (using the Sæmundsson formula), in addition to the refraction already applied to the Sun, Moon, planets, and stars by the Astronomy Engine library. As a result, a satellite drawn near a star will sit at the correct apparent elevation in most viewing conditions, and a satellite that has just dipped below the geometric horizon may still be drawn (and seen) for an additional ~½° of true elevation below.
The residual error comes from a deliberate modeling simplification: the formula uses sea-level standard atmosphere constants (1010 mbar, 10 °C) regardless of the observer's actual altitude or weather. At a sea-level ground site, this is essentially exact. At a typical airliner altitude (~35,000 ft), atmospheric pressure is only about 24% of sea level, so true refraction is roughly a quarter of what the formula predicts. The simulator therefore over-lifts satellites at high altitude, with the error growing toward the horizon:
| Observer altitude | True elevation | Approx. residual error |
|---|---|---|
| Sea level | any | negligible (formula is calibrated here) |
| ~35,000 ft | above 20° | under 2 arcmin |
| ~35,000 ft | 5°–10° | ~5–8 arcmin |
| ~35,000 ft | near 0° | up to ~20 arcmin (over-lifted) |
This is the Option A trade-off: a single, dependency-free formula that is accurate at the ground and only slightly off at altitude near the horizon — still much better than ignoring refraction altogether, where the error there would have been ~25 arcmin in the opposite direction.
Magnitude of refraction the simulator applies, by true elevation:
| True elevation | Refraction lift applied | Effect on display |
|---|---|---|
| Above 20° | under 3 arcmin | Imperceptible |
| 10° to 20° | 3 to 5 arcmin | Brings satellite into agreement with nearby stars |
| 5° to 10° | 5 to 10 arcmin | Visible improvement — satellite no longer drawn below same-elevation stars |
| Below 5° | 10 to 29 arcmin | Major correction; just-set satellites still drawn for ~½° of true elevation below the horizon |
Frame-rate caching of satellite positions
Tiny — under 0.5 arcminFor performance, the simulator only fully recomputes satellite positions every third animation frame (about every 33 milliseconds at 60 frames per second), reusing the cached values in between. A satellite moving at orbital speed (~7.5 km/s) travels about 0.25 km in that interval — which projects to under 0.5 arcmin at typical viewing distances. Imperceptible.
True Equator Mean Equinox (TEME) treated as Pseudo Earth Fixed (PEF)
Arcsecond-class — invisibleSGP4 outputs satellite positions in a reference frame called the True Equator Mean Equinox of date, or TEME. Strictly speaking, converting TEME to an Earth-rotating frame requires a small correction called the equation of equinoxes, then a polar-motion correction. The library used here (satellite.js) skips both and rotates TEME directly into a closely-related frame called Pseudo Earth Fixed, or PEF.
The shortcut introduces under 1 arcsecond of error — roughly 1/2000 of a Moon-width. It is hundreds of times smaller than the SGP4 error already present, and entirely invisible.
Polar motion neglected
Sub-arcsecond — invisibleEarth's rotational pole wanders by about 0.3 arcseconds (roughly 9 meters at the surface) over months. The simulator does not apply this correction. The resulting error is far below any visible threshold.
World Geodetic System 1972 versus 1984 ellipsoid mismatch
Sub-arcsecond — invisibleSGP4 was designed around the World Geodetic System 1972 (WGS-72) shape of the Earth. Modern position data uses the World Geodetic System 1984 (WGS-84). The two ellipsoids differ by a few meters, which is well below pixel scale.
How Position Error Becomes Angular Error
The same kilometer of satellite position error looks very different in the sky depending on how far away the satellite is. The relationship is simple geometry:
angular error (radians) ≈ position error / slant range
| Satellite & viewing geometry | Slant range | 2 km error becomes |
|---|---|---|
| ISS overhead (zenith) | ~400 km | ~17 arcmin (~½ Moon) |
| ISS at 45° elevation | ~570 km | ~12 arcmin (~⅓ Moon) |
| ISS near horizon (10°) | ~1,500 km | ~4.5 arcmin (~⅐ Moon) |
| Starlink overhead | ~550 km | ~12 arcmin |
| GPS satellite overhead | ~20,000 km | ~0.3 arcmin (negligible) |
Putting It All Together
Bottom line
- At any elevation, ground observer: total error is now dominated by SGP4 + element age — typically ¼ to ½ Moon-width for fresh data on LEO satellites. Refraction is corrected, so satellites near the horizon now line up with nearby stars.
- Just-set satellites: a satellite up to about ½° below the geometric horizon is still drawn, matching what the observer would actually see through the refracting atmosphere.
- High-altitude observer (e.g. airliner) near the horizon: the refraction correction over-shoots by up to ~20 arcmin because it uses sea-level atmospheric constants. Above ~20° elevation the over-shoot is under 2 arcmin and invisible.
- Stars, Sun, Moon, planets: drawn to better than 1 arcsecond. Effectively perfect.
- Coordinate-frame approximations (TEME-as-PEF, polar motion, WGS-72/84) contribute well under 1 arcsecond combined and are invisible at any practical zoom.