Walker-Delta Constellation (space-systems/orbit-mechanics/walker-delta-constellation)
Use when the task is parameterizing a Walker-Delta constellation at the
conceptual level: validating the t/p/f triple, computing the plane and
slot geometry, and enumerating the full slot grid of a Walker-Delta
constellation such as the Galileo-class 24/3/1. This leaf implements the
standard Walker-Delta geometry model (t total satellites over p equally
spaced planes with phasing parameter f) in pure Python, stdlib only. It
pairs with space-systems/orbit-mechanics/satellite-coverage for the
single-satellite access side of a constellation and with
space-systems/orbit-mechanics/ground-track-repeat for repeat-cycle
context. It does NOT do single-sat access geometry, repeat-cycle
analysis, or empirical capacity studies of the deployed constellation;
those belong to sibling leaves.
Domain quick reference
- Walker-Delta notation: t total satellites, p orbital planes, f the
phasing parameter; s = t / p satellites per plane (t must be divisible
by p, f must be an integer in [0, p - 1]).
- RAAN spacing: planes are equally spaced in right ascension of the
ascending node, 360 / p degrees apart; plane j (0-based) sits at
RAAN = j * 360 / p.
- Mean anomaly spacing: within a plane the s slots are equally spaced,
360 / s degrees apart.
- Inter-plane phase: the phasing offset between adjacent planes is
f * 360 / t degrees; each plane's first slot carries that offset.
- Slot mean anomaly: slot k in plane j sits at (k * 360 / s + j * f *
360 / t) mod 360 degrees, so the constellation forms the characteristic
Walker-Delta diagonal pattern across planes.
- Slot ids are (plane_index, slot_index); the grid has exactly t slots
and t distinct (RAAN, mean anomaly) pairs.
- Identity checks: s * p == t; raan spacing * p == 360; mean anomaly
spacing * s == 360; inter-plane phase == f * 360 / t.
- Angles in degrees throughout; no module constants are needed, the
model is pure geometry.
- ECSS frames the space systems context; the relations above are
standard engineering methodology, summary-only.
Workflow
- Fix the constellation triple (t, p, f) and confirm it is physical
with validate_walker: positive t and p, t divisible by p, f in
[0, p - 1].
- Get the derived geometry with walker_parameters: satellites per
plane, RAAN spacing 360/p, mean anomaly spacing 360/s, and the
inter-plane phase f*360/t.
- Enumerate the constellation with walker_slots: t slot dicts, s per
plane, each with plane, slot, raan_deg = j * 360 / p and
mean_anomaly_deg = (k * 360 / s + j * f * 360 / t) mod 360.
- Confirm the grid is complete and unique with unique_slot_count,
which must return t.
- Run the deterministic contract test
scripts/test_walker_delta_constellation.py to confirm the model.
Worked example
Reference constellation: Walker-Delta 24/3/1 (24 satellites, 3 planes,
phasing parameter 1, the Galileo-class geometry). Real module outputs:
- walker_parameters(24, 3, 1): satellites_per_plane 8,
raan_spacing_deg 120.0, mean_anomaly_spacing_deg 45.0,
inter_plane_phase_deg 15.0.
- walker_slots(24, 3, 1): 24 slots, 8 per plane. Plane 0 slot 0 sits at
RAAN 0.0, MA 0.0; plane 1 slot 0 at RAAN 120.0, MA 15.0; plane 2 slot
0 at RAAN 240.0, MA 30.0. Slot 3 of plane 1, for example, sits at MA
(3 * 45.0 + 15.0) = 150.0 deg, giving the diagonal phasing pattern.
- unique_slot_count(24, 3, 1): 24 distinct (RAAN, MA) pairs.
- Variation: f = 2 gives inter_plane_phase_deg 30.0; the Galileo analog
27/3/1 gives inter_plane_phase_deg 13.333 and 9 satellites per plane
with RAAN spacing 120.0 and MA spacing 40.0.
- Identity spot check: 8 * 3 = 24 satellites, 120.0 * 3 = 360 deg of
RAAN sweep, 45.0 * 8 = 360 deg of in-plane MA sweep, and the phase
1 * 360 / 24 = 15.0 deg.
Verification
- Confirm validate_walker(24, 5, 1) raises ValueError (t not divisible
by p) and validate_walker(24, 3, 3) raises ValueError (f outside
[0, p - 1]); non-positive t or p also raise ValueError.
- Confirm walker_parameters(24, 3, 1) returns exactly
{satellites_per_plane: 8, raan_spacing_deg: 120.0,
mean_anomaly_spacing_deg: 45.0, inter_plane_phase_deg: 15.0} with the
documented dict keys.
- Confirm walker_slots(24, 3, 1) has 24 entries, that plane 1 slot 0
carries MA 15.0 and plane 2 slot 0 carries MA 30.0, and that all MAs
stay within [0, 360).
- Confirm the identities: satellites per plane times p equals t, RAAN
spacing times p equals 360, mean anomaly spacing times s equals 360,
and the phase equals f * 360 / t.
- Confirm walker_slots is deterministic (two calls return identical
lists) and unique_slot_count returns t for every valid triple.
- Run the contract test offline: python3
scripts/test_walker_delta_constellation.py (35 tests, deterministic).
Related leaves
- space-systems/orbit-mechanics/satellite-coverage: the single-satellite
access geometry side of a constellation, out of scope here.
- space-systems/orbit-mechanics/ground-track-repeat: repeat-cycle and
ground-track context for constellation design.
- space-systems/orbit-mechanics/sun-synchronous-inclination: the
inclination choice that fixes the plane geometry a Walker-Delta
pattern is laid over.
- space-systems/mission-design/launch-window-analysis and
space-systems/mission-design/mission-delta-v-budget: the deployment
and station-keeping loop that a Walker-Delta constellation feeds.
Pitfalls
- Reading t/p/f as three independent knobs: t must be divisible by p and
f is bounded to [0, p - 1], so triples like 24/5/1 or 24/3/3 are
rejected by validate_walker before any geometry is computed.
- Confusing the in-plane spacing with the phasing offset: the mean
anomaly spacing 360/s spaces the s slots within a plane, while the
inter-plane phase f*360/t shifts whole planes relative to each other;
quoting 45.0 deg as the phase of 24/3/1 when the true phase is 15.0
deg collapses the constellation into an un-phased stack.
- Forgetting the first-slot phase offset: each plane's first slot is not
at MA 0 but carries j * f * 360 / t (15.0 deg for plane 1 of 24/3/1),
which is what creates the diagonal Walker-Delta pattern.
- Summing angles without the modulo: slot mean anomalies are wrapped mod
360, so a slot whose raw offset exceeds 360 deg folds back into the
[0, 360) band.
- Dropping the RAAN dimension in uniqueness checks: slots are unique
(RAAN, MA) pairs; with f = 0 the MA repeats across planes and only the
distinct RAAN values keep the t slots unique.
- Treating the conceptual grid as a capacity model: this leaf produces
the t/p/f geometry and slot grid only; empirical capacity and access
studies of the deployed constellation belong to sibling leaves.
Behavior contract (gate 3)
Run the deterministic contract test (stdlib unittest, offline):
python3 scripts/test_walker_delta_constellation.py
The test covers the 24/3/1 worked example within 1e-9 (8 satellites per
plane, RAAN spacing 120.0 deg, MA spacing 45.0 deg, phase 15.0 deg),
the f = 2 phase of 30.0 and the 27/3/1 phase of 13.333 within 1e-3, the
slot grid enumeration (length t, s entries per plane, plane 1 slot 0 at
MA 15.0, plane 2 slot 0 at MA 30.0, MA wrapped into [0, 360)), the
uniqueness of the (RAAN, MA) pairs, the documented identities (s * p ==
t, RAAN spacing * p == 360, MA spacing * s == 360, phase == f * 360 /
t), dict key exactness, determinism, and ValueError rejection of
non-divisible t, out-of-range f and non-positive t or p.
Compliance
- Standards referenced, not reproduced: ECSS is a free ESA standards
family (ecss.nl/standards); the Walker-Delta relations above are
standard engineering methodology, summary-only per standards-map.yaml.
- compliance: STANDARDS-REF, gated: false.
1---2name: walker-delta-constellation3description: Use when you must parameterize a Walker-Delta constellation: validate the t/p/f triple (total satellites divisible by the plane count, phasing parameter within range), enumerate the planes and the slots per plane, compute the right ascension of ascending node spacing 360/p, the in-plane mean anomaly spacing 360/s with s = t/p satellites per plane, and the inter-plane phasing offset f*360/t, and produce the unique (RAAN, mean anomaly) slot list. Produces the satellites per plane, the RAAN spacing, the mean anomaly spacing, the inter-plane phase, and the enumerated slot grid. Trigger: walker delta constellation, t/p/f phasing, constellation plane spacing, inter-plane phasing, constellation slot enumeration, raan mean anomaly grid.4license: Apache-2.05---67# Walker-Delta Constellation (space-systems/orbit-mechanics/walker-delta-constellation)89Use when the task is parameterizing a Walker-Delta constellation at the10conceptual level: validating the t/p/f triple, computing the plane and11slot geometry, and enumerating the full slot grid of a Walker-Delta12constellation such as the Galileo-class 24/3/1. This leaf implements the13standard Walker-Delta geometry model (t total satellites over p equally14spaced planes with phasing parameter f) in pure Python, stdlib only. It15pairs with space-systems/orbit-mechanics/satellite-coverage for the16single-satellite access side of a constellation and with17space-systems/orbit-mechanics/ground-track-repeat for repeat-cycle18context. It does NOT do single-sat access geometry, repeat-cycle19analysis, or empirical capacity studies of the deployed constellation;20those belong to sibling leaves.2122## Domain quick reference2324- Walker-Delta notation: t total satellites, p orbital planes, f the25 phasing parameter; s = t / p satellites per plane (t must be divisible26 by p, f must be an integer in [0, p - 1]).27- RAAN spacing: planes are equally spaced in right ascension of the28 ascending node, 360 / p degrees apart; plane j (0-based) sits at29 RAAN = j * 360 / p.30- Mean anomaly spacing: within a plane the s slots are equally spaced,31 360 / s degrees apart.32- Inter-plane phase: the phasing offset between adjacent planes is33 f * 360 / t degrees; each plane's first slot carries that offset.34- Slot mean anomaly: slot k in plane j sits at (k * 360 / s + j * f *35 360 / t) mod 360 degrees, so the constellation forms the characteristic36 Walker-Delta diagonal pattern across planes.37- Slot ids are (plane_index, slot_index); the grid has exactly t slots38 and t distinct (RAAN, mean anomaly) pairs.39- Identity checks: s * p == t; raan spacing * p == 360; mean anomaly40 spacing * s == 360; inter-plane phase == f * 360 / t.41- Angles in degrees throughout; no module constants are needed, the42 model is pure geometry.43- ECSS frames the space systems context; the relations above are44 standard engineering methodology, summary-only.4546## Workflow47481. Fix the constellation triple (t, p, f) and confirm it is physical49 with validate_walker: positive t and p, t divisible by p, f in50 [0, p - 1].512. Get the derived geometry with walker_parameters: satellites per52 plane, RAAN spacing 360/p, mean anomaly spacing 360/s, and the53 inter-plane phase f*360/t.543. Enumerate the constellation with walker_slots: t slot dicts, s per55 plane, each with plane, slot, raan_deg = j * 360 / p and56 mean_anomaly_deg = (k * 360 / s + j * f * 360 / t) mod 360.574. Confirm the grid is complete and unique with unique_slot_count,58 which must return t.595. Run the deterministic contract test60 scripts/test_walker_delta_constellation.py to confirm the model.6162## Worked example6364Reference constellation: Walker-Delta 24/3/1 (24 satellites, 3 planes,65phasing parameter 1, the Galileo-class geometry). Real module outputs:6667- walker_parameters(24, 3, 1): satellites_per_plane 8,68 raan_spacing_deg 120.0, mean_anomaly_spacing_deg 45.0,69 inter_plane_phase_deg 15.0.70- walker_slots(24, 3, 1): 24 slots, 8 per plane. Plane 0 slot 0 sits at71 RAAN 0.0, MA 0.0; plane 1 slot 0 at RAAN 120.0, MA 15.0; plane 2 slot72 0 at RAAN 240.0, MA 30.0. Slot 3 of plane 1, for example, sits at MA73 (3 * 45.0 + 15.0) = 150.0 deg, giving the diagonal phasing pattern.74- unique_slot_count(24, 3, 1): 24 distinct (RAAN, MA) pairs.75- Variation: f = 2 gives inter_plane_phase_deg 30.0; the Galileo analog76 27/3/1 gives inter_plane_phase_deg 13.333 and 9 satellites per plane77 with RAAN spacing 120.0 and MA spacing 40.0.78- Identity spot check: 8 * 3 = 24 satellites, 120.0 * 3 = 360 deg of79 RAAN sweep, 45.0 * 8 = 360 deg of in-plane MA sweep, and the phase80 1 * 360 / 24 = 15.0 deg.8182## Verification8384- Confirm validate_walker(24, 5, 1) raises ValueError (t not divisible85 by p) and validate_walker(24, 3, 3) raises ValueError (f outside86 [0, p - 1]); non-positive t or p also raise ValueError.87- Confirm walker_parameters(24, 3, 1) returns exactly88 {satellites_per_plane: 8, raan_spacing_deg: 120.0,89 mean_anomaly_spacing_deg: 45.0, inter_plane_phase_deg: 15.0} with the90 documented dict keys.91- Confirm walker_slots(24, 3, 1) has 24 entries, that plane 1 slot 092 carries MA 15.0 and plane 2 slot 0 carries MA 30.0, and that all MAs93 stay within [0, 360).94- Confirm the identities: satellites per plane times p equals t, RAAN95 spacing times p equals 360, mean anomaly spacing times s equals 360,96 and the phase equals f * 360 / t.97- Confirm walker_slots is deterministic (two calls return identical98 lists) and unique_slot_count returns t for every valid triple.99- Run the contract test offline: python3100 scripts/test_walker_delta_constellation.py (35 tests, deterministic).101102## Related leaves103104- space-systems/orbit-mechanics/satellite-coverage: the single-satellite105 access geometry side of a constellation, out of scope here.106- space-systems/orbit-mechanics/ground-track-repeat: repeat-cycle and107 ground-track context for constellation design.108- space-systems/orbit-mechanics/sun-synchronous-inclination: the109 inclination choice that fixes the plane geometry a Walker-Delta110 pattern is laid over.111- space-systems/mission-design/launch-window-analysis and112 space-systems/mission-design/mission-delta-v-budget: the deployment113 and station-keeping loop that a Walker-Delta constellation feeds.114115## Pitfalls116117- Reading t/p/f as three independent knobs: t must be divisible by p and118 f is bounded to [0, p - 1], so triples like 24/5/1 or 24/3/3 are119 rejected by validate_walker before any geometry is computed.120- Confusing the in-plane spacing with the phasing offset: the mean121 anomaly spacing 360/s spaces the s slots within a plane, while the122 inter-plane phase f*360/t shifts whole planes relative to each other;123 quoting 45.0 deg as the phase of 24/3/1 when the true phase is 15.0124 deg collapses the constellation into an un-phased stack.125- Forgetting the first-slot phase offset: each plane's first slot is not126 at MA 0 but carries j * f * 360 / t (15.0 deg for plane 1 of 24/3/1),127 which is what creates the diagonal Walker-Delta pattern.128- Summing angles without the modulo: slot mean anomalies are wrapped mod129 360, so a slot whose raw offset exceeds 360 deg folds back into the130 [0, 360) band.131- Dropping the RAAN dimension in uniqueness checks: slots are unique132 (RAAN, MA) pairs; with f = 0 the MA repeats across planes and only the133 distinct RAAN values keep the t slots unique.134- Treating the conceptual grid as a capacity model: this leaf produces135 the t/p/f geometry and slot grid only; empirical capacity and access136 studies of the deployed constellation belong to sibling leaves.137138## Behavior contract (gate 3)139140Run the deterministic contract test (stdlib unittest, offline):141142 python3 scripts/test_walker_delta_constellation.py143144The test covers the 24/3/1 worked example within 1e-9 (8 satellites per145plane, RAAN spacing 120.0 deg, MA spacing 45.0 deg, phase 15.0 deg),146the f = 2 phase of 30.0 and the 27/3/1 phase of 13.333 within 1e-3, the147slot grid enumeration (length t, s entries per plane, plane 1 slot 0 at148MA 15.0, plane 2 slot 0 at MA 30.0, MA wrapped into [0, 360)), the149uniqueness of the (RAAN, MA) pairs, the documented identities (s * p ==150t, RAAN spacing * p == 360, MA spacing * s == 360, phase == f * 360 /151t), dict key exactness, determinism, and ValueError rejection of152non-divisible t, out-of-range f and non-positive t or p.153154## Compliance155156- Standards referenced, not reproduced: ECSS is a free ESA standards157 family (ecss.nl/standards); the Walker-Delta relations above are158 standard engineering methodology, summary-only per standards-map.yaml.159- compliance: STANDARDS-REF, gated: false.