THE ITERATIVE CLOSEST POINT

Snap one point cloud onto another by matching then fitting, over and over. Match each source point to its nearest target point, solve the optimal rigid transform for those pairs in closed form, apply it, and repeat. The mean-square distance falls monotonically to a local minimum — this is how two scans become one map. Rendered, not quoted.

source Besl & McKay, A Method for Registration of 3-D Shapes (1992), IEEE Trans. PAMI 14(2):239–256 — doi:10.1109/34.121791
Blue Team · builds & defends
3THE MODELlit

ICP alternates two steps until the pose stops moving:

1 · match — for every source point, find its nearest target point (Euclidean). This guesses the correspondences.

2 · solve — with those pairs held fixed, the optimal rigid transform (R,t) is the closed-form orthogonal Procrustes / SVD solution: center both sets, correlate them, take the rotation, then t = q̄ − R·p̄.

Each step can only lower the mean-square distance, so the metric decreases monotonically to a fixed point.

amber Point-to-point here; point-to-plane converges in fewer iterations but needs surface normals.

5THE LINEAGElit

Besl & McKay 1992 turned nearest-neighbour matching plus the rigid Procrustes fit into an iteration — the standard way a fresh scan is registered against the last one.

Downstream neighbour: the pose-graph SLAM sphere (Smith & Cheeseman 1986) consumes these scan-to-scan rigid transforms as graph edges. ICP gives the relative pose; the back-end fuses the chain of poses into one consistent map. Rigidity is the contract the map depends on.

7THE WITNESSlit

Live re-check of the rigidity guarantee on a dedicated anisotropic probe: the solver must return an orthonormal map (RᵀR = I, det = +1). It confirms green now, and flips red the instant window 6 swaps the rigid solve for an affine one.

witness idle
The Machine
4DATA INin ↓

A source cloud P and a target cloud Q. Here Q is a known rigid transform of a hexagonal token with one displaced marker vertex: rotation θ*=25.000°, translation t*=(1.30, −0.80). Initialization: identity.

match → solve → apply
0THE PANEL — live ICPlit
iteration0 SSE (nearest²) recovered θ recovered t ‖R−R*‖
selfcheck failed
proven result
8DATA OUTout ↓
booting…

From identity, correct correspondences are found (25° < 30° half-spacing), so ICP recovers the exact rigid pose and the SSE collapses to machine zero.

Red Team · attacks & breaks
1THE ADVERSARYwall

The adversary owns the initial pose and the overlap. Real ways ICP breaks:

Local minima — a far or symmetric start locks onto the wrong basin (window 0's BAD INIT shows it).

Outliers & partial overlap — nearest-neighbour pairs the wrong points and drags the fit off; needs rejection / trimming.

Non-rigid deformation — a rigid model cannot fit it; loosening to affine over-fits it (window 6).

The wall: ICP guarantees convergence only to the nearest local minimum of the mean-square metric — never the global one.
2THE GRAVEYARD
  • “ICP converges to the correct global alignment.” It converges monotonically to the nearest local minimum; global correctness needs a good coarse pose (features / branch-and-bound).
  • “More free parameters (affine) always fit better, so they are safer.” Dropping the orthogonality constraint lets scale & shear absorb noise and mismatched pairs — the object distorts and the true pose is lost.
  • “Point-to-point ICP is as fast as any variant.” amber Point-to-plane typically converges in far fewer iterations near a surface.
6THE TAMPERwall

Planted void: replace the rigid Procrustes solve with a general affine least-squares solve (scale + shear allowed). On the witness's anisotropic probe the fit distorts the shape and the recovered map is no longer a rotation — the rigidity guarantee dies.

amber Honest subtlety: on perfectly rigid data (window 0's token) affine coincides with rigid, so the bug hides there — which is exactly why the witness runs its own non-rigid probe.