Engineering · Control

Command is a guess
until something
checks.

A stepper told to advance two hundred steps advances two hundred steps, unless something stops it — in which case it does not, and nothing in the system finds out. Every axis of the PDK is closed on an absolute encoder, so the difference between where the platform was told to be and where it actually is exists as a number the controller acts on.

The encoder feedback path drawn as a loop: commanded position, measured position, and the error between them.

Three nested loops

Each one checks the layer beneath it.

They run at different rates for a reason: the inner loop has to be faster than the thing it corrects, and the outer loops have less to do per cycle but more to reason about.

The three nested control loops in the PDK and their internal rates
LoopRate (internal)What it compares
Drive, per motor8 kHzCommanded position and current against the encoder reading, on the same 125 µs cycle
Inverse kinematics3.3 kHzThe requested platform pose against the six leg targets that would produce it
Command stream1 kHzPose commands out over CAN at 2 Mbaud — each command returns that axis's encoder position with it
How we know this
  • 8 kHz drive loop, from the drive firmware timer ARK drive firmware source
  • 3.3 kHz inverse kinematics recorded as canonical ARK engineering record
  • Feedback is send-on-send, per command — not a 250 Hz cyclic report ARK engineering record

Why it matters here

A platform under a person is not a plotter.

The load changes

Riders differ by tens of kilograms, sit differently, and shift while driving. An open-loop system is calibrated for one load and wrong for every other. A closed loop simply measures what happened and corrects.

Six legs must agree

The legs are rigidly coupled through the platform. If one runs behind, the others are fighting it through the structure. Closing each leg individually is what keeps a disagreement from becoming a force.

Faults become visible

A closed loop produces an error signal continuously. A persistent error is a fault the machine can detect and act on — an open-loop system has no way to know it is wrong.

The boundary

A loop only knows what its sensor tells it.

Closing the loop on the motor shaft closes it on the motor shaft. Anything that happens after that point — compliance in a joint, a gap in a transmission, flex in the frame — is outside the loop. The controller will report that the shaft is exactly where it was asked to be, and it will be right, and the platform can still be somewhere else. This is why the architecture matters as much as the control: removing the transmission is what makes the shaft a good proxy for the load.

A faster loop is also not automatically a better one. Rate sets the ceiling on how quickly a disturbance can be answered; the answer's quality depends on the tuning, and an aggressive loop on a compliant structure oscillates rather than settles. The numbers on this page describe how often the machine gets to correct itself, not how well it does it.

And no loop rate anywhere in this machine is a rate your PC will see. These are internal figures. The game supplies data at its own cadence — typically 60 Hz — and nothing downstream can invent detail that was never sent.

A diagram headed “The Two-Tier Control Loop”. The motor loop runs at 8 kHz, every 125 microseconds, closing current and position on each drive. The platform loop runs at 1 kHz, reading all six motor encoders and sending new position targets to the three ARK Drive controllers over CAN. Both rates are internal to the platform.
Two loops, two rates — both internal to the machine

Keep reading

Field-oriented control

What the innermost loop is actually computing, 8,000 times a second per motor.

21-bit encoders

The sensor every one of these loops depends on.

Latency

The same path measured in time rather than in loops.