Skip to content

Pana1v/polka

Repository files navigation

POLKA

ROS 2 Humble ROS 2 Iron ROS 2 Jazzy ROS 2 Kilted ROS 2 Lyrical
Ubuntu 22.04 Ubuntu 24.04 Ubuntu 26.04
C++17 CUDA optional PCL colcon
License: Apache-2.0 GitHub stars GitHub issues Last commit

Polka

Polka multi-LiDAR fusion
Multi-LiDAR fusion: one spinning Ouster vs. Ouster + Livox Avia + Mid-360 merged into a single cloud.

Multi-LiDAR fusion node for ROS 2. Merges any mix of PointCloud2 and LaserScan sources into a unified PointCloud2 and/or LaserScan, with per-source and output filtering, IMU deskewing, and optional CUDA acceleration. One composable node replaces a relay / filter / transform / merge / downsample chain.

Features in action

Each clip runs polka with a different config on the TIERS multi-LiDAR dataset (Ouster OS1 + Livox Avia + Mid-360), rendered headless with Open3D. See doc/media/ to regenerate.

range filter
Range filter: keep points within a distance shell
angular filter
Angular filter: keep a yaw sector
box filter
Box filter: crop to an axis-aligned box
height cap
Height cap: clip to a z-range
angular invert flag
Angular invert flag: keep vs. exclude a sector
self filter
Self-filter: remove the robot's own footprint
voxel downsample
Voxel downsample: 69k to 5k points
dual output
Dual output: merged cloud plus flattened 2D scan
2D LaserScan merge
2D LaserScan merge: each beam colored by the sensor with the nearest return

Features

  • Heterogeneous fusion: mix 3D PointCloud2 and 2D LaserScan sources freely
  • Dual output: merged PointCloud2, LaserScan, or both at once
  • Per-source and output filtering: range, angular, box, height cap, footprint (ego-body) exclusion, voxel downsample
  • IMU deskewing: per-point SE(3) motion correction, with per-point timestamp auto-detect
  • CUDA acceleration: optional GPU merge engine, falls back to CPU
  • TF2 integration: automatic lookup with last-known-good fallback
  • Fully parameterized and composable: runtime ROS 2 params; standalone or in a component container

Install

Each ROS 2 distro has its own code-identical branch:

Distro Ubuntu Branch
Humble 22.04 humble
Iron 22.04 iron
Jazzy 24.04 jazzy
Kilted 24.04 kilted
Lyrical 26.04 lyrical
git clone -b humble https://github.com/Pana1v/polka.git ~/ros2_ws/src/polka
cd ~/ros2_ws && colcon build --packages-select polka
# add  --cmake-args -DWITH_CUDA=ON  for the GPU merge engine

Quick start

cp config/example_params.yaml config/my_robot.yaml      # edit topics + output_frame_id
ros2 launch polka polka.launch.py config_file:=config/my_robot.yaml

Set output_frame_id to your base frame, list sensors under source_names, and make sure TF resolves each sensor frame_id to output_frame_id. Replaying a bag? Pass use_sim_time:=true and play with --clock (see Configuration).

Documentation

License and credits

Apache-2.0. The per-point deskewing motion model is inspired by rko_lio (Malladi et al., 2025, arXiv:2509.06593).

About

A drop in clean and efficient replacement for your messy lidar pre-processing

Topics

Resources

License

Stars

45 stars

Watchers

1 watching

Forks

Packages

 
 
 

Contributors