A magazine-fed electromagnetic deployer that ejects unmodified CubeSats from a rideshare host at programmable velocity, the unserved regime between spring deployers (~2 m/s) and propulsive transfer vehicles (hundreds of m/s).
CubeSats flown as rideshare secondaries inherit the primary customer's orbit. The spring that ejects them adds 1-2 m/s, enough to drift clear, not enough to change an orbit. A satellite with no propulsion of its own is stuck there for life. VOLLEY replaces the spring with an ironless double-sided Halbach linear synchronous motor driving a reusable magnetic sled along a 1.5 m track. Twelve 3U CubeSats feed from two transverse cassettes and fire one at a time. The satellite is never modified, the magnets ride the sled, not the payload.
Feed, retention gate, 1.3 m of acceleration at 10.7 g, coast and trim, release at 1500 mm, regenerative braking over the next 240 mm, eddy brake, sled recovered for the next shot. Regeneration returns 296 J of the sled's 1291 J to the bank and the brake absorbs the remaining 952 J, so efficiency is quoted electrical-to-payload net of a 23 % sled-energy credit.
paper/make_animation.py imports motor_model.py rather than
reimplementing it).Every figure here is a script output, not a measurement. Two of them carry a genuine independent cross-check; everything else is single-sourced.
| Quantity | Value | Source |
|---|---|---|
| Thrust constant | 11.22 N per kA/m, ±1.26 % ripple | motor_model.py |
| Exit velocity, 3U | 16.54 m/s at 10.7 g | motor_model.py |
| Electrical to payload efficiency | 21.2 % | motor_model.py |
| Closed-loop dispersion | 0.027 m/s (3σ) to ±0.10 km apogee | motor_model.py |
| Orbital lifetime multiplier | x1.62 at mean activity, not invariant, P16 | astro.py |
| Constellation seeding, 30° | 1.4-6.9 days vs 25 by differential drag | astro.py |
| Dry / loaded mass | 76.9 kg / 124.9 kg | mass_properties.py |
| Recoil per shot | 66.1 N·s | astro.py |
| Track first mode | 109 Hz fixed-fixed (target >70) | sizing.py |
validation/A4_sled_structural.md before the structural analysis ran,
and the measurement landed in the ≥ 6.80 kg branch, "the headline changes and the paper
changes materially". A4 has since run and the drawn plate passes all three bands, so
nothing forces a lighter chassis. The scripts moved first, then the paper. Exit velocity is
down 19 % and efficiency from 32 % to 19 %, since taken back to 21.2 % by regeneration
(A11), but the lifetime multiplier fell only
x1.80 to x1.62, lifetime is a weak function of Δv, so the mission case survives better than
the machine spec. 9.445 kg is the as-drawn, unpocketed geometry and A4 reports a 17x stress
margin, so a rib-stiffened redesign would recover mass; nobody has designed one.
2881 J leaves the capacitor bank per shot, 296 J comes back through the
regenerative section, and 547 J of the net 2585 J reaches the payload — the 21.2 %.
Source sizing.py energy_closure; 100.0 % accounted.
This chart said "no regeneration credit" and put the sled's whole 1291 J in the brake until
2026-07-31. The 2025 decision behind that argued the motor cannot arrest the sled,
which it cannot — the brake still takes 952 J of every shot. It never argued that none
of the energy could be recovered, and A11 found 23 % of it available. The 86 J ESR bar has
its own history: no script modelled the bank's series resistance until 2026-07-30, so the
loss was real in hardware and absent from the accounting until a circuit simulation found
it.
Days to spread a constellation 30° apart. The differential-drag comparator is itself a model output, not a measurement, replacing it with published flown results is an open task.
GMAT R2022a, run headless with MSISE90 / 20x20 gravity / RK89, propagated to the 120 km floor at three solar-activity levels. The x1.80 lifetime multiplier of the day reproduces at mean and high activity. At low activity it does not, and the invariance the paper nominated as its defensible result is falsified. These runs were propagated at 20.37 m/s, before the measured sled mass moved the rated point to 16.54 m/s, the falsification survives, since a uniform density scale cannot move a ratio at any Δv, but the absolute numbers are historical (P19).
astro.py models
solar activity as a uniform multiplicative scale on density, and sweeping that scale over a
40x range moves the multiplier only 1.7992 to 1.7968. A uniform density factor
divides both lifetimes by the same number, so the ratio is invariant by construction of
the model. MSIS instead changes the shape of the density, altitude profile with F10.7,
the boosted orbit's apogee sits ~37 km higher, and the ratio then moves. Written up as
P16.Separately, over a bounded 30-day window the fitted decay rates are
−0.1618 km/day (GMAT) against −0.1216 km/day (astro.py), GMAT decays
1.33x faster. Reported SMA is osculating and its short-period variation runs 12.2 km peak
to peak, several times the decay across the window, so the comparison is a least-squares
rate over 31 daily samples rather than a difference of endpoints.
Two results have a genuine independent cross-check: the Halbach airgap field (analytic wave model vs magpylib, agreeing to three digits) and orbital decay (orbit-averaged Gauss vs an independent Cowell RK4, 99.4 %). Nothing has been validated by hardware, FEA, or third-party review. Each cross-check below carries an acceptance band declared before its run. Three have now been run, and one of the three failed , which is the point of declaring the band first.
| Analysis | Tool | Closes | Status |
|---|---|---|---|
| A1 airgap field | FEMM | E1, E2 | specified |
| A4 sled chassis | CalculiX ccx 2.21 | P5, P8 | run, all 3 bands pass |
| A5 lifetime & seeding | GMAT R2022a | E6, P16 | run, FAIL, invariance falsified |
| A6 conjunction Pc | NASA CARA | P1 | specified |
| A7 separation & tip-off | Project Chrono | E7 | specified |
| A8 pulse-power chain | ngspice | E17 | run, bands met, 2 findings |
Five scripts, two dependencies, roughly twelve minutes end to end.
Results land in analysis/results/*.json.
| Script | What it computes | Runtime |
|---|---|---|
verify_field.py | magpylib cross-check of the airgap field | ~10 s |
mass_properties.py | parametric mass rollup | instant |
motor_model.py | Kt, shot sim, closed-loop dispersion | ~2 min |
sizing.py | mechanical, thermal, electrical margins | instant |
astro.py | lifetime, seeding, conjunction | ~10 min |