TSDF vs Surfel maps

Dense RGB-D SLAM needs a map representation that can absorb noisy depth frames into a clean surface. Two families dominate, exemplified by KinectFusion and ElasticFusion.

TSDF: fusing into a voxel grid

TSDF (Truncated Signed Distance Function) is a volumetric representation: space is divided into voxels, and each voxel stores the signed distance to the nearest surface, truncated to a narrow band around it, plus a fusion weight. Each new depth frame is first converted into a per-voxel distance observation: project the voxel center x\mathbf{x} into the depth image and compare the measured depth against the voxel’s distance along the camera ray,

ft(x)=Ψ ⁣(dt(π(KTt1x))xtt/λμ),Ψ(η)=min(1,max(1,η)),f_t(\mathbf{x}) = \Psi\!\left(\frac{d_t\big(\pi(\mathbf{K}\,\mathbf{T}_t^{-1}\mathbf{x})\big) - \|\mathbf{x} - \mathbf{t}_t\|/\lambda}{\mu}\right), \qquad \Psi(\eta) = \min(1, \max(-1, \eta)),

where μ\mu is the truncation distance and Ψ\Psi clamps values into [1,1][-1, 1]. These observations are fused by a running weighted average per voxel:

F(x)W(x)F(x)+wfnew(x)W(x)+w,W(x)W(x)+wF(\mathbf{x}) \leftarrow \frac{W(\mathbf{x})\,F(\mathbf{x}) + w\,f_{\text{new}}(\mathbf{x})}{W(\mathbf{x}) + w}, \qquad W(\mathbf{x}) \leftarrow W(\mathbf{x}) + w

The surface is the zero-crossing of FF, extracted by ray-casting or marching cubes. Fusion is trivially parallel (ideal for GPUs) and averaging cancels sensor noise, producing smooth watertight surfaces. The costs: memory grows with volume rather than surface area — KinectFusion’s fixed grid (e.g. 5123512^3 voxels at 2-3 mm resolution) covers only a few cubic meters, which is what voxel hashing and octrees were invented to mitigate — resolution is fixed by voxel size, and correcting past poses is expensive: the volume must be de-integrated and re-integrated (BundleFusion) or shifted (Kintinuous).

Surfels: fusing into surface primitives

Surfel maps are point-based: the scene is a set of surfels — disk-shaped surface elements

M={(pi,ni,ri,ci,wi,ti)}\mathcal{M} = \{(\mathbf{p}_i, \mathbf{n}_i, r_i, \mathbf{c}_i, w_i, t_i)\}

each carrying position, normal, radius, color, confidence weight, and timestamp. New measurements either update an existing nearby surfel (weighted averaging of its attributes) or spawn a new one. Memory scales with observed surface area, resolution adapts to measurement density, and because surfels are independent primitives, the map can be deformed: ElasticFusion applies a non-rigid deformation graph (in the spirit of embedded deformation) to the surfel cloud at loop closure instead of maintaining a pose graph. The costs: no connected mesh comes for free, rendering-based model prediction is needed for tracking, and deformation can blur fine surface detail.

Side by side

TSDF (KinectFusion)Surfels (ElasticFusion)
StructureVoxel grid over spaceUnstructured point set on surface
FusionRunning average per voxelPer-surfel attribute update
Surface extractionZero-crossing (ray-cast / marching cubes)Splat rendering
MemoryScales with volume (needs hashing/octrees)Scales with surface area
Loop-closure correctionDe-/re-integration or volume shiftingNon-rigid map deformation
Output qualitySmooth, watertight meshesAdaptive, deformable, no mesh

Choosing in practice — and the pitfalls

Neither wins outright: BAD SLAM optimizes surfels jointly with poses in a direct bundle adjustment, while BundleFusion shows TSDFs can stay globally consistent through re-integration. Some rules of thumb and traps:

Later neural representations (neural fields, 3D Gaussians) are best understood as descendants of these two philosophies — implicit volumetric versus explicit primitive-based mapping.

Why it matters for SLAM

The map representation dictates almost everything downstream in a dense SLAM system: how tracking predictions are generated, how memory scales with scene size, and — most critically — how the system can correct the map when loop closure reveals accumulated drift. “TSDF with re-integration or surfels with deformation” is the fundamental design fork of RGB-D SLAM, and recognizing it lets you place any dense system on the map quickly.

Hands-on