Skip to main content
Tests the teleop filter stack by feeding it a known-dirty stream and checking what comes out — no robot, no VR headset, and exactly reproducible. A clean joint-space signal (a synthetic sine, or a committed reference motion) is corrupted and replayed through the production smoothing chain at the production rates. For the hardware version — the same noise injection and filter stack, but actually driving the arms and scoring the measured positions — use tune.motion --noise/--filter, which is also where the diagnostics dashboard runs it. The production pipeline is:
--noise picks the source under test, and each source is injected at its real entry point — which is what makes the two testable independently:
  • network — transport artifacts injected before the pose low-pass, so the whole stack gets to clean them: jitter (white noise on every sample — hand tremor, sensor noise), outliers (isolated teleported samples — tracking glitches), and stalls (the stream freezes on its last sample, then jumps to catch up — wifi stalls, dropped frames).
  • ik — solver artifacts injected between the low-pass and the EMA, exactly where the solver sits in production, so only the EMA and the trapezoid can see them (the pose filter never gets a chance, same as on the real robot): band-limited 3–20 Hz per-joint churn (a restless null space — the scale diag.offline kinematics measures on real recordings) and persistent jumps (a redundancy flip: one joint steps to another solution branch for 0.3–1 s, then returns).
  • combined (default) — both at once, each at its own injection point: the full production insult.
The output is scored against the clean reference, per joint: the stack should track the intentional motion while removing what was injected. The noise is seeded, and the network and IK streams are seeded independently — the same seed gives the identical network noise with or without IK noise on top, so mode-to-mode comparisons are apples to apples. Change a filter parameter (e.g. --cutoff), rerun, and compare scores on the exact same input.

Reading the scorecard

One caveat when reading: while the stream is stalled the clean reference keeps moving, so error during a stall is missing information, not filter failure. What the filter owns is the catch-up — resuming without overshoot or an acceleration spike.