Skip to content
AI360Xpert
Beta

Point Cloud Registration Alignment

Two scans of one room start misaligned. Registration finds the rotation and shift that snap them together for mapping and tracking.

Coarse matches seed a fine alignment that snaps two scans together
Coarse matches seed a fine alignment that snaps two scans together

Why Does This Exist?

Lidar frames, room scans, and CAD models live in different coordinates until aligned. Registration exists as the snap step behind mapping, visual SLAM loop repair, and object pose: find correspondences, solve T=[R∣t]T = [R|t], verify on overlap. Without it scans stay as floating shells.

Local refinement is ICP; learned global matching is Deep Global Registration; image analog is image registration.

Think of It Like This

Aligning two transparencies of stars

Lay two star transparencies offset on a projector and slide one until constellations overlap. A rough corner match gets close; nudging individual stars locks it.

Coarse matches are the corner slide and ICP is the nudge. The analogy stops at outliers: stars rarely lie while scans carry moving people that must be ignored.

How It Actually Works

Coarse stage extracts descriptors such as FPFH or learned FCGF, matches them, and runs RANSAC for a rough RR and tt that survives up to 7070 percent outliers. Fine stage runs point-to-plane ICP on the overlap region. Success needs overlap above about 3030 percent; below that symmetry and repetition dominate. Error reports translation in centimeters plus rotation in degrees on the overlapping points only.

Worked numbers

Two room scans share 6060 percent overlap. Coarse RANSAC from 500500 matches keeps 120120 inliers and lands within 0.30.3 m and 55 degrees. ICP refines to 0.040.04 m and 0.80.8 degrees mean error on overlap. A 1010 percent-overlap pair from opposite doors fails with 22 m error despite low residuals on the sliver.

Code

def apply_rigid(pts: list[tuple[float, float]], angle_deg: float, tx: float) -> list[tuple[float, float]]:    import math    a = math.radians(angle_deg)  # 2D stand-in for 3D rigid motion    return [(x * math.cos(a) - y * math.sin(a) + tx, x * math.sin(a) + y * math.cos(a)) for x, y in pts]

print(apply_rigid([(1.0, 0.0)], 90.0, 0.5))  # -> [(0.5, 1.0)]

Watch Out For

Registering near-duplicate hallways

Symmetric corridors give many equally good snaps offset by one door spacing. The symptom is low residual with wrong room assignment. Verify with a second modality such as image overlap or free-space checks before merging maps.

The Quick Version

  • Registration solves the rigid RR and tt aligning two scans.
  • Coarse descriptor matching plus RANSAC survives heavy outliers.
  • Fine ICP polishes on the overlap region only.
  • Overlap above 3030 percent is the practical minimum.
  • Reference rooms land under 55 cm and 11 degree with 6060 percent overlap.
  • Symmetry needs extra verification beyond low residuals.