C++ implementations, derived variants, and compact baselines for localization papers
103 methods · 73 paper reimplementations · 42 papers with no public author code · one C++ API · honest KITTI benchmarks
KITTI seq07 odometry, no GT seed — current promoted trajectories on one shared drift-colored scale.
Try it in one command — no build, no dataset; runs the quick synthetic and
committed-data comparison, then drops report.html and its reproducibility
manifest.json into ./zoo-demo/:
docker run --rm -v "$PWD/zoo-demo:/out" ghcr.io/rsasaki0109/localization_zoo:latestdirection_consistent_rotation_v10 combines the motion-guard KISS frontend
with official KISS-ICP 1.3.0. Ground truth is used only for scoring.
| Public evaluation | v10 ATE | v10 translational RPE | Conservative rate | Result |
|---|---|---|---|---|
| Fresh KITTI Raw 0023 (474 frames) | 5.494 m | 1.622% | 12.38 FPS | ATE −2.00% vs v6; RPE +0.146% |
| Same-input KITTI Odometry 04 (271 frames) | 1.145 m | 0.354% | 10.67 FPS | Best ATE and translational RPE in the frozen six-method table |
| External Boreas summer drive (600 frames) | 0.663 m | 0.966% | 3.02 FPS | ATE −0.407% and RPE −0.100% vs v6; dense-sensor runtime limitation |
The frozen comparison also includes v6, MOLA-LO, MAD-ICP, official KISS-ICP, and CT-ICP. See the frozen manifest, aggregate, and protocol. v10 is not universally best; its dual frontend is also not real-time on dense Boreas scans.
Re-score the frozen trajectories and verify all hashes from the external SSD:
export LOCALIZATION_ZOO_DATA_ROOT=/media/external/loc_zoo
python3 evaluation/scripts/reproduce_lidar_v10.pyOn PowerShell, set $env:LOCALIZATION_ZOO_DATA_ROOT before running the command.
Paper-oriented C++ implementations share one API, ROS 2 wrappers, tests, and evaluation tools—even when no reusable author code exists.
- Pure C++: ROS-independent core libraries for research, education, and embedded use
- ROS 2 Humble: Ready-to-run nodes via
ros2 run - Built-in benchmarking: Compare methods immediately after build
- Degeneracy-aware methods: Includes RELEAD and X-ICP for constrained environments
- Claim tiers: Separate faithful reproduction, mechanism evidence, adapters, and compact baselines
The catalog is broader than the manuscript-grade evidence set:
- Catalog: all 103 methods, including derived variants and compact baselines.
- Paper-ready subset: methods satisfying the
tier and ablation criteria, frozen in
paper_ready_bundle.json. - Frozen paper-ready bundle (8 methods): I-LOAM and KC-LO (T0 candidates);
LiDAR-IBA and TrICP-LO (T1); DegenSense and D2-LIO (competitive no-IMU KITTI
fallback rows, not full LIO claims); M-GCLO and Quadric-LO (T1+). Manifest:
paper_ready_bundle.json. Other ports remain adapter/mechanism evidence until their sensor-data gaps close.
KITTI Odometry full sequences, ranked by relative pose error (the seed-independent local-accuracy metric). ATE in parens is unbounded drift over the run. Full matrix: explorer.
| Method | Seq 00 | Seq 02 | Seq 05 | Seq 07 | Seq 08 |
|---|---|---|---|---|---|
| 4541 fr | 4661 fr | 2761 fr | 1101 fr | 4071 fr | |
| LeGO-LOAM | 0.84% (12 m) | 0.88% (42 m) | 0.52% (5 m) | 0.53% (3 m) | 1.37% (19 m) |
| A-LOAM | 0.90% (19 m) | 0.93% (51 m) | 0.51% (5 m) | 0.61% (3 m) | 1.39% (19 m) |
| KISS-ICP | 0.86% (21 m) | 0.94% (39 m) | 0.62% (6 m) | 0.61% (2 m) | 1.34% (19 m) |
| F-LOAM | 0.99% (9 m) | 0.95% (54 m) | 0.54% (6 m) | 0.59% (3 m) | 1.37% (17 m) |
| SuMa | – | – | – | 0.94% (4 m) | – |
| CT-ICP | 1.97% (19 m) | 2.64% (67 m) | 1.09% (11 m) | 1.17% (3 m) | 1.91% (31 m) |
| MULLS | – | – | – | 2.64% (8 m) | – |
Best variant per cell (docs/experiments.md). KISS-ICP /
LOAM ~0.5–1.4% drift is competitive — their large ATE is honest drift, not a
broken port.
No GT-seeded methods here. NDT / LiTAMIN2 / GICP use the ground-truth pose as the per-frame initial guess, so their ATE is seed adherence, not tracking — and the ranking even inverts: NDT's 0.02 m comes from not registering (
--no-gt-seed→ 87% RPE, the worst tracker), while GICP's larger ATE is real registration. They need a GT prior and aren't standalone odometry, so they are not ranked.
Details and negative results: Reproducibility Report.
KITTI full-sequence odometry with first-pose anchor and --no-gt-seed.
RPE is drift %/100 m; ATE is shown in parentheses. LIO rows use a no-IMU fallback.
This is a shared-harness catalog, not an endorsement of paper fidelity. Manuscript evidence is limited to the frozen bundle.
| Method | Seq 00 (4541 fr) | Seq 07 (1101 fr) | Paper |
|---|---|---|---|
| DegenSense | 0.811% (12 m) | 0.558% (1 m) | arXiv:2412.07513 |
| D2-LIO | 0.814% (11 m) | 0.541% (1 m) | arXiv:2508.14355 |
| M-GCLO | 0.835% (19 m) | 0.671% (2 m) | ISPRS Ann. 2024 |
| KC-LO | 0.837% (13 m) | 0.510% (1 m) | ECCV 2004 |
| LiDAR-IBA | 0.841% (11 m) | 0.633% (1 m) | arXiv:2602.06380 |
| LODESTAR | 0.848% (7 m) | 0.598% (1 m) | arXiv:2511.09142 |
| Terrain-RBF-LIO | 0.849% (8 m) | 0.587% (1 m) | arXiv:2509.26222 |
| DALI-SLAM | 0.849% (8 m) | 0.600% (1 m) | ISPRS JPRS 2025 |
| DAMM-LOAM | 0.851% (7 m) | 0.598% (1 m) | arXiv:2510.13287 |
| CUBE-LIO | 0.851% (9 m) | 0.608% (1 m) | ROBOMECH 2026 |
| Intensity-Flow | 0.856% (8 m) | 0.616% (1 m) | Measurement 2026 |
| Quadric-LO | 0.867% (15 m) | 0.598% (2 m) | arXiv:2304.14190 |
| Adaptive-ICP | 0.870% (11 m) | 0.569% (1 m) | arXiv:2509.22058 |
| MCC-LO | 0.892% (13 m) | 0.611% (2 m) | PLOS ONE 2018 |
| I-LOAM | 0.899% (13 m) | 0.575% (2 m) | UR 2020 |
| Mesh-LOAM | 0.901% (13 m) | 0.616% (1 m) | IEEE T-IV 2024 |
| NHC-LIO | 0.902% (18 m) | 0.608% (3 m) | IEEE Sens. J. 2023 |
| SVN-ICP | 0.912% (14 m) | 0.607% (3 m) | arXiv:2509.08069 |
| ICPSC-LO | 0.912% (19 m) | 0.660% (4 m) | JAG 2023 |
| VLOM | 0.914% (10 m) | 0.605% (3 m) | arXiv:2304.08978 |
| TrICP-LO | 0.931% (10 m) | 0.662% (2 m) | IVC 2005 |
| GMM-LO | 0.941% (14 m) | 0.657% (1 m) | arXiv:1807.02587 |
| MCGICP-LO | 0.940% (20 m) | 0.774% (5 m) | RAS 2017 |
| Student-T-LO | 0.952% (15 m) | 0.696% (2 m) | PMC11314997 2024 |
| Small-but-Mighty | 0.961% (15 m) | 0.897% (3 m) | Remote Sens. 2025 |
| GNC-LO | 0.986% (18 m) | 0.722% (2 m) | arXiv:1909.08605 |
| IMLS-SLAM | 1.000% (18 m) | 0.700% (3 m) | ICRA 2018 |
| CT-VoxelMap | 1.046% (21 m) | 0.800% (3 m) | arXiv:2604.03747 |
| OPL-LVIO | 1.050% (15 m) | 0.902% (4 m) | Remote Sens. 2022 |
| AD-VLO | 1.052% (13 m) | 0.939% (3 m) | ICRA 2019 |
| TC-MVLO | 1.054% (11 m) | 0.939% (3 m) | ISR 2022 |
| TC-LVGF | 1.055% (12 m) | 0.941% (4 m) | ROBIO 2023 |
| TC-VLO | 1.060% (12 m) | 0.925% (4 m) | IV 2019 |
| BIEVR-LIO | 1.063% (25 m) | 0.873% (4 m) | arXiv:2604.14421 |
| V-LOAM2015 | 1.066% (14 m) | 0.910% (4 m) | ICRA 2015 |
| Vibration-LIO | 1.082% (15 m) | 0.781% (3 m) | arXiv:2507.04311 |
| ID-LIO | 1.111% (15 m) | 0.999% (5 m) | Sensors 2023 |
| ELO | 1.124% (23 m) | 0.981% (4 m) | IEEE RA-L 2021 |
| UA-LIO | 1.132% (33 m) | 0.967% (3 m) | IEEE TIM 2025 |
| DiLO | 1.200% (39 m) | 1.533% (7 m) | ETRI J. 2021 |
| PCR-DAT | 1.239% (11 m) | 1.040% (4 m) | ISR 2024 |
| RF-LIO | 1.351% (23 m) | 1.272% (5 m) | IROS 2021 |
| Spectral-LO | 2.901% (67 m) | 3.939% (27 m) | arXiv:2005.02042 |
| KISS-ICP (same profile, ref) | 0.872% (12 m) | 0.618% (2 m) | — |
| CT-ICP (same profile, ref) | 2.577% (17 m) | 2.500% (4 m) | — |
Mechanism evidence and limitations are summarized below; raw artifacts are linked.
HDL-400 activates IMU paths for D2-LIO, DegenSense, ID-LIO, and RF-LIO, with small RPE deltas on this window (artifact). LiDAR-IBA IMU residuals are not yet wired into pcd_dogfooding.
NCLT confirms IMU-gated paths and improves DegenSense ATE from 0.24 m to 0.16 m; poor KISS-ICP sanity makes this mechanism evidence only (artifact).
M-GCLO: disabling ground factors worsens ATE and rotational drift on KITTI (ablation) and synthetic rolling ground (stress test).
On hilly KITTI seq08, ground-off keeps RPE similar but worsens ATE by 149% (artifact).
MulRan no-GT-seed odometry diverges; the GT-seeded result is mechanism evidence only (artifact).
KC-LO: best seq07 drift here, but only ~1.4–3.1 FPS (ablation). LiDAR-IBA: bundle adjustment slightly lowers ATE but worsens RPE and throughput (ablation). Quadric-LO: plane fallback is rare on highway data (ablation; curved-object stress).
On KITTI seq02, disabling the rare fallback worsens RPE by 55% and ATE by 84% (artifact).
On geometry-rich, IMU-free KITTI, many robust and multimodal mechanisms become secondary to the point-to-plane core. Dynamic-scene stress still favors RF-LIO over ID-LIO (artifact).
On KITTI seq05, RF-LIO trails ID-LIO and KISS-ICP (artifact).
Full ablations and negative results: benchmark artifacts.
I-LOAM intensity on/off results with mapping disabled:
| Sequence | Geometric baseline (intensity off) | I-LOAM (intensity on) | Δ drift |
|---|---|---|---|
| Seq 00 | 3.186% (76.0 m) | 2.606% (49.4 m) | −18.2% |
| Seq 07 | 3.806% (18.5 m) | 3.055% (15.1 m) | −19.7% |
Reflectance cuts drift by 18–20% in this paired KITTI ablation. Raw artifacts:
seq00 on,
seq00 off,
seq07 on,
seq07 off,
and the paired summary
i_loam_intensity_ablation.json.
The hero shows KITTI seq07 full trajectories on one drift-colored scale. Regenerate it or use the generic plotter.
Methods are labeled paper reimplementation, derived variant, or compact baseline. A benchmark result does not by itself prove paper fidelity; see reproduction status and paper-ready criteria.
The stable benchmark core is separated from variants in experiments/.
See experiments, decisions, and
interfaces.
# build + synthetic benchmark + quick real-data fixture suite
bash evaluation/scripts/demo_localization_zoo.shOutput is written under experiments/results/runs/demo_localization_zoo/.
After the first successful run, compare the broader starter set without
rebuilding:
bash evaluation/scripts/demo_localization_zoo.sh --skip-build --profile broadCI-equivalent smoke checks:
bash evaluation/scripts/smoke_ci_fixture.sh
bash evaluation/scripts/smoke_multimodal_fixture.shMore workflows: evaluation/README.md.
Activation and retention definitions: docs/activation_metrics.md.
Compare results only within the same dataset, window, initialization policy, and runtime profile.
Current published groups:
| Group | Role | Ranking policy | Source |
|---|---|---|---|
| KITTI Odometry seq00 full | Odometry full sequence | Ranked within seq00 by translational RPE [%/100 m] | docs/benchmarks/paper_ready_bundle.json |
| KITTI Odometry seq07 full | Odometry full sequence | Ranked within seq07 by translational RPE [%/100 m] | docs/benchmarks/paper_ready_bundle.json |
| KITTI Odometry seq07 108-frame smoke | Regression smoke | Unranked; exact frame-ID association check only | docs/benchmarks/latest/results.json |
| Autoware Istanbul 108-frame snapshot | GT-seeded scan-to-map references | Reference-only; not ranked against odometry | docs/benchmarks/latest/results.json |
Detailed rows and provenance are in the interactive explorer, interfaces, and methodology. KITTI preparation example:
python3 evaluation/scripts/prepare_kitti_odometry_inputs.py \
--kitti-root /path/to/data_odometry --sequence 00 --sequence 07 \
--window-size 108 --include-fullMethod ATE [m] FPS
─────────────────────────────────
CT-ICP 0.124 0.1 << best accuracy
A-LOAM 2.059 4.6 << balanced baseline
X-ICP 16.634 5.9
LiTAMIN2 31.155 2.6
Reproduce with
./synthetic_benchmark. No external dataset is required.
Eight planar matchers (papers 43–50) plus Karto-Matcher (map-based CSM extension) in scan_dogfooding.
Full leaderboard, fixtures, and reproduction steps:
docs/benchmarks/scan2d/README.md.
| Method | Intel val | fr079 val | MIT val | Synth corridor |
|---|---|---|---|---|
| 73 fr / 378 m | 384 fr / 373 m | 33 fr / 267 m | 120 fr / 9.5 m | |
| RF2O | 14.3% | 15.4% | 27.6% | 1.3% |
| Karto-Matcher | 14.0% | 13.7% | 28.1% | 30.5% |
| CSM | 14.0% | 13.7% | 28.1% | 30.5% |
| NDT-2D | 14.9% | 14.4% | 27.8% | 0.8% |
| IDC | 15.3% | 27.7% | 29.5% | 42.6% |
| MbICP | 14.5% | 15.4% | 27.5% | 0.05% |
| PL-ICP | 15.0% | 14.1% | 27.2% | 0.01% |
| Kinematic-ICP | 18.4% | 18.9% | 23.4% | 83.8% |
| PSM | 21.8% | 13.9% | 27.9% | 11.6% |
cmake --build build --target scan_dogfooding
bash evaluation/scripts/run_scan2d_benchmark.shSetup: evaluation/scripts/SETUP_2D_SCAN_BENCHMARK.md.
Hard Point Cloud Localization Dataset results; full protocol and coverage are in the benchmark README.
Full-trajectory indoor_easy_01 vs indoor_hard_01, six unchanged runner defaults:
| Method | Easy ATE-XY (m) | Hard ATE-XY (m) | Easy RPE-XY (m/f) | Hard RPE-XY (m/f) |
|---|---|---|---|---|
| KISS keyframe | 8.763 | 25.307 | 0.076 | 0.124 |
| LiTAMIN2 | 10.815 | 17.875 | 0.358 | 0.611 |
| CT-ICP | 18.767 | 16.795 | 0.284 | 0.350 |
| X-ICP | 10.037 | 11.733 | 0.320 | 0.353 |
| DegenSense + IMU | 13.201 | 617.008 | 0.567 | 8.319 |
| DegenSense, no IMU | 11.759 | 11.729 | 2.736 | 3.679 |
CT-ICP's lower hard ATE is misleading: its estimated path is 468.38 m versus 115.49 m ground truth. Official BIEVR-LIO:
| Sequence | ATE-XY (m) | RPE-XY (m/f) | Estimated / GT path (m) |
|---|---|---|---|
indoor_easy_01 |
0.422 | 0.0033 | 76.26 / 77.29 |
indoor_hard_01 |
8,882.579 | 21.947 | 28,754.33 / 114.71 |
BIEVR-LIO excels on easy but diverges on hard. Fixed-map NDT also false-locks on all three kidnap sequences, showing that stable refinement alone does not prove a correct global lock.
python3 evaluation/scripts/run_hard_pcl_odometry_benchmark.py \
--pcd-dir dogfooding_results/hard_pcl_localization/indoor_easy_01 \
--gt-csv experiments/reference_data/hard_pcl_indoor_easy_01_gt.csv \
--output-dir experiments/results/hard_pcl_localization/indoor_easy_01/full --jobs 6Setup: evaluation/scripts/SETUP_HARD_PCL_LOCALIZATION_BENCHMARK.md.
Full results tree: experiments/results/hard_pcl_localization/.
| Paper | Venue | Key Idea | Reference |
|---|---|---|---|
| LiTAMIN2 | ICRA 2021 | KL-divergence ICP with aggressive point reduction for faster registration | arXiv |
| GICP | RSS 2009 | Plane-to-plane ICP with local covariance modeling and Mahalanobis distance | Paper |
| Voxel-GICP | RA-L 2021 | GICP accelerated with voxel representatives and voxel-level covariance | Paper |
| small_gicp | Derived | Compact GICP with voxel downsampling and capped correspondences | GitHub |
| VGICP-SLAM | Derived | Voxel-GICP front-end with Scan Context and loop-graph back-end | - |
| NDT | IROS 2003 | NDT-style registration against voxel Gaussian models with a compact optimizer | Paper |
| KISS-ICP | RA-L 2023 | Compact KISS-ICP-style pipeline with voxel hashing, adaptive thresholds, and robust ICP | Paper |
| A-LOAM | RSS 2014 | Curvature-based feature extraction with a three-stage odom-to-map pipeline | GitHub (ROS1) |
| F-LOAM | Derived | Lightweight LOAM pipeline with input thinning and sparse map updates | - |
| ISC-LOAM | Derived | Lightweight LOAM with intensity descriptors and F-LOAM/GICP loop graph | - |
| LOAM Livox | Derived | LOAM variant for solid-state LiDAR using pseudo scan lines from azimuth sectors | Reference |
| LeGO-LOAM | IROS 2018 | Ground-aware feature extraction for vehicle-oriented LOAM | Paper |
| MULLS | Derived | Multi-metric scan-to-map alignment using edge, plane, and point residuals | - |
| BALM2 | T-RO 2022 | Local bundle adjustment over recent keyframes with line and plane residuals | arXiv |
| SuMa | RSS 2018 | Dense surfel-based point-to-plane odometry from range-image maps | GitHub |
| DLO | Derived | Direct keyframe odometry that aligns dense scans to a local GICP map | GitHub |
| HDL Graph SLAM | Derived | NDT front-end with floor priors, Scan Context, and GICP loop closures | GitHub |
| CT-ICP | ICRA 2022 | Continuous-time registration with two poses per frame and SLERP motion compensation | GitHub (ROS1) |
| X-ICP | T-RO 2024 | Constrained ICP using Hessian SVD to classify observable directions | arXiv |
| Paper | Venue | Key Idea | Reference |
|---|---|---|---|
| RELEAD | ICRA 2024 | Constrained ESIKF with projection-based suppression along degenerate directions | arXiv |
| CT-ICP + RELEAD | Hybrid | Continuous-time CT-ICP interpolation combined with RELEAD degeneracy handling | - |
| Paper | Venue | Key Idea | Reference |
|---|---|---|---|
| IMU Preintegration | T-RO 2017 | Preintegration on SO(3) with first-order bias correction for LIO pipelines | Paper |
| Paper | Venue | Key Idea | Reference |
|---|---|---|---|
| CT-LIO | Hybrid | Lightweight LIO that combines CT-ICP interpolation with IMU preintegration constraints | CLINS |
| DLIO | ICRA 2023 | Compact DLIO-style LIO built on DLO-style registration plus IMU preintegration | GitHub |
| LINS | Derived | Lightweight LiDAR-inertial estimator with iterated filtering and point-to-plane updates | - |
| Point-LIO | Derived | Compact direct LIO with raw-point planarity correspondences and iterated filtering | - |
| CLINS | Derived | Sequence pipeline version of CT-LIO-style continuous-time registration | - |
| VILENS | Derived | Compact visual-lidar-inertial smoother with Point-LIO-style local maps and reprojection fusion | - |
| LIO-SAM | IROS 2020 | Lightweight pose graph with A-LOAM front-end, Scan Context, GICP, and IMU rotation priors | Paper |
| LVI-SAM | Derived | Compact visual-lidar-inertial SLAM built on top of a LIO-SAM-style pose graph | - |
| VINS-Fusion | Derived | Compact visual-inertial odometry with landmark reprojection and IMU preintegration | - |
| OKVIS | Derived | Fixed-window VIO with landmark reprojection and IMU preintegration | - |
| ORB-SLAM3 | Derived | Compact visual-inertial SLAM with keyframe graph and overlap-based loop closure | - |
| FAST-LIO2 | T-RO 2022 | Lightweight direct LIO with raw-point scan-to-map alignment and IMU prediction | Paper |
| FAST-LIVO2 | Derived | Compact local visual-lidar-inertial odometry built on FAST-LIO2 poses and reprojection residuals | - |
| R2LIVE | Derived | Compact visual-lidar-inertial SLAM combining FAST-LIO2 odometry and visual landmark factors | - |
| FAST-LIO-SLAM | Derived | Lightweight graph SLAM with FAST-LIO2 front-end, Scan Context, and GICP loop closures | - |
IMU-only methods (no LiDAR registration); evaluated on NCLT 2013-01-10 and
KITTI Raw drive 0009 with imu.csv inputs, not on the KITTI LiDAR leaderboard.
| Paper | Venue | Key Idea | Reference |
|---|---|---|---|
| IMU Dead Reckoning | Baseline | Strapdown INS lower-bound for the LIO family, with opt-in classical aids (ZUPT / NHC / attitude leveling / ZARU), a motion-gated static-init quality gate, and a 15-state error-state Kalman filter (--imu-dr-eskf) mode |
- |
| OdoNet | IEEE Sens. J. 2022 | 1D-CNN pseudo-odometer speed aiding for strapdown INS with NHC/ZUPT | Paper |
| NN-ZUPT | Meas. Sci. Technol. 2023 | CNN zero-velocity detection driving ZUPT corrections for vehicle INS | Paper |
| NHC-Net | GPS Solutions 2023 | Motion-state CNN with adaptive non-holonomic constraints for vehicle dead reckoning | - |
imu_motion_health is a LiDAR-free streaming C++
SDK and CSV replay CLI for 6-axis IMUs. It diagnoses startup calibration,
bias, timestamp gaps, non-finite values, and saturation; classifies stationary,
moving, impact, fall/tilt, and vibration states; and emits JSON diagnostics plus
short-term relative attitude, velocity, and position. Its standalone build only
requires Eigen3 and GTest, and the included deterministic demo needs no sensor
download.
| Paper | Venue | Key Idea | Reference |
|---|---|---|---|
| Scan Context | IROS 2018 | Lightweight place recognition with polar ring-sector descriptors and yaw-shift search | Paper |
docker run --rm -v "$PWD/zoo-demo:/out" ghcr.io/rsasaki0109/localization_zoo:latestsudo apt install libeigen3-dev libpcl-dev libopencv-dev libceres-dev libgtest-dev
python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install -r requirements-lock.txt
bash evaluation/scripts/demo_localization_zoo.shManual build and test:
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j"$(nproc)"
ctest --test-dir build --output-on-failure
./build/evaluation/synthetic_benchmarkExperimental pybind11 bindings cover KISS-ICP, NDT, GICP, and LiTAMIN2:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_PYTHON_BINDINGS=ON
cmake --build build -j"$(nproc)" --target localization_zoo_py
python3 python/example_synthetic.pyimport sys; sys.path.insert(0, "build/python")
import localization_zoo as lz
odom = lz.KissICP()
for scan in scans: # Nx3 float64 numpy arrays
odom.register_frame(scan)
print(odom.pose) # 4x4 world-frame poseSee python/README.md for the full API.
cd ros2 && colcon build
source install/setup.bash
ros2 run localization_zoo_ros litamin2_node
ros2 launch localization_zoo_ros play_rosbag.launch.py \
bag_path:=/path/to/bag points_topic:=/velodyne_pointspython3 evaluation/scripts/benchmark.py \
--gt gt_poses.txt \
--est LiTAMIN2:litamin2_poses.txt A-LOAM:aloam_poses.txt \
--output_dir results/localization_zoo/
├── common/ # Shared Eigen/PCL utilities
├── papers/ # One self-contained dir per method (headers, sources, tests)
├── evaluation/ # Benchmark and evaluation tools
├── ros2/ # ROS 2 Humble wrappers
└── .github/workflows/ci.yml
Each papers/*/ directory is self-contained; core libraries are ROS-independent.
RELEAD and X-ICP report underconstrained geometry:
=== Tunnel Environment ===
Has degeneracy: yes
Degenerate translation dirs: 1
dir: [1, 0, 0] # x direction (tunnel axis) is degenerate
=== Normal Environment ===
Has degeneracy: no # walls and ground constrain all directions
ROS 2 publishes the status on /degeneracy.
mkdir -p papers/your_method/{include/your_method,src,test}
# 1. Write headers, sources, and tests
# 2. Add CMakeLists.txt
# 3. Add add_subdirectory to the top-level CMakeLists.txt
# 4. Run ctest and keep the full suite passingSee CONTRIBUTING.md for the checklist, or open a paper request.
| Library | Version | Purpose |
|---|---|---|
| Eigen3 | >= 3.3 | Linear algebra |
| PCL | >= 1.10 | Point cloud processing |
| Ceres Solver | >= 2.0 | Nonlinear optimization |
| GTest | >= 1.11 | Unit testing |
| OpenCV | >= 4.0 | I/O utilities |
Contributions are welcome — new paper reimplementations, bug fixes, and benchmark improvements. See CONTRIBUTING.md for scope, the honesty policy, and the per-paper checklist.
If you use this software or its benchmarks, please cite it (see CITATION.cff) or use GitHub's "Cite this repository" button.
@software{sasaki_localization_zoo,
author = {Sasaki, Ryohei},
title = {Localization Zoo: from-paper {C++} reimplementations of {LiDAR}
localization and odometry methods, honestly benchmarked},
url = {https://github.com/rsasaki0109/localization_zoo},
version = {1.0.0},
year = {2026}
}MIT