Skip to content

Add SMALL_VGICP Koide manifest for Phase 1 backend comparison#93

Open
rsasaki0109 wants to merge 3 commits into
mainfrom
chore/phase1-small-vgicp-manifest
Open

Add SMALL_VGICP Koide manifest for Phase 1 backend comparison#93
rsasaki0109 wants to merge 3 commits into
mainfrom
chore/phase1-small-vgicp-manifest

Conversation

@rsasaki0109

Copy link
Copy Markdown
Owner

Adds the missing third manifest for the Phase 1 backend comparison (NDT_OMP vs SMALL_GICP vs SMALL_VGICP) on Koide outdoor_hard_01.

The NDT_OMP and SMALL_GICP manifests already exist; SMALL_VGICP was missing even though the backend is fully wired (registration_backend_policy.hpp maps it, the component constructs it with vgicp_voxel_resolution). This manifest mirrors the SMALL_GICP one exactly except registration_method, the output dir, and the ROS domain id, so the two small_gicp variants differ only in registration type.

small_gicp is installed (/usr/local/lib/libsmall_gicp.so) and the Koide data is local, so the three-way comparison is turn-key — it only needs an idle machine (load < ~5) for valid alignment-time numbers.

Config only; no code change.

Phase 1 compares NDT_OMP vs SMALL_GICP vs SMALL_VGICP on Koide
outdoor_hard_01. The NDT_OMP and SMALL_GICP manifests already exist;
the SMALL_VGICP one was missing even though the backend is fully wired
(registration_backend_policy.hpp + component, vgicp_voxel_resolution).

This mirrors the SMALL_GICP manifest exactly except registration_method
(SMALL_VGICP), the output dir, and the ROS domain id, so the two
small_gicp variants differ only in the registration type. small_gicp is
installed and the Koide data is local, so the three-way comparison is
turn-key; it only needs an idle machine (load < ~5) for valid
alignment-time numbers.
The _full_gt_diag_map manifests reference data not on disk; the runnable
Koide data is outdoor_hard_01a + map_outdoor_hard.ply. Add 01a smoke
manifests for the three backends and document the first 60s result in
docs/phase1_koide_backend_comparison.md.

Key finding: translation-RMSE alone is a trap. With full-density Livox
scans SMALL_GICP/SMALL_VGICP are throughput-bound (1.5-3.4 s/align vs
NDT 0.15 s) and produce only ~10-15 poses, so their low RMSE is a
mirage. With identical downsampling (voxel 0.5) SMALL_GICP becomes the
accuracy/stability winner (0.095 m, 100% ok, 0.40 s/align) while NDT_OMP
is the fastest baseline (0.266 m, 89% ok) and SMALL_VGICP is not viable
at vgicp_voxel_resolution 0.5 (38.9% ok). Single 60s smoke; full 380s
and a VGICP resolution sweep are follow-ups.
@rsasaki0109

Copy link
Copy Markdown
Owner Author

Ran the comparison on the locally-available outdoor_hard_01a (the _full_gt_diag_map data is not on disk). 60 s smoke, machine just-idle.

Key finding: translation-RMSE alone is a trap. With full-density Livox scans SMALL_GICP/SMALL_VGICP are throughput-bound (1.5–3.4 s/align vs NDT 0.15 s) → only ~10–15 poses → their low RMSE is a mirage over the seed neighbourhood.

Fair comparison with identical downsampling (voxel 0.5):

backend max align poses ok-rate trans RMSE rot RMSE
NDT_OMP 0.154 s 195 89.4% 0.266 m 2.46°
SMALL_GICP 0.396 s 126 100% 0.095 m 2.18°
SMALL_VGICP 0.630 s 29 38.9% 0.209 m 2.56°
  • SMALL_GICP wins on accuracy + stability (2.8× better translation than NDT, 100% ok, zero rejects vs NDT's hard-window reject streak), still real-time-viable.
  • NDT_OMP = fastest baseline.
  • SMALL_VGICP not viable at vgicp_voxel_resolution: 0.5 (38.9% ok) — needs a finer-resolution sweep.

Single 60 s smoke; full 380 s and a VGICP resolution sweep are follow-ups. Details in docs/phase1_koide_backend_comparison.md.

…t winner

Ran the full outdoor_hard_01a window (380s). The 60s-smoke ranking is
overturned: NDT_OMP 0.668m vs SMALL_GICP 11.70m vs SMALL_VGICP 22.68m.

SMALL_GICP looked best on the easy first 60s (0.095m, 100% ok) but is
fragile -- it loses lock on the hard section and never recovers (lost
274.5s of 380, fitness explodes to 1.3M, crop starves), diverging to
11.7m. NDT_OMP is less accurate while locked but survives the hard
section (recovery_retry recovers once) and ends at 0.668m. A textbook
case of why a single easy window is necessary-but-not-sufficient (the
Phase 3 lesson). Adds the full380 manifests and the reversal section to
the comparison doc.
@rsasaki0109

Copy link
Copy Markdown
Owner Author

Full 380 s window — the ranking REVERSES.

backend poses ok-rate trans RMSE rot RMSE longest lost
NDT_OMP 476 57.3% 0.668 m 11.2° 75.4 s
SMALL_GICP 87 11.2% 11.70 m 47.4° 274.5 s
SMALL_VGICP 35 6.7% 22.68 m 32.6° 298.4 s

SMALL_GICP looked best on the easy first 60 s (0.095 m, 100% ok) but is fragile: on the hard section it loses lock and never recovers (lost 274.5 s of 380, fitness explodes to 1.3M, crop starves), diverging to 11.7 m. NDT_OMP is the robust winner (0.668 m) — less accurate while locked, but it survives the hard section (recovery_retry recovers once).

The 60 s smoke ranking was exactly reversed by the full replay — a textbook case of why a single easy window is necessary-but-not-sufficient (the Phase 3 lesson).

Verdict: NDT_OMP recommended default. SMALL_GICP = higher locked-in accuracy but not safe without lock-retention work; SMALL_VGICP not competitive as configured. Full details in docs/phase1_koide_backend_comparison.md.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant