K3-1-1

Velodyne VLP-32C — User Manual Key Information

Created 2020-06-08Updated 2026-07-18robot

  • Description: Key-information digest of the Velodyne VLP-32C ("Ultra Puck") LiDAR User Manual (doc 63-9325) — sensor model, packet rates, data/position packet structure, azimuth/distance encoding, and network access. Reference for parsing raw VLP-32C UDP streams
  • My Notion Note ID: K3-1-1
  • Created: 2020-06-08
  • Updated: 2026-07-18
  • License: Free to share: please credit Yu Zhang and link back to yuzhang.io

Table of Contents


1. Overview

VLP-32C = 32-channel mechanical spinning LiDAR ("Ultra Puck"), 903 nm, time-of-flight. Reference figures/tables below cite the User Manual (63-9325).

1.1 How LiDAR works (Time of Flight)

  • Each IR laser emits a pulse; time-of-shooting + direction registered.
  • Pulse travels until it hits an obstacle → part of the energy reflected back → paired IR detector registers time-of-acquisition + received power.
  • Distance ← round-trip time; reflectivity ← received power.

1.2 Sensor Origin & Frame of Reference

  • Distances reported relative to the sensor in spherical coordinates: radius rr, elevation ω\omega, azimuth α\alpha.
  • Data origin (0,0,0)(0,0,0) is 37.34 mm above the sensor base, on the center axis (Figure 9-1).

1.3 Packet Types

  • Data packets — 3D measurements + calibrated reflectivity, a set of azimuths, a 4-byte timestamp, and two factory bytes (identify sensor model + return mode → software auto-adapts to the data format).
  • Position packets — echo of the last NMEA message from a GPS time source (if configured) + a byte for the PPS (Pulse Per Second) signal state.

1.4 Calibrated Reflectivity

  • Diffuse reflectors: 0–100 (for reflectivities 0%–100%).
  • Retro-reflectors: 101–255 (255 = ideal retro-reflector; 101–254 = partially obstructed / imperfect).

1.5 Laser Return Modes

Sensor analyzes multiple returns; selectable output = strongest, last, or both (dual return).

1.6 Precision Azimuth Calculation

  • The azimuth α\alpha reported per data block = the center line of the firing pattern at the moment the first laser pair fired.
  • Lasers are offset from the center line by fixed amounts → to get each point's precise azimuth, apply a horizontal offset per laser (vertical angle + azimuth offset given by the laser's position in the packet, Table 9-2). Lasers are not evenly placed.

2. Sensor Operation & Rates

2.1 Firing Sequence

  • Takes 55.296 μs to fire + recharge all 32 lasers (a "firing sequence" / "firing group"). Lasers fire in pairs.
  • Time between firings = 2.304 μs. 16 firings, then an idle recharge period of 18.432 μs:
(16×2.304 μs)+18.432 μs=55.296 μs(16 \times 2.304\ \mu s) + 18.432\ \mu s = 55.296\ \mu s

The manual's prose rounds the idle period to 18.43 μs but uses 18.432 μs in the formula — 18.432 is the exact value.

2.2 Data Packet Rate

  • 12 firing cycles per data packet → accumulation delay 12×55.296 μs=0.66355212 \times 55.296\ \mu s = 0.663552 ms/packet.
  • 1/0.663552 ms=15071 / 0.663552\ \text{ms} = 1507 packets/second.
  • 1248 bytes/packet×1507 packets/s=1,880,736 bytes/s1248\ \text{bytes/packet} \times 1507\ \text{packets/s} = 1{,}880{,}736\ \text{bytes/s}.

2.3 Position Packet Rate

  • Position packets arrive at ≈ 1/14 the data-packet rate:
  • 554 bytes/packet×1507/14=59,634 bytes/s554\ \text{bytes/packet} \times 1507 / 14 = 59{,}634\ \text{bytes/s}.

2.4 Total Packet Rate

  • Single return: 1,880,736+59,634=1,940,370 bytes/s1{,}880{,}736 + 59{,}634 = 1{,}940{,}370\ \text{bytes/s}.
  • Dual return (data rate doubles, position rate unchanged): (2×1,880,736)+59,634=3,821,106 bytes/s(2 \times 1{,}880{,}736) + 59{,}634 = 3{,}821{,}106\ \text{bytes/s}.

2.5 Laser Measurements per Second (single return)

  • 32 firings/block×12 blocks/packet=384 firings/packet32\ \text{firings/block} \times 12\ \text{blocks/packet} = 384\ \text{firings/packet}.
  • 384×1507=578,688384 \times 1507 = 578{,}688 laser measurements/second.

2.6 Rotation Speed

  • Motor: 300–1200 RPM inclusive, in increments of 60 RPM (300, 360, 420, …, 1140, 1200).

3. Data Packet Structure

3.1 Laser Channel

  • A single 903 nm laser emitter + detector pair, fixed at a particular elevation angle, with its own Laser ID.
  • Elevation doesn't change → not stored in the packet; inferred from the data point's position in the block.
  • In VLP-32C, no laser channel is vertically inline with the azimuth in a firing group; each channel is offset by one of four different azimuth offsets.

3.2 Data Point

  • 3 bytes = 2 bytes distance + 1 byte calibrated reflectivity.
  • Distance = unsigned int with 4 mm granularity → a raw value 25,154 represents 25,154×4=100,61625{,}154 \times 4 = 100{,}616 mm = 100.616 m.
  • Elevation angle ω\omega inferred from position within the data block.

3.3 Azimuth

  • 2-byte unsigned int, in hundredths of a degree → raw 27,742 = 277.42°.
  • Valid range 0–35,999. One azimuth reported per data block.

3.4 Data Block

  • Holds one firing sequence of 32 lasers; 12 data blocks per data packet; one azimuth per block.
  • 100 bytes = 2-byte flag 0xFFEE + 2-byte azimuth + 32 data points (2+2+32×3=1002 + 2 + 32 \times 3 = 100).
  • For time-offset calculations, number the blocks 0–11.

3.5 Time Stamp

  • 4-byte, 32-bit unsigned int marking the first data point of the first firing sequence of the first block.
  • Value = microseconds since the top of the hour, range 0 – 3,599,999,999 (μs in one hour).

3.6 Factory Bytes

  • Two bytes indicating how azimuths + data points are organized in the packet (values/meanings in Table 9-1). Together with the model byte they let parsing software auto-adapt.
  • (VLP-32C firmware at time of manual = 4.3.0.0.)

3.7 Overall Data Packet

  • 1248 bytes, sent via UDP on port 2368: 42-byte protocol header + 12 data blocks + 4-byte timestamp + 2 factory bytes.
  • Two formats: Single Return (strongest or last) and Dual Return.
  • In dual return the sensor sends a pair of blocks per azimuth firing: odd blocks (1, 3, …, 11) = strongest or second-strongest; even blocks (0, 2, …, 10) = last return. If strongest = last, the second-strongest is provided; if only one return, even|odd pairs are identical. Data rate doubles.

4. Position Packet Structure

  • 554-byte UDP packet on port 8308: an echo of the NMEA sentence from an external time source + PPS status + a timestamp of when the position packet was assembled.
  • Field layout (Table 9-3, offsets from start of packet). Several fields the older draft marked "unused" are actually sensor telemetry:
Bytes Offset (hex) Description
42 0x0000 UDP header
187 0x002A Reserved
11 0x00E5 Board temperatures + ADC calibration status/timing
4 0x00F0 Timestamp (μs since top of hour)
1 0x00F4 Pulse Per Second (PPS) status
3 0x00F5 Thermal status, last-shutdown temp, power-up temp
128 0x00F8 NMEA sentence (GPRMC/GPGGA), fixed 128-byte field, null-padded
178 0x0178 Reserved

Total = 42+187+11+4+1+3+128+178=55442 + 187 + 11 + 4 + 1 + 3 + 128 + 178 = 554 bytes.

5. Access & Control

  • Default IP: factory-set to 192.168.1.201. To talk to the sensor directly, put the host on the same subnet.
  • Web interface: connect Ethernet → power the Interface Box (two green LEDs) → sensor starts scanning/transmitting ~30 s after power-up → browse to http://192.168.1.201. The web UI exposes most control settings.
  • Visualization: VeloView (open-source, Velodyne-tailored) for live view + recording; ROS / PCL can substitute.
  • Scripted control: HTTP curl against the sensor's control endpoints (see manual).

References

  • Velodyne LiDAR. VLP-32C User Manual (63-9325). — the source manual; §6 (data structures), §8 (firing timing), §9 (packet formats), Appendix C (mechanical). Firmware 4.3.0.0.