Φferromotion · textbook · chapter 1 rust → wasm · on-device
A muscle rejects a disturbance before a nerve could carry the news. This chapter is about what that means for machines — and every number in it is computed on your device, right now, by the same Rust library the native tools use.
Perturb a robot joint and the usual story begins: a sensor reports, a controller computes, a motor responds. Every stage costs time. Animals are worse off — a spinal reflex takes roughly 30 ms to close, and anything routed through cortex is slower still. Yet a guinea fowl hits a hidden pothole mid-stride and simply keeps running. The recovery is over before the reflex signal has arrived.
So the leg cannot be waiting for instructions. Something in the tissue is already doing the work — and we can be precise about what.
A motor takes a command and produces a torque. A muscle produces force as a product of three things: how hard it is activated, how long it currently is, and how fast it is changing length. That last factor is the one that matters here.
drag across the curve — the dashed line is the slope
Drag along it and notice the slope is positive everywhere. Stretch the muscle faster and it pulls back harder; let it shorten and it gives way. Written down, that is ∂F/∂v > 0 — the definition of a damper.
Below, a 2 kg mass hangs on a Hill muscle pulling against a 300 N load. The activation is constant. There is no controller in this simulation at all — no feedback, no reflex, nothing reading the state and deciding anything. Drag the mass anywhere and let go. Kick it.
force-velocity ON — a muscle
It comes home and stays there. Now switch the force-velocity curve off — everything else identical, same stiffness, same activation, same load — and the mass rings like a bell and never stops. That single curve is the entire difference between a spring and a limb.
The obvious objection: fine, but a fast enough controller could deliver the same stiffness and damping. So let's grant it exactly that. We measure the muscle's real impedance at its operating point — stiffness … N/m and damping … N·s/m, taken by finite differences off the live model — and hand those very numbers to a neural controller driving the same mass against the same load.
Identical mechanical impedance. One difference: the controller acts on state from τ milliseconds ago.
Drag τ down. The neural loop holds only in a sliver near zero, marked τc on the slider. Past it the same impedance that stabilizes the muscle tears the mass apart, because a correction computed from stale state arrives pointing the wrong way and pumps energy in.
This is not a quirk of the simulation. It is the classical delay margin, and the page checks itself against it — bisecting for the critical delay in WebAssembly on load, then comparing with the analytic crossover of m·s² under (K + B·s)·e−sτ:
| critical delay — measured here, by bisection | … |
| critical delay — analytic delay margin | … |
| agreement | … |
| Hill's hyperbola residual, live | … |
A spinal reflex is that many times slower than the slowest delay this loop survives. The muscle's impedance is not merely easier to get from tissue than from a controller — it is not available to a neural loop at all.
This inverts the usual reading of morphological computation. The body is not helping the controller by taking some load off it. The body is doing something the controller cannot do, at any gain, with any tuning, because the delay forbids it. What the nervous system sends is not a correction but a setpoint — the activation level — and the mechanics resolve everything faster than the message could have returned.
For a machine the lesson is a design constraint rather than an inspiration. Rejecting disturbances at the millisecond scale is not a control problem you can solve with a faster loop or a better estimator. It is a decision that gets made when you choose the actuator. Series elasticity, tuned compliance, and the shape of a force-velocity curve are not padding around the real controller; at these timescales, they are the controller.
What you just drove: the HillMuscle from ferromotion-control, compiled to WebAssembly — the same code the native tools link against, not a reimplementation. Force-velocity follows Hill (1938); the model form follows Zajac (1989). Nothing here is precomputed: the impedance is measured off the model by finite differences, the critical delay is bisected in your browser, and the residual above is Hill's hyperbola checked live.
Verified in the library: Hill's hyperbola holds to 1e-12 · ∂F/∂v > 0 across the range · the force-velocity branches are C¹ at v=0 by construction · fixed activation reaches the same equilibrium from both position and velocity perturbations · the measured critical delay matches the analytic margin to under 2%. Each is a test in cargo test, not a claim in prose.
Institute for Physical AI · the Rust library · crates.io