Skip to content

Software

lidarslam_ros2 (lidar_slam_ros2)

From github.com/rsasaki0109/lidar_slam_ros2 (opens in a new tab)

  • Navigation and mapping
  • Framework
  • BSD-2-Clause

A ROS 2 LiDAR SLAM system that turns a rosbag into an Autoware-compatible map bundle with point cloud maps and lanelet2 output.

Facts

GitHub stars
939read on 6 Nov 2026
Last update
6 Nov 2026Newest commit on develop
Maintenance
Activea commit in the last 90 days
Difficulty
Advanced
Hardware it needs, as the project states it
ROS 2 Humble or Jazzy on Ubuntu 22.04 or 24.04, with 8 GiB of memory for the source build; the Docker demo needs Docker.

Checked on GitHub on 6 Nov 2026.

Licenses

Code
BSD-2-Clause (opens in a new tab)

Read by Robotheca from LICENSE (opens in a new tab) (BSD-2-Clause) at commit efb955c (opens in a new tab), on 6 Nov 2026.

Commercial use
Yes

Overview

What it does: Robotheca's summary

  • Builds maps from a rosbag using RKO-LIO odometry and graph-based loop closure.
  • Writes Autoware-compatible map bundles including pointcloud_map, projector info and lanelet2 files.
  • Offers a lidarslam-map command with diagnosis, start, view, compare and merge subcommands.
  • Supports PointCloud2 with IMU or GNSS, plus Velodyne scan with Applanix GSOF49 as maintained inputs.
  • Includes loop closure options and a radar fusion path for tunnel and fog mapping.
  • Can colour point cloud maps with camera images through a separate pipeline.

Written by Robotheca from the project's README (opens in a new tab) at commit 47ffd9b, not by its creator.

The README

The creator's own README, copied as written: README.md by @rsasaki0109, at commit efb955c, under BSD-2-Clause (opens in a new tab). The original on GitHub (opens in a new tab).

Read the README here

lidar_slam_ros2

(opens in a new tab) (opens in a new tab) (opens in a new tab)

Live map building on a handheld outdoor walk, coloured by when each part was mapped Camera-coloured SLAM point-cloud map of a park Handheld Ouster OS1-64 going down one stairwell and up another UGV with an Ouster OS1-64 mapping a metro tunnel Three separate walks through New College, Oxford, each first drawn where it was recorded, then joined into one map

Outdoor walk, APE 0.55 m (Koide (opens in a new tab), CC BY 4.0) · camera-coloured park (RTK-SLAM (opens in a new tab), CC BY 4.0) · stairs, ATE 0.24 m on development data · held-out metro tunnel, 0.38 m like BIEVR-LIO and FAST-LIO2 (GEODE (opens in a new tab)) · three separate walks joined into one map with no position hint (Oxford Spires (opens in a new tab), CC BY-NC-SA 4.0). How these were made (opens in a new tab).

Turn a rosbag into a map you can actually drive on. ROS 2 LiDAR SLAM that writes an Autoware-compatible map bundle: pointcloud_map/, map_projector_info.yaml and lanelet2. RKO-LIO (MIT) + graph_based_slam (BSD-2), no GPL on the default workflow. 日本語クイックスタート (opens in a new tab) · release notes v0.11.0 (opens in a new tab) · next v0.12.0 (opens in a new tab)

Quickstart
Choose your shortest path
GoalStart hereSafety and cost boundary
See a verified map, no buildDefault if unsure: Docker demoStable v0.11.0-humble; needs Docker; host writes stay in ./lidarslam_output.
Map my own rosbagOwn-bag route: lidarslam-map doctor /path/to/rosbag2Read-only diagnosis first; then lidarslam-map start /path/to/rosbag2 writes a new output.
Build from source or contributeSource quickstart: bash scripts/source_quickstart.sh --dry-runRelease v0.11.0; needs ROS 2, 8 GiB, and roughly 30 minutes.
Try it with Docker (one command, no build)
docker run --rm -e LIDARSLAM_HOST_UID="$(id -u)" -e LIDARSLAM_HOST_GID="$(id -g)" \
  -v "$PWD/lidarslam_output:/lidarslam_ws/output" \
  ghcr.io/rsasaki0109/lidar_slam_ros2:v0.11.0-humble

The 517 MB MID-360 demo writes lidarslam_output/mid360_demo/ as your user. Other platforms: Getting Started (opens in a new tab).

Map your own bag (one command after install)
lidarslam-map start /path/to/rosbag2

Run lidarslam-map with no arguments for a guided start, or lidarslam-map doctor first: it uses no network and writes no files. See supported inputs.

Build + verified demo from source (one helper)
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
git clone --recursive https://github.com/rsasaki0109/lidar_slam_ros2.git
cd lidar_slam_ros2
bash scripts/source_quickstart.sh

The helper detects Humble/Jazzy, installs the dependencies, builds the six maintained packages and runs the verified demo (--dry-run, --build-only). It prints a lidarslam-map path that auto-activates this build. Needs ROS 2, 8 GiB and about 30 minutes. Before handoff: python3 scripts/check_first_map_verification_package.py --json, continue only on READY.

Use your own bag

For an Ouster, Velodyne, RoboSense or other PointCloud2 bag, do not edit this package's launch files or YAML first: run lidarslam-map doctor, then lidarslam-map start. It checks topics, frames, fields, timestamps, a maintained profile and calibration, and stops unsafe inputs with a stable reason code and one next action. Maintained inputs: PointCloud2+Imu, PointCloud2+NavSatFix, VelodyneScan+Applanix GSOF49.

Why lidarslam_ros2
  • Autoware-compatible output: verify_autoware_map.py prints map_verify: PASS on every saved bundle.
  • lanelet2 auto-generation from the SLAM trajectory, validated for Autoware routing.
  • Surveyed ground truth: per-dataset APE thresholds gate every release in CI (accuracy).
  • Loop closure, GPL-free: Scan Context, BEV / SOLiD / Triangle descriptors and 3D-BBS verification (opt-in).
  • Tunnels and fog: radar fusion maps a ~500 m tunnel; without radar, an Ouster preset holds all ten ENWIDE sequences; on GEODE's 13 held-out tunnel bags, no failure but not the most accurate (comparison (opens in a new tab), guide (opens in a new tab)).
  • Deterministic offline mapping: byte-identical trajectories, loop edges and submaps.
  • Refined maps: plane bundle adjustment under holdout-validated thresholds (evidence (opens in a new tab)).
flowchart LR
    bag(["rosbag2"]) --> rko["RKO-LIO<br/>LiDAR-inertial odometry"]
    rko --> gbs["graph_based_slam<br/>loop closure + graph optimization"]
    gbs --> bundle["Autoware map bundle<br/>pointcloud_map · lanelet2 · projector info"]
Camera-coloured point-cloud maps

The pipeline refines each camera pose against the LiDAR map, then projects the pixels onto it. On the park walk at the top (RTK-SLAM Stadtgarten 2, the RTK-GNSS-anchored trajectory at 0.100 m absolute error; MP4 (opens in a new tab)) the refinement takes the held-out epipolar error from 1.09 to 0.34 px (tool (opens in a new tab), GNSS anchoring (opens in a new tab), release reference (opens in a new tab)).

python3 tools/colored_map/colored_map_pipeline.py \
  <bag> output/<run>/traj_corrected.tum output/<run>/colored_map \
  --raw-traj output/<run>/traj_raw.tum \
  --extrinsic configs/gaussian_splatting/<lidar_camera_extrinsic>.yaml

Moving rigs: --refine-spatiotemporal-calibration (design (opens in a new tab)). Regression gates: Benchmarking (opens in a new tab).

Open-source benchmark results

On the same HILTI 2022 exp04 LiDAR/IMU input and CPU-only host, the competitive profile recorded 44.1% lower median APE RMSE than GLIM over three runs:

SystemMedian APE RMSEMedian processing RTFMaximum peak RSS
lidarslam_ros20.0482 m0.194369.4 MB
GLIM CPU0.0863 m0.218696.0 MB

This is a scoped HILTI exp04 result from one 4-vCPU cloud VM (2026-10-19, three alternated runs per system, GLIM v1.2.2 built natively because the VM has no Docker daemon). There, lidarslam_ros2 has the lower median APE, processing RTF and peak RSS; the RTF ranges barely separate. It is not an overall best-system claim. Commands, scoring rules, the earlier Docker-based record and map-quality limits: Comparison (opens in a new tab). The two-system comparison runners were retired after v0.11.0; rerun them from that tag.

The separate Voxel-SLAM v17 research candidate also achieved the lowest geometric-mean APE across NavINST, Oxford, and UrbanNav: 2.2836 m, versus GLIM 5.0779, Point-LIO 3.8388, FAST-LIO2 6.9576, and fixed Voxel-SLAM 2.7160 — 55.0% lower than GLIM. It is not the default release path, does not win every sequence, and is not fresh-blind evidence. Exact revisions, per-sequence results, input hashes, resource results, map limitations, and reproduction notes are in Comparison (opens in a new tab).

Development-data results with loop closure on the MapsHD humanoid MID-360 trials, Oxford Spires Keble 05 and HILTI exp04, with settings chosen on those same sequences, are in Comparison (opens in a new tab).

Accuracy

Release-gate thresholds (Benchmarking (opens in a new tab)) block every release in CI. Tunnel and fog mapping: Degeneracy Resilience Guide (opens in a new tab).

Docs

Preview the doc site locally: python3 -m mkdocs serve.

Support and license
ROS 2 distroUbuntuScope
Humble22.04default workflow build + package tests in CI
Jazzy24.04default workflow build + package tests in CI; Autoware dogfood exercised locally

graph_based_slam is BSD-2-Clause; RKO-LIO, DLIO, and the optional vendored 3D-BBS are MIT; FAST_GICP is BSD-3-Clause; built-in Scan Context is local. GPL-only components (Thirdparty/lio-sam, Thirdparty/3d_bbs) are excluded via COLCON_IGNORE.

Quality gates
bash scripts/run_default_ci_checks.sh

Full gate list and parameter pointers: docs/workflows.md (opens in a new tab).

If this project saves you mapping time, a ⭐ helps others find it.

Files and versions

Facts read at commit efb955c

Robotheca read the repository at two versions: the summary at 47ffd9b and the facts and the README at efb955c (read on 6 Nov 2026).

Robotheca never hosts the code: each link goes to the creator's own page.

Use it

How to install it, in the creator's words: The project's website (opens in a new tab)

Robotheca doesn't review code. Read it before running it.

Robotheca lists software as a reference: nothing is hosted or run here, and every fact links to where it was read.