This is the full dataset behind Your Servo Is Lying To You — every plot the MATLAB analysis toolkit produced for all nine units, not just the handful that made it into the article itself. Laid out the same way the toolkit itself lays it out: one figure per servo family, one subplot per unit. Same ground truth, same 55,029 trials, just the unabridged version for anyone who wants a specific unit’s own curve rather than the pooled numbers.

One methodology note that applies throughout: a couple of the raw naive-sweep traces below have a real, reproducible glitch right near their low-pulse edge — a wrap/backoff artifact, not a fabricated data point — and are cleaned the same way the MATLAB toolkit itself cleans them (drops a non-monotonic tail once the sweep’s direction sustainedly reverses). Nothing is smoothed or adjusted beyond that; every curve here is the servo’s own measured response.

A caveat added after this page first went up: every unit’s maximum pulse below was capped by a firmware bug, not each servo’s real mechanical limit — the range-finding firmware’s pulse ceiling was set to a value the AVR Servo library’s own pulse encoding silently overflows, clamping every commanded pulse above ~2076µs down to exactly 2076µs. It’s visible in hindsight: every one of the nine units below reports a max pulse within a few dozen microseconds of 2076, regardless of family or gear ratio — not what nine independent mechanical limits should look like. Re-running two of the nine units (Miuzei unit 3, MG90D unit 3) on the fixed firmware found real ranges far wider than shown here — 313° and 308° respectively, against the 236.2° and 229.8° this page still shows for them — and re-ran the article’s core comparison (naive linear vs. N-point table) across that full corrected range on both: same result, naive still clearly worst, returns still diminish past ~10–20 points. The article’s central finding held up under the real range; the specific range/stroke numbers on this page did not, and are being corrected unit by unit. First correction applied: Miuzei unit 3’s range-finding chart below now reflects the real, fixed-firmware measurement (313.1°, 325–2655µs). Its calibration, accuracy, and error-by-angle charts further down this page — and every chart for every other unit — still show the original, capped numbers pending the same correction.

Range-finding: naive vs. coarse vs. fine

Three passes finding the same physical limit, overlaid: a dead-simple naive sweep (dashed, amber), the smart algorithm’s fast coarse pass (dotted, amber), and its slow, precise fine pass (solid, blue) — what every other number in this study is built on. The two markers show the smart algorithm’s final reported edges. Angle is normalized so 0° sits at the low-pulse edge.

Miuzei 25kg Servo

Unit 1 -23° 70° 163° 256° 340 2150

Unit 1: 232.8° stroke (345–2080µs).

Unit 2 -24° 71° 166° 262° 335 2100

Unit 2: 237.7° stroke (340–2080µs).

Unit 3 -31° 94° 219° 344° 315 2700

Unit 3: 313.1° stroke (325–2655µs) — corrected 2026-08-25, see note above.

Knockoff MG996R

Unit 1 -17° 48° 113° 177° 300 2150

Unit 1: 160.2° stroke (350–2065µs).

Unit 2 -18° 46° 110° 174° 300 2100

Unit 2: 148.0° stroke (370–1975µs).

Unit 3 -17° 47° 111° 175° 300 2150

Unit 3: 158.7° stroke (355–2075µs).

MG90D

Unit 1 -24° 73° 169° 266° 250 2150

Unit 1: 241.6° stroke (265–2075µs).

Unit 2 -40° 59° 157° 256° 250 2150

Unit 2: 230.4° stroke (330–2075µs).

Unit 3 -34° 63° 159° 255° 250 2150

Unit 3: 229.8° stroke (340–2075µs).

Calibration curve and hysteresis

Top: the direction-averaged fine sweep (solid line) that becomes each unit’s ground truth, with a shaded band showing how far the up-sweep and down-sweep disagree at the same commanded pulse — backlash, which no static lookup table can correct. Bottom: that same curve’s local slope (degrees per microsecond) — the raw point-to-point rate (faint), smoothed to cancel out encoder-quantization noise (bold blue), against the curve’s single overall best-fit slope (dashed). Where the smoothed line drifts away from the dashed reference is exactly where the curve bows away from a straight line — the thing a 2-point linear model can’t see and a lookup table exists to fix.

Miuzei 25kg Servo

Unit 1 -19° 71° 162° 252° 345 2080 Unit 1 — local slope (°/µs) -0.001 0.097 0.195 345 2080

Unit 1: 348 points, mean backlash 0.989°, worst-case 1.760°.

Unit 2 -19° 73° 165° 257° 340 2080 Unit 2 — local slope (°/µs) -0.025 0.100 0.226 340 2080

Unit 2: 349 points, mean backlash 1.067°, worst-case 2.460°.

Unit 3 -19° 72° 164° 255° 325 2075 Unit 3 — local slope (°/µs) 0.038 0.117 0.196 325 2075

Unit 3: 351 points, mean backlash 1.442°, worst-case 2.110°.

Knockoff MG996R

Unit 1 -13° 49° 111° 173° 350 2065 Unit 1 — local slope (°/µs) 0.014 0.081 0.149 350 2065

Unit 1: 344 points, mean backlash 1.077°, worst-case 2.020°.

