wikillm

Paper · 2020-12-12 · cs.CV, cs.RO

An Overview of Depth Cameras and Range Scanners Based on Time-of-Flight Technologies

Survey of time-of-flight depth sensing. Pulsed-light sensors time the round trip directly (LIDAR scanners, flash cameras); continuous-wave sensors estimate phase by four-bucket demodulation and suffer phase wrapping. Gives the depth-from-phase formulas, device specifications and a pinhole plus distortion calibration for ToF cameras. No new experiments; no code.

Time-of-flight depth sensingCalibrationtime-of-flightdepth-sensinglidarcamera-calibrationsurvey

arXivPDFMarkdown12 min read

AI-compiled by claude-haiku-5-5 on 2026-11-06, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.

In plain words

A time-of-flight camera measures how far away things are by sending out light and timing how long it takes to come back. Some devices time a short flash directly. Others send a light that flickers at a steady rate and measure how far the flicker has shifted when it returns. The first kind is the sort of spinning sensor used on vehicles and robots, and it works outdoors. The second kind is the small camera type, and it works best indoors over short distances.

The second kind has a catch. A shift of one full flicker cycle looks the same as no shift at all, so distances repeat after a fixed span. The paper explains how these sensors work, lists the commercial devices, and shows how to turn their raw readings into 3-D points by treating the sensor like an ordinary camera that needs calibration.

TL;DR

This is a survey and tutorial, not a method paper. It covers two sensing principles for time-of-flight depth: pulsed-light (direct timing, outdoor, long range) and continuous-wave (phase shift, indoor, short range). It gives the four-sample phase formulas, the depth-from-phase relation with its wrap limit, and a pinhole-plus-distortion calibration for ToF cameras. Use it as a reference for equations and device specifications, and check the pitfalls below before implementing.

Problem

Depth from a single laser beam needs scanning, a mirror or many beams, to give a full image §1. Pulsed sensors need very fine timing: a centimetre of depth needs timing better than a nanosecond, because light covers about 30 cm per nanosecond (footnote in §2.1). Continuous-wave sensors measure a phase, which repeats every full cycle, so depth is ambiguous beyond one unambiguous range §4.3. Stereo cameras fail on untextured surfaces such as walls, and ToF sensors give depth regardless of texture §7. Pulsed-light sensors are the systems of choice for autonomous driving and robot navigation, because continuous-wave systems do not work under adverse outdoor light §8. The paper compares these trade-offs and points to calibration as the step that turns raw ToF data into usable coordinates §6.

Method

The paper is organised as an overview. No new method is proposed. The sections below restate its technical content.

Principle. A ToF sensor emits light and measures the travel time τ from the source to the object and back. Depth is d = ½ c τ, with c the speed of light §4.3. Pulsed-light sensors measure τ directly, and continuous-wave sensors measure a phase φ = 2π f τ for modulation frequency f §1 §4.1.

Step 1: pulsed-light sensors §2. A laser or laser diode emits pulses. Single-photon avalanche diodes (SPADs) fire on one photon, and per-pixel time-to-digital converters record the arrival time §2 §2.2. Two setups exist:

  • Range scanner: one laser on a rotating mirror, or a head of 16, 32 or 64 laser-detector pairs at fixed vertical angles §2.
  • 3D flash camera: one diffused laser pulse floods the scene and a 2-D SPAD array records depth in one shot §2 §3.3.

Step 2: continuous-wave sensors §4. The emitter sends a sinusoidally modulated signal, and each pixel demodulates the return. With emitted power s(t) = a1 + a2 cos(2πft) and received power r(t) = A cos(2πft − φ) + B, where A is the received amplitude and B the background offset §4.1, the cross-correlation of the two gives a value that depends on the phase. Four samples at ψ = 0, π/2, π and 3π/2 are enough to recover phase, amplitude and offset §4.1 fig. 8:

  • phase: arctan of (C3 − C1) over (C0 − C2) §4.1;
  • amplitude: the root of the sum of squares of the two differences, divided by a2 §4.1;
  • offset: the sum of the four samples, divided by 4·a1 §4.1.

In a real pixel, the four samples come from four shutters, each open for T/4 of a modulation period T. The shutter cycle repeats for an integration time that covers hundreds of thousands of periods to raise the signal-to-noise ratio §4.2.

Step 3: depth from phase §4.3. Depth is d = c φ / (4π f). The phase wraps at 2π, so the unambiguous range is d_max = c / (2f). The measured depth is d_measured = d − n · d_max, where n is an integer that can differ from pixel to pixel. The paper cites several phase-unwrapping methods but does not choose one §4.3.

Step 4: pinhole model and intrinsics §6.1. A ToF camera is modelled as a pinhole camera. The intrinsic matrix A has α_u, α_v (scale times focal length) and the principal point (u0, v0). The paper's matrix has no skew term. The measured quantity is the radial distance d from the optical centre to the point, not the depth along the optical axis. The camera-frame point is P = d / ‖A⁻¹q‖ · A⁻¹q, where q = (u, v, 1) §6.1.

Step 5: extrinsics and lens distortion §6.2 §6.3. The rigid pose has six parameters (rotation and translation) §6.2. The distortion model has a radial polynomial l(r) = 1 + ρ1 r² + ρ2 r⁴ and a tangential term with τ1, τ2, so four distortion parameters in total §6.3. The image is undistorted by numerically inverting this model §6.3. The paper notes that the outgoing infrared signal also vignettes the intensity image, which can be modelled by a bivariate polynomial when full photometric calibration is needed §6.3.

Step 6: depth-wiggling correction §6.4. Systematic nonlinear error ("wiggling") is removed either by a lookup table or by a cubic B-spline correction d′ = d − Σ_i β_i B_{i,3}(d). The coefficients β_i come from least squares over known target depths, and the number of coefficients depends on the number of depth planes used in calibration §6.4.

Step 7: practical calibration §6.5. The amplitude-plus-offset image of a CW camera can be calibrated with standard colour-camera tools. Because ToF images are low resolution, the paper uses a special corner-detection method that fits two pencils of lines to the calibration pattern §6.5 fig. 12.

Step 8: combining ToF and colour cameras §7. Three configurations are covered: one ToF camera plus one colour camera (the Kinect v2 and DS311/DS325 have one built in); one ToF camera plus two colour cameras, which gives a stereo pair; and multiple ToF units. Cross-calibration can use a projective alignment solved by SVD and refined by bundle adjustment §7. The paper states these methods without giving their equations.

Pseudocode 1: four-bucket demodulation and depth §4.1 §4.3.

Pseudocode
# Four-bucket demodulation of one CW-TOF pixel  [§4.1] [§4.2]
# Input:  c0..c3 = correlation samples at 0, pi/2, pi, 3pi/2  [fig. 8]
#         a1, a2 = emitted offset and amplitude (not stated how obtained)
# Output: phase (rad), amplitude, offset
def demodulate_pixel(c0, c1, c2, c3, a1, a2):
    # Phase from the two quadrature differences  [§4.1]
    # The paper writes arctan; atan2 keeps the quadrant
    phase = atan2(c3 - c1, c0 - c2)
    # Wrap into [0, 2*pi): the paper does not say how  [§4.1]
    phase = phase % (2.0 * pi)
    # Received amplitude, scaled by the emitted amplitude a2  [§4.1]
    amplitude = sqrt((c3 - c1) ** 2 + (c0 - c2) ** 2) / a2
    # Background offset, scaled by the emitted offset a1  [§4.1]
    offset = (c0 + c1 + c2 + c3) / (4.0 * a1)
    return phase, amplitude, offset


# Depth from phase  [§4.3]
# Input:  phase (rad) in [0, 2*pi), freq (Hz) of the modulation
# Output: depth in metres, inside the unambiguous range [0, d_max)
def depth_from_phase(phase, freq):
    # Unambiguous range: the depth at phase 2*pi  [§4.3]
    max_depth = SPEED_OF_LIGHT / (2.0 * freq)
    # Same as c / (4*pi*f) * phase  [§4.3]
    depth = phase / (2.0 * pi) * max_depth
    return depth

Pseudocode 2: pixel to 3-D point and wiggling correction §6.1 §6.4.

Pseudocode
# Radial depth and pixel to camera-frame 3-D point  [§6.1]
# Input:  (u, v) pixel, d radial distance (m), A intrinsic 3x3 matrix
# Output: point (X, Y, Z) in camera coordinates
def pixel_to_point(u, v, d, A):
    # Ray direction from the pixel: p = A^-1 q  [§6.1]
    # (lens undistortion is applied to the pixel first  [§6.3])
    ray = inverse(A) @ [u, v, 1]
    # Scale the ray so its length is the measured radial distance  [§6.1]
    point = d / norm(ray) * ray
    return point


# Depth wiggling correction with a cubic B-spline  [§6.4]
# Input:  d measured depth, beta coefficients, centres of spline knots
# Output: corrected depth
def correct_wiggling(d, beta, centres):
    # Coefficients are fitted by least squares on known depths  [§6.4]
    bias = 0.0
    for i in range(len(beta)):
        # Cubic B-spline basis B_{i,3} evaluated at d  [§6.4]
        bias = bias + beta[i] * cubic_bspline(i, d, centres)
    return d - bias

Hyperparameters

Values are as the paper states them. Nothing here comes from code.

NameValueWhereNotes
Speed of light cnot stated§4.3the paper's footnote uses 3×10¹⁰ cm/s §2.1
Modulation frequency (CW)user-selectable on SR4000: 29, 30 or 31 MHz; or 14.5, 15.0 or 15.5 MHz§5.1maximum depth 5.17, 5, 4.84 m; 10.34, 10, 9.67 m
Modulation frequency SR450013.5 MHz§5.1stated max depth 9 m (see Pitfalls)
Modulation frequency, Kinect v2several frequencies, 10 to 130 MHz§5.2the individual values are not stated
Example frequency30 MHz gives d_max = 5 m§4.3
Integration (CW)hundreds of thousands of periods§4.2raises SNR, causes motion blur
Shutter timingfour shutters, each open T/4§4.2T is the modulation period
Pulse width, pulsed range scanner (text)5 ns§3.1HDL-64E
Pulse width, pulsed range scanner (table)10 nstab. 1HDL-64E, HDL-32E, VLP-16
Laser wavelength, Velodyne905 nm; beam divergence 2 mrad§3.1
Pulse rate, HDL-64Eup to 20 000 Hz§3.1
Rotation, HDL-64Eup to 900 rpm (15 Hz)§3.1360° field of view
Toyota prototype870 nm; 200 kHz; 4 ns FWHM; 40 mW mean power§3.2
Toyota divergence1.5° vertical, 0.05° horizontal§3.2three polygon facets at +1.5°, 0°, −1.5°
Toyota revolution100 ms; 170° horizontal scan§3.21020×32 points per revolution, resampled to 340×96 at 10 FPS
MIT Lincoln flash prototype1 ns pulse; 532 nm; up to 500 m§3.3
TigerEye / DragonEye1570 nm; 128×128 SPAD sensor§3.3
SPAD timingjitter of a few tens of picoseconds§2.2"approximately 10 ps" in §1
Kinect v2 depth0.8 to 4.2 m; accuracy 0.5 % of range§5.2reported in the cited work of Bamji et al. §5.2
Velodyne HDL-64E measured noise3.0 to 3.5 cm§3.1double the manufacturer's 2 cm
Pinhole intrinsicsα_u, α_v, u0, v0§6.1no skew term
Lens distortionρ1, ρ2, τ1, τ2§6.3
Extrinsics6 parameters§6.2
B-spline wiggling correctionn coefficients, cubic§6.4n depends on number of calibration depth planes; not stated
Calibration patternOpenCV board§6.5 fig. 12

Results

This is a survey with no new experiments. The numbers below are device specifications the paper reports, and they are author-reported. The paper gives no accuracy figures for most commercial devices, because it says they depend on surface, lighting and frame rate tab. 2 tab. 3.

Table 1: pulsed-light scanners tab. 1.

ModelResolution (H×V)Range / accuracyFOVFrame ratePoints/sLaserPulse width
HDL-64E0.08°×0.4°2–120 m / 2 cm360°×26.8°5–15 Hz1,300,000905 nm10 ns
HDL-32E0.08°×1.33°2–120 m / 2 cm360°×31.4°5–20 Hz700,000905 nm10 ns
VLP-160.08°×1.87°2–100 m / 2 cm360°×30°5–20 Hz300,000905 nm10 ns
Toyota prototype0.05°×1.5°not specified170°×4.5°10 Hz326,400870 nm4 ns

Table 2: commercial pulsed-light flash cameras tab. 2.

CameraResolutionRangeFOVFPSLaserIndoor / outdoor
TigerEye-1128×1281100 m3°×3°10–301570 nmno / yes
TigerEye-2128×128450 m8.6°×8.6°10–301570 nmno / yes
TigerEye-3128×128150 m45°×22°10–301570 nmno / yes
TigerEye-4128×12860 m45°×45°10–301570 nmno / yes
DragonEye128×1281500 m45°×45°10–301570 nmno / yes
Real.iZ VS-10001280×102410 m45°×45°30–450905 nmyes / yes
Basler640×4806.6 m57°×43°15not specifiedyes / yes

Table 3: commercial continuous-wave cameras tab. 3.

CameraResolutionRangeFOVMax FPSIlluminationIndoor / outdoorMultiple cameras
SR4000176×1440–5 or 0–10 m43°×34°30LEDyes / no6 cameras
SR4500176×1440–9 m43°×34°30LEDyes / nomany cameras
DS311160×1200.15–1 or 1.5–4.5 m57°×42°60LEDyes / nonot specified
DS325320×2400.15–1 m74°×58°60diffused laseryes / nonot specified
E70160×1200.1–10 m70°×53°52LEDyes / yes4 cameras
E40160×1200.1–10 m45°×34°52LEDyes / yes4 cameras
Kinect v2512×4240.8–4.2 m70°×60°30LEDyes / nonot specified

Other reported figures: the SR4000 runs at 10–15 FPS for the most accurate depth §5.1; the Kinect v2 has 0.5 % accuracy in its range §5.2; the paper reports no accuracy number for the flash cameras tab. 2.

Paper vs code

No official code. The paper has no code link. Its only links are to vendor websites: Velodyne, Advanced Scientific Concepts, Odos Imaging, Mesa Imaging, SoftKinetic, Fotonic and PMD §2 §3 §5. A GitHub repository search for time-of-flight horaud returned no results. The paper is a survey, so the only "code" would be the vendors' own SDKs, which are not covered here.

Pitfalls

  • Phase formula typo. The four-sample phase is arctan((C3 − C1)/(C0 − C2)) §4.1, but the depth formula in §4.3 writes (C0 − C1) in the denominator. The derivation in §4.1 gives C0 − C2 (C0 − C2 = a2·A·cos φ and C3 − C1 = a2·A·sin φ, inferred from the paper's C(ψ, φ) expression). Use C0 − C2.
  • Scale constants unknown. The amplitude and offset formulas need the emitted amplitude a2 and offset a1 §4.1. The paper does not say how to get them. Using the sensor's own amplitude-plus-offset output is the practical route §6.5, but that is not stated as a formula.
  • Radial, not z-depth. The pinhole model in §6.1 assumes the sensor measures the distance d from the optical centre to the point. The footnote says the sensor really measures to the image plane and that the offset is assumed small §6.1. Many SDKs return z-depth. Check which one your device gives before using the back-projection in Pseudocode 2.
  • No skew term. The intrinsic matrix §6.1 has no skew parameter, and the paper does not justify dropping it.
  • Phase wrap. The unambiguous range is c/(2f), 5 m at 30 MHz §4.3. Lowering f extends range and reduces accuracy §4.3. Multi-frequency unwrapping is cited but not described §4.3.
  • SR4500 range does not match the formula. The paper states a 9 m maximum at 13.5 MHz §5.1 tab. 3. Its own relation c/(2f) gives about 11.1 m. The paper does not reconcile the two. Other SR4000 values match the formula, for example 5.17 m at 29 MHz.
  • Velodyne pulse width. The text says 5 ns §3.1; Table 1 says 10 ns tab. 1.
  • Velodyne minimum range. Figure 2 gives 1 m as the minimum fig. 2; Table 1 gives 2 m tab. 1.
  • SPAD timing. "About 10 ps" §1 and "a few tens of picoseconds" §2.2 disagree.
  • Frame rates. The DragonEye is given as 10 FPS in the text §3.3 but as 10–30 FPS in Table 2 tab. 2. The SR4000 is listed at 30 FPS maximum tab. 3 but the paper says 10–15 FPS is more accurate §5.1.
  • Integration time and motion. CW sensors integrate over very many periods §4.2, so motion blur appears on moving objects and fast shutter speeds are not possible §4.3.
  • Error sources. The paper lists demodulation, integration, temperature, motion blur, distance, background light, phase wrapping, scattering and multi-path errors §4.3. It does not give magnitudes for most of them. It also says depth error from unknown materials and complex scenes is hard to predict §6.5.
  • Wiggling correction parameters. The number of B-spline coefficients and the calibration depths are not stated §6.4. An implementer must choose them and calibrate per device.
  • Multi-camera interference. Cameras can run together only if each has its own modulation frequency. SR4000 units are limited to six such frequencies, and SR4500 units encode their frequency §5.1 §4.3. Many devices do not let the user set the frequency §7.
  • Vendor data are dated. The tables describe devices at the paper's time. The paper notes that the D-imager was discontinued in March 2015 §5.3. Re-check any spec before relying on it.
  • Stereo versus ToF. The paper argues that ToF data help stereo on untextured surfaces §7. It gives no quantitative comparison.
  • Figures. The paper's figures are not reproduced here. They are cited by number only.

Lineage

  • Builds on: the cited foundations rather than cards in this wiki. Lange and Seitz (2001) for the CW principle §4; Cova et al. (1981) for SPAD timing §2.2; Glennie and Lichti for the Velodyne HDL-64E model §3.1.
  • Compared against: the paper compares the pulsed scanners, the flash cameras and the CW cameras against each other through its tables tab. 1–3.
  • Superseded by: not stated.

Source and license

Adapted from “An Overview of Depth Cameras and Range Scanners Based on Time-of-Flight Technologies” by Radu Horaud, Miles Hansard, Georgios Evangelidis, Clement Menier (arXiv:2012.06772), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors.