diff --git a/docs/superpowers/specs/2026-06-11-wide-angle-distortion-design.md b/docs/superpowers/specs/2026-06-11-wide-angle-distortion-design.md index a6b3fed..dfdf672 100644 --- a/docs/superpowers/specs/2026-06-11-wide-angle-distortion-design.md +++ b/docs/superpowers/specs/2026-06-11-wide-angle-distortion-design.md @@ -19,8 +19,8 @@ This is a **model** limitation, not a calibration-points problem. - Camera is **permanently fixed** relative to the bed → calibration is one-time and durable. - Correction strategy: **bend the overlay** to match the raw (curved) video. The camera image is left untouched (no per-frame image rectification). -- Calibration budget: **~8–12 points** jogged to known machine X/Y across the bed, - including near the corners (where distortion is worst). +- Calibration budget: **~12–16 points** jogged to known machine X/Y across the bed, + including near the corners (where distortion is worst). See *Calibration target* below. - Keep the existing overlay pipeline shape: `machine-mm → image-point` for drawing, and `image-point → machine-mm` for click-to-set-origin / drag-to-rotate. @@ -92,6 +92,32 @@ video click (px) → set work origin / rotation ``` +## Calibration target (practical procedure) + +A **box + "#"** drawn on the bed: lines at the thirds of each axis, i.e. +`x ∈ {0, ⅓, ⅔, 1}` and `y ∈ {0, ⅓, ⅔, 1}`. Their 16 intersections are the calibration +points — **12 on the perimeter** (4 corners + 2 per side) plus **4 interior crossings** at +the centre of the "#". Click all 16 in the feed. + +The 4 interior points matter: a polynomial constrained only on the boundary can wiggle in +the interior, so the centre crossings pin the fit where edge points can't. + +**Capture by jog-and-mark, not ruler-and-guess:** jog the spindle to each target +coordinate and mark at the tip, so the commanded machine coordinate is exact and the mark +sits exactly under the tip. Then click each mark in the video. + +For the 2440×1220 bed the 16 targets are every combination of: + +``` +X: 0 813.3 1626.7 2440 +Y: 0 406.7 813.3 1220 +``` + +Interior four: (813.3, 406.7), (1626.7, 406.7), (813.3, 813.3), (1626.7, 813.3). + +This 16-point spread also clears the degree-3 minimum, so escalating from degree 2 to 3 +needs no extra capture. + ## Migration The committed default calibration in `dist/config.json` is a homography and **will not