Vision Alignment Lab
Pivots, lever arms, and the "look — compute — move — look again" loop: play with the geometry until the math becomes obvious
Table top view (drag the cameras)
Yellow = the table (950×1000 mm). Red dashed lines = motor axis lines; T1/T2 = the pivots where the two Y motors push the table — they can only slide front-back along the red lines, never sideways. K1/K2 = two cameras (blue squares), each watching its own purple mark (two marks total). The X1/Y1, X2/Y2 values beside each camera = the four stored geometry legs (the camera's horizontal/vertical offset from its own pivot — the raw numbers the machine keeps). The purple lever arm r = camera to pivot midpoint, synthesized from the four legs when the pivot sits at the midpoint (not an aim line). Dragging a camera = the camera got moved during a changeover; the four legs change with it — time to re-calibrate.
1 · Push the axes, watch the marks move
Step:
(a calibration move is typically 2 mm)
K1 view (40×)
K2 view (40×)
Try: press Y1+ only (Y2 stays) → the table rotates about T2. Then drag K1 farther from T2 and press again — compare the Δ values.
Live calculation (refreshes on every axis move; every subtraction shown):
The two symbols in the camera views: + blue cross = the taught target position — the finish line; it never moves during alignment; ● purple dot = where the mark actually is in the camera right now — it moves with the table. Δ is which minus which: ΔX = dot's current X − cross's X
ΔY = dot's current Y − cross's Y
The cross sits where the dot was at teach time, so alignment success ⇔ Δ = 0 (inside the ±0.02 mm window counts as 0).
2 · Alignment experiment: what if the stored geometry is stale?
True distance, camera K1 to pivot midpoint: — mm (dragging K1 changes it)
Assumed distance D stored in the machine: mm
not calibrated
Initial offset (mark displacement seen by the camera): 1.5 mm
Target window: ±0.02 mm (entering it = alignment success)
The math of every alignment round (nothing skipped):
① camera reads residual δ (purple dot − blue cross)
② controller computes the angle command: θ = δ ÷ D_assumed
③ motors execute θ, but the table's true response is set by D_true:
actual correction = θ × D_true = δ × (D_true ÷ D_assumed)
④ new residual = δ − actual correction = δ × (1 − D_true ÷ D_assumed)
⑤ if |new residual| ≤ 0.02 mm → done; otherwise back to ① Live prediction for the current parameters: The factor k = 1 − D_true ÷ D_assumed decides the fate: k = 0 → done in one round; k negative (D_assumed too small) → overshoot and oscillate toward zero; k ≤ −1 (estimate way off) → diverges, abort.