Why a pendulum tuned to 84.4 minutes cannot tell that its vehicle is accelerating — and why that one fact makes inertial navigation possible.
Six interactive modules that build the idea from first principles. Everything is simulated live from the equations of motion, not illustrated.
A held acceleration. The 1 m pendulum (amber) swings out to 5.8° and parks there for the whole manoeuvre — it is measuring acceleration, not gravity. The pendulum one Earth radius long (mint) does not move at all.
Hang a pendulum of length l from a pivot that rides along the surface of a spherical Earth of
radius R. Let λ be the pivot's angular position about the Earth's centre and θ the rod's tilt
away from the local vertical at the pivot. Projecting Newton's law perpendicular to the rod
gives the exact equation of motion
l·θ̈ = (R·cos θ − l)·λ̈ + R·λ̇²·sin θ − g·sin θ
and for small tilts that collapses to
l·θ̈ + g·θ = (R − l)·λ̈
Everything the vehicle does sits on the right, multiplied by (R − l). Choose l = R and that
term is identically zero: the pendulum becomes deaf to acceleration, at any amplitude and any
frequency. What remains is an unforced oscillator with
ω = √(g/R) = 1.2407e-3 rad/s T = 2π√(R/g) = 84.4 minutes
The picture that makes it click: a pendulum of length R has its bob at the centre of the Earth.
Slide the pivot anywhere along the surface and the rod still runs from the surface to the centre,
which is exactly what "local vertical" means. It never has to swing.
Module 2. Hold the rod vertical and the bob must sit at distance R − l from the centre, so as
the vehicle drives it traces a circle of radius |R − l|. Following that circle requires sideways
acceleration, which requires tilt. At l = R the circle collapses to a point that never moves.
Module 3. Steady tilt per unit acceleration plunges through six decades at l = R. A 1 m pendulum
and a 100 km pendulum are equally useless as vertical references — the curve only does anything
interesting in the last decade before R.
The surprise is the tuning budget. Sensitivity goes as the fractional mistuning, so arcsecond-class performance needs the effective length correct to about 300 m out of 6371 km. That is why the idea is buildable: you never make the lever arm, you make a gain.
Module 4. Integrate the accelerometers and torque the platform at k·δv. The error dynamics come
out as φ̈ + (g·k)·φ = a·(1/R − k) − b·k — the pendulum equation with the loop gain k standing in
for 1/l.
Setting k = 1/R zeroes the acceleration term and fixes the natural period at 84.4 minutes: one
condition, both prizes. That is the whole reason an inertial navigator works. Dead reckoning means
integrating twice, so any constant error should grow without bound — and it does, as t² and t³,
if the loop is open. Schuler tuning converts that runaway into a bounded 84.4-minute oscillation,
leaving only gyro drift as a straight ramp.
Module 5. A satellite in zero-altitude circular orbit, a frictionless train through any straight tunnel, and the Schuler pendulum. Three unrelated systems, one period, and they never drift apart.
An Earth-sized gravitating ball hands you exactly two numbers, a length R and an acceleration g.
There is only one way to combine them into a time, √(R/g), so any oscillator driven by the Earth's
own gravity across the Earth's own size has to land within 2π of 84.4 minutes.
Module 6. Ten steps from a weight on a stick to the Schuler condition, plus both limiting cases and an honest list of what a single-axis treatment leaves out.
npm install
npm run dev # http://localhost:5173Each module is directly linkable, on the live site too:
#lab ·
#centre ·
#null ·
#ins ·
#84 ·
#math
| Script | What it does |
|---|---|
npm run dev |
Vite dev server |
npm test |
physics test suite |
npm run typecheck |
tsc --build |
npm run lint |
oxlint |
npm run build |
production bundle |
npm run screenshots |
regenerates the images above (needs the dev server running) |
Every push to main runs lint, the physics tests and the build, then publishes to GitHub Pages.
The deploy sets BASE_PATH=/schuler-pendulum/; everywhere else the app builds for the root, so
dropping it on Vercel, Netlify or Cloudflare Pages needs no configuration at all.
The simulations integrate the equations above directly with fixed-step RK4, choosing a step that resolves the shortest active pendulum. Nothing is precomputed or faked, and the plots store a min/max pair per sample so a 2-second swing replayed at 400× shows a true envelope rather than an aliased line.
Two idealisations of gravity give an identical answer for the component perpendicular to the rod,
which is the only component that matters: a uniform field −g·r̂ along the local vertical at the
pivot, and the interior field of a uniform-density Earth −(g/R)·B. Both yield g·sin θ, so the
result does not hinge on which one you pick.
Deliberately left out, all of which module 6 discusses:
- Earth rate. This is a single-axis, non-rotating-Earth treatment. A real navigator also torques
for
Ω⊕, and Coriolis coupling between the two horizontal channels splits the Schuler oscillation and adds a 24-hour beat. - The vertical channel. Along the vertical the same feedback is unstable, with errors growing as
e^(ω·t). Altitude must come from elsewhere. - Ellipticity. The correct gain uses the local radii of curvature, which differ north–south and east–west by about 0.7 %.
src/lib/physics.test.ts checks the simulation against closed-form and textbook results rather than
against itself:
- The Schuler period is 84.4 min, and equals both a length-
Rpendulum's natural period and the period of a zero-altitude circular orbit. - A short pendulum settles at
atan(a/g)— it is an accelerometer — and shifts further asv²/Rsoftens gravity, matching an independent Newton solve of the steady state. - Steady tilt follows
(1 − l/R)·a/gacross lengths from10⁻⁶ Rto2 R, including the sign flip pastl = R. - A Schuler pendulum holds the vertical to better than 10⁻⁴ rad through 3 m/s² sustained acceleration and through a violent out-and-back journey.
- 100 µg of accelerometer bias gives a bounded 637 m position error; 0.01 °/h of gyro drift gives a
0.309 m/s ramp (≈0.6 nmi/h); an initial tilt
φ₀gives a boundedR·φ₀oscillation. - A tuned loop's position error is identical whether the vehicle is parked or manoeuvring hard.
- With no levelling feedback the same initial tilt grows as
g·φ₀·t²/2instead.
src/
lib/ physics, integrators and formatting, framework-free
pendulum.ts curved-Earth pendulum, exact EOM + RK4
ins.ts single-axis inertial navigator error model
drive.ts vehicle acceleration profiles
series.ts ring buffer storing min/max per sample, for honest envelopes
physics.test.ts
components/ Plot (streaming canvas), Chart (static XY), UI kit, KaTeX wrapper
views/ one file per module
scripts/
screenshots.mjs
src/lib has no React dependency, so PendulumWorld and InsWorld can be imported into a plain
Node script if you would rather poke at the numbers directly.
Max Schuler published the result in 1923 (Die Störung von Pendel- und Kreiselapparaten durch die Beschleunigung des Fahrzeuges, Physikalische Zeitschrift 24). Any modern text on inertial navigation covers Schuler tuning; Titterton & Weston, Strapdown Inertial Navigation Technology, is a good starting point for the full three-axis error model.
MIT





