---
kind: concept
slug: signed-distance-field
title: Signed distance field
summary: >-
  A grid that stores, for each cell, the distance to the nearest surface, with a sign for inside versus outside. Common pipelines fuse depth into a truncated SDF (TSDF), then derive a Euclidean SDF (ESDF) at a chosen resolution. Covered so far by one paper: a GPU depth-to-ESDF stack for high-DoF robot motion generation, with author-reported speed and memory results.
tags: [geometry, collision-checking, mapping, robotics]
papers: ["2603.05493"]
related: [inverse-kinematics, inverse-dynamics-control, semantic-occupancy-mapping, simultaneous-localization-and-mapping]
status: draft
updated_at: 2026-11-01
---

## Overview

A signed distance field (SDF) assigns each point of a volume the distance to
the closest surface. The sign separates the free side from the occupied side.
The distance is the quantity planners and collision checks read; the sign tells
them which side of a surface a query is on. The paper uses two stages. A
truncated SDF (TSDF) is fused from depth images and only keeps values near the
observed surfaces. An ESDF is then generated from the TSDF, at a resolution the
task chooses, and holds distances over the whole grid [arxiv:2603.05493 §5].

The shared invariant is that the magnitude comes from an exact nearest-surface
assignment, while the sign is recovered from a sample on the query side of the
surface. Unobserved cells need an explicit rule, and the paper treats them as
free space [arxiv:2603.05493 §5.4].

## Variants

### Depth-fused TSDF with on-demand ESDF

Space is stored as 8x8x8-voxel blocks, and memory is reserved only for blocks
near observed geometry. A hash table finds each block's slot, and two float16
channels hold the depth average and an SDF for analytic primitives. The paper
quotes about 350 MB for 100k active blocks, roughly 11 times less than a dense
grid [arxiv:2603.05493 §5.1]. Integration projects every voxel into the depth
image, so no atomic writes are needed. Each observation is weighted by the
projected voxel area [arxiv:2603.05493 §5.2]. Each step multiplies block weights
by a time factor, and blocks in view get an extra frustum factor, which removes
stale observations [arxiv:2603.05493 §5.3]. The ESDF is seeded from cells that
sit near a surface, propagated with an exact nearest-site method, and given a
sign from an adjacent static sample [arxiv:2603.05493 §5.4]. Card:
[cuRoboV2](/papers/2603.05493).

### Other variants

None in the wiki yet. The paper's comparison baseline for ESDF generation is
nvblox, whose results are reported in [arxiv:2603.05493 §7.6].

## When to use which

The rows below rest on the author-reported benchmarks in one paper and one
scene. They are not independent replications.

| Situation | Use | Why |
|---|---|---|
| Live depth stream, GPU available, distance needed each frame | Depth-fused TSDF with on-demand ESDF | At 20 mm on a Redwood bedroom sequence, the paper reports 1.52 ms and 0.82 GB against nvblox's 2.97 ms and 2.55 GB, at similar recall [arxiv:2603.05493 §7.6]. Benchmarks use an RTX 4090 [arxiv:2603.05493 §7]. |
| Sensor resolution finer than the planner needs | Decouple TSDF and ESDF voxel sizes | The ESDF can be coarser than the TSDF [arxiv:2603.05493 §5.4]. The real-robot setup used a 2.5 mm TSDF with a 2 cm ESDF [arxiv:2603.05493 §7.7]. |
| Thin structures, ESDF cell much larger than the TSDF voxel | Test before relying on it | The seven-point seeding probe can miss thin surfaces. The paper estimates the break-even near a resolution ratio of about 2 [arxiv:2603.05493 §5.4] [arxiv:2603.05493 §7.6]. |
| Moving people or objects in the scene | Set time decay explicitly | The paper's example time factor is 0.99 and frustum factor 0.5 [arxiv:2603.05493 §5.3]. Without decay, stale observations persist. |
| No GPU, or single-query latency on other hardware | Not covered by this evidence | Benchmarks are batched on one GPU type, and single-problem latency on other hardware was not reported [arxiv:2603.05493 §7]. |

## Implementation sketch

The sketch follows the three stages in the paper. It is not the paper's code.
Pseudocode is in our own words, and values come from the cited section.

```pseudocode
# Stage 1: seed ESDF cells that contain a surface  [arxiv:2603.05493 §5.4]
# tsdf(p): TSDF value at point p, or None if unobserved
# band: 0.9 * tsdf_voxel_size (paper's threshold)
def seed_sites(esdf_cells, tsdf, cell_size, band):
    sites = []
    for c in esdf_cells:
        # Centre plus six face probes at half a cell from the centre
        for p in probe_points(c, cell_size):
            d = tsdf(p)
            if d is not None and abs(d) < band:
                sites.append(c)
                break
    return sites

# Stage 2: exact nearest site per cell, then unsigned distance  [§5.4]
# nearest_site[c]: nearest seeded site, from a separable propagation
def unsigned_distance(c, nearest_site, cell_size):
    return dist(c, nearest_site[c]) * cell_size

# Stage 3: sign from a sample on the query side of the surface  [§5.4]
# geom_sdf(p): static-geometry SDF at p, or None if unobserved
def signed_distance(c, site, d, geom_sdf, step):
    # Step from the site toward the query; the step length is not
    # stated in the paper and must be chosen by the implementer
    sample = geom_sdf(step_toward(site, c, step))
    if sample is None:
        return d            # unobserved: treated as exterior
    return d if sample >= 0 else -d
```

Notes on the sketch:

- The sign convention in stage 3 is one choice. The paper uses the sign of the
  static sample; the exterior default for unobserved cells follows the paper.
- The paper does not state the step length in stage 3 [arxiv:2603.05493 §5.4].
- The paper's propagation step is an exact method. Any method that gives exact
  nearest sites works; the paper names PBA+ and a fixed launch count [§5.4].

## Contradictions

None across papers; this page currently rests on one paper. Within that paper,
the abstract gives up to 99% collision recall for the ESDF, while the text of
§7.6 reports 97.0% as the highest recall it shows [arxiv:2603.05493 §7.6].
Treat the 99% figure as unverified until the paper's text supports it.

## Papers

- [cuRoboV2](/papers/2603.05493) (arXiv:2603.05493, CC BY-SA 4.0): depth fusion into a block-sparse TSDF, on-demand GPU ESDF with exact nearest sites and sign recovery, and torque-limited B-spline trajectory optimisation in the same stack.
