Choosing a Point-Cloud Registration Method: ICP, NDT & Global

Point-cloud registration is where a pipeline either aligns two LiDAR scans to centimetres or silently converges to a plausible-looking wrong answer — and the difference is almost always method selection, not tuning. This decision guide, part of the sensor fusion and spatial data alignment domain, frames the choice between iterative closest point (ICP), the normal distributions transform (NDT), and a global feature-based pass. The selection is driven by two questions — how good is the initial pose, and how dense is the scan — against a hard ≤0.05 m RMSE alignment budget. The concrete implementations are covered in point cloud registration techniques; this page decides which to run.

Registration method follows from initial-pose quality and scan density:

Point-Cloud Registration Method Decision Flow Top box is two point clouds. Arrow to a diamond asking if a good initial pose exists. A no branch goes right to a global FPFH plus RANSAC box. A yes branch goes down to a second diamond asking if the scan is dense and structured. Its yes branch goes to point-to-plane ICP; its no branch goes to NDT. The global box feeds down into the second diamond. A gate at the bottom checks fitness and RMSE. Two point clouds source · target Good initial pose? within basin no Global FPFH+RANSAC coarse from scratch yes Dense & structured? planar surfaces yes Point-to-plane ICP no NDT gate: fitness · RMSE ≤ 0.05 m

Method Overview #

The three methods occupy different niches along the axes of initial-pose tolerance and scan density:

Method Needs initial guess Scan density Compute Best fit
Point-to-plane ICP Yes (local) Dense, structured Low per iteration Refinement on planar AV scenes
NDT Moderate (local) Sparse tolerant Medium (voxel grid) Sparse/noisy scans, moderate error
Global FPFH+RANSAC No Any with features High (features + RANSAC) Coarse alignment from scratch

ICP and NDT are refiners — they need a starting pose in the basin of convergence. The global pass is the only method that works with no prior, but it is coarse and always followed by a local refinement. The practical pipeline is: global pass when the prior is bad, then ICP on dense structured scans or NDT on sparse ones.

Decision Criteria #

Criterion 1 — Is the initial pose inside the basin of convergence? #

A local method only works if the starting transform is close enough. Estimate the initial error from odometry or a pose prior; if the rotation or translation exceeds the convergence radius, a global pass is mandatory.

python
import numpy as np

def needs_global(init_T: np.ndarray, rot_limit_deg=15.0, trans_limit_m=2.0) -> bool:
    """True if the initial guess is likely outside the local basin."""
    R = init_T[:3, :3]
    angle = np.degrees(np.arccos(np.clip((np.trace(R) - 1) / 2, -1, 1)))
    trans = np.linalg.norm(init_T[:3, 3])
    return angle > rot_limit_deg or trans > trans_limit_m

Key parameters: rot_limit_deg and trans_limit_m bound the local basin; beyond them, seed with global registration using FPFH features and RANSAC.

Criterion 2 — Scan density and structure select the refiner #

Dense, planar scenes favour point-to-plane ICP; sparse or noisy scans favour NDT's distribution model. Estimate density from the average nearest-neighbour spacing.

python
from scipy.spatial import cKDTree

def choose_refiner(points: np.ndarray, spacing_thresh=0.3) -> str:
    d, _ = cKDTree(points).query(points[::50], k=2)
    mean_spacing = float(d[:, 1].mean())
    return "icp" if mean_spacing < spacing_thresh else "ndt"

Key parameter: spacing_thresh (0.3 m) splits dense from sparse; below it ICP has enough correspondences, above it NDT is more robust.

Criterion 3 — Compute budget #

ICP is cheapest per iteration but needs a good start; NDT costs a voxel grid build; the global pass is the most expensive. Run the global pass only when Criterion 1 demands it, and prefer ICP over NDT when density allows, to keep per-scan cost low at map scale.

Validation & QC Automation #

Every method's output is validated the same way, against the alignment budget:

  • Inlier RMSE ≤0.05 m on correspondences within the search radius.
  • Fitness ≥ threshold: the fraction of source points with a target correspondence must exceed a scene-dependent floor (e.g. ≥0.6 for overlapping scans).
  • Transform sanity: the recovered rotation and translation are within physically plausible bounds for the platform motion.
