CURL-SLAM: Continuous and Compact LiDAR Mapping (T-RO 2025)
CURL-SLAM is a real-time, CPU-based LiDAR mapping system that utilizes spherical harmonics to generate an ultracompact, globally consistent, and continuously reconstructible 3D map.
Paper: https://ieeexplore.ieee.org/document/11078155/
- System Requirements
- Quick Start (Docker)
- Run Demos
- Datasets
- Configuration
- Results
- Citation
- License
- Acknowledgements
- Appendix: Common compose commands
- Ubuntu 22.04 / 24.04 tested; base image is ROS Noetic on Ubuntu 20.04
- Docker Engine + Compose plugin (
docker composeworks): https://docs.docker.com/engine/install/ubuntu/
- GPU only improves 3D visualization performance; the core SLAM pipeline runs on CPU.
- NVIDIA driver installed (
nvidia-smiworks) - NVIDIA Container Toolkit installed: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
git clone https://github.com/SenseRoboticsLab/CURL-SLAM.git
cd CURL-SLAMxhost +si:localuser:rootIf echo $DISPLAY changes, re-run the same docker compose -f ... down and up command you used to start the container.
CPU/GPU (replace cpu with gpu if needed):
sudo -E HOME=$HOME docker compose -f docker/docker-compose.cpu.yaml up --build -d
# Terminal 1
sudo docker compose -f docker/docker-compose.cpu.yaml exec curl_slam /bin/bash
# Terminal 2
sudo docker compose -f docker/docker-compose.cpu.yaml exec curl_slam /bin/bashIf you run Docker without sudo, drop sudo -E HOME=$HOME. The HOME=$HOME part keeps the correct host
.Xauthority when using sudo.
Note: the Dockerfiles build from a fresh repository clone inside the image and check out the branch specified in the Dockerfile, rather than using the current local workspace contents directly.
Optional data mount (edit docker/.env first):
HOST_DATA_DIR=/path/on/host # optional--env-file is only needed for up/build. exec does not require it.
sudo -E HOME=$HOME docker compose --env-file docker/.env \
-f docker/docker-compose.cpu.yaml -f docker/docker-compose.cpu.data.yaml up --build -d
# Terminal 1
sudo docker compose -f docker/docker-compose.cpu.yaml exec curl_slam /bin/bash
# Terminal 2
sudo docker compose -f docker/docker-compose.cpu.yaml exec curl_slam /bin/bashStop (Run this after you finish the demo to stop and remove the container.):
sudo docker compose -f docker/docker-compose.cpu.yaml downTerminal 1 (mapping):
roslaunch curl_slam curl_slam.launchTerminal 2 (play bag):
rosbag play <PATH_TO_BAG>After mapping finishes, load the saved map and adjust resolution:
roslaunch curl_slam curl_map_load.launchGUI for adjusting reconstruction parameters in real time.
Dynamic parameters (rqt_reconfigure):
w: patch image resolution; higher = denser.SH_degree: spherical harmonics degree; higher = more detail.IQR_factor: IQR-based cutoff used whenis_fix_length_thresholdis false.length_thres: fixed continuity threshold; gaps larger than this are treated as holes and removed whenis_fix_length_thresholdis true.open3d_speed: visualization rotation speed; display only.is_fix_length_threshold: toggle fixedlength_thresvs. IQR thresholding.is_save_pcd: save reconstructed map point cloud toresults_dir/final_map.is_save_curlmap: save curl map toresults_dir/final_map.
Sample Newer College rosbags (multi-cam): https://ori-drs.github.io/newer-college-dataset/multi-cam/
- https://drive.google.com/file/d/1wRnRSni9bcBRauJEJ80sxHIaJaonrC3C/view
- https://drive.google.com/file/d/1ORkYwGpQNvD48WRXICDDecbweg8MxYA8/view
Quick download with gdown (inside container):
gdown --id 1wRnRSni9bcBRauJEJ80sxHIaJaonrC3C
gdown --id 1ORkYwGpQNvD48WRXICDDecbweg8MxYA8These are rosbags, so you can play them directly:
ls *.bag
rosbag play ./<bag_file>.bagPrimary YAML configs live in:
config/config.yamlconfig/config_small.yamlconfig/config_middle.yamlconfig/config_challenge.yamlconfig/config_light.yaml
@ARTICLE{11078155,
author = {Zhang, Kaicheng and Xu, Shida and Ding, Yining and Kong, Xianwen and Wang, Sen},
journal = {IEEE Transactions on Robotics},
title = {CURL-SLAM: Continuous and Compact LiDAR Mapping},
year = {2025},
volume = {41},
pages = {4538-4556},
doi = {10.1109/TRO.2025.3588442}
}This project is licensed under GPL-3.0. See LICENSE. Third-party notices are listed in
THIRD_PARTY_NOTICES.md.
This project builds on Patchwork++, PCL, Ceres Solver, Open3D, Sophus, CGAL, and other open-source components.
See THIRD_PARTY_NOTICES.md for bundled third-party code and licenses.
# replace cpu with gpu if needed
sudo -E HOME=$HOME docker compose -f docker/docker-compose.cpu.yaml up --build -d
sudo -E HOME=$HOME docker compose -f docker/docker-compose.cpu.yaml exec curl_slam /bin/bash
sudo docker compose -f docker/docker-compose.cpu.yaml logs -f
sudo docker compose -f docker/docker-compose.cpu.yaml ps
sudo docker compose -f docker/docker-compose.cpu.yaml stop
sudo docker compose -f docker/docker-compose.cpu.yaml start
sudo docker compose -f docker/docker-compose.cpu.yaml down


