Sandbox — LSD is in active testing. All systems operational·payments are test-mode (no real charges).
Overview Use Cases News Docs Tool Store Support Community Get LSD
Use cases/ Robotics/ Building a warehouse occupancy map from LiDAR sweeps
Fused warehouse point cloud in the 3D viewer above the finished 2D occupancy grid replace with clip · 1600 × 900

Building a warehouse occupancy map from LiDAR sweeps

Drop a folder of LAS/LAZ sweeps on the canvas, chain registration, voxel downsampling, and ground removal, then bake a 10 cm occupancy grid. You get a scrubbable 3D map and a nav-ready GeoTIFF from one live pipeline. When the robot rescans the floor, drop the new files and every export rebuilds itself.

▶ Video walkthrough Intermediate ⏱ 35 min lidaroccupancy-gridpoint-cloudnavigationwarehouse

Why we stopped scripting this#

Every warehouse robot team has the same folder somewhere: register.py, downsample.py, make_grid.py, and a README nobody trusts. The map got rebuilt whenever someone remembered, and when racking moved, the nav stack found out the hard way. The pipeline below replaced that folder in an afternoon — and because every node is live, the map now rebuilds itself whenever new sweeps land.

What you'll need#

About 4 GB of LAS/LAZ sweeps from a mobile robot — ours is a scan cart doing a slow lap of a 6,000 m² floor — with odometry poses embedded or sitting in a sidecar CSV. No PDAL, no Open3D, no conda environment that only builds on one laptop. If you don't have scans handy, the sample warehouse dataset bundled with LSD runs the whole walkthrough end to end.

When the floor changes#

This is the part that pays rent. Racking moved in aisle 9 last month; the robot re-scanned overnight, we dropped the new sweeps onto the same canvas, and the cached intermediates downstream recomputed on their own. The GeoTIFF and glTF exports rebuilt in under two minutes, and the nav team pulled the fresh grid without a single Slack message.

Step by step

How it's built

  1. #015 · Load 01

    Drop the sweeps on the canvas

    Drag all 38 .laz files from the robot's scan folder onto the canvas. LSD stacks them into a single @load node and previews the raw cloud — 212 million points, colored by intensity. Open the inspector to confirm each sweep's odometry pose came along for the ride.

    Stacked load node with all 38 sweeps and the raw intensity-colored preview replace with screenshot · 1200 × 750
  2. #016 · Shape 02

    Register the sweeps into one cloud

    Add a @shape registration node and feed it the embedded odometry poses. Toggle ICP refinement and watch the doubled-up aisle walls snap into single crisp planes in the preview. The registered cloud is a cached intermediate, so nothing downstream ever re-runs the alignment.

    Aisle walls snapping into alignment after ICP refinement replace with screenshot · 1200 × 750
  3. 03

    Thin the cloud with a voxel grid

    Chain a voxel downsample node and drag the cell size to 5 cm. The preview thins live — 212 million points fall to 9 million with every rack leg still standing. Everything downstream now recomputes in seconds instead of minutes.

    Voxel size slider with the live point-count readout replace with screenshot · 1200 × 750
  4. 04

    Cut away the ground plane

    Add a ground-removal node set to plane fit with a 4 cm tolerance. The slab vanishes while pallet feet, floor tape, and low debris survive as obstacles. What's left is exactly the geometry the robot can hit.

    Cloud with the slab removed and obstacles left standing replace with screenshot · 1200 × 750
  5. #017 · Shape 05

    Bake the 2D occupancy grid

    Drop a rasterize node and set 10 cm cells over a 0.2–1.8 m height band. Points inside the band mark cells occupied; everything scanned but empty becomes free space. The grid renders beneath the 3D cloud so you can check each rack against its footprint.

    Occupancy grid rendered beneath the 3D cloud replace with screenshot · 1200 × 750
  6. #018 · Deliver 06

    Export the map for the nav stack

    Wire the grid into a @deliver node set to GeoTIFF and send the fused cloud out as glTF for the sim team. Hit export and both files land in the nav stack's map folder. When new sweeps arrive, the same canvas rebuilds both exports untouched.

    Export node with GeoTIFF and glTF outputs configured replace with screenshot · 1200 × 750
The pipeline

Every step used, at a glance

Load

LiDAR sweeps

Stack 38 mobile-robot sweeps into one node with per-sweep odometry poses intact.

LAS/LAZ
Shape

Register, thin, flatten

ICP-register the sweeps into one cloud, voxel-downsample it, strip the ground, and rasterize the occupancy grid.

Deliver

Nav-ready map

Scrub the fused map in the 3D viewer and export the grid and mesh for the nav stack.

GeoTIFFglTF
212M → 9M
points after the voxel pass
10 cm
occupancy grid resolution
Zero scripts
between raw sweeps and a nav-ready map

More use cases