What a Tumbling
Satellite Reveals About Itself

A spacecraft spins in deep space, far from any planet. No
thrusters, no gyroscopes, no control system keeping it pointing in the
right direction. For a few minutes, it tumbles freely — and from the way
it tumbles, you can read, in closed form, the distribution of its own
mass. This post is the story of how that works, and why the same
mathematical operation that reads a guitar string reads a
spacecraft.


Before we start: the real
JWST

The James Webb Space Telescope is at the Sun-Earth L2 point, roughly
1.5 million kilometres behind the Earth. It has a 6.5-metre primary
mirror built from 18 hexagonal gold-coated beryllium segments, a
five-layer sunshield the size of a tennis court, and an attitude control
system that keeps its pointing accurate to about 1 milliarcsecond — more
precise than any ground-based telescope.

Critically, JWST’s attitude control system includes reaction wheels,
fine-guidance sensors, and gyroscopes whose entire purpose is to
prevent the kind of uncontrolled tumbling we are about to
study. In normal operation, JWST never tumbles. It is extraordinarily
tightly controlled.

So why study the uncontrolled case?

Because understanding the natural dynamics of a rigid body — the
physics the control system is working against — is how you design the
control system in the first place. It is how you verify that the control
system is functioning after launch. And it is how you model what the
telescope would do if, for any reason, the control system were to fail
or be disabled. The uncontrolled rigid-body dynamics are always present
underneath. Stripping away the L2 orbital mechanics, the solar radiation
pressure, and the active control leaves the underlying machinery
visible.

That underlying machinery turns out to be surprisingly beautiful.


The thought
experiment: two bodies in deep space

We place two simplified spacecraft in free space — no Sun, no Earth,
no orbital mechanics. Just the two bodies and the equations of
motion.

Body A is JWST-like in its overall shape: a flat
sunshield at one end, a primary mirror assembly at the other, a
spacecraft bus and boom running between them. The numbers are
illustrative rather than exact specifications, but they capture the
essential geometry: total mass approximately 2450 kg,
principal moments of inertia in the body frame of diag(23322,
23322, 15384) kg·m²
. The boom runs along the z-axis, and I_zz =
15384 is smaller than I_xx = I_yy = 23322. The body is
elongated along the boom — technically, it is prolate,
in the same geometric sense as a pencil or a rugby ball. The ratio of
the two distinct principal moments is 23322 / 15384 =
1.52; this anisotropy ratio will be the quantity we
eventually read from the spectrum.

Body B is smaller — a probe with a short cylindrical
body and a dish antenna. Mass approximately 100 kg,
principal moments diag(29, 29, 5) kg·m². Body B is also
prolate, but considerably more so: its I_zz / I_xx ratio is
approximately 5.8.

We place Body A at the origin and Body B at a distance of 50
metres
along the x axis. At that separation, the gravitational
attraction between them is approximately 2 × 10⁻⁷ N —
not much more than the force a mosquito exerts on landing. The
gravity-gradient torque that each body’s mass distribution exerts on the
other’s rotation is approximately 6 × 10⁻¹⁰ N·m. Both
forces are very small; we will see precisely how small in a moment.

The interesting part is in the initial angular velocities. Body A
starts with ω = (0.02, 0, 0.08) rad/s expressed in its
own body frame: most of the spin is about the boom axis (ω_z = 0.08
rad/s), but there is a small perpendicular component along x (ω_x = 0.02
rad/s — 25% of the dominant spin). Body A is also tilted 0.3
radians
(approximately 17°) relative to the inertial frame from
the start, so its principal axes do not line up with the inertial
coordinate axes. Body B starts with ω = (0, 0.03, 0.08)
rad/s
— similar structure, with the perpendicular component
along y.

It is that small perpendicular component — 0.02 rad/s out of 0.08
rad/s — that everything interesting depends on.


Why the body talks to itself

