📡

The Problem

How invisible encoder noise becomes visible robot jitter
signal processing robotics

Servo encoders have inherent noise of ±1–2 counts per reading. At 12-bit resolution (4096 counts/rev), that's ±0.09° — completely invisible on the arm itself.

In teleoperation between dissimilar robots, a conversion layer scales joint values from the leader's space into the follower's space. When the follower has finer-grained motors or different units, scale factors of 800–1100× are common. This turns invisible encoder noise into a real problem:

Noise amplification through the teleop pipeline — the conversion layer acts as a noise multiplier

At a typical 100Hz control rate, every noisy reading becomes a new position command. The result: constant vibration during precise tasks where the operator holds the leader arm still.

The noise is invisible where it originates (the leader's encoder) but devastating where it lands (the follower's end-effector). The conversion scaling acts as a noise amplifier.
🧮

The EMA Filter

Exponential moving average — one multiply-add, one float of state
filter math

An exponential moving average smooths a noisy signal by blending each new reading with the previous smoothed value:

α controls the responsiveness/smoothness trade-off. At α=1 the raw signal passes through unchanged. At α=0.1, each output is 90% memory and 10% new reading — strong smoothing.

The 95% settling time (how long to reach 95% of a step input):

The EMA requires one float of state per channel and one multiply-add per sample. No buffers, no FFT, no windowing. It's a first-order IIR filter with cutoff frequency fc = α · fs / (2π) — at α=0.1 and 100Hz, that's ~1.6Hz, which passes smooth operator intent and rejects high-frequency encoder noise.

The filter should be applied after the conversion layer, in the follower's joint space. Filtering before conversion would be in the wrong coordinate frame — the scaling factors would re-amplify any residual noise.
🎛️

EMA Playground

Adjust α and watch the noise vanish
interactive filter
Live EMA Filter Demo
α (alpha) 0.10
Noise amplitude 40
raw noisy signal    EMA filtered    true signal

Low α (0.05) produces smooth output that lags behind rapid changes. High α (0.8+) tracks closely but lets noise through. The sweet spot for teleoperation is 0.1–0.2.

📈

Tuning Guide

Step response, settling times, and choosing the right α
dynamics tuning
Step response for various α values — settling time shown at the 95% threshold
α Behavior 95% settling Use case
1.0 No filtering (passthrough) 0ms Disable filter
0.5 Light smoothing ~50ms Fast teleop, low noise
0.2 Moderate smoothing ~120ms General teleoperation
0.1 Strong smoothing ~230ms Precise tasks, high noise
0.05 Very heavy smoothing ~500ms Near-static positioning

At α=0.1 and 100Hz the filter averages over roughly the last 10 readings. That's enough to smooth ±2 count encoder noise without the operator feeling lag on deliberate movements. α=0.1 eliminated visible jitter during pick-place teleoperation without perceptible delay.

An operator reports the follower feels "sluggish." The current α is 0.05. What do you change?
α=0.05 has ~500ms settling time — too slow for fast tasks. Increase to α=0.2 (~120ms settling) for a good balance of smoothness and responsiveness. The right α depends on the noise level and the task: higher scaling factors or longer lever arms need more smoothing; fast manipulation needs less.