Skip to content

Latest commit

 

History

913 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Localization Zoo

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

C++17 ROS2 Humble Reimplementations and Derived Variants CTest MIT License

KITTI seq07 full-sequence trajectory comparison, with paths colored by position error from ground truth and ranked by RPE drift

KITTI seq07 odometry, no GT seed — current promoted trajectories on one shared drift-colored scale.

↪ Open the interactive benchmark and method explorer

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:latest

Promoted LiDAR odometry v10

direction_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.py

On PowerShell, set $env:LOCALIZATION_ZOO_DATA_ROOT before running the command.


Why Localization Zoo?

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

Paper-Ready Claim Boundary

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.

Leaderboard — odometry, RPE [drift %/100 m], lower is better

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.

From-paper reimplementations (no public reference code) — KITTI full

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.

Does LiDAR intensity actually help? — I-LOAM ablation

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.

Trajectory gallery — KITTI seq07, current promoted trajectories

The hero shows KITTI seq07 full trajectories on one drift-colored scale. Regenerate it or use the generic plotter.

Scope Note

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.


Experiment-Driven Development

The stable benchmark core is separated from variants in experiments/. See experiments, decisions, and interfaces.

Quick checks (after clone)

# build + synthetic benchmark + quick real-data fixture suite
bash evaluation/scripts/demo_localization_zoo.sh

Output 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 broad

CI-equivalent smoke checks:

bash evaluation/scripts/smoke_ci_fixture.sh
bash evaluation/scripts/smoke_multimodal_fixture.sh

More workflows: evaluation/README.md. Activation and retention definitions: docs/activation_metrics.md.


Benchmark

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-full

Synthetic Urban (30 frames)

Method         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.

2D Laser Scan Odometry

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.sh

Setup: evaluation/scripts/SETUP_2D_SCAN_BENCHMARK.md.

Hard Point Cloud Localization

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 6

Setup: evaluation/scripts/SETUP_HARD_PCL_LOCALIZATION_BENCHMARK.md. Full results tree: experiments/results/hard_pcl_localization/.


Implementations

Point Cloud Registration

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

Degeneracy-Aware Methods

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 -

Foundations

Paper Venue Key Idea Reference
IMU Preintegration T-RO 2017 Preintegration on SO(3) with first-order bias correction for LIO pipelines Paper

LIO / Continuous-Time Fusion

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 Dead Reckoning / Aided INS

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 SDK

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.

Place Recognition / Loop Closure

Paper Venue Key Idea Reference
Scan Context IROS 2018 Lightweight place recognition with polar ring-sector descriptors and yaw-shift search Paper

Quick Start

Docker (no local dependencies)

docker run --rm -v "$PWD/zoo-demo:/out" ghcr.io/rsasaki0109/localization_zoo:latest

Native build

sudo 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.sh

Manual 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_benchmark

Python bindings (experimental)

Experimental 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.py
import 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 pose

See python/README.md for the full API.

ROS 2

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_points

Evaluation

python3 evaluation/scripts/benchmark.py \
  --gt gt_poses.txt \
  --est LiTAMIN2:litamin2_poses.txt A-LOAM:aloam_poses.txt \
  --output_dir results/

Architecture

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.


Degeneracy Detection Demo

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.


Adding a New Paper

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 passing

See CONTRIBUTING.md for the checklist, or open a paper request.


Dependencies

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

Contributing

Contributions are welcome — new paper reimplementations, bug fixes, and benchmark improvements. See CONTRIBUTING.md for scope, the honesty policy, and the per-paper checklist.

Citation

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}
}

License

MIT

About

C++ from-paper reimplementations of LiDAR localization & odometry papers, with benchmarks and tests.

Topics

Resources

Contributing

Stars

55 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages