{"id":13799404,"url":"https://github.com/rsasaki0109/lidarslam_ros2","last_synced_at":"2026-04-02T15:46:47.545Z","repository":{"id":39992998,"uuid":"236982343","full_name":"rsasaki0109/lidarslam_ros2","owner":"rsasaki0109","description":"ROS 2 package of 3D lidar slam using ndt/gicp registration and pose-optimization","archived":false,"fork":false,"pushed_at":"2026-03-27T22:45:33.000Z","size":11775,"stargazers_count":796,"open_issues_count":36,"forks_count":159,"subscribers_count":12,"default_branch":"develop","last_synced_at":"2026-03-27T22:51:47.233Z","etag":null,"topics":["lidar","localization","mapping","robotics","ros","ros2","slam"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rsasaki0109.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-01-29T12:57:45.000Z","updated_at":"2026-03-27T22:45:36.000Z","dependencies_parsed_at":"2023-02-09T18:16:55.233Z","dependency_job_id":"9e1f171d-9821-42d6-92e7-03c78c06103b","html_url":"https://github.com/rsasaki0109/lidarslam_ros2","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/rsasaki0109/lidarslam_ros2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsasaki0109%2Flidarslam_ros2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsasaki0109%2Flidarslam_ros2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsasaki0109%2Flidarslam_ros2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsasaki0109%2Flidarslam_ros2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rsasaki0109","download_url":"https://codeload.github.com/rsasaki0109/lidarslam_ros2/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsasaki0109%2Flidarslam_ros2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31309303,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["lidar","localization","mapping","robotics","ros","ros2","slam"],"created_at":"2024-08-04T00:01:02.359Z","updated_at":"2026-04-02T15:46:47.537Z","avatar_url":"https://github.com/rsasaki0109.png","language":"HTML","funding_links":[],"categories":["Packages"],"sub_categories":["Application layer"],"readme":"lidarslam_ros2\n====\n\nROS 2 LiDAR SLAM focused on non-GPL pointcloud-map authoring, benchmarking, and compatibility with Autoware pointcloud-map workflows.\n\n\u003e Status: `develop` tracks the current `v2 alpha` line.\n\u003e For the latest tagged public beta, see [v0.2.2 Release Notes](docs/releases/v0.2.2.md).\n## Recommended Public Workflow\n\nThe recommended public path in this repository is:\n\n- frontend: `RKO-LIO`\n- backend: `graph_based_slam`\n- output: Autoware-compatible `pointcloud_map/` and `map_projector_info.yaml`\n\nThis is the path exercised in the public quickstart, benchmark flow, and release/readiness gate.\n\n## Scope\n\nThis repository is for people who want:\n\n- ROS 2 LiDAR SLAM with loop closure\n- pointcloud maps that Autoware can load\n- a non-GPL default workflow\n\nOut of scope for the public path:\n\n- `lanelet2_map.osm` generation\n- Autoware planning/localization bringup\n- GPL-only frontend or backend components in the default workflow\n\n## Why This Repo\n\n- non-GPL default path: `graph_based_slam` (BSD-2-Clause), `scanmatcher` (project-local), `RKO-LIO` (MIT), `DLIO` (MIT), `FAST_GICP` (BSD-3-Clause)\n- pointcloud-map authoring is treated as a first-class workflow, not just a side-effect of odometry\n- Autoware pointcloud-map flow is exercised end-to-end\n- default benchmark path is tracked on `NTU VIRAL`\n- current long-loop evidence is tracked on `MID360`\n- optional GNSS georeferencing writes `map_projector_info.yaml`\n- GNSS edges can use covariance-based weighting, with RTK-like fixes inferred from low horizontal covariance\n- GPL-free Scan Context place recognition is available in `graph_based_slam`\n- experimental submap-BEV and SOLiD descriptors can be benchmarked without adding GPL dependencies\n- optional dynamic-object filtering can clean the saved `pointcloud_map/` at `/map_save` time without changing live odometry\n- dynamic-filter reports now track both point reduction and coarse tile-footprint preservation\n- packet-based Applanix IMU deskew support exists for real open data, but it remains experimental and off by default in the Leo Drive packet path\n- the Leo Drive classic path now has a dedicated benchmark-suite entrypoint and report\n- place-recognition and dynamic-filter comparisons both have report generators with tracked artifacts\n- a focused map-authoring report can summarize benchmark, GNSS, cleanup, and classic-path evidence in one place\n- a submission-bundle helper can package maps, metrics, trajectories, logs, and reports in a repeatable layout\n\n## Install\n\nClone with submodules and install dependencies:\n\n```bash\ncd ~/ros2_ws/src\ngit clone --recursive https://github.com/rsasaki0109/lidarslam_ros2.git\ncd ..\nrosdep install --from-paths src --ignore-src -r -y\n```\n\nIf you already cloned without submodules:\n\n```bash\ngit -C src/lidarslam_ros2 submodule update --init --recursive\n```\n\nBuild the workspace:\n\n```bash\ncolcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release\n```\n\n## Quickstart\n\n```bash\n# local checks\nbash scripts/run_default_ci_checks.sh\n\n# fixed public quickstart\nbash scripts/download_ntu_viral_tnp01.sh\nbash scripts/run_autoware_quickstart.sh\n\n# arbitrary rosbag2\nbash scripts/run_autoware_map_beginner.sh /path/to/rosbag2\n```\n\n## Point-Cloud Map Example\nAutoware-compatible browser proof built from a live `/map/pointcloud_map`: the rendered map comes from Autoware map loaders, map verify is `PASS`, and GNSS runs emit `LocalCartesian`.\n![Autoware-compatible proof](lidarslam/images/autoware_map_loader_proof.png)\nSave-time dynamic-object filtering on Leo Drive `bag6` cuts saved points by about `50%` while keeping verification `PASS`.\n![Dynamic-object filter summary](lidarslam/images/dynamic_object_filter_bag6_summary.svg)\n\n## Docs\n- [Autoware-Compatible Map Authoring](docs/autoware-map-authoring.md) / [Autoware Quickstart](docs/autoware-quickstart.md) / [Autoware Foxglove](docs/autoware-foxglove.md)\n- [Operator Workflows](docs/workflows.md)\n- [Benchmarking And Release Gate](docs/benchmarking.md)\n- [Comparison](docs/comparison.md)\n- [v0.2.2 Release Notes](docs/releases/v0.2.2.md)\n- [Contributing](CONTRIBUTING.md)\n- [Changelog](CHANGELOG.md)\n- [Releasing](RELEASING.md)\n\nPreview the doc site locally with `python3 -m mkdocs serve`.\n\n## Current Snapshot\n\n- long-loop map authoring: the current documented `MID360` path closes a large loop and keeps `PASS` map verification\n- georeferenced output: open-data GNSS runs emit `LocalCartesian` `map_projector_info.yaml` with `map_origin`\n- save-time cleanup: the dynamic-object filter removes about `50%` of saved points on `Leo Drive bag6` while keeping verification `PASS`\n\n| Dataset | Published configuration | Reference kind | APE RMSE (m) | Autoware map verify |\n| --- | --- | --- | --- | --- |\n| `NTU VIRAL tnp_01` | current default | `ground_truth` | `0.952` | `PASS` |\n| `NTU VIRAL tnp_01` | best observed | `ground_truth` | `0.870` | `PASS` |\n| `MID360` | current default | `cross_validation` | `3.641` | `PASS` |\n| `MID360` | best observed | `cross_validation` | `3.590` | `PASS` |\n\nMore detail lives in [docs/comparison.md](docs/comparison.md), [docs/benchmarking.md](docs/benchmarking.md), `output/benchmark_summary.md`, and `output/latest_report.html`.\n\n## Main Entrypoints\n\nRequired input topics for the main public path:\n\n| Launch path | Required topics | Optional topics |\n| --- | --- | --- |\n| `ros2 launch lidarslam rko_lio_slam.launch.py` | LiDAR `sensor_msgs/PointCloud2` on `lidar_topic`, IMU `sensor_msgs/Imu` on `imu_topic` | `sensor_msgs/NavSatFix` on `gnss_topic` (default: `/gnss/fix`) when `use_gnss:=true` |\n| `ros2 launch lidarslam lidarslam.launch.py` | Point cloud `sensor_msgs/PointCloud2` on `input_cloud`, TF from `robot_frame_id` to the LiDAR frame | IMU on `imu_topic` when `scanmatcher use_imu:=true`, odom TF when `scanmatcher use_odom:=true`, GNSS on `gnss_topic` (default: `/gnss/fix`) when backend `use_gnss:=true` |\n| `ros2 launch graph_based_slam graphbasedslam.launch.py` | `lidarslam_msgs/MapArray` on `map_array` | IMU on `/imu` when `use_imu_preintegration:=true`, GNSS on `gnss_topic` (default: `/gnss/fix`) when `use_gnss:=true` |\n\nThere is no wheel-speed / vehicle-speed input in the current public path yet.\nInspect GNSS covariance quality before enabling backend GNSS weighting:\n\n```bash\npython3 scripts/inspect_navsatfix_covariance.py /path/to/rosbag2 --topic /gnss/fix\n```\nThe backend GNSS subscription topic is configurable with `gnss_topic` (default: `/gnss/fix`).\n`scripts/run_open_data_gnss_smoke.sh` auto-detects the NavSatFix topic if you do not pass `--gnss-topic`.\n\nSome open-data bags expose GNSS quality only through Applanix raw messages. For those, inspect `GSOF50` first:\n\n```bash\ngit clone --depth=1 https://github.com/autowarefoundation/applanix.git /tmp/applanix\npython3 scripts/inspect_applanix_gsof50_quality.py /path/to/rosbag2 \\\n  --topic /lvx_client/gsof/ins_solution_rms_50 \\\n  --applanix-msg-dir /tmp/applanix/applanix_msgs/msg\n```\n\nTo use those bags with the current public `NavSatFix` path, generate a small sidecar rosbag2 with `scripts/convert_applanix_gsof_to_navsatfix_bag.py`. The full command is in [docs/workflows.md](docs/workflows.md).\n\nRun the public Autoware quickstart:\n\n```bash\nbash scripts/run_autoware_quickstart.sh\n```\n\nRun `RKO-LIO + graph_based_slam` directly:\n\n```bash\nros2 launch lidarslam rko_lio_slam.launch.py \\\n  bag_path:=/path/to/rosbag2 \\\n  lidar_topic:=/os_cloud_node/points \\\n  imu_topic:=/os_cloud_node/imu\n```\n\nSave the current map:\n\n```bash\nros2 service call /map_save std_srvs/srv/Empty\n```\n\nTo filter likely dynamic objects only in the saved map output, enable `use_dynamic_object_filter: true` and tune `dynamic_object_filter_voxel_size`, `dynamic_object_filter_min_observations`, `dynamic_object_filter_temporal_window`, and `dynamic_object_filter_max_range_from_sensor_m` before calling `/map_save`.\n\nRun the standard benchmark path:\n\n```bash\nbash scripts/download_ntu_viral_tnp01.sh\nbash scripts/run_rko_lio_graph_benchmark.sh\n```\n\nFor the Leo Drive classic-path suite, dynamic-filter benchmark, and MID360 place-recognition comparison, use the entrypoints documented in [docs/benchmarking.md](docs/benchmarking.md).\n\nRun the local readiness gate:\n\n```bash\nbash scripts/run_release_readiness_checks.sh --ape-threshold 0.10\n```\n\n## License Policy\n\nThe default public workflow excludes GPL-only frontend/backend components.\n\n- `graph_based_slam`: BSD-2-Clause\n- `scanmatcher`: project-local frontend/backend code in this repository\n- `RKO-LIO`: MIT\n- `DLIO`: MIT\n- `FAST_GICP`: BSD-3-Clause\n- built-in `Scan Context`: implemented locally to avoid GPL dependencies\n\n`Thirdparty/lio-sam` is excluded from default `colcon` package discovery via `COLCON_IGNORE`.\n\n## Support Matrix\n\n| ROS 2 distro | Ubuntu | Scope |\n| --- | --- | --- |\n| Humble | 22.04 | default workflow build and package tests in CI |\n| Jazzy | 24.04 | default workflow build and package tests in CI; Autoware pointcloud-map dogfood exercised locally |\n\n## Quality Gates\n\nThe main checks for the public path are:\n\n- `bash scripts/run_default_ci_checks.sh`\n- `python3 scripts/verify_autoware_map.py \u003cpointcloud_map_dir\u003e`\n- `bash scripts/run_autoware_quickstart.sh`\n- `bash scripts/run_rko_lio_graph_autoware_dogfood.sh --auto-exit-secs 20`\n- `bash scripts/run_release_readiness_checks.sh --ape-threshold 0.10`\n\nFor the command-level details, parameter-file pointers, and Autoware map output notes, see [docs/workflows.md](docs/workflows.md).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frsasaki0109%2Flidarslam_ros2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frsasaki0109%2Flidarslam_ros2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frsasaki0109%2Flidarslam_ros2/lists"}