← Work

dynamic_lidar_interpolation

ROS2 C++ package for real-time LiDAR point cloud interpolation — five methods from nearest-neighbour to spline, tested on Velodyne and Ouster

Creator & Maintainer · 2024 · maintained · GitHub ↗

Problem

Low-cost LiDAR sensors publish at 5–10 Hz — too slow for robot navigation controllers running at 20–50 Hz. The gap between sensor updates and control cycles forces a choice between downsampling the controller (losing performance) or operating on stale maps (risking collisions). Motion distortion from rolling-shutter effects further degrades scan quality at speed.

Approach

Temporal interpolation between consecutive LiDAR scans using estimated robot motion. Given two consecutive point cloud frames and the odometry transform between them, synthesise intermediate frames at arbitrary timestamps. The interpolated frames are published as standard ROS2 sensor_msgs/PointCloud2 messages, transparent to all downstream consumers (SLAM, nav2, occupancy grid mapping).

The core interpolation logic is ROS2-independent pure C++ (PCL + Eigen3), so it can be embedded in non-ROS pipelines without modification. Runtime parameter adjustments via ROS2 parameters allow method switching and threshold tuning without restarting the node.

Architecture

LiDAR topic + odometry topic → consecutive frame buffer → motion-compensated interpolation at target timestamp → sensor_msgs/PointCloud2 publish.

Five interpolation methods, ranked by computational cost:

RankMethodEfficiency
1Nearest Neighbour⭐⭐⭐⭐⭐ Very high
2Bilinear⭐⭐⭐⭐ High
3Bilateral⭐⭐ Moderate
4Edge-Aware⭐⭐ Moderate
5Spline⭐ Low

All methods are selectable at runtime via ROS2 parameters without recompilation.

Results

Tested hardware:

  • Velodyne: VLP-16
  • Ouster: OS0, OS1, OS2, OSDome
  • Robosense: RS-BPearl

Tested platforms: ROS2 Humble on Ubuntu 20.04 and 22.04.

Visualisation verified with RViz, Foxglove Studio, Isaac Sim, Gazebo, and CARLA. Downstream SLAM and navigation stacks (nav2) require no modification — the interpolated cloud is a standard PointCloud2 message.

  • 46 stars on GitHub
  • AGPL-3.0 license

Stack

  • C++17
  • ROS2 Humble
  • PCL
  • Eigen3
  • sensor_msgs
  • nav_msgs
  • colcon

Technologies

  • C++17
  • ROS2
  • PCL
  • Eigen3
  • Point Cloud Processing