Newton’s second law, F = ma, governs point particles. For rigid
bodies, the rotational analogue is Euler’s equation, written here in the
body’s own rotating reference frame:

$$I \cdot \frac{d\boldsymbol{\omega}}{dt} + \boldsymbol{\omega} \times (I \cdot \boldsymbol{\omega}) = \boldsymbol{\tau}$$

The quantity I is the body’s inertia tensor — a 3×3
matrix that encodes how the mass is distributed in three dimensions.
Written in the body frame, it is constant, because the body
does not change shape relative to itself. The τ on the
right is external torque; for now we set it to zero.

The important term is the middle one: ω × (I · ω).
Here is its geometric meaning. If ω points exactly along one of the
body’s principal axes — the special directions where the inertia tensor
acts as a simple scalar multiplier — then I · ω is parallel to ω, and
the cross product is zero. There is no self-torque. The body spins
steadily.

If ω has even a small component off a principal axis, however, then I
· ω points in a slightly different direction from ω. The cross product
is non-zero. The body exerts a torque on its own rotation — and so the
spin axis begins to drift. This is precession: not caused by any
external force, but by the body’s own internal geometry redirecting its
angular momentum. The inertia tensor is not a passive descriptor; it is
the cause of the motion’s structure.

For an expert in classical mechanics, this is Euler’s equations doing
their standard job. For our purposes here, the intuitive point is: a
rigid body spinning off its principal axis will always precess, at a
rate set by its shape. The body is speaking its own geometry out loud,
in the language of rotation.


The frequency of that
precession

For a body with axial symmetry (I_xx = I_yy, with I_zz different),
the Euler equations are solvable in closed form. The perpendicular
components of angular velocity oscillate at the Euler precession
frequency
:

$$\lambda_{\text{Euler}} = \frac{I_{zz} – I_{xx}}{I_{xx}} \cdot \omega_z$$

Each factor has a concrete physical meaning. The ratio (I_zz − I_xx)
/ I_xx is the fractional anisotropy of the body — it is positive for
oblate bodies (pumpkin-shaped, I_zz > I_xx) and negative for prolate
ones (pencil-shaped, I_zz < I_xx). The factor ω_z is the dominant
axial spin rate. Their product is the rate at which the perpendicular
component sweeps around the spin axis.

For Body A, with the numbers we have:

λ_A = (15384 − 23322) / 23322 × 0.08
    = −0.3404 × 0.08
    = −0.0272 rad/s

The negative sign means retrograde precession — the spin axis drifts
in the opposite sense to the rotation — which is correct for a prolate
body. The magnitude gives the precession period:

$$T = \frac{2\pi}{|\lambda|} \approx \mathbf{231\ \text{seconds}}$$

We have not simulated anything yet. This is a purely algebraic
prediction from the known mass distribution and the initial spin rate.
If Euler’s equations are correct — and they have been tested rather
thoroughly since 1765 — then the x-component of Body A’s angular
velocity should oscillate with a period of 231 seconds. That is the
prediction we will test.


We ran it

The simulation integrates the full two-body equations of motion —
rotational dynamics via quaternions plus gravity and gravity-gradient
torques — over 600 seconds of simulated time, sampling the state at
1-second intervals. The result is 601 data snapshots, each containing
positions, orientations, angular velocities, and conservation
diagnostics for both bodies.

The first thing to check is always conservation. In a closed system
with no external forces, total energy and total angular momentum are
exact invariants. If the numerical integrator is trustworthy, both
should stay constant to near machine precision. The diagnostics:

|dE / E_0| = 6.2 × 10⁻¹²
|dL / L_0| = 2.1 × 10⁻¹⁰

Both values are near the floor of 64-bit floating-point arithmetic.
The fourth-order Runge-Kutta integrator, running at an internal step of
0.05 seconds, is being honest about the physics. We proceed.

We now extract the quantity we want to analyze: ω_x(t), the
x-component of Body A’s angular velocity in its own body frame, at each
of the 601 time steps. This is the component that precesses — the
observable that carries the Euler frequency.