python
def validate_registration(result, rmse_budget=0.05, fitness_floor=0.6):
    assert result.inlier_rmse <= rmse_budget, f"RMSE {result.inlier_rmse:.3f} m too high"
    assert result.fitness >= fitness_floor, f"fitness {result.fitness:.2f} too low"

The basin of convergence is the criterion everything else hangs off. Below it ICP refines; above it ICP converges confidently to the wrong minimum and reports a small residual while doing so:

Basins of Convergence for ICP and NDT Two curves of final error against initial pose error showing a sharp ICP cliff at 0.6 metres and a gentler NDT degradation to 1.5 metres, with a global pass marked as the way back inside. 00.5 1.01.5 m 00.61.22.0 m initial pose error → · final error on the vertical axis 0.05 m accept ICP — cliff at ~0.6 m NDT — degrades gradually a global pass moves you left, back inside a basin past the cliff ICP still reports a small internal residual — the failure is only visible against ground truth, never from the fit itself

Edge Cases & Failure Patterns #

  • ICP on a bad prior. Converges confidently to a wrong local minimum. Gate on Criterion 1 and seed with a global pass when the prior is out of basin.
  • NDT voxel too coarse. A large voxel smooths away structure and under-constrains the fit. Size the voxel to the scene scale, typically 1–2 m for outdoor LiDAR.
  • Global pass with too few features. Low-texture scenes (open highway) yield few distinctive FPFH features, so RANSAC finds no consensus. Fall back to odometry-seeded NDT.
  • Degenerate geometry. A long featureless corridor is unconstrained along its axis; all methods slide. Detect low geometric conditioning and hold that degree of freedom from odometry.

Structure, not point count, is what separates the refiners. NDT's voxel statistics survive a sparse or degenerate scene where ICP's nearest-point correspondences become ambiguous:

Scene Structure Against Refiner Behaviour Three scene sketches — urban, tunnel and open field — each annotated with which degrees of freedom are constrained and how ICP and NDT behave. urban · walls both ways tunnel · walls one way open field · ground only 6 dof constrained along-axis translation weak x, y and yaw unconstrained ICP wins on accuracy NDT holds; ICP slides neither helps — use a prior test the scene, not the algorithm: the same pair of clouds decides the answer, and it is cheap to compute the structure tensor first

Performance & Scale Notes #

Downsample before every method — a voxel grid at the scene scale cuts point counts by an order of magnitude with negligible accuracy loss, and is covered in accelerating ICP with a KD-tree and voxel downsampling. Cache the target's KD-tree (ICP) or voxel grid (NDT) across iterations. The global pass dominates cost, so run it only when Criterion 1 fires; at map scale, most scan pairs have a good odometry prior and skip straight to ICP. Registration parallelizes per scan pair with the async worker pattern from async data pipeline architecture.

Reporting convergence separately from accuracy #

One reporting discipline underpins every number on this page. Convergence rate and residual error must be reported apart, because averaging them describes neither.

A method that converges on 82 per cent of trials with a tight 0.03 m peak, and scatters the remaining 18 per cent above a metre, has a mean error of about 0.21 m. A method that converges on 99 per cent of trials with a broader 0.06 m peak has a mean of about 0.07 m. The single-number comparison says the second method is three times more accurate; the honest comparison says the first is twice as accurate whenever it works and fails five times as often. Those are different trades, and only the second framing lets a reader make the one that suits their stack.

Scene structure, not point count #

One clarification is worth making because it is the single most common misreading of the ICP-versus-NDT comparison: what separates the refiners in practice is the scene's structure, not how many points it contains.

In a structured urban scene with walls in two directions plus a ground plane, all six degrees of freedom are constrained and point-to-plane ICP is the more accurate of the two. In a tunnel or a motorway cutting, every surface is parallel to the direction of travel, so ICP slides freely along the axis while NDT's voxel distributions still weakly constrain it — the same points, a completely different outcome. In an open field with only ground returns, both horizontal translations and the yaw are unconstrained for either method, and no refiner recovers a pose the geometry does not determine; only an external prior does.

