Point cloud filtering for rain, dust, and fog

Rain, dust, and fog produce false-positive point returns at high density. We compared four filtering approaches across a 30-day outdoor delivery robot trial and present the accuracy–latency trade-offs.

Side-by-side LiDAR point cloud scans showing raw vs filtered returns during rainfall

LiDAR sensors are frequently marketed as "all-weather" capable, and in a narrow sense they are — the laser pulse continues to fire in rain, fog, and dust, unlike cameras that degrade in low light. But the point cloud you get from a LiDAR in heavy rain is not a clean representation of the physical scene. It contains false returns from water droplets, intensity anomalies where rain-wet surfaces specularly reflect, and missing returns where water on the lens diffuses the transmitted beam. An unfiltered point cloud in heavy rain looks, to a naive occupancy grid update, like a dense fog of obstacles at close range.

We ran a 30-day outdoor delivery robot trial that included 8 rain events ranging from light drizzle to 25mm/hour downpour, several high-dust-load days (the robot operates near a construction zone), and intermittent morning fog. This post presents what we measured and how PathVynt's preprocessing layer handles each condition.

How rain returns appear in the point cloud

A single raindrop at 3m range from an Ouster OS1-32 produces a return at approximately 3m with an intensity between 20–40 (on the 0–255 scale). The return occupies a single angular cell. A heavy downpour at 25mm/hour produces approximately 80–120 raindrop returns per scan cycle per 10° angular sector, scattered throughout the 0–20m range. These returns are individually indistinguishable from small solid objects — a 20cm sphere at 3m would produce a similar return profile.

The distinguishing characteristics of rain returns are:

  • Temporal inconsistency: Rain returns at a given azimuth/elevation angle are independent from one scan to the next. A real obstacle at the same position will produce returns at consistent range and intensity across 3+ consecutive scans.
  • Range clustering: Rain produces returns throughout the range column, not at a specific range. A real obstacle produces a tight range cluster — all returns from the same surface are within 2–5cm of each other.
  • Intensity distribution: Rain returns cluster in the 15–50 intensity range. Most real surfaces (except highly absorptive black materials) produce returns above 60. The intensity distribution of the scene shifts noticeably in rain.

Four filtering approaches compared

We compared four approaches for rain filtering, measuring both false positive removal rate (what fraction of rain returns were correctly identified as noise) and false negative rate (what fraction of real obstacle returns were incorrectly removed as noise).

Approach 1: Intensity threshold filter. Remove returns below intensity threshold T. Simple, zero-latency. At T=50: removes ~72% of rain returns but also removes 15% of real obstacle returns (dark surfaces, asphalt edges). At T=30: removes 45% of rain returns, 3% of real obstacle returns. Not sufficient alone but useful as a first-pass filter before temporal approaches.

Approach 2: Radius outlier removal (PCL ROR). Remove points that have fewer than K neighbors within radius R. Standard approach from the Point Cloud Library. At K=3, R=0.15m: removes ~68% of rain returns with 8% false negative rate on real obstacles. Latency: 4–7ms per scan on Jetson Orin NX, which is significant when running at 20Hz. Not suitable as the primary filter on power-constrained platforms without modification.

Approach 3: Temporal consistency filter (PathVynt default). A point is retained only if a corresponding point exists within a spatial tolerance in the previous N scan frames. At N=3, spatial tolerance 5cm: removes ~88% of rain returns with a false negative rate of under 2% on real obstacles. Latency: 2ms per scan (the temporal buffer uses an efficient spatial hash, not a full ICP step). This is PathVynt's default preprocessing approach because it handles rain, dust, and fog with a single mechanism without intensity-threshold tuning per environment.

Approach 4: Intensity histogram normalization. Rather than removing returns, reweight each point's occupancy contribution based on its intensity relative to the current scan's empirical intensity distribution. In rain, the distribution shifts left; the normalized weights reduce the occupancy contribution of likely-rain points without removing them entirely. This is a softer approach that preserves uncertain occupancy state rather than binary present/absent. Trade-off: the occupancy grid has higher uncertainty in rain, which the planner must handle with wider safety margins. Latency: 1ms per scan.

Dust and fog: different profiles

Construction-zone dust is different from rain. Dust returns are concentrated in the 0–5m range (the dense particle region immediately around the robot) and have very low intensity (typically below 25). They are also denser than rain — thousands of returns per scan rather than hundreds. The temporal consistency filter handles dust well because dust particles at 2m range are also temporally inconsistent across scans.

Fog is the most difficult condition. Dense fog at 100m/100m visibility produces returns distributed throughout the 0–100m range at medium intensity (30–60). The temporal consistency filter has higher false negative rates in fog because water droplets in a dense fog patch can be relatively stable in position from one scan to the next — they're not moving like rain, they're diffusing slowly.

PathVynt's fog mode (WeatherFilter.mode = FOG) adds a secondary filter: range-weighted intensity threshold. Returns below a range-dependent intensity threshold are suppressed. At 5m range, the threshold is 40; at 20m, the threshold is 55; at 50m, 70. This reflects the known behavior of fog: more distant returns through fog have lower signal-to-noise and are less likely to represent real obstacles. The thresholds are configurable per-deployment based on your fog density profile.

Practical guidance for outdoor delivery robot deployments

For a delivery robot operating year-round in a temperate urban environment:

  • Enable temporal consistency filter (depth=3) as the base configuration. This handles most rain and dust without tuning.
  • Set weather mode to AUTO. PathVynt detects adverse conditions by monitoring the current scan's temporal consistency rate — if it drops below 70%, the engine automatically activates enhanced filtering. You don't need to pre-configure for specific weather; the runtime adapts.
  • In fog-prone regions (coastal, morning valley fog): enable range-weighted intensity threshold in addition to temporal consistency. The combined filter reduces missed detections in fog at the cost of slightly wider occupancy uncertainty in dense fog conditions.
  • Log the /pathvynt/weather_state topic in production. It records which filter mode is active, the temporal consistency rate, and the detected intensity distribution per scan. This data is invaluable for retrospective analysis when a near-miss or unexpected stop is investigated.

One thing to be clear about: no filtering approach eliminates the fundamental limitation that LiDAR detection range drops in dense atmospheric conditions. In 50m visibility fog, your effective detection range for small obstacles (pedestrians) drops to approximately 15–20m regardless of the filtering quality. If your application requires maintaining full detection range in dense fog, you need additional sensor modalities — particularly FMCW LiDAR or radar — not better filtering of mechanical-spin LiDAR returns. PathVynt's filtering makes the most of the signal you have; it doesn't create signal that isn't there.