Skip to content

Commit a644e3e

Browse files
authored
Merge pull request #90 from rsasaki0109/feat/public-demo-validation-dashboard
Add public demo, validation dashboard, and reliability roadmap
2 parents 1739887 + 7c281b1 commit a644e3e

19 files changed

Lines changed: 1729 additions & 58 deletions

.github/workflows/main.yml

Lines changed: 35 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,66 +4,71 @@ on:
44
pull_request:
55
branches:
66
- main
7+
push:
8+
branches:
9+
- main
10+
11+
permissions:
12+
contents: read
713

814
jobs:
915
humble_build:
1016
name: Build on Humble
1117
runs-on: ubuntu-22.04
1218
container: ros:humble
1319
steps:
14-
- uses: actions/checkout@v1
20+
- uses: actions/checkout@v4
1521
with:
1622
submodules: true
1723
- name: Copy repository
1824
run: |
19-
mkdir -p ~/ros2_ws/src/lidar_localization_ros2
20-
cp -rf . ~/ros2_ws/src/lidar_localization_ros2
25+
mkdir -p ~/ros2_ws/src/lidar_localization_ros2
26+
cp -rf . ~/ros2_ws/src/lidar_localization_ros2
2127
- name: Install dependencies
2228
run: |
23-
source /opt/ros/humble/setup.bash
24-
sudo apt install -y python3-rosdep
25-
apt update
26-
rosdep update
27-
cd ~/ros2_ws/src
28-
git clone https://github.com/rsasaki0109/ndt_omp_ros2.git -b humble
29-
rosdep install -r -y --from-paths . --ignore-src
29+
source /opt/ros/humble/setup.bash
30+
sudo apt-get update
31+
sudo apt-get install -y python3-rosdep python3-colcon-common-extensions
32+
rosdep update
33+
cd ~/ros2_ws/src
34+
git clone https://github.com/rsasaki0109/ndt_omp_ros2.git -b humble
35+
rosdep install -r -y --from-paths . --ignore-src
3036
shell: bash
3137
- name: Build packages
3238
run: |
33-
source /opt/ros/humble/setup.bash
34-
sudo apt install python3-colcon-common-extensions
35-
cd ~/ros2_ws
36-
colcon build
37-
source ~/ros2_ws/install/setup.bash
39+
source /opt/ros/humble/setup.bash
40+
cd ~/ros2_ws
41+
colcon build
42+
source ~/ros2_ws/install/setup.bash
3843
shell: bash
3944

4045
jazzy_build:
4146
name: Build on Jazzy
4247
runs-on: ubuntu-24.04
4348
container: ros:jazzy
4449
steps:
45-
- uses: actions/checkout@v1
50+
- uses: actions/checkout@v4
4651
with:
4752
submodules: true
4853
- name: Copy repository
4954
run: |
50-
mkdir -p ~/ros2_ws/src/lidar_localization_ros2
51-
cp -rf . ~/ros2_ws/src/lidar_localization_ros2
55+
mkdir -p ~/ros2_ws/src/lidar_localization_ros2
56+
cp -rf . ~/ros2_ws/src/lidar_localization_ros2
5257
- name: Install dependencies
5358
run: |
54-
source /opt/ros/jazzy/setup.bash
55-
sudo apt install -y python3-rosdep
56-
apt update
57-
rosdep update
58-
cd ~/ros2_ws/src
59-
git clone https://github.com/rsasaki0109/ndt_omp_ros2.git -b humble
60-
rosdep install -r -y --from-paths . --ignore-src
59+
source /opt/ros/jazzy/setup.bash
60+
sudo apt-get update
61+
sudo apt-get install -y python3-rosdep python3-colcon-common-extensions
62+
rosdep update
63+
cd ~/ros2_ws/src
64+
# ndt_omp_ros2 does not publish a dedicated jazzy branch yet; humble is used in CI.
65+
git clone https://github.com/rsasaki0109/ndt_omp_ros2.git -b humble
66+
rosdep install -r -y --from-paths . --ignore-src
6167
shell: bash
6268
- name: Build packages
6369
run: |
64-
source /opt/ros/jazzy/setup.bash
65-
sudo apt install python3-colcon-common-extensions
66-
cd ~/ros2_ws
67-
colcon build
68-
source ~/ros2_ws/install/setup.bash
70+
source /opt/ros/jazzy/setup.bash
71+
cd ~/ros2_ws
72+
colcon build
73+
source ~/ros2_ws/install/setup.bash
6974
shell: bash

AGENTS.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ lidarloc_ws/
2222
source scripts/setup_local_env.sh
2323
```
2424

25-
- The setup script sources ROS 2 Humble, adds `../local_prefix`, and then sources `../build_ws/install/setup.bash` when present.
25+
- The setup script sources ROS 2 Humble for this workspace overlay, adds `../local_prefix`, and then sources `../build_ws/install/setup.bash` when present.
26+
- Upstream README/CI also track Jazzy builds; local overlay development here remains Humble-based unless explicitly migrated.
2627
- Do not replace the local-prefix workflow with system-wide dependency installs unless explicitly requested.
2728
- Build from the overlay workspace, not from this repository directory:
2829

CHANGELOG.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,28 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
### Added
6+
7+
- `scripts/run_public_demo.sh` for the 30-minute Autoware Istanbul public demo path
8+
- `scripts/run_public_validation_dashboard.sh` for Markdown/HTML public validation dashboards
9+
- `param/benchmark/v1_1_boreas_dry_run_endpoint.example.yaml` for the v1.1 MVP dry-run endpoint chain
10+
- `scripts/run_v1_1_relocalization_smoke.sh` to guard the v1.1 claim boundary
11+
12+
### Reliability / Claim Boundary
13+
14+
- guard `use_odom` integration until initial pose is valid and keep pose finite for NDT init guess
15+
- ignore non-finite `/initialpose` payloads and stop eager scan replay during pose reset
16+
- v1.1 relocalization is documented as a validated dry-run `/initialpose` command artifact only
17+
- guarded reset publication and post-reset observation remain experimental and outside the public MVP endpoint
18+
- automatic runtime recovery and production-grade global relocalization are explicitly out of scope
19+
20+
### ROS 2 Distro Support
21+
22+
- README badges and support matrix now show **Jazzy-first / Humble-compatible**
23+
- GitHub Actions workflow updated to `actions/checkout@v4` and `push` on `main`
24+
- Jazzy CI still builds against `ndt_omp_ros2` `humble` branch until a dedicated Jazzy branch exists upstream
25+
326
## 1.0.0 - 2026-03-30
427

528
Initial repo-ready Nav2-focused release.

CMakeLists.txt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ install(PROGRAMS
125125
scripts/benchmark_make_graph_dataset
126126
scripts/benchmark_pose_recorder
127127
scripts/benchmark_diagnostic_recorder
128+
scripts/build_public_demo_report.py
129+
scripts/build_public_validation_dashboard.py
128130
scripts/build_relocalization_demo_report.py
129131
scripts/benchmark_runner
130132
scripts/benchmark_sweep_localizer
@@ -160,6 +162,10 @@ install(PROGRAMS
160162
scripts/run_nav2_reinit_supervisor_regression.sh
161163
scripts/run_recovery_action_experiments.py
162164
scripts/run_reinit_trigger_experiments.py
165+
scripts/run_public_demo.sh
166+
scripts/run_public_validation_dashboard.sh
167+
scripts/run_v1_1_relocalization_smoke.sh
168+
scripts/validate_v1_1_claim_language.py
163169
scripts/run_public_regression_suite.sh
164170
scripts/run_release_regression_suite.sh
165171
scripts/run_nav2_demo_smoke
@@ -212,6 +218,17 @@ if(BUILD_TESTING)
212218
COMMAND test_scan_admission_policy
213219
)
214220

221+
add_executable(test_odom_integration_policy
222+
test/test_odom_integration_policy.cpp)
223+
target_include_directories(test_odom_integration_policy PRIVATE
224+
include)
225+
ament_target_dependencies(test_odom_integration_policy
226+
geometry_msgs)
227+
add_test(
228+
NAME odom_integration_policy
229+
COMMAND test_odom_integration_policy
230+
)
231+
215232
add_executable(test_ndt_initializer_policy
216233
test/test_ndt_initializer_policy.cpp)
217234
target_include_directories(test_ndt_initializer_policy PRIVATE

README.md

Lines changed: 89 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@
55
<p><strong>Map-based 3D LiDAR localization for ROS 2, Nav2, and repeatable rosbag evaluation.</strong></p>
66

77
<p>
8-
<img alt="ROS 2 Humble" src="https://img.shields.io/badge/ROS%202-Humble-1f5b99">
8+
<a href="https://github.com/rsasaki0109/lidar_localization_ros2/actions/workflows/main.yml">
9+
<img alt="build" src="https://github.com/rsasaki0109/lidar_localization_ros2/actions/workflows/main.yml/badge.svg">
10+
</a>
11+
<img alt="ROS 2 Jazzy" src="https://img.shields.io/badge/ROS%202-Jazzy-2563eb">
12+
<img alt="ROS 2 Humble compatible" src="https://img.shields.io/badge/ROS%202-Humble-compatible-1f5b99">
913
<img alt="Release v1.0.0" src="https://img.shields.io/badge/release-v1.0.0-2f855a">
1014
<img alt="Backend NDT OMP" src="https://img.shields.io/badge/default-NDT__OMP-4a5568">
1115
<img alt="License BSD 2 Clause" src="https://img.shields.io/badge/license-BSD--2--Clause-6b46c1">
@@ -33,6 +37,46 @@ Current boundary: short public replay, smoke, and controlled regression paths ar
3337
Long-horizon robustness on stronger public `LiDAR + IMU + GT` data and real robot deployment still
3438
need dataset or hardware-specific validation.
3539

40+
v1.1 relocalization stops at a validated dry-run `/initialpose` command artifact.
41+
It does not claim automatic runtime recovery or production-grade global relocalization.
42+
See [docs/v1_1_relocalization.md](docs/v1_1_relocalization.md).
43+
44+
## 30-Minute Public Demo
45+
46+
Reproduce map-based localization on the official **Autoware Istanbul** public dataset:
47+
48+
```bash
49+
cd /path/to/lidarloc_ws/repo
50+
source scripts/setup_local_env.sh
51+
scripts/run_public_demo.sh
52+
```
53+
54+
What it does:
55+
56+
- downloads the Istanbul map + bag when missing
57+
- builds `lidar_localization_ros2` when the overlay is missing
58+
- replays `60 s` of urban localization
59+
- writes `demo_report.md`, `demo_report.json`, and `trajectory_xy.png`
60+
61+
Typical first-run time: about **15–30 minutes** (network download dominates).
62+
Re-runs with `--resume` are much faster.
63+
64+
Latest local smoke on Autoware Istanbul `60 s` (dataset already present, 2026-06-10):
65+
66+
- translation RMSE: `1.63 m`
67+
- rotation RMSE: `0.19 deg`
68+
- matched samples: `102`
69+
- wall time: about `70 s`
70+
71+
Example report output directory:
72+
73+
```text
74+
lidarloc_ws/artifacts/public/demo/latest/
75+
demo_report.md
76+
demo_report.json
77+
trajectory_xy.png
78+
```
79+
3680
## Quick Start
3781

3882
Expected workspace layout:
@@ -66,6 +110,7 @@ For the full no-sudo local-prefix workflow, see [docs/local_build.md](docs/local
66110
| Jetson + Livox MID-360 | `ros2 launch lidar_localization_ros2 mid360_legged_localization.launch.py map_path:=/absolute/path/to/map.pcd cloud_topic:=/livox/points imu_topic:=/livox/imu` |
67111
| Self-contained Nav2 smoke | `ros2 run lidar_localization_ros2 run_nav2_demo_smoke --map-yaml /absolute/path/to/map.yaml --initial-pose-x 0.0 --initial-pose-y 0.0 --goal-x 1.0 --goal-y 0.0` |
68112
| Real-localizer replay smoke | `ros2 run lidar_localization_ros2 run_nav2_replay_smoke --map-yaml /absolute/path/to/map.yaml --pcd-map-path /absolute/path/to/map.pcd --bag-path /absolute/path/to/bag` |
113+
| **30-minute public demo** | `source scripts/setup_local_env.sh && scripts/run_public_demo.sh` |
69114
| Public regression | `source scripts/setup_local_env.sh && scripts/run_public_regression_suite.sh` |
70115

71116
## Nav2 Requirements
@@ -112,6 +157,34 @@ Main outputs:
112157
- Public benchmark runs should prefer binary little-endian float32 `.ply` maps.
113158
- Generated `.pcd` maps are useful for inspection, but are not the preferred benchmark path.
114159

160+
## Latest Public Validation
161+
162+
Regenerate the dashboard from local demo / regression artifacts:
163+
164+
```bash
165+
source scripts/setup_local_env.sh
166+
scripts/run_public_validation_dashboard.sh
167+
```
168+
169+
Outputs:
170+
171+
```text
172+
lidarloc_ws/artifacts/public/dashboard/
173+
index.md
174+
index.html
175+
dashboard.json
176+
```
177+
178+
| Suite | Dataset | What it checks |
179+
|---|---|---|
180+
| Public demo | Autoware Istanbul `60 s` | Star-friendly replay + trajectory report |
181+
| Public regression | Istanbul `60 s` | No-IMU safety gate on public urban replay |
182+
| Public regression | HDL `hdl_400` `60 s` | IMU safety / throughput smoke |
183+
| Release regression | Nav2 reinit supervisor `150 s` | Controlled recovery wrapper behavior |
184+
185+
Historical snapshots and interpretation notes live in
186+
[docs/public_validation_log.md](docs/public_validation_log.md).
187+
115188
## Validation
116189

117190
Fast build check:
@@ -134,15 +207,7 @@ Release-style regression:
134207
ros2 run lidar_localization_ros2 run_release_regression_suite.sh
135208
```
136209