That is why the structure measurement is worth computing before registering rather than diagnosing afterwards. It costs one eigendecomposition of a three-by-three matrix, and it tells you which directions of the result will be unreliable whichever method runs — which is information the downstream filter needs and cannot obtain any other way.

It is worth naming the property all four of the criteria below are circling, because it is the same one each time: a registration result is only usable together with a statement of which directions it constrained. Overlap decides whether the result is a refinement or a coincidence. Density decides whether the objective had enough correspondences to mean anything. Structure rank decides which axes of the answer to believe. Prior error decides whether the optimiser started inside a basin at all. None of the four is a preference, and none of them is visible in the residual the solver reports.

Deciding from the scan rather than from habit #

The criteria above describe what each method costs. Turning that into a per-pair decision needs three measurements taken from the clouds themselves, each costing microseconds and each useful as a diagnostic in its own right.

Overlap is the fraction of source points with a target point inside the correspondence radius, measured at the initial pose because that is the information available when the decision has to be made. Urban pairs one frame apart typically return 0.75–0.9. Below about 0.3 no refiner should run at all: a refiner with too little overlap converges to a neighbouring minimum and reports a small internal residual while doing so, which is the worst possible failure mode because nothing in the fit indicates it.

Density is the median points per square metre over occupied ground cells — median rather than mean, because a scan with one dense patch and a lot of empty space has a flattering mean and few correspondences anywhere useful. Below about 20 points per square metre ICP's objective becomes noisy: it is a sum over point-to-point correspondences, and there are too few of them for the fit to be driven by anything but which handful of points happened to land near a surface. NDT scores against a local distribution instead, so it pools the map's structure regardless of how many live points fall in a cell and degrades gracefully as the live cloud thins.

Structure rank is the effective rank of the surface-normal scatter matrix in the overlapping region, and it is not a method choice at all — it is a statement about how far to trust whichever method runs. A ground plane alone gives rank 1; a ground plane plus a wall gives 2; a corner gives 3. Rank below 3 means at least one direction is unconstrained by any method, and the correct response is an inflated covariance along the weak eigenvector rather than a confident pose.

That third measurement is the one most stacks omit, and it is why tunnel poses look confident. The method chosen in a tunnel is usually fine — overlap and density are both healthy — and the result is unreliable along track regardless. Recording the three numbers with the result, rather than only the method, is what makes a divergence weeks later diagnosable.

A fourth quantity enters separately because it is a property of the seed rather than of the scan: the prior's own error. ICP's basin on urban scans is around 0.6 m and NDT's around 1.5 m, so after a GNSS outage, after a stop of unknown duration, or on the first frame of a session, a global pass is mandatory whatever the scan measurements say. Confusing the two — treating a poor prior as a scan problem — produces stacks that run a global pass on every frame because the previous frame's residual was large.

FAQ #

When does ICP fail and NDT succeed? #

ICP matches individual point correspondences, so it needs dense, overlapping clouds and a decent initial pose; on sparse LiDAR returns or with a poor guess it locks onto wrong correspondences and converges to a local minimum. NDT instead models the target as a grid of normal distributions and aligns the source to that continuous field, which is more tolerant of sparsity and moderate initial error. On sparse or noisy scans NDT often converges where ICP stalls.

Why is a global registration pass sometimes mandatory? #

Both ICP and NDT are local methods — they refine a pose that is already roughly right. When there is no good initial guess, a local method has no basin of attraction to fall into and will diverge. A global pass using FPFH feature matching with RANSAC finds a coarse alignment from scratch, which then seeds the local refiner.

Is point-to-plane always better than point-to-point ICP? #

On structured scenes with planar surfaces — roads, walls, buildings — point-to-plane ICP converges faster and more accurately because it lets points slide along surfaces toward alignment. Point-to-point is simpler and can be more robust on unstructured geometry where reliable normals are hard to estimate. For AV scenes, which are dominated by planar structure, point-to-plane is the usual default.

Up one level: Sensor Fusion & Spatial Data Alignment — the parent domain whose registration stage this guide helps you configure.