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
- 2. Sensor Operation & Rates
- 3. Data Packet Structure
- 4. Position Packet Structure
- 5. Access & Control
- References
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 , elevation , azimuth .
- Data origin 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 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:
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 ms/packet.
- packets/second.
- .
2.3 Position Packet Rate
- Position packets arrive at ≈ 1/14 the data-packet rate:
- .
2.4 Total Packet Rate
- Single return: .
- Dual return (data rate doubles, position rate unchanged): .
2.5 Laser Measurements per Second (single return)
- .
- 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 mm = 100.616 m.
- Elevation angle 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 (). - 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 = 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
curlagainst 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.