137-
Latest recorded public validation snapshot:
138-
139-
- [docs/public_validation_log.md](docs/public_validation_log.md)
140-
- `2026-05-22`, commit `2a5f11f`, release regression `overall_pass=true`
141-
- Istanbul `60 s` no-IMU safety check: `1.176 m` translation RMSE, `0.393 deg` rotation RMSE
142-
- HDL `60 s` IMU safety check, two-repeat median: pose rows `558.5 -> 553.5`
143-
- Nav2 reinitialization supervisor `150 s`: requested rows `944 -> 7`
144-
145-
This snapshot is public replay validation, not Jetson + MID-360 hardware validation.
210+
This validation path is public replay regression, not Jetson + MID-360 hardware validation.
146211

147212
## Branch Workflow
148213

@@ -184,11 +249,22 @@ git branch -D <branch>
184249
| v1.1 relocalization work | [docs/v1_1_relocalization.md](docs/v1_1_relocalization.md) |
185250
| Experiment interfaces and decisions | [docs/interfaces.md](docs/interfaces.md), [docs/experiments.md](docs/experiments.md), [docs/decisions.md](docs/decisions.md) |
186251
| Roadmap | [docs/competitive_roadmap.md](docs/competitive_roadmap.md) |
252+
| Reliability / open issues | [docs/reliability_roadmap.md](docs/reliability_roadmap.md) |
253+
254+
## ROS 2 Support
255+
256+
| Distro | Status | CI |
257+
|---|---|---|
258+
| Jazzy | primary target for new users (2026) | `jazzy_build` in [`.github/workflows/main.yml`](.github/workflows/main.yml) |
259+
| Humble | supported for existing deployments | `humble_build` in [`.github/workflows/main.yml`](.github/workflows/main.yml) |
260+
261+
Local development in this workspace still uses the Humble-based `scripts/setup_local_env.sh`
262+
overlay workflow documented in [docs/local_build.md](docs/local_build.md).
187263

188264
## Dependencies
189265

190-
- ROS 2 Humble
191-
- [ndt_omp_ros2](https://github.com/rsasaki0109/ndt_omp_ros2.git)
266+
- ROS 2 Jazzy or Humble
267+
- [ndt_omp_ros2](https://github.com/rsasaki0109/ndt_omp_ros2.git) (`humble` branch; used for both distro CI builds today)
192268
- [small_gicp](https://github.com/koide3/small_gicp), optional for `SMALL_GICP` and `SMALL_VGICP`
193269

194-
See [CHANGELOG.md](CHANGELOG.md) for release notes.
270+
See [CHANGELOG.md](CHANGELOG.md) for release notes and distro support notes.

0 commit comments

Comments
 (0)