Φferromotion · textbook · chapter 13 rust → wasm · on-device
A platform hung from a few cables can move faster and reach farther than any jointed arm — but a cable can only pull, never push. Holding it steady means finding a set of tensions that are all positive and all within limits, and this page finds them on your device with the same Rust code the native tools use.
Cable-driven parallel robots — camera rigs over a stadium, giant 3D printers, rehabilitation supports — trade rigid links for lightweight cables spooled from fixed anchors. That makes them fast and huge, but it comes with a hard constraint: a cable cannot push. Every cable must stay taut, its tension between a floor (so it never goes slack) and a ceiling (so the motor and cable survive). Holding the platform is a question of whether such tensions exist at all.
To keep every cable able to pull, these robots use more cables than the platform has degrees of freedom. That makes the tensions non-unique — many combinations produce the same supporting wrench — so the controller must choose one that keeps them all comfortably in range. The clean choice is the tension nearest the middle of each cable's limits that still balances the load exactly.
Below, a platform hangs from four cables against its own weight. Drag it around the frame; each cable's thickness shows its tension.
drag it toward a corner and watch a cable's tension collapse toward slack — that edge is the boundary of the workspace
Drag the platform toward a corner and one of the far cables loses tension — it would go slack, and the moment it does the platform is no longer controlled. The set of poses where a fully-taut, in-range distribution exists is the robot's wrench-feasible workspace, and its boundary is exactly where you feel a cable give out. Raise the weight and the workspace shrinks; the heavier the load, the smaller the region the cables can hold it in.
On load, this page hung the platform in the centre and solved for the holding tensions:
| a valid (all-taut, in-range) distribution exists? | … |
| largest cable tension | … |
| verdict | … |
The four tensions come out positive, within limits, and balance the weight exactly — the equilibrium residual is machine-zero by construction. There is one subtlety the model is honest about: at the perfectly centred, unrotated pose the cables pull straight along their own moment arms, so the platform has plenty of force authority but no torque authority at all — a wrench that twists it cannot be balanced there until it rotates even slightly.
A pull-only mechanism can be fast, light, and enormous — and its reachable, controllable region is precisely the set of poses where some all-positive, in-range tension distribution balances the load. Find that distribution, and check it exists.
Cable robots close out this series on a different note than the rigid and soft chapters: here the governing question is not a single stability margin but the feasibility of a pull, a small least-squares projection wrapped in a bounds check. It is the same shape of answer, though — turn a control problem into a place where the solution is forced and then simply read off whether it lands in the allowed set. Fast, light, and reaching far, cable robots are physical AI built from tension alone.
What you just drove: the Cdpr tension distribution from ferromotion-control, compiled to WebAssembly — the same code the native tools link against. Each drag rebuilds the structure matrix at the new pose and projects the mid-range tension onto the wrench-equilibrium set; nothing precomputed.
Verified in the library: the distribution balances the wrench exactly at a generic pose (‖Wt−w‖<1e-9); a centred platform holds a load with positive, symmetric tensions; the correction lies in row(W) — the nearest-to-mid property; an over-range wrench is flagged infeasible; and the centred symmetric config is torque-singular. Each is a test in cargo test, not a claim in prose. See also ch.11 — the robot that bends · the full textbook.
Institute for Physical AI · the Rust library · crates.io