Screening for conjunctions
What you will accomplish
A conjunction screen you can act on, and a clear view of which parts of the answer are geometry and which are assumptions you supplied.
Two things in this workflow produce alarming numbers that mean nothing. Both are shown here with real output.
Prerequisites
- A constellation.
- Optionally a TLE catalog to screen against.
Steps
Screen the fleet against itself
orbitforge conjunction screen \
--constellation ph1.json \
--duration-hours 24 --threshold-km 10 --step-seconds 60Screened 60 objects (all pairs) over 24.0 h: 0 events under 10 km.Screen against an external catalog
orbitforge conjunction screen \
--constellation ph1.json \
--catalog stations.tle \
--duration-hours 24 --threshold-km 10 --step-seconds 60A well-formed Walker does not conflict with itself
The intra-constellation screen returns nothing, and raising the threshold does not change that:
| Threshold | Events |
|---|---|
| 10 km | 0 |
| 50 km | 0 |
| 100 km | 0 |
| 200 km | 0 |
This is a real result, not a failure to look. A Walker pattern places satellites at uniform spacing within a plane and phases adjacent planes so that crossings do not coincide, so intra-constellation separations stay large by construction.
A screen that returns nothing is evidence the pattern is well formed. It is not evidence that the fleet is safe, because the risk is from objects you do not control.
Note also that conjunction screen has no --model flag. It does not accept
a propagation model the way simulate and coverage do, so plan the epoch
discipline for a TLE-derived fleet accordingly.
1042 events, none of them collisions
Screening a TLE-imported fleet against the catalog it came from:
Screened 24 objects vs 24 catalog entries over 24.0 h: 1042 events under 10 km.
iss-49271 / FREGAT DEB: TCA 2026-06-26T02:10:14Z miss 1.164 km at 0.00 km/s (RIC [-0.000, -1.164, -0.000])
iss-53239 / CSS (WENTIAN): TCA ... miss 1.374 km at 0.00 km/s
iss-53239 / TIANZHOU-10: TCA ... miss 1.375 km at 0.00 km/sEvery one of those 1042 events has a relative speed below 1.6 m/s. The maximum across the whole set is 0.0016 km/s.
A real crossing conjunction in low Earth orbit has a relative speed of several kilometers per second. Zero relative speed means the two objects are co-orbiting: either the same object appearing in both inputs, or genuinely co-located hardware such as modules and visiting vehicles at a space station.
Three signatures identify them, and all three are in the output:
- Relative speed near zero. The decisive one.
- Purely along-track separation. The cross-track component of the RIC offset comes out around a nanometer, which is numerically zero.
- The same pair repeating at the orbital period. The 1042 events come from only 64 distinct pairs, and the most frequent produced 17 events each over 24 hours, which is one per revolution.
The screen did exactly what it was asked. Filtering co-orbiting pairs is the analyst’s job, and the fastest filter is a minimum relative speed.
Collision probability is a statement about your covariance
Probability is only reported when you supply --ric-sigma-km:
orbitforge conjunction screen \
--constellation iss.json --catalog stations.tle \
--start 2026-06-25T19:29:47Z \
--duration-hours 2 --threshold-km 10 \
--hard-body-m 20 --ric-sigma-km 0.5,0.5,0.5A TLE contains no covariance. Whatever you pass to --ric-sigma-km came from
somewhere else, or from your imagination. The tool declines to invent one, which is
why probability is absent by default.
Holding the geometry fixed at a 1.164 km miss and varying only the assumed covariance:
| Assumed sigma | Probability |
|---|---|
| 0.05 km | 4.0e-60 |
| 0.10 km | 2.2e-17 |
| 0.25 km | 7.1e-6 |
| 0.45 km | 9.3e-5 |
| 0.55 km | 1.1e-4 |
| 1.0 km | 7.1e-5 |
| 2.0 km | 2.3e-5 |
| 10.0 km | 1.0e-6 |
Same encounter, same miss distance, and the probability spans 54 orders of magnitude.
Probability dilution
Read that table again and notice it is not monotonic. Probability peaks near a sigma of 0.55 km, roughly half the miss distance, and falls away on both sides.
- Small sigma. You know both orbits precisely, and you know they miss. Low probability, and genuinely reassuring.
- Large sigma. The probability mass is smeared across an enormous volume, so very little of it lands on the hard body. Low probability, and not reassuring at all.
This is probability dilution, and it is the trap in the table. A low number arising from poor tracking looks identical to a low number arising from good tracking.
Never quote a probability without the covariance that produced it. A Pc of 1e-6 at 10 km sigma means “we have no idea where these objects are”, which is the opposite of what the number appears to say.
Hard-body radius scales cleanly
Unlike covariance, this one behaves predictably. At a fixed 0.5 km sigma:
| Hard body | Probability |
|---|---|
| 5 m | 6.4e-6 |
| 10 m | 2.6e-5 |
| 20 m | 1.0e-4 |
| 50 m | 6.4e-4 |
| 100 m | 2.6e-3 |
Probability scales with the square of the radius, as an area should. Doubling from 10 to 20 m multiplies it by 4; going from 20 to 50 m multiplies it by 6.25.
That is a check you can run yourself, and it is worth running once on any tool before trusting its probabilities.
A workable procedure
- Screen at a generous threshold to see the population.
- Discard events below a minimum relative speed, which removes co-orbiting pairs and self-matches.
- Confirm your own satellites are not present in the catalog.
- For survivors, obtain a real covariance rather than assuming one.
- Compute probability across a range of plausible covariances and report the range, not a single value.
- Treat a low probability from a large covariance as a tracking problem, not a safety result.
Checklist
- Does the catalog contain your own satellites?
- Did you filter on relative speed?
- Is every probability quoted with the covariance behind it?
- Is the covariance measured or assumed, and does the reader know which?
- Is the hard-body radius realistic for both objects together?
Next steps
conjunction screenreference for the full flag set.- Import a real fleet for the epoch discipline TLE data requires.
main (pre-release)