Skip to Content
ToolchainOrrery

Orrery

Orrery answers one question: where is everything, and who can talk to whom, when.

It propagates orbits, works out which satellites can see each other and for how long, when each is in sunlight, when a ground station is overhead, and what a link between any two of them could actually carry. The output is a contact plan — a time-expanded graph of who is connected to whom over a horizon — and that plan is what the coordination research runs on top of.

It exists because of a specific methodological problem. A study of coordination under communication delay has to get its delay from somewhere, and for years ours came from a number typed into a configuration file. That is a legitimate way to sweep an axis and an illegitimate way to claim a constellation experiences it. Orrery makes the delay derived from geometry: you specify orbits, and the delay falls out.

Availability. Orrery is proprietary and is not distributed. This page documents its architecture, its validation, and its limits. See Reproducibility and Data Availability for what we share.

What is in it

ModuleJob
orbitsWalker-Delta constellations (i:T/P/F), Keplerian propagation with J2 secular drift, co-planar clusters
tleSGP4 ingest of real two-line elements — the external anchor
geometryExact segment/limb occlusion for inter-satellite links, range and range-rate (Doppler), analytic solar vector, conical umbra and penumbra with illumination fraction, ground-station elevation
contactsVisibility windows collapsed into a ContactPlan and a contact graph
linkbudgetRadio (Friis, G/T, Eb/N0) and optical (aperture gains, photons-per-bit) budgets, each answering range ↔ rate in both directions
stations, downlinkGround stations as plan nodes, and contention between satellites competing for them
delayThe oracle: earliest-arrival time over the plan
framesThe reference-frame guard
powerIllumination and ground-visibility series, sampled into the arrays a scheduler consumes

Dependencies are numpy and networkx, plus optional sgp4.

It is deliberately not built on skyfield, astropy or poliastro. A low-precision analytic Sun vector is accurate to about 0.01°, which is far past sufficient for deciding whether a satellite is in shadow, and it avoids shipping a 100 MB planetary ephemeris to answer a question about eclipse boundaries. SGP4 is used only for real elements: propagating an invented constellation through a TLE fit is a round trip through a lossy model that buys nothing.

The delay oracle

This is the part the rest of the research rests on.

Effective delay between two satellites is not distance over the speed of light. It is an earliest-arrival time over the contact plan: propagation plus contact-wait, accumulated across however many hops the message needs, solved as a time-dependent shortest path. A message may sit on a satellite for four minutes waiting for the next window, cross it in two milliseconds, and wait again.

The oracle returns the decomposition, not just the total. That is deliberate: it means the claim “contact-wait dominates light-lag” is shown from data every time rather than asserted once. On the constellations we study the waiting share is 99.77%–99.97% — and the test that asserts contact-wait dominates is one we would treat as a research result if it ever failed, not a test to fix.

The magnitude is a different matter, and Orrery is built to make you careful with it. Contact windows quantise to the sampling grid, so a coarser plan inflates the delay; and the figure depends on when a message departs, ranging roughly 4× across departure times on the same constellation. The distribution is also bimodal — a median hop is effectively instant because the link already exists, while the tail runs to minutes. This is why everything we publish quotes the waiting fraction freely and never a magnitude without its sampling grid and its reduction attached.

Validated against the outside, not against itself

Anything that only agrees with itself can be confidently wrong, so each layer is anchored to a number somebody else published:

  • the J2 secular rate reproduces the sun-synchronous inclination (98.6° at 800 km)
  • and the ISS nodal regression (−5° per day)
  • Greenwich sidereal time at J2000 comes out at 280.46°
  • the Sun at J2000 sits at 0.983 AU and −23° declination
  • the eclipse fraction for low Earth orbit lands in the expected 30–42%
  • a real ISS two-line element propagates to the right altitude (420 km) and speed (7.66 km/s)

Three things it measured that we did not expect

Each of these changed how we frame a result, which is the main argument for building the twin rather than assuming the geometry.

A frozen link range can be doing almost no work. Our reference configuration uses a 5,000 km optical inter-satellite link, and a link budget confirms that a namable terminal closes it. But on that constellation the cutoff excludes only 0.5% of pair-samples and yields the same contacts as no cutoff at all — the plan is limited by the Earth’s limb, not by the link budget. Nothing published on that basis is wrong, but “we model a 5,000 km optical ISL” would imply the budget shapes the sparsity, and there it does not. Go the other way and it bites hard: below about 1,980 km the same constellation has literally zero contacts, and Orrery raises rather than reporting a plausible-looking number.

A union visibility model overstates downlink for a tight formation, badly. Asking “is a ground station in view” is a reasonable gate for a satellite that only needs to know a pass exists. But a formation whose members sit a kilometre apart rises and sets together, so they all queue for the same antenna at the same moment. Modelling the contention rather than the visibility reduces available downlink by one to two orders of magnitude for such a cluster, and most of its satellites are never served at all. We record that as the direction our assumption is wrong in, with its measured size.

A comparison can be degenerate by construction. Two ground-station scheduling policies return identical numbers on a tight formation — co-located satellites generate identical windows, so there is nothing for a policy to decide. On a spread constellation the same two policies separate cleanly. A benchmark row that reports a tie because its environment cannot express a difference reads as robustness, and it is nothing of the kind. Orrery pins that case with a test so the tie cannot be published as a finding.

The guards

Three failure modes are prevented structurally rather than by care.

Reference frames cannot be mixed. Analytic propagation yields J2000 ECI; SGP4 yields TEME. Relative geometry within either is fine and combining them is meaningless, so position arrays are tagged with their frame and a mismatch raises rather than quietly producing a plausible distance.

Ground stations are sinks in the oracle. A path is never relayed through a station, because station-to-station forwarding is terrestrial backhaul — a different network with its own availability that the plan does not model. Opting in is possible and has to be typed out explicitly, because it is that strong an assumption.

A rate is never a plausible default. A contact’s data rate is None unless a link budget was supplied, and when it is supplied it is evaluated at the window’s worst range, not its best: a rate the link only achieves at closest approach cannot be planned against.

Honest scoping

The geometry is real. A real two-line element anchors orbits and nothing else — the coordination algorithms running on top are still simulation, and an orbital compute payload is still hypothetical. A real TLE must not be allowed to launder a claim about anything but where the satellites are. This is the same scoping rule we apply to every result in the lab, and it is stated at length in Reproducibility and Data Availability.

How it fits

Orrery holds no coordination algorithm, no integrator and no orchestration. It computes geometry and hands it across as plain arrays: a contact plan for Gossamer to replicate state over, a per-satellite delay for Leviathan’s communication model to impose, and illumination and downlink series for a scheduler to consume. It never imports the orchestrator, and the coordination layer never imports it.

That separation is what lets the delay axis in our simulation work be derived from a real constellation rather than dialled in — which is the difference between studying a phenomenon and assuming it.

Last updated on