<- Back to notes

From a TLE to a contact window

The map on the apsis case study answers a concrete question: when is the next contact window between the ISS and the ESA stations at Cebreros and Maspalomas? Between “download the orbital data” and “the antenna should point here at 18:43 UTC” there are a few steps that rarely get spelled out. This is the whole pipeline, as apsis runs it.

Two lines that describe an orbit

A TLE (two-line element set) is exactly what the name says: two 69-character lines that encode a satellite’s orbit as mean Keplerian elements, plus a drag term and an epoch, fitted by the US space surveillance network to its tracking observations. The catalog number identifies the object; the ISS is 25544.

The epoch is the part people underestimate. A TLE is not a permanent description of an orbit. It is a snapshot that starts aging the moment it is published: in low Earth orbit, atmospheric drag varies with solar activity and the position error grows by kilometres per day. For the ISS, which reboosts regularly and flies through the densest air any satellite tolerates, fresh elements appear several times a day. apsis refreshes its catalog from CelesTrak every two hours and treats a changed TLE as an event worth reacting to.

SGP4, the propagator everyone uses

TLEs only make sense together with the analytical model they were fitted for: SGP4. It is not a numerical integrator. It is a closed-form theory that captures the secular effects of Earth’s oblateness (the J2 term is why orbits precess) and a simplified drag model. The trade is precision for speed: position is only good to a few kilometres, but one evaluation costs microseconds, so sweeping two full days of trajectory for every satellite and station pair stays cheap. apsis calls it through skyfield, which wraps the reference implementation.

From an orbit to a local sky

SGP4 outputs position in an inertial reference frame, and a ground station does not care about inertial frames; it cares about where to point. So the position is converted to topocentric coordinates relative to the station: azimuth (compass direction) and elevation (angle above the horizon). Elevation is the number that decides everything that follows.

The elevation mask

In theory a station sees a satellite the instant it clears the geometric horizon. In practice the first degrees are useless: the signal grazes hundreds of kilometres of atmosphere, terrain and buildings get in the way, and many antennas cannot track that low anyway. Operations put a floor on usable elevation, called the elevation mask. apsis uses 10 degrees.

The numbers behind the mask are brutal. At 10 degrees of elevation the ISS sits roughly 1,500 km away along the line of sight. At a culmination directly overhead, 420 km.

A pass is simply the interval where elevation stays above the mask: it starts at AOS (acquisition of signal), peaks at culmination, and ends at LOS (loss of signal). Peak elevation is the quality metric of a pass. One that culminates at 15 degrees is short and far; one at 75 degrees is nearly overhead and gives the longest, cleanest window. That is why the pass schedule in the viewer colours the elevation column.

Why passes arrive in bursts

The ISS completes an orbit in about 93 minutes, roughly 15.5 per day. While it flies, the Earth rotates underneath, so each successive ground track lands about 23 degrees of longitude further west. Seen from a fixed station the result is a rhythm, not a uniform spread: a few consecutive orbits pass within view (one short pass every hour and a half), then the geometry drifts out of range and the station sees nothing for around half a day until the pattern comes back. If the schedule on the map shows a burst of passes tomorrow morning and nothing tonight, that is the mechanics at work.

What apsis does with all of it

A scheduled job pulls fresh TLEs every two hours. When elements actually change, an outbox event triggers recomputation of every affected (satellite, ground station) pair: skyfield finds the AOS, culmination and LOS events above the 10-degree mask across a rolling 48-hour horizon, and the resulting passes, ground tracks included, land in PostGIS ready to be served as GeoJSON. Predicting further ahead would mostly add error, since everything is recomputed on the next TLE change anyway.

The scheduling and outbox machinery has its own write-up, and the full implementation is open source at github.com/aJustDev/apsis.