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.