Deterministic boot-time offset reconstruction for antagonistic tendon-driven joints
The problem
An antagonistic tendon-driven joint is controlled through motor-side positions that must be referenced to the joint: each motor's angle maps to the joint angle through a calibrated joint↔motor map, anchored by per-motor offsets established during calibration. The motors' multi-turn counters reset on power loss. The common workaround — re-running a tensioning calibration at every boot — has two costs: boot time, and anchor variance: each recalibration settles on a slightly different equilibrium (tendon friction/stiction), so the joint's reference frame shifts by a small, uncontrolled amount at every power cycle. That variance contaminates any cross-boot comparison and slowly degrades map fidelity.
The observation
Two absolute references survive a power cycle:
- the motor's single-turn absolute (magnetic) encoder position — only the turn count is lost, not the within-turn angle;
- the joint-side absolute encoder, which never loses its reference.
Through the calibrated map, the joint angle predicts the expected motor angle. The saved calibration anchor therefore differs from a freshly measured naive offset by — ideally — an integer number of motor turns.
The method
- One-time anchor. A tensioned calibration establishes per-motor offsets; they are persisted. This anchor is never re-measured at boot again.
- Same-state read (the key step). At boot, before measuring anything, the controller re-applies the same tension state used when the anchor was captured, and lets the drivetrain settle briefly. This eliminates the slack take-up term between the anchor's physical state and the boot measurement — a term that is otherwise not modelable, because at zero tension the motor's rest position inside the tendon slack band depends on how the system was last shut down (clean stop, emergency stop, manual handling), not on any constant of the mechanism.
- Lattice snap. Compute, per motor, the difference between the
freshly measured naive offset (measured motor angle minus map-expected motor angle
at the current joint pose) and the saved anchor. Round that difference to the
nearest whole motor turn:
k = round(delta / turn), whereturn = 360°/gear ratioat the output. - Fail-closed acceptance. Accept only if the residual
delta − k·turnis well inside the half-turn ambiguity window (a small fraction of ±turn/2), and the implied turn count is physically plausible. Otherwise reject and fall back to the full recalibration — the method never guesses. - Deterministic re-anchor. On acceptance, the applied offset is
saved anchor + k·turn— whole turns added to a bit-identical anchor. A verification re-read against the map closes the loop. The joint's reference frame is therefore identical across power cycles until the next explicit recalibration.
Properties
- Deterministic: the anchor is never re-measured, so recalibration stiction variance is eliminated from ordinary boots.
- Fail-closed: any ambiguity (residual near the half-turn boundary, implausible turn count, invalid sensor state) rejects into the trusted full recalibration.
- Shutdown-agnostic: because the read happens in the anchor's own tension state, the method is insensitive to how the system was previously powered down.
- Self-diagnosing: the reconstructed turn count doubles as an odometer of what happened while unpowered (e.g., it correctly measured a tendon that had been fully unwound and rewound by hand).
Evidence (bench, July 2026, single ankle joint, two antagonistic DOFs)
- Boot-time reference restoration in ~1.3 s vs ~4.6 s for the recalibration path, with the residuals observed between 0.03° and 4.5° against a ±18° ambiguity window, across clean shutdowns, emergency-stop shutdowns, and power-loss events.
- Recovery of a ten-full-turn counter loss (joint hand-swept while unpowered) with the turn count reconstructed exactly.
- Correct fail-closed rejection of a genuinely ambiguous state (residual mid-window after manual disturbance), falling back to full recalibration without operator intervention.
Why we are publishing this
We publish this method openly and deliberately so that it remains free for anyone to use — including us. This note is intended as prior art. Our firmware implementation of the method is currently part of our private development tree; the method itself, as described above, is sufficient for an independent implementation.