Unit 2 -12° 45° 102° 160° 370 1975 Unit 2 — local slope (°/µs) 0.032 0.090 0.148 370 1975

Unit 2: 322 points, mean backlash 1.233°, worst-case 1.930°.

Unit 3 -13° 49° 110° 172° 355 2075 Unit 3 — local slope (°/µs) 0.022 0.088 0.153 355 2075

Unit 3: 345 points, mean backlash 0.779°, worst-case 1.580°.

MG90D

Unit 1 -20° 74° 167° 260° 265 2075 Unit 1 — local slope (°/µs) 0.026 0.121 0.216 265 2075

Unit 1: 363 points, mean backlash 1.311°, worst-case 2.720°.

Unit 2 -19° 71° 160° 249° 330 2075 Unit 2 — local slope (°/µs) 0.024 0.123 0.221 330 2075

Unit 2: 350 points, mean backlash 1.245°, worst-case 2.810°.

Unit 3 -19° 70° 160° 249° 340 2075 Unit 3 — local slope (°/µs) 0.009 0.121 0.233 340 2075

Unit 3: 348 points, mean backlash 1.437°, worst-case 3.250°.

Accuracy by model

Top: every trial’s signed error (actual minus target), one box per model — box spans the middle 50% of trials, the line inside is the median, whiskers reach to the most extreme trial within 1.5× that spread, dots beyond that are outliers. Bottom: the same data collapsed to one number per model, mean |error|. All six models, each its own color — this is where diminishing returns actually shows up: table10 through table50 cluster together and barely move, while linear2 sits well apart from all of them.

linear2table10table20table30table40table50

Miuzei 25kg Servo

Unit 1 — error distribution -2.4° 0.0° 4.2° lin2 t10 t20 t30 t40 t50 Unit 1 — mean |error| 0.00 0.68 1.36 lin2 t10 t20 t30 t40 t50

Unit 1.

Unit 2 — error distribution -2.6° 0.0° 3.2° lin2 t10 t20 t30 t40 t50 Unit 2 — mean |error| 0.00 0.48 0.95 lin2 t10 t20 t30 t40 t50

Unit 2.

Unit 3 — error distribution -3.9° 0.0° 2.8° lin2 t10 t20 t30 t40 t50 Unit 3 — mean |error| 0.00 0.47 0.94 lin2 t10 t20 t30 t40 t50

Unit 3.

Knockoff MG996R

Unit 1 — error distribution -1.5° 0.0° 3.5° lin2 t10 t20 t30 t40 t50 Unit 1 — mean |error| 0.00 0.89 1.77 lin2 t10 t20 t30 t40 t50

Unit 1.

Unit 2 — error distribution -2.2° 0.0° 1.3° lin2 t10 t20 t30 t40 t50 Unit 2 — mean |error| 0.00 0.73 1.45 lin2 t10 t20 t30 t40 t50

Unit 2.

Unit 3 — error distribution -1.1° 0.0° 2.4° lin2 t10 t20 t30 t40 t50 Unit 3 — mean |error| 0.00 0.55 1.11 lin2 t10 t20 t30 t40 t50

Unit 3.

MG90D

Unit 1 — error distribution -3.2° 0.0° 2.4° lin2 t10 t20 t30 t40 t50 Unit 1 — mean |error| 0.00 0.70 1.41 lin2 t10 t20 t30 t40 t50

Unit 1.

Unit 2 — error distribution -1.4° 0.0° 6.2° lin2 t10 t20 t30 t40 t50 Unit 2 — mean |error| 0.00 1.72 3.44 lin2 t10 t20 t30 t40 t50

Unit 2.

Unit 3 — error distribution -2.9° 0.0° 4.7° lin2 t10 t20 t30 t40 t50 Unit 3 — mean |error| 0.00 1.26 2.53 lin2 t10 t20 t30 t40 t50

Unit 3.

Error by target angle

Mean |error| binned into ten deciles across this unit’s own commanded-angle range, all six models — shows where in the range a model is worst, which a single aggregate number hides. linear2 is drawn heavier since it’s the point of comparison; the five table sizes usually sit close enough to overlap, which is the same diminishing-returns story as the section above, just plotted against angle instead of trial count.

linear2table10table20table30table40table50

Miuzei 25kg Servo

Unit 1 0.0° 1.1° 2.2° -27° 183°

Unit 1 — all six models.

Unit 2 0.0° 0.7° 1.3° -120° 93°

Unit 2 — all six models.

Unit 3 0.0° 0.9° 1.8° -134° 78°

Unit 3 — all six models.

Knockoff MG996R

Unit 1 0.0° 1.6° 3.2° 148° 292°

Unit 1 — all six models.

Unit 2 0.0° 1.0° 2.0° 255° 388°

Unit 2 — all six models.

Unit 3 0.0° 1.0° 2.1° 152° 295°

Unit 3 — all six models.

MG90D

Unit 1 0.0° 1.4° 2.7° -62° 155°

Unit 1 — all six models.

Unit 2 0.0° 3.1° 6.2° 139° 346°

Unit 2 — all six models.

Unit 3 0.0° 2.0° 4.1° 158° 345°

Unit 3 — all six models.