The 601-point time series spans 600 seconds with a
1-second sampling interval. Fourier transform bin spacing: 1/600 ≈
1.67 mHz. A single FFT operation later:

Peak frequency:    0.0050 Hz
Peak period:       200.00 s
Peak magnitude:    4.840e+00 (rad/s)

One clean peak. No harmonics, no noise floor, no broadened base that
would suggest damping on this timescale. The spectrum is
unambiguous.


The climax: prediction
meets measurement

We predicted 231 seconds. The FFT reports 200 seconds. These are
different numbers. But they agree — once you understand the geometry of
the discrete Fourier transform.

The FFT does not report arbitrary frequencies. Working from a
600-second observation window with 1-second sampling, it can only report
frequencies at integer multiples of its bin spacing (1.67 mHz). The
available periods near the predicted 231 s are: 600 s, 300 s,
200 s, 150 s, 120 s… The predicted period of 231 s sits
between the 300-s and 200-s bins. The nearer bin is 200 s.

The FFT peak correctly rounded to the nearest available bin. The
cross-diagnostic puts a number on this:

--- theoretical Euler precession (body A axisymmetric model) ---
  I_axial:           15384.0000 kg.m^2   (= I_zz)
  I_perp:            23322.0000 kg.m^2   (= I_xx = I_yy)
  omega_z (initial): 0.080000 rad/s
  lambda_Euler:      -0.027201 rad/s
  Theoretical freq:  0.0043 Hz
  Theoretical period:231.01 s

--- agreement check ---
  Bin offset (peak vs theory): 0.13 FFT bins
  Result: peak matches theory within FFT bin resolution. OK.

0.13 FFT bins. The measurement and the algebraic
prediction agree to better than one-seventh of the minimum resolvable
frequency difference. The small residual — 0.13 bins — has three
contributions: the bin quantisation itself (the dominant effect), the
tiny perturbation from the gravity-gradient torque, and integration
rounding. All three are far smaller than the bin width.

Now step back and notice what just happened. We predicted a physical
quantity — the precession period of a rigid body — from a formula
involving only the body’s mass distribution and its spin rate. We ran a
simulation of the actual dynamics. We applied the Fourier transform to
600 seconds of output. The measured value landed within 0.13 bins of the
prediction. The physical system did exactly what the equations said it
would do, and the Fourier transform read it.

There is something subtly different here from most signal-processing
applications. In a radar system (say), someone transmits a signal and we
observe how it returns. A frequency exists in the data because someone
put it there. Here, nobody imposed a 231-second oscillation from
outside. The precession at the Euler frequency is Body A’s natural
response to its initial conditions: started with a small
off-axis spin component, the body’s own internal geometry — the Euler
equations, the inertia tensor, the interplay of I_zz and I_xx — produces
a precession at the characteristic frequency. We are not measuring an
input; we are identifying a natural mode of the
dynamical system.

The DFT found it from 600 seconds of data. The prediction was pure
algebra. The body told us its own mass distribution, just by
tumbling.


The
gravity-gradient torque: small but present

The simulation includes the gravity-gradient torque throughout — the
tiny force that Body B’s mass distribution exerts on Body A’s rotation
across 50 metres of separation. At t = 600 s, it reads approximately
6.3 × 10⁻¹⁰ N·m. Body A’s rotational kinetic energy at
this point is approximately 54 J. For that torque to do
meaningful work on the spin, it would need to act for roughly
10¹¹ seconds — about three thousand years. In the
600-second window of this experiment, it is dynamically invisible.

It is not scientifically unimportant, however. At L2, where the Sun’s
and Earth’s gravity nearly cancel and the residual tidal environment is
very weak, a gravity-gradient torque from any extended nearby object can
become the primary attitude-disturbing mechanism — precisely
because everything else at L2 is also vanishingly small. The full story
requires months of integration, a realistic L2 halo-orbit tidal
potential, and a more complete dynamical model. What this first-cut
experiment establishes is that the pipeline — integrator, conservation
check, Fourier analysis, interpretation — works correctly. The platform
is sound. The small torque is there, traceable, available for analysis
at longer integration horizons.


What
this tells us: a reflection on mathematical agnosticism

The Fourier transform has appeared in every chapter of the guide this
post belongs to. It read the oscillator frequency from an oscilloscope
trace. It identified the harmonic overtones of an audio recording. It
located a bearing-fault signature in a vibration log. It extracted
target velocity from a radar Doppler return. And here, it read the
mass-distribution anisotropy of a spacecraft from 600 seconds of
body-frame angular velocity data.

The physics in each of these cases is genuinely different —
electromagnetic signals, propagating pressure waves, materials science
and tribology, Doppler reflection, rigid-body dynamics and tensor
algebra. None of these domains share much vocabulary; a practicing
engineer in one of them might have little professional contact with the
others.

And yet the same three lines of code work in all of them.

What the Fourier transform is actually doing, in each case, is asking
the same question of the data: at what frequencies does this signal
repeat?
The answer to that question connects directly to something
structurally important about the underlying physical system — the
natural frequencies of an oscillator, the harmonic series of a vibrating
string, the rotation rate of a defective bearing, the precession period
of a rigid spacecraft. The transform does not know what domain it is in.
It does not care whether the input came from a gyroscope or a microphone
or a pulsar timing array. It looks at the numbers and reports where the
periodicity lives.

The same algorithm that reads a guitar string also reads a spacecraft
— and also reads the timing residuals of a millisecond pulsar, the
spatial fluctuations in the cosmic microwave background, and the
gravitational-wave signal from a binary neutron star inspiral. These are
not four different tools that happen to share a name. They are four
instances of the same intellectual operation applied to four physical
systems that all share, at the mathematical level, the property of
having characteristic frequencies.

The universe does not have separate physics for music and radar and
spacecraft and cosmology. It has differential equations, those equations
have characteristic frequencies, and the Fourier transform is the
canonical instrument for reading those frequencies from any signal. That
this remains true across twelve orders of magnitude in frequency — from
the 4.3-millisecond precession of a spacecraft to the 13-billion-
year-old acoustic oscillations in the early universe — is, to our minds,
one of the more quietly remarkable facts about the mathematical
structure of the world.


For the technically curious

The full first-principles derivation — König’s decomposition of
kinetic energy, the inertia tensor built from the parallel-axis theorem,
the gravity-gradient torque via quadrupole multipole expansion — lives
in the canonical-tier documentation at lege-artis/jwst-l2-coupled-dynamics:

The Python code that produced the trajectory data in this post is at
experiments/jwst-l2-first-cut/run_first_example.py in the
same repository. Run it yourself; it produces the 601-point NDJSON
trajectory in about 3 seconds, and the cross-project Fourier diagnostic
at lege-artis/fourier
reads it immediately after.


References

  • H. Hughes, Spacecraft Attitude Dynamics, Wiley, 2004.
    §5.3 (gravity-gradient torque on a rigid spacecraft); §4 (inertia
    tensor, parallel-axis theorem, body-frame bookkeeping); §8
    (gravity-gradient stabilisation).

  • L. D. Landau and E. M. Lifshitz, Mechanics (Vol. I,
    Course of Theoretical Physics), 3rd ed., Pergamon, 1976. §32 (kinetic
    energy and Euler’s equations for a rigid body; torque-free symmetric
    top).

  • H. Goldstein, C. Poole, J. Safko, Classical Mechanics,
    3rd ed., Addison-Wesley,

    1. §5.3–§5.6 (Euler’s equations, principal-axis frame, torque-free
      motion).

For the technical reader

This post is based on the lege-artis/jwst-l2-coupled-dynamics
project: