DevBriX
AGV/AMR·Jul 05, 2026·12 min read

LiDAR scan processing: Filtering point clouds in real-time

Handling noise and false positives in 2D LiDAR data for AGV navigation using computationally lightweight algorithms on edge devices.

LiDAR scan processing: Filtering point clouds in real-time

Filtering LiDAR point clouds in real-time on AGV edge hardware

A 2D LiDAR feeding an AGV's navigation stack produces noisy data by nature — dust, reflective surfaces, and thin obstacles like table legs all generate readings that a naive obstacle map will happily misinterpret. The challenge is filtering that noise on an edge CPU with a real-time budget, not a GPU with headroom to spare.

Where the noise actually comes from

  • Reflective and glossy surfaces produce spurious returns or dropped readings entirely, since the beam scatters away from the sensor instead of back to it.
  • Dust and airborne particulate in warehouse environments creates sparse, randomly-positioned false points.
  • Mixed pixels at object edges — where a beam partially clips an object's boundary — return a distance between the true near and far surfaces, neither of which is real.

Lightweight filtering that fits an edge budget

Statistical outlier removal (comparing each point's distance to its neighbors' median) catches most dust-induced noise for a fraction of the cost of a full point-cloud library. Temporal consistency filtering — only trusting a point if it appears in 2 of the last 3 scans at roughly the same position — removes single-frame reflections without adding meaningful latency.

For mixed-pixel edge noise, a simple angular-gradient check between adjacent beam returns flags suspicious jumps far more cheaply than a full RANSAC line-fit pass, though RANSAC is worth reserving for extracting wall segments once the cloud is already cleaned.

Keeping it real-time

On a Cortex-A72-class edge processor, a naive nearest-neighbor search across a full scan (360–1000+ points) can blow your cycle budget if you're running at 10+ Hz. A grid-based spatial hash built once per scan turns O(n²) neighbor lookups into near-O(n), which is usually the difference between a filter that keeps up and one that lags behind the vehicle's actual motion.

Fusing filtered scans into the occupancy map

Once points are cleaned, a probabilistic occupancy grid (log-odds updates per cell) tolerates the residual noise far better than a binary occupied/free map — a single stray point no longer flips a cell permanently, it just nudges a probability that decays if not reinforced by subsequent scans.

Takeaway: the goal on edge hardware isn't the most sophisticated filter — it's the cheapest filter that removes enough noise that your planner stops seeing phantom obstacles, without eating into the latency budget your control loop depends on.