← Eggert Gudmundsson Projects

LiDAR ranging · static-scene precision characterization

Static-Scene Noise

254 consecutive frames of an unchanging office scene, 8×8 zones. Most of the array holds frame-to-frame noise around 0.3% of range; a few zones sitting on a real depth discontinuity are noisier, by as much as 15×. Repeating the run with the room lights off changes neither — the active-illumination ranging is unaffected by ambient light in this scene.

Part
ST VL53L8CX, 8×8 zones, SATEL-VL53L8 breakout
Device
cali.EGG68 (nRF9151), shared I²C bus with Grid-EYE/accelerometer
Scene
stable office scene, unchanged between runs
Conditions
room lights on, then off — two independent 254-frame series
Source
live device-log stream, ~200–250 ms/frame (I²C round-robin collection loop)
Field
distance_mm, 64 zones

Summary

Across the 48 zones that view a single, far, flat surface, per-zone standard deviation is tight and consistent: a median of 5.7 mm against a mean distance near 1.8 m, about 0.3% relative noise. The 16 zones in the two columns closest to a real depth edge (range drops from ~1.8 m to ~0.6–0.95 m across that boundary) are both noisier and far less consistent with each other — median std 10 mm, one zone as high as 75–93 mm. Turning the room lights off and repeating the full 254-frame run changed neither pattern.

Flat-region noise

5.7 mm

median std, 48 zones, ~0.3% of range

Depth-edge noise

10–93 mm

median–max std, 16 zones on the boundary

Ambient light effect, distance

≤11 mm

max per-zone shift, lights on vs off

Ambient light effect, noise

≈0

flat-region std unchanged within 0.3 mm

The setup

The scene is an ordinary, unmodified office: a stable mix of surfaces at different distances, nothing staged or targeted for this test. It didn't move between any of the runs described here. Rather than issuing individual cal tof raw shell commands, both 254-frame series were read straight off the device's own live log stream — the I²C round-robin collection loop (see the project overview for the scheduler/cache architecture) already pushes a fresh distance frame roughly every 200–250 ms whenever the LiDAR's schedule is on, so 254 frames is about a minute of passive listening, not 254 separate commands.

Two independent series were captured back to back, same scene, same sensor configuration: room lights on, then room lights off. Per-zone mean and standard deviation are computed across all 254 frames in each series.

Flat region vs. the depth edge

The 8×8 array splits cleanly into two regimes. Columns 0–5 look at one far surface the whole time — mean distance is smooth and continuous across all 48 of those zones (1782–1851 mm), and every one of them holds a standard deviation between 4.7 and 8.8 mm. Columns 6 and 7 straddle a real edge in the scene: mean distance drops abruptly, from ~1.8 m in column 5 to 900–950 mm in column 6 to 600–870 mm in column 7. The standard deviation in that same region is both higher on average and far less consistent zone to zone — a few zones sit at 50–75 mm while their immediate neighbors are under 10 mm.

Two 8x8 heatmaps side by side, mean distance and standard deviation per zone, lights-on condition. The mean-distance grid shows a smooth gradient around 1800mm across most of the array dropping sharply in the rightmost two columns. The standard-deviation grid is uniformly pale (low) across the same region, with several much darker (higher) cells concentrated in the rightmost two columns.
8×8 zone grid, 254-frame mean and standard deviation, lights on. The depth transition in the mean-distance panel (left) lines up exactly with the elevated, uneven noise in the std panel (right) — the noise is concentrated at the range discontinuity, not spread evenly across the array.

That pairing is the expected signature of a mixed-pixel (edge) effect: a zone whose field of view spans two surfaces at different ranges returns a distance that depends on exactly how the return energy splits between them frame to frame, which is inherently less repeatable than a zone looking at one flat surface. It is a property of where the zone sits relative to the scene, not a fault spread across the sensor — the 48 single-surface zones never show it.

Ambient light: no measurable effect

The VL53L8CX ranges by timing its own 940 nm VCSEL pulse, not by passively imaging the scene, so ordinary room lighting is not expected to change what it reports. Repeating the full 254-frame series with the office lights off, same scene, confirms that directly rather than assuming it.

Two scatter panels, each plotting a per-zone statistic with the room lights off on the y-axis against lights on on the x-axis, with a dashed y=x reference line. Panel a, mean distance: all 64 points sit tightly on the line across the full 600-1850mm range. Panel b, standard deviation: most points cluster near the origin on the line; the handful of higher-noise edge zones scatter loosely around the line without a consistent offset.
All 64 zones, lights-on vs lights-off, 254-frame mean/std each. Left: reported distance is unchanged, every zone from 0.6 to 1.85 m. Right: the tight flat-region cluster sits on the line; the noisier depth-edge zones scatter around it in both directions, not consistently to one side — run-to-run variation in an already-noisy region, not a lighting effect.

Per-zone mean distance moved by 1.0 mm on average between the two conditions (11.0 mm at the single largest zone, still inside that zone's own frame-to-frame noise). Flat-region standard deviation moved by 0.33 mm on average — the median across those 48 zones was 5.71 mm with the lights on and 5.65 mm with them off. Neither difference is distinguishable from ordinary run-to-run variation.

Method & caveats

  • Data source is the device's own CoAP-send log line (Sending lidar frame: ... dist=...), read passively off the live UART log stream while the commissioning schedule was running — not individual cal tof raw captures. Only distance_mm is logged this way; the richer per-target diagnostic fields used in the window-transmission study (signal_per_spad, range_sigma_mm, etc.) were disabled at the source in 2026-10-02 to cut per-frame I²C time, see that page and lidar.h's own notes — not available here.
  • Single scene, single sensor, one distance range (~0.6–1.85 m). No claim here about how the flat-region noise floor or the edge-effect magnitude scale with distance, incidence angle, or target reflectance.
  • "Flat region" / "depth edge" is a post-hoc split based on where the mean distance actually discontinues in this particular scene (columns 0–5 vs 6–7), not a property fixed to those column indices in general — point the sensor at a different scene and a different set of zones will straddle whatever edge is there.
  • Standard deviation is computed per zone across all 254 frames of a series; frames with a non-zero status were excluded (none were, in either series — all 254/254 came back status=0 in both runs).

Data: two 254-frame series (lights on, lights off), same office scene, 2026-10-04. Raw per-zone distance series held in the device project repository, not published here.