IEEE/RSJ IROS · 2022 · an animated walkthrough

Elevation Mapping for Locomotion and Navigation using GPU

The paper in 119 seconds · narrated · sound on
Transcript

A four-legged robot hikes a steep, overgrown trail, and climbs over boxes in the lab. Both rely on a map of the ground. How do you build it fast enough, and keep it honest?

A walking robot entering a cave or a stairwell sees only a slice of the ground at a time. So it keeps an elevation map: a grid that remembers one ground height per square, and plans every path and footstep on it. Flat maps can't describe steps, and full 3-D maps are heavy. One height per square is light and fits legged robots.

The catch is speed. A depth camera sends about 400,000 points per frame, and the older software handled them one after another. This paper moves the work to the graphics chip, the GPU, where thousands of small workers each handle one point at once. Each square blends in new points, trusting near ones more than far, noisy ones.

Field tests showed the map could lie. When the robot's own height estimate drifts, the whole map is shifted to match the newest scan. Ray casting traces the line from the sensor to each point; anything that line passes through is erased, so moved obstacles vanish. And a low beam close to the robot is ignored, instead of turning into a wall. Even hidden ground gets a limit: it can be no higher than the rays that flew over it. Extra layers, like a learned safety score, filled-in holes and flat regions, serve both path planning and footstep planning.

On the robot's own computer, a full update takes under 7 milliseconds: every laser scan makes it into the map. The map guided four ANYmal robots through caves in the DARPA Subterranean Challenge. Released as open source, it became the terrain map behind many walking controllers that followed.

Real footage: Robotic Systems Lab, ETH Zurich, from the lab’s videos for the robust perceptive locomotion paper (Miki et al., Science Robotics 2022; hiking trail and height-sample view) and for TAMOLS (Jenelten et al., 2022; lab obstacle course and map layers). Both controllers use this paper’s map. The rest of the video uses the animations below and the paper’s figures. Voice: Kokoro TTS (synthetic). Music and sound effects: synthesized for this video.

The story in plain words

Researchers at ETH Zurich moved a walking robot’s terrain map onto its graphics chip, so it can turn hundreds of thousands of sensor points into a clean map of the ground many times a second, and they fixed the everyday glitches that make such maps lie.

  1. Why this matters

    A robot walking into an unknown cave or stairwell only sees a slice of the world at a time. To decide where to go and where to put each foot, it needs a map that stitches its sensor readings together as it moves.

  2. What makes it hard

    A depth camera can deliver about 400,000 points in a single frame, many times a second. The map must keep up, and it must not lie: a slow error in the robot’s own height, an obstacle that moved away, or a low ceiling can all leave “ghosts” in it, like a fake step or a wall that isn’t there.

  3. What people did before

    The same lab’s earlier open-source height map worked well for slower walking and for navigation, but it ran on the main processor and slowed down steeply as points piled up. Other GPU tools thinned the points out for long-range driving (too coarse for feet), or kept full 3-D block maps that need much more memory.

  4. What this paper does

    It runs the whole map update on the graphics chip, where thousands of small workers each handle one point at once, like a stadium crowd each checking one seat instead of one usher walking every row. On top, it adds fixes found in field tests and extra layers that navigation and walking controllers need.

  5. What they showed

    On the robot’s own computer a full update from about 43,000 laser points took 6.9 ms, about a seventh of the time between two scans. The map kept up with every LiDAR scan, removed ghosts the earlier software left behind, and ran on four robots in the DARPA Subterranean Challenge.

  6. Why it’s a step forward

    One fast, shared map serves both “where can I go?” and “where do I step?”, and it is open source, so many later controllers were built on it. Its limit: one height per square, so bridges or several floors need workarounds.

Words used below
elevation map
a grid seen from above; each square stores one ground height (“2.5-D”)
point cloud
the dots a laser scanner or depth camera returns, each a 3-D position
GPU
graphics chip: thousands of simple workers running at the same time
drift
a slowly growing error in the robot’s estimate of where it is
ray casting
tracing the line from the sensor to each point; that line must be empty
traversability
a 0-to-1 score for how safe a patch of ground is to cross
1 / 8
sensor points & rays elevation map this paper (GPU & fixes)
Scene 1

Read the full section with the paper’s figures ↓

The paper, section by section

Everything the animation skips

Each section matches one scene above. Press “Watch scene” to jump back to its animation; click any figure to enlarge it. Figures are from the paper; the text is a plain-language walkthrough.

Scene 1

Why a robot needs a map

In short: a robot only sees a slice of the world at a time, so it keeps a map that remembers what it has seen, and that map has to update as fast as the robot moves.

A mobile robot in an unknown place perceives it with onboard sensors: LiDARs (laser scanners) and depth cameras. Each returns a point cloud, a set of 3-D dots on whatever the beams hit. One frame covers only part of the surroundings, so robots fuse the frames over time into a map, then plan on that map.

Two kinds of users need that map. A navigation planner asks “which way can I go?” and rates the terrain by slope and roughness. A walking controller for a legged robot asks “where exactly can each foot land?” and needs fine detail around the feet. The paper builds one map that serves both, in real time.

Paper Fig. 1. The quadruped ANYmal on a staircase (top left) and the map it builds there, shown as several layers: the raw heights, a traversability score, surface normals, filled-in holes and flat regions cut into polygons.
Scene 2

Which kind of map?

In short: storing one ground height per square is the sweet spot for walking robots: it can describe steps and slopes, and it stays small.

The classic occupancy grid marks each square of a flat floor plan as occupied or free. That is fine for a wheeled robot indoors, but on rough terrain with slopes and steps it has no way to say “this is a step you can climb”.

An elevation map (often called 2.5-D) keeps the same flat grid but stores a ground height in each square. Earlier work extended it to several levels per square for structures like bridges. Voxel maps go fully 3-D: space is cut into small cubes, each with a probability of being occupied. They can describe anything, but for the same square size they need far more memory than a height grid.

Some systems build a voxel map and then flatten it into a height map. The paper points out the cost: fine resolution means tiny cubes and lots of memory, and the robot then has to keep both maps. This paper builds the height map directly from the points.

Map typeStoresStairs & slopesMemory
Occupancy grid (2-D)occupied / free per squarenosmall
Elevation map (2.5-D)one height per squareyessmall
Voxel grid (3-D)occupancy per cubeyes, plus overhangslarge

What this means: for legged robots the height grid gives most of the benefit of 3-D at a fraction of the memory, which is why this paper, and the controllers built on it, use one.

Scene 3

One worker vs. thousands

In short: the map update is the same small job for every point, so the paper hands each point to its own worker on the graphics chip instead of queueing them on the processor.

The starting point is the lab’s earlier open-source elevation map by Fankhauser et al. It moves each incoming point into the robot’s map frame and updates that square’s height, all on the CPU (the main processor). That worked for earlier walking and navigation experiments, but the paper found it was not efficient enough to process large point clouds in real time for faster, more agile robots.

Updating a square from a point barely depends on the other points, which is exactly the kind of work a GPU is built for. The paper writes the update as custom GPU programs (CUDA kernels, written through the Python library CuPy) that run over all points in parallel. The map lives in GPU memory the whole time; it is copied back to the CPU and published as a ROS message (the usual robot messaging system) only at a rate the user chooses, which avoids needless copying.

Animated. The raw depth-camera case: the CPU lane’s single worker is still going when the GPU lane has already updated the map again. The worker speeds are schematic; the tick rates at the bottom are the paper’s 60 Hz sensor and 16.1 Hz map updates, slowed down 20×.
Paper Fig. 2. The pipeline. Points and the robot’s pose go into GPU memory; there the points are transformed, the height drift is corrected, heights are updated with ray casting, and per-cell layers are computed. Only the finished map crosses back to the CPU.
Paper Fig. 7. Processing time as the number of points grows, on a desktop PC and on the robot’s Jetson Xavier. The earlier CPU software (blue) grows steeply; the GPU version (red/orange) stays low, even though it also runs ray casting, traversability and normals, which the baseline measurement did not include. Arrows mark two Bpearl LiDARs (≈ 110,000 points) and one RealSense camera (≈ 920,000).
Sensor settingPoints per frameMap updates / sSensor frames / s
Depth camera (RealSense), filtered6,27649.460
Depth camera (RealSense), raw407,04016.160
LiDAR (Bpearl), raw43,07419.9920

What this means: on the robot’s own computer, the map keeps pace with every LiDAR scan and still updates 16 times a second from 400,000-point camera frames; with a lightly thinned camera cloud it reaches almost 50 updates a second, which the paper calls fast enough for walking. (Paper Table II; 10 m × 10 m map at 4 cm.)

Scene 4

Fusing points into a height

In short: each square keeps a height and an uncertainty, and every new point nudges the height, more if the point is trustworthy, not at all if it is clearly wrong.

The height update follows the earlier probabilistic elevation map: a one-number Kalman filter per square, the textbook way to blend a running estimate with new noisy measurements. With h the square’s height, σm² its variance (uncertainty), pz a new point’s height and σp² that point’s variance:

h ← (σp² · h + σm² · pz) / (σm² + σp²)  // weighted average: the less certain side counts less
σm² ← σm² σp² / (σm² + σp²)  // uncertainty shrinks with each point
σp² = αd · d²  // point noise grows with distance d squared; αd set by the user

The distance rule is a simplified version of a published depth-sensor noise model. A new square starts with a very large variance, so its first point is taken almost as is. A small constant variance is also added over time, so squares that stop being updated slowly become less certain.

Animated. Watch the weights under each point: the far readings move the estimate little, the near ones a lot, and the teal band (the square’s uncertainty) narrows. Noise level and readings are illustrative.

Two guards

Outliers. As in the earlier work, a point whose height is too many standard deviations away from the square’s estimate (a large Mahalanobis distance) is rejected.

Wall edges. A square on the edge of a wall receives points from the top and from the face. Plain averaging pulls its height below the true top. The paper counts the points that fall into a square in one update; above a threshold, points lower than the current estimate are ignored. This check runs before the outlier test, which keeps edges sharp.

Animated. The red dashed line is the plain average; the teal line skips points below the estimate and stays at the top of the wall. Values are illustrative.
Scene 5

Fixing the ghosts

In short: field deployments showed three ways a height map goes wrong (drift, moved obstacles, overhangs), and the paper adds a cheap fix for each, plus one for multi-floor buildings.

Height drift compensation

No robot knows its own position perfectly; the estimate slowly drifts, and height drift is the most harmful kind because it creates fake steps. Each update, the paper measures the error ε between every new point and the map, uses only flat squares (steep ones, judged by the traversability layer, would give misleading errors) and shifts the whole map by the average error.

Animated. Steep squares at the block’s edges are skipped; the flat ones give the average error, and the map moves by it. The drift size is illustrative.
Paper Fig. 4. Drift compensation: the gap ε between new measurements (red) and the current map (blue) is measured away from steep, low-traversability areas (orange), then the map is shifted.

Visibility cleanup by ray casting

If something moves away, its old heights stay in the map until their uncertainty grows enough to pass the outlier test, which is slow. Ray casting fixes this: for each point, the paper steps along the line from the sensor to that point. Where the line passes below a square’s height (minus a margin for its uncertainty), that square must be empty, so its height is removed. To stop flickering when rays graze a surface at a shallow angle, a square is only removed if it hasn’t been updated for a while and the ray is not too parallel to the surface (|r · n| > αn, with r the ray direction and n the surface normal).

Animated. Each ray that dips below the ghost’s height clears a square. The earlier software also had a cleanup, but ran it less often than the sensor rate to save computation.
Paper Fig. 5. Bottom: a box has moved left; rays now pass through its old spot below the stored height, so the old squares are removed. Top: the same rays also give the upper bound used in scene 6.

Exclusion area for overhangs

A beam or ceiling just in front of the robot returns points high above the floor, which a height map would record as a wall, blocking the path underneath. The paper ignores points above a ramp-shaped boundary in front of the sensor: flat and just above sensor height close to the robot, then rising at an angle θa to a maximum. Close overhangs are ignored; slopes rising further away are still mapped.

Animated. From afar the bar builds a (red) wall. Once it falls into the shaded ignore zone, its points stop counting and the rays clear the wall, so the opening appears as the robot gets close. Ramp values are illustrative.
Paper Fig. 3. The exclusion area, set by an offset c above the sensor, a length b, an angle θa and a maximum height d. Points in the grey region are ignored.

Overlap clearance

In multi-floor buildings, a 2.5-D map can keep heights from the floor above or below. Near the robot, the paper clears heights that differ from the robot’s own height by more than a threshold, which the authors report works well when the robot climbs or descends stairs.

Tested on the same recorded data

Paper Fig. 6. Each row replays the same ANYmal recording with the feature on (left), off (middle) and with the earlier software (right). Row 1: a large height drift leaves a big gap without compensation. Row 2: without per-scan cleanup, stale walls remain. Row 3: an overhanging obstacle becomes a wall unless the exclusion area is used.

What this means: the paper shows these results as map pictures rather than scores; in all three cases the fix removes the artifact that the feature-off setting and the earlier software show.

Scene 6

What rays say about the unseen

In short: even where the ground is hidden, the rays that flew over it prove it can be no higher than they were, and the slope of that limit hints at whether the hole is harmless or a drop.

Holes in the map have to be interpreted by whatever uses it. A navigation planner typically either fills them optimistically (for example by image inpainting) or treats them as untraversable. Neither is right everywhere.

While stepping along each ray for the cleanup, the paper also records, for every square without a valid height, the lowest ray height that passed over it. If the ground there were higher, the ray would have hit it. This is stored as an upper-bound layer, similar to the idea of “virtual surfaces” in earlier navigation work. Ground hidden behind an obstacle usually gives an upper bound with a small incline; a real drop gives a steeper one, because the rays that graze its edge go down more steeply.

Animated. At the edge of a drop, the upper bound (violet) slopes steeply: a warning. Compare the gentle slope behind a box in scene 6. Geometry is illustrative.
Paper Fig. 8. From the DARPA Subterranean Challenge final. (a) A narrow cave; the traversability layer (white = easy, blue = hard) guided local navigation. (b) A steep, narrow slope; the orange upper-bound layer covers the part hidden from the sensor and helped the planner there.
Scene 7

One map, many layers

In short: because the map already lives on the graphics chip, it can cheaply carry extra layers that navigation and walking controllers need, from a learned traversability score to flat regions for footholds.

For navigation

Traversability. A small convolutional neural network (from the lab’s ArtPlanner navigation work) scores each square from the local geometry. It is written in PyTorch and shares GPU memory with the map, so no data has to be copied, and it is light enough to run at the full map update rate. Surface normals are computed per square as well.

For walking

Optimization-based walking controllers need a complete, well-behaved terrain. The package offers optional post-processing:

  • Minimum filter (inpainting): empty squares are filled with the minimum height found along the border of the hole, as in the TAMOLS planner.
  • Smoothing: Gaussian, box-blur and median filters from OpenCV; the median filter is reported to be better at removing artifacts.
  • Plane segmentation: the map is split into continuous flat regions, returned as polygons (outer boundary and holes), which a whole-body model-predictive controller uses as foothold constraints.
Animated. Raw → inpainted with the border minimum → smoothed. A schematic profile, not paper data.
Paper Fig. 9. Layers used by the TAMOLS planner on a staircase: the raw map, the in-painted map, and two progressively smoother layers, the last used as a “virtual floor” for the body.
Real run. The map under ANYmal on a lab obstacle course, as used by TAMOLS: first the raw heights (blue), with big holes where the sensors could not see, then the filtered layer (red) with the holes filled in. Footage: Robotic Systems Lab, ETH Zurich (TAMOLS video, Jenelten et al. 2022).

The map fed three kinds of controllers in the lab’s later work: a reinforcement-learning walking controller that samples heights around each foot (also used at the SubT Challenge), a model-based planner that scores footholds from normals and roughness, and a whole-body MPC that uses the plane segmentation.

Real run. The reinforcement-learning controller at work: the grey mesh is the elevation map around ANYmal, and the red dots are the heights it samples around each foot at every step. Footage: Robotic Systems Lab, ETH Zurich (video for Miki et al., Science Robotics 2022).
Scene 8

Results in numbers and in the field

In short: on the robot’s own computer the whole update, with every feature on, takes under 7 ms, and the map ran on four robots in a major underground competition.

The timing below was measured on the Jetson Xavier onboard ANYmal, averaged over 1000 updates with Bpearl LiDAR data (10 m × 10 m map, 4 cm squares).

Step (43,017 points)Time
point transform & height-error count1.194 ms
drift compensation0.742 ms
height update & ray casting0.648 ms
overlap clearance0.003 ms
traversability (neural network)4.102 ms
normal calculation0.168 ms
total6.857 ms

What this means: the LiDAR delivers a scan every 50 ms, and the full update needs about a seventh of that. The traversability network is 60 % of the time, so the authors name it as the part to speed up next. (Paper Table I.)

In the field

At the DARPA Subterranean Challenge, team CERBERUS ran this map on four ANYmal robots exploring underground. A local planner used the traversability and upper-bound layers to pick safe paths and avoid places like cliffs, toward targets set by an exploration planner.

The reinforcement-learning walking controller took its terrain heights from this map. With leg odometry (position estimated from the legs’ motion), the robot’s height tended to drift, especially when feet slipped, which made fake steps in the map. Drift compensation made walking smoother; in long missions, a pose estimate fusing the inertial sensor with LiDAR SLAM plus drift compensation reduced the issue further.

Limits

Limits and what came next

In short: this is an engineering paper about a fast, practical tool; its fixes are simple rules with thresholds, and it keeps the one-height-per-square view of the world.

  • One height per square. Bridges, tables and multiple floors cannot be represented at once. The exclusion area and overlap clearance are practical workarounds, not a full 3-D model.
  • Rules with thresholds. Drift compensation, the wall-edge rule, the exclusion ramp and overlap clearance each depend on user-set parameters.
  • Qualitative map-quality results. Map quality is compared with pictures (Fig. 6), not an error score against ground truth; timing is measured precisely.
  • Where the time goes. The traversability network takes most of each update (4.102 of 6.857 ms), so the paper points to it for future speed-ups.

The package was released as open source (elevation_mapping_cupy) and, per the paper, formed the terrain perception for learning-based and model-based walking controllers, navigation planners and a learned method for filling occluded regions.