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.
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.
- 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
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 enginecp config/example_params.yaml config/my_robot.yaml # edit topics + output_frame_id
ros2 launch polka polka.launch.py config_file:=config/my_robot.yamlSet 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).
- Configuration: every parameter, filters, IMU deskewing, rosbag playback
- Pipeline and architecture: what polka replaces, internal stages, file layout
- Maintaining distro branches: single-source-of-truth sync across the five branches
Apache-2.0. The per-point deskewing motion model is inspired by rko_lio (Malladi et al., 2025, arXiv:2509.06593).









