3D visionTroubleshooting

Point cloud with normals timeout: capture time and compute time

A point cloud grab with normals times out because host normal estimation adds compute to capture. Measure both passes and size the timeout.

LumaSpec Vision9 min read Share on LinkedIn

On this page 10 sections
  1. 01What the symptom rules out
  2. 02The grab is two operations: capture, then normal estimation
  3. 03Likely causes, in order of probability
  4. 04Worked example: sizing grab_timeout for a 2.6 s normals grab
  5. 05Fix 1: set grab_timeout past capture plus compute
  6. 06Fix 2: cut the point count before normals run
  7. 07Fix 3: grab XYZ only and compute normals in your own pipeline
  8. 08Prevention: budget the host, not just the camera
  9. 09When a bigger timeout still fails
  10. 10Questions

You request a point cloud with normals, the grab call blocks, then throws a timeout error — yet the same camera hands over XYZ in a fraction of that time once the normals and intensity components are disabled. The camera is almost never at fault. A normals-enabled grab is two operations back to back: the capture the sensor performs, then a host-side pass that estimates a normal vector for every point on your CPU. This guide splits the two timings, sizes the grab timeout from a measured worst case, and works through the three fixes: a bigger timeout, a smaller cloud, or normals computed in your own pipeline.

What the symptom rules out

A successful XYZ grab clears the camera, the trigger, the cable and the SDK installation. The failure appears only when the normals component is enabled, so the added host work is the first suspect, not the link.

Run the isolation test before anything else. Grab XYZ plus intensity with normals off. If that succeeds and the timeout returns when normals come back on, the compute pass is the cause and every fix below applies directly.

One-shot captures behave the same way: the call waits for the whole operation to finish. The capture-side version of that arithmetic is covered in software trigger image timeout: why one-shot capture misses frames.

The grab is two operations: capture, then normal estimation

With normals enabled, one grab call runs three stages in sequence: capture and encode the cloud at the sensor, transfer it across the link, then estimate a normal vector for every point before the call returns. Capture time follows camera parameters such as exposure time and encoding mode. Normal estimation time follows your computer, because each vector comes from a nearest-neighbor search around the point plus a local plane fit over that neighborhood — work that grows with the number of points.

A useful reference figure: with a default parameter set on a typical desktop PC, a full capture-plus-normals grab took about 2.6 s end to end. That total, not the capture alone, is what the timeout has to cover.

The payload grows too. XYZ alone is three 4-byte floats per point, or 12 bytes. With normals and intensity the same cloud carries about 28 bytes per point — more transfer time and more allocation on the host.

Laser profilers and structured-light 3D sensors produce the XYZ cloud at the sensor; the normal pass runs entirely on the host PC that receives it.

3D sensorsHikrobot MIS-DP3850-01P 3D laser profile sensorMIS-DP3850-01P
Type
Laser profiler
$12,379.00 · quotedView and quote
3D sensorsHikrobot MV-DP4180-03P 3D Laser Profile SensorMV-DP4180-03P
Type
Laser profiler
$12,389.00 · quotedView and quote
3D sensorsHikrobot MV-DPS200P-02 Projected structured-light 3D cameraMV-DPS200P-02
Type
Stereo / structured light
$8,829.00 · quotedView and quote

The 3D sensors category groups these by type — laser profiler, structured light, ToF — and the camera finder narrows the list by series and availability.

Likely causes, in order of probability

Work down the table in order; each test takes a minute or two.

Rank Likely cause Test What the result tells you
1 Timeout sized for capture only Set a 30 s timeout and time ten normals-enabled grabs The worst measured grab is the real budget; the old value sat under it
2 Cloud too large for the host CPU Watch CPU cores during the grab, then halve the resolution and re-time One core pinned near 100% means a single-threaded pass; half the points roughly halves its time
3 Capture slower than assumed Time the XYZ-only grab on the identical parameter set Long exposure, multi-exposure capture or full-resolution encoding raise capture as well as compute
4 Other load on the host Close other streams and applications, then re-time Shared cores stretch the compute pass and the transfer alike

Worked example: sizing grab_timeout for a 2.6 s normals grab

Inputs:

  • Worst measured normals-enabled grab t_grab_worst = 2.6 s, taken as the largest of ten timed runs with default parameters on a typical desktop PC.
  • Margin rule: set the timeout to at least twice the worst measured grab. The doubling assumes the production PC runs another task alongside the grab, starts cold after power-up, or simply has slower cores than the measurement machine — any of which stretches the compute pass.
t_grab = t_capture + t_transfer + t_normals grab_timeout ≥ 2 × t_grab_worst

Arithmetic: 2.6 s × 2 = 5.2 s, so set grab_timeout to 5,200 ms; where the API steps in whole seconds, 6 s.

Decision: below 2.6 s of budget, every normals-enabled grab fails. Between 2.6 s and 5.2 s, grabs pass on a quiet PC and start failing the moment anything else loads the CPU. At 5.2 s or above, the grab survives a busy host. Re-run the ten timed grabs after any change to resolution, exposure, encoding mode or host PC, because the budget moves with them.

Fix 1: set grab_timeout past capture plus compute

The direct fix is the timeout itself. The setting lives in the grab call of your vision library — grab_timeout in the obtain_point_cloud_with_normals example program, set before you call grab_data. Enter the value in the unit the parameter documents; most libraries take milliseconds.

A timeout decides only how long the call waits, never how fast the compute runs. If the cycle tolerates a 5.2 s call, this fix is complete. If the inspection rate cannot spare the time, the compute itself has to shrink — that is the next two fixes.

Fix 2: cut the point count before normals run

Normal estimation cost tracks the point count, so cloud size is the lever with the most reach. Halve the resolution and the pass typically takes about half the time; crop to the region the inspection actually grades and estimate normals only inside it.

Changing resolution at capture time is a documented operation on most 3D sensors: see changing depth resolution and field of view at capture time and the X, Y and Z resolution settings that keep the cloud undistorted.

Fix 3: grab XYZ only and compute normals in your own pipeline

Request XYZ — plus intensity where you need it — in the grab, and run normal estimation as a separate step in your own code. The grab call then returns at capture speed, grab_timeout never has to cover the compute, and the normal pass runs where you schedule it: a worker thread, a batch after the run, or another machine altogether.

The trade is that you own the normal code path: you choose the neighborhood radius or neighbor count, and edge behavior changes with that choice. For inline inspection where every cycle needs normals, keep the pass on the station PC and parallelize it; for offline measurement, batch it and let the cores work through the queue.

Prevention: budget the host, not just the camera

Re-time the grab after every parameter change and keep the worst case in the station log. A change that looks optical — longer exposure, finer resolution, multi-exposure capture — moves the compute budget too, because it hands the normal pass more points to fit.

A filter or a second camera stream on the same PC competes for the same cores; the guide on point cloud filters that slow the depth camera measures that competition.

Treat the host as part of the machine design when normals run every cycle. The vision controllers in the catalog are built around multi-camera capture plus algorithm load, not office duty.

Vision controllersHikrobot MV-VC5525-256G70-NN VC5000 Vision Controller, 12th-I5, 32GB+256G SSD, Supported PCIEMV-VC5525-256G70-NN
LAN ports
5+ LAN ports
USB 3 ports
3-4 USB 3 ports
PoE
PoE camera ports
Light outputs
8 built-in channels
$4,479.00 · quotedView and quoteBuild a system with it

As a concrete anchor, the MV-VC5525-256G70-NN pairs a 12th-gen Intel Core i5 with 32 GB of memory and PoE camera ports — the class of host a normals-per-cycle station needs.

Sizing a new station? The configurator's controller step walks ports, memory and light channels in one pass.

Build the whole station

The configurator matches a camera, lens, light, light controller and cables to each other, step by step, and lists only parts that fit what you already picked.

Start with the light controller

When a bigger timeout still fails

If a 30 s timeout still expires, compute time is no longer the explanation. The list changes:

  • Firmware and SDK mismatch: a normals component the firmware cannot fill stalls the grab instead of failing early. Re-align versions per the firmware and SDK alignment check.
  • Stalls under load: the grab hangs mid-transfer rather than waiting on compute; the acquisition stalls under load guide walks the recovery split.
  • Link saturation: extra components raise bytes per point, and a marginal cable or switch drops below the needed rate. Start with diagnosing stream failures on the transfer side.

Only trim the timeout once ten timed grabs sit comfortably inside it — and never below twice the worst measured grab.

Next step: set a 30 s timeout, time ten normals-enabled grabs, and put the worst case into the formula above. The 3D vision topic page collects the other point-cloud guides; if a station log still refuses to fit the cycle, bring it to the contact page and we will read it with you.

Questions

How much slower is a point cloud with normals than the same grab without them?

The capture itself does not change; the added time is the host-side normal estimation pass. With default settings on a typical desktop, capture plus normal vectors for a full cloud has been measured at about 2.6 s. That compute share scales with point count and CPU cores, so an underpowered host can stretch it well past the capture time.

What grab timeout should I set for a point cloud with normals?

Measure the worst grab over ten runs with a generous temporary timeout, then set the real timeout to at least twice that worst case. For a 2.6 s worst measurement that is 5.2 s, so enter 5,200 ms or round up to 6,000 ms. Re-measure after every change to resolution, exposure, encoding mode or host PC.

Does the intensity image slow the grab the same way normals do?

No. Intensity is captured alongside depth and travels with the point cloud, so it adds bytes per point and transfer time rather than a CPU pass. The timeout failure with both components enabled is almost always the normal estimation. If XYZ plus intensity still times out, look at the link and the stream instead of the compute.

Why does normal estimation use so much CPU?

Each point's normal comes from fitting a small local plane to the points around it, which requires a nearest-neighbor search per point across the cloud. The cost grows with the number of points, and single-threaded implementations keep one core busy while the rest idle. More cores help only if the SDK or your own code parallelizes the pass.

Can the 3D camera deliver normals itself, so the PC has nothing to compute?

In the camera-plus-SDK setup discussed here, the sensor delivers XYZ and intensity and the normal vectors are derived on the host, which is why the compute time follows your computer rather than the camera. Plan either a host with cores to spare or a pipeline that grabs XYZ first and computes normals off the trigger path.