L09 · Orbital Traffic Control
The real satellite catalogue, propagated, screened for near-misses and pushed 200 years into a Kessler future, all shown in a live 3D ops console in the browser.

Screenshot from a headless Chromium capture; index.html is the live version.
Open index.html by double-clicking it. It is a single file with no server and no build step, and runs on an integrated GPU. The console shows 18,677 real objects (all 16,001 active satellites plus the debris clouds of four historic breakups), each propagated live by SGP4 in the browser. You can scrub a 24 h timeline, click any dot for its orbit and live state, and click a conjunction to fly to the two objects and watch them pass each other with a live separation readout.
1. The question
Right now, which pairs of objects in low Earth orbit are about to pass dangerously close to each other? How likely is a collision, given how poorly we actually know where things are? And if we keep launching the way we do, does LEO tip into a self-sustaining collision cascade (the Kessler syndrome)?
Three time scales, three models:
| Horizon | Question | Model |
|---|---|---|
| seconds | When exactly is the closest approach, and how close? | SGP4 + TCA root-finding |
| 24 hours | Which of ~174 million pairs come within 10 km? | vectorised SGP4 + KD-tree sieve |
| 200 years | Does the debris population run away? | shell source-sink Monte Carlo + NASA breakup model |
2. The model
2.1 Propagation: SGP4/SDP4 from two-line elements
CelesTrak publishes mean orbital elements (TLEs) fitted by the US Space Force to radar and optical tracking. SGP4 is the analytical theory those elements were fitted with. It covers secular and periodic J2 to J4 effects and a drag term via B*, and switches to SDP4 with luni-solar and resonance terms for periods over 225 min. The output is position and velocity in the TEME frame. A TLE is only meaningful inside SGP4: feeding it to a numerical integrator gives worse answers, not better ones.
2.2 Screening: KD-tree sieve, then time of closest approach (TCA)
All N = 18,677 objects are propagated together (SatrecArray, C++) every Δt = 20 s for 24 h, which is 80.7 million states. At each sample:
- Coarse sieve: a KD-tree fixed-radius query returns every pair with |Δr| < R, where R = d + vmaxΔt/2, d = 10 km and vmax = 16 km/s. No pair that can close within d during ±Δt/2 can escape this radius.
- Linear filter: τ = −Δr·Δv/|Δv|², clamped to ±Δt/2. Keep the pair if |Δr + Δv τ| < d.
- Group: consecutive-step hits of one pair form one encounter. Pairs that stay within d for more than 10 min, or have vrel < 0.1 km/s, are co-orbiting: docked vehicles, formations, freshly deployed trains. They are excluded, because the short-encounter Pc model does not apply to them.
- TCA, vectorised: second-order relative motion with two-body gravity, D(τ) = Δr + Δv τ + ½Δa τ², then Newton iterations on D·D′ = 0 for all encounters at once.
- TCA, exact, where it matters: every encounter under 1 km is re-solved by bounded Brent minimisation of the true SGP4 separation |r₂(t) − r₁(t)|.
2.3 Collision probability (Pc)
In the encounter plane (normal to vrel), the combined position uncertainty C = C₁ + C₂ is projected to 2×2, and
$$P_c=\iint_{|\mathbf x|<R_{HB}} \frac{1}{2\pi\sqrt{|C|}}\exp\!\left(-\tfrac12(\mathbf x-\mathbf m)^\top C^{-1}(\mathbf x-\mathbf m)\right)dA$$
This is the Foster/Alfano short-encounter model. m is the miss vector and RHB the combined hard-body radius. The integral is evaluated with a 16×32 Gauss-Legendre polar quadrature.
Stated covariance assumption. A public TLE carries no covariance, so one has to be assumed. Each object gets independent Gaussian errors, diagonal in its own radial/in-track/cross-track (RTN) frame: σR = 0.1 km, σT = 0.5 km + 1.5 km/day × |TCA − TLE epoch|, σN = 0.2 km. These are TLE-grade values, of the order reported by Flohrer et al. (2008). Hard-body radii are 5 m for constellation satellites, 3 m for other payloads, 50 m for crewed stations and 0.5 m for debris. The page also reports the covariance-free worst case, Pcmax = RHB²/(e d²) (Alfano 2005), which bounds Pc over any isotropic covariance.
2.4 Kessler: shell source-sink Monte Carlo
LEO from 200 to 2000 km is split into 36 shells of 50 km. The state per shell is S (active payloads), D (derelict intact objects: dead payloads and rocket bodies) and N (fragments ≥ 10 cm). The initial state comes from today's SATCAT: 16,079 / 2,649 / 9,961.
- Collisions follow gas-kinetic theory: λab = σab vrel na nb / Vshell (halved for a = b), with vrel = 10 km/s. Active satellites avoid a fraction of them: 99 % of active-active and 95 % of the rest (MOCAT-style α). Collisions are drawn as Poisson events.
- Fragments come from the NASA Standard Breakup Model (Johnson et al. 2001): N(Lc) = 0.1 M0.75 Lc−1.71. M = mt + mp if the collision is catastrophic (projectile energy over 40 J/g); otherwise M = mpv². Fragment A/M comes from the SBM bimodal distribution and Δv from log₁₀Δv = 0.9χ + 2.9 ± 0.4 (χ = log₁₀ A/M). Sampled kicks turn into a shell-to-shell spreading kernel.
- Drag: da/dt = −ρ(h) B √(μa) with B = CDA/m. ρ is the Vallado piecewise-exponential atmosphere. Binomial transfers move objects down one shell per step. Fragments use B = 2.2 × median(SBM A/M) = 0.28 m²/kg; derelicts use 0.022 m²/kg. Active satellites station-keep.
- Operations: 5-year missions. At end of life a satellite is disposed with probability PPMD, otherwise it becomes D. Launches replace retirees and grow the fleet toward a target, with a multinomial draw over the recent-launch altitude profile. Active debris removal (ADR) takes k derelicts per year from the riskiest shell.
- 200 runs × 4 scenarios × 200 years at a 0.25-year step. Runs vary only in their random draws (Poisson, binomial and multinomial).
The cloud-decay validation integrates each fragment's (a, e) with King-Hele's orbit-averaged drag: da/dt = −Bρp√(μa) e−c[I₀(c) + 2eI₁(c)] and de/dt = −Bρp√(μ/a) e−c[I₁ + ½e(I₀ + I₂)], where c = ae/H.
3. M&S concepts you'll learn here
- Model-data consistency: a TLE is a fit to one specific theory (SGP4). Mean elements are not osculating elements; using them with another propagator is an error.
- Multi-fidelity screening: a cheap conservative sieve over all pairs, a vectorised analytic refinement over the survivors, and exact re-solving only where the decision depends on it. This is how production SSA pipelines scale.
- Conservative filtering and false negatives: the sieve radius comes from a velocity bound, so it cannot miss an event. A Δt = 1 s re-run checks that empirically.
- Spatial indexing: a KD-tree turns an O(N²) all-pairs problem (174 M pairs per sample) into roughly O(N log N).
- Uncertainty is part of the answer: Pc depends on an assumed covariance. The same 75 m miss can be Pc = 4e-4 or 2e-3 depending on σ (see Pcmax and the dilution region).
- Encounter-plane geometry: at 15 km/s head-on, along-track error points along vrel and mostly drops out of the problem.
- Stochastic population models: Poisson/binomial Monte Carlo on a compartment (shell) model gives spread as well as means.
- Validation against history: the breakup model and drag model are tested on real fragment clouds, with honest misses.
- Verification across implementations: the Python and JavaScript SGP4 are checked against each other, both in node and live in the browser.
- Real-time visual simulation: keyframed SGP4 plus cubic Hermite interpolation gives smooth 60 fps motion for about 19k objects while propagating each object only once per keyframe (every 60 to 300 s of sim time).
4. Tech stack (cumulative; ★ = new in this level)
| Tool | Role here |
|---|---|
| Python 3.12, NumPy | vectorised everything: sieve maths, Pc quadrature, Monte Carlo state arrays |
| SciPy | optimize.minimize_scalar (Brent TCA), special.i0e/i1e (King-Hele drag), ★ spatial.cKDTree (fixed-radius pair search) |
| pandas, requests | SATCAT join and history, polite cached downloads from CelesTrak and jsDelivr |
| Matplotlib | the five analysis figures (dark theme) |
| multiprocessing | 4 workers, each propagating and sieving a slice of the 24 h window |
| ★ sgp4 (python-sgp4, Vallado C++) | SatrecArray: 18,677 objects × 4,320 epochs in compiled code (≈0.2 µs/state) |
| ★ Three.js 0.170 (WebGL, CDN importmap) | globe with day/night + city-lights shader, atmosphere, 18,677-point custom shader, trails, markers |
| ★ satellite.js 5.0 | SGP4 in the browser (same Vallado code), live propagation of the whole catalogue |
| ★ Node 22 | headless cross-check of satellite.js against python-sgp4 (crosscheck.mjs) |
Numba (L05/L06) is part of the stack but isn't needed here. The hot loop (SGP4) is already compiled C++, and the Monte Carlo is vectorised over runs and shells.
5. Industry & scientific tools
| Tool | What it is | Who uses it | How this project maps to it |
|---|---|---|---|
| Space-Track.org (US Space Force, 18/19 SDS) | Authoritative public catalogue: GP/TLE, SATCAT, and CDMs (conjunction data messages) for registered operators | Every operator; CelesTrak mirrors its GP data | Our input data (via CelesTrak). A real CDM carries the actual covariance we had to assume |
| CelesTrak (+ SOCRATES) | Curated GP/TLE groups, SATCAT, and SOCRATES, a public TLE-based conjunction screening report | Researchers, educators, amateur trackers | sim.py is a mini-SOCRATES. Compare our top events with theirs |
| NASA CARA (+ open-source CARA Analysis Tools) | NASA's conjunction assessment and risk analysis for its own fleet: 2-D/3-D Pc, Monte Carlo Pc, manoeuvre planning | NASA missions; its tools are public on GitHub | pc_circle is the textbook 2-D Pc. CARA adds 3-D Pc for slow encounters and covariance realism |
| Ansys STK (+ STK SatPro/CAT, ODTK) | Commercial astrodynamics environment: propagators (SGP4, HPOP), access, close-approach tool, orbit determination | Defence, primes, satellite operators | Our screening is STK's "Advanced CAT" in about 200 lines. STK would use HPOP and real covariances |
| NASA GMAT | Open-source mission design and trajectory optimisation, high-fidelity force models, scripting | NASA flight projects, universities | Use it to design the avoidance manoeuvre after this tool flags an event |
| Orekit (Java, + Python wrapper) | Open-source flight-dynamics library: frames, numerical and analytical propagators, OD, events | CNES, ESA, commercial operators | Proper TEME→GCRF→ITRF frames, numerical propagation and orbit determination beyond SGP4 |
| poliastro → hapsira (Python) | Pythonic astrodynamics (Lambert, manoeuvres, plotting); poliastro was archived in 2023 and hapsira is the maintained fork | Students, researchers | Two-body/Kepler maths like our refine_2body, plus manoeuvre planning |
| CesiumJS | Open-source WebGL globe with time-dynamic CZML, terrain, 3D Tiles | Space operations dashboards, AGI/Ansys, NASA | What index.html does with Three.js; Cesium adds precise frames, terrain and CZML time series |
| LeoLabs | Commercial phased-array radar network plus conjunction and collision-avoidance service | Commercial LEO operators, insurers | Their data would replace our TLE covariance with measured, much smaller uncertainties |
| NASA ORDEM | Engineering debris flux model (sizes down to 10 µm) for spacecraft shielding design | NASA/industry spacecraft designers | The "environment" our shells approximate, at a snapshot in time |
| NASA LEGEND | 3-D debris evolution model (LEO-to-GEO) with the NASA SBM, used for long-term projections | NASA ODPO; IADC studies | Our Kessler MC is a 1-D, shell-averaged LEGEND. LEGEND propagates each object |
| ESA MASTER / DELTA | ESA's flux model (MASTER) and long-term evolution model (DELTA, now DELTA 4) | ESA Space Debris Office, IADC | European counterparts of ORDEM/LEGEND |
| MIT MOCAT | Source-sink (SSEM) and Monte Carlo orbital-capacity models | Academic policy studies | Closest relative of our shell model (same S/D/N species and α avoidance factors) |
| ESA DRAMA / NASA DAS | Mission compliance tools: lifetime, re-entry casualty risk, 25-/5-year rule | Every mission applying for a licence | Our drag and lifetime maths; the PMD fraction in our scenarios is what these tools check |
6. Results
Catalogue fetched from CelesTrak on 2026-09-18: 18,677 objects (16,001 active payloads plus 2,676 catalogued fragments from FY-1C, Cosmos 2251, Iridium 33 and Cosmos 1408). The screening window is 2026-09-17 23:00 UTC + 24 h.
6.1 The catalogue and where objects get close

Today's LEO is dominated by one 50 km shell: 9,700 active satellites between 450 and 500 km, almost all Starlink. Classic debris lives higher, at 700 to 1000 km, where drag is weak. Over 90 % of all close approaches happen in that one Starlink shell (right panel; the axis is symlog).
6.2 Screening: 24 hours of traffic

| value | |
|---|---|
| SGP4 states evaluated | 80.7 M (18,677 objects × 4,320 steps) |
| sieve hits (pair-steps) | 595,561 |
| encounters < 10 km | 270,442 (213,056 Starlink × Starlink) |
| encounters < 1 km | 1,458 |
| encounters with Pc > 1e-4 / > 1e-5 | 198 / 3,008 |
| co-orbiting pairs excluded | 558 |
That is about 40 close approaches under 10 km per Starlink satellite per day. At d < 10 km the cumulative count follows N(<d) ∝ d² almost exactly (left panel), the signature of random crossing geometry. It steepens above about 3 km, which is consistent with constellation shells being separated by a few km in altitude.
The Pc cloud (middle) is capped near 4e-4. With TLE-grade σ of a few hundred metres and a 10 m hard body, Pc can never be large, however close the nominal miss. This is the dilution effect: poor knowledge caps the computed risk. The orange line is Pcmax.
6.3 The top event

COSMOS 2581 × FIRESAT3: TCA 2026-09-18 00:39:54.065 UTC at 595 km. Miss 75 m (R/T/N = −70 / 0 / −27 m), vrel = 15.10 km/s, nearly head-on. Pc = 4.0e-4 under the stated covariance, Pcmax = 2.4e-3. The same FireSat satellite passes the other two members of the Cosmos 2581/2582/2583 group within 4 seconds (211 m and 135 m, ranks 3 and 5). Run #2 is STARLINK-4566 × CUBESX-HSE 3 at 37 m. In the web page, click row 1 (or open index.html?conj=0) to watch it:

6.4 Kessler outlook

| Scenario (200 runs each) | LEO objects ≥ 10 cm in 2226, median (5 to 95 %) | catastrophic collisions by 2226 |
|---|---|---|
| No new launches | 16,586 (11,545 to 22,582) | 16 |
| Steady fleet (16k), 90 % disposal | 111,538 (94,520 to 127,961) | 183 |
| Mega-constellation boom (65k), 90 % disposal | 59.2 M (runaway) | 21,618 |
| Boom + 99 % disposal + ADR 5/yr | 824,180 (779,258 to 874,293) | 1,128 |
Today's LEO holds 28,689 objects (SATCAT, mean altitude 200 to 2000 km).
- No new launches: the population falls by 60 % in 20 years (11.4k in 2046) as the low Starlink shells decay. It bottoms out at 10.7k around 2074 and then grows again (13.1k in 2126, 16.6k in 2226), driven by collisions at 800 to 1000 km, even with zero launches. This is the Liou & Johnson (2006) result: parts of LEO are already past the critical density.
- Steady fleet: slow, steady growth; the population doubles by about 2144.
- The boom at 90 % disposal runs away. A 10 % failure rate over about 20,000 satellites at 1,050 to 1,150 km (the planned Guowang/Qianfan altitudes) leaves derelicts where drag cannot remove them, and derelict-derelict collisions grow as D². Past about 10⁶ objects the absolute numbers are meaningless: the model has no feedback (operators would stop launching) and no fragment-fragment grinding. The lesson is the onset: the two boom scenarios are 116k vs 86k in 2046 but already 883k vs 125k (7×) by 2076.
- Mitigation works but is not free: 99 % disposal plus 5 removals per year keeps the boom about 70× below runaway, yet still ends about 30× above today. High-altitude constellations need very high disposal reliability.
6.5 Verification and validation (actual numbers from the run)

| Check | Target | Result |
|---|---|---|
| satellite.js vs python-sgp4, 60 objects (all 10 classes incl. SDP4 deep space) × 5 epochs (−12 h to +72 h) | < 1 km | max 0.247 m, rms 0.138 m (node); the page repeats it live: 0.25 m |
| Synthetic encounter (equatorial vs polar circular orbits meeting at a node, miss = 0.5 km exactly) hidden among 3,000 random objects | found; TCA < 10 ms, miss < 0.1 m | found; Brent: 0.024 ms, 0.065 mm; 2-body Newton: 0.032 ms, < 0.001 mm |
| Pc quadrature vs exact centred isotropic result 1 − exp(−R²/2σ²) | < 1e-6 relative | 3.3e-16 |
| Sieve step-size convergence: Δt = 1 s re-screen of the first 15 min | 0 missed at Δt = 20 s | 2,702 encounters, 0 missed |
| Vectorised 2-body TCA vs exact SGP4+Brent on all 1,460 sub-km events | a few m | median < 0.1 m, max 2.4 m |
| Monte Carlo object bookkeeping (initial + launched + created − re-entered − disposed − destroyed − removed) | exact | 0 imbalance |
| NASA SBM fragment count vs SATCAT: Iridium 33 × Cosmos 2251 (the one true intact-intact collision) | within ×2.5 | 1,211 vs 2,370 (×0.51) |
| SBM vs SATCAT: FY-1C / Cosmos 1408 (ASAT tests) | (reported) | 843 vs 3,531 (×0.24, miss) / 1,400 vs 1,806 (×0.78) |
| Fraction of fragments still in orbit today, model vs SATCAT | within 0.35 | FY-1C 0.72 vs 0.66 · Iridium-Cosmos 0.58 vs 0.31 (miss) · Cosmos 1408 0.03 vs 0.00 |
Honest misses. (1) The SBM under-predicts FY-1C by 4×. This is a known issue: the ASAT kinetic-kill vehicle fragmented the target far more finely than the SBM's collision branch predicts, and the catalogue includes objects smaller than 10 cm. (2) The static atmosphere does not reproduce the Iridium-Cosmos cloud. The real curve drops in steps during the 2014 and 2024 to 2025 solar maxima. The mean CIRA-72 density cannot do that, so the model keeps about twice as many fragments. A solar-cycle-driven density (NRLMSISE-00 with F10.7) is the fix.
7. Run it
# from SimulationLab/
uv run python L09_orbital_traffic_control/sim.py # analytics + figures + data.js
# then double-click L09_orbital_traffic_control/index.html
node L09_orbital_traffic_control/crosscheck.mjs # optional: standalone JS-vs-Python SGP4 check
Runtime on the 8-core laptop: about 2 min when the machine is quiet (the 24 h screening took 45 s on 4 cores). The final documented run took 16 min (screening 544 s) because other simulations were saturating all 16 threads; expect anything in between. The first run downloads about 10 MB (CelesTrak TLE groups, SATCAT, satellite.js) into data/ and never again; delete data/ to refresh the catalogue. Everything else is deterministic (fixed seeds).
Web console controls: drag to orbit, scroll to zoom, click a dot to inspect it (with trail and live altitude/speed/lat/lon). / searches by name or NORAD id, space pauses, and , / . change the time warp (1× to 1800×). Click a conjunction row or a timeline tick to fly to the encounter; Earth view resets the camera. The legend toggles layers. index.html?conj=0 opens directly on the top event.
8. Code tour
| File / function | What it does |
|---|---|
sim.py · load_catalog |
cached CelesTrak TLE groups + SATCAT join (owner, launch date), categorisation |
sim.py · screen_step |
KD-tree sieve + linear closest-approach filter for one epoch |
sim.py · _screen_chunk / screen |
worker: SatrecArray propagation of a time slice, then sieve each step; Pool(4) over slices |
sim.py · group_encounters |
merges consecutive hits of a pair into one encounter, flags co-orbiting pairs |
sim.py · refine_2body |
vectorised 2nd-order Newton TCA for all encounters |
sim.py · refine_tca |
Brent TCA on the exact SGP4 separation (sub-km events, synthetic test) |
sim.py · cov_eci, encounter_plane, pc_circle |
covariance assumption → encounter plane → 2-D Pc quadrature |
sim.py · verify_*, convergence_check, node_crosscheck |
the verification table above |
sim.py · export_js |
writes data.js (window.SAT_DATA: TLEs, metadata, top 170 conjunctions, Kessler bands, reference states) |
kessler.py · sbm_count, sbm_fragments |
NASA Standard Breakup Model (counts, size, A/M, Δv) |
kessler.py · fragment_orbits, decay_cloud, breakup_validation |
fragment clouds from Δv kicks; King-Hele decay; comparison with SATCAT history |
kessler.py · initial_state, spread_kernel, scenarios, run_mc |
shell Monte Carlo (collisions, drag, disposal, launches, ADR) |
figures.py |
the five PNGs |
crosscheck.mjs |
node: loads data.js + satellite.js, recomputes the reference states |
index.html |
the console: Three.js scene, keyframed SGP4 (satellite.js) with cubic Hermite interpolation, picking, search, conjunction list, timeline, encounter-plane SVG, Kessler chart |
How the browser keeps 18,677 objects at 60 fps: satellite.js SGP4 costs about 2 µs per object, so the whole catalogue takes about 40 ms, too slow to run every frame. The page propagates keyframes (every 60 to 300 s of sim time, depending on warp) and spreads the next keyframe's work over the frames in between. Each frame it evaluates a cubic Hermite spline from the positions and velocities at the two surrounding keyframes. Error is well under 1 km at 300 s spacing, and selected objects are always propagated exactly.
9. Simplifications & ceilings
- TLE accuracy (about 1 km) is the ceiling of everything in §6.2 and §6.3. Pc from TLEs is an indicator, not an operational number. Operators use CDMs from Space-Track (special-perturbations orbits plus real covariance) or their own GPS ephemerides.
# ponytail:fixed TLE covariance model. A single RTN σ law for all objects: no dependence on object type, tracking quality or drag uncertainty. The upgrade is covariance realism from OD, or CDM covariances.- 2-D short-encounter Pc assumes rectilinear relative motion through the encounter. Slow encounters (vrel < 0.1 km/s) are excluded instead of handled with 3-D/Monte Carlo Pc.
- TEME ≈ inertial. The globe is rotated by GMST only (no polar motion or equation-of-equinoxes corrections, which are below 100 m). The Sun direction uses a low-precision almanac formula.
- Manoeuvres are invisible. Starlink satellites manoeuvre autonomously; a 24 h TLE forecast cannot know that.
- Kessler model: gas-kinetic mixing within 50 km shells (ignores constellation structure, so active-active collisions are overestimated). Mean static atmosphere (no solar cycle). A single effective B per species.
# ponytail:at most one shell per drag step (slow at 200 to 300 km).# ponytail:Poisson thinning in place of the multinomial fragment spread. No explosions, fragment-fragment collisions, disabling (non-lethal) hits or operator feedback. - Runtime scaling: the sieve is O(N log N) per step, but the 10 km encounter count grows about as N² in dense shells. At 60k satellites, expect about 10× the encounters.
10. Go further
- Real CDMs: register on Space-Track, pull the public CDMs for one day and compare their Pc with ours for the same pairs. How much does real covariance change the ranking?
- Solar-cycle drag: swap
atmosphere()for NRLMSISE-00 (pymsis) driven by historical F10.7. Does the Iridium-Cosmos survival curve now show the 2014 and 2024 steps? - Avoidance manoeuvre: for the top event, compute the smallest along-track Δv (hours before TCA) that raises the miss to 1 km or drops Pc below 1e-6. Check it in GMAT or Orekit.
- 3-D / Monte Carlo Pc for slow Starlink-Starlink encounters (sample both covariances, propagate, count hits). Compare with NASA CARA's open-source tools.
- Rebuild it in industry tools: redo the screening in STK Advanced CAT or the Orekit event detectors, and the globe in CesiumJS with CZML exported from
sim.py. Rerun the Kessler scenarios in MOCAT-SSEM and compare the runaway thresholds.
11. References
- Vallado, Crawford, Hujsak, Kelso (2006). Revisiting Spacetrack Report #3, AIAA 2006-6753. The SGP4 used by both python-sgp4 and satellite.js.
- Hoots & Roehrich (1980). Spacetrack Report No. 3: Models for Propagation of NORAD Element Sets.
- Vallado (2013). Fundamentals of Astrodynamics and Applications, 4th ed. (Table 8-4 exponential atmosphere).
- Foster & Estes (1992). A parametric analysis of orbital debris collision probability and maneuver rate for space vehicles, NASA JSC-25898.
- Alfano (2005). Relating position uncertainty to maximum conjunction probability, J. Astronaut. Sci. 53(2).
- Chan (2008). Spacecraft Collision Probability, Aerospace Press.
- Flohrer, Krag, Klinkrad (2008). Assessment and categorization of TLE orbit errors for the US SSN catalogue, AMOS Conference.
- Hoots, Crawford, Roehrich (1984). An analytic method to determine future close approaches between satellites, Celest. Mech. 33 (the classic screening filters).
- Johnson, Krisko, Liou, Anz-Meador (2001). NASA's new breakup model of EVOLVE 4.0, Adv. Space Res. 28(9).
- King-Hele (1987). Satellite Orbits in an Atmosphere: Theory and Applications.
- Kessler & Cour-Palais (1978). Collision frequency of artificial satellites: the creation of a debris belt, JGR 83(A6).
- Liou & Johnson (2006). Risks in space from orbiting debris, Science 311.
- D'Ambrosio, Lifson, Linares (2022). The capacity of low Earth orbit computed using source-sink modeling (MOCAT-SSEM), arXiv:2206.05345.
- NASA CARA (2020). Conjunction Assessment Risk Analysis Best Practices Handbook.
- Data: CelesTrak GP & SATCAT (T.S. Kelso); textures: NASA Blue Marble / Black Marble via the three-globe examples.