# LiDAR Dataset Gateway

## Product value

The Dataset Gateway gives Mission Core a repeatable perception laboratory
before the production vehicle and its final sensor installation exist. It
separates four questions that were previously mixed together:

- whether the transport preserved the sensor evidence;
- whether preprocessing produces a valid one-scan perception input;
- whether an algorithm is accurate against independent labels;
- whether several scans form a stable local map for an operator or planner.

This prevents tuning an algorithm until a visually dense vendor map merely
looks plausible. It also keeps work reusable across Gazebo, Unreal, public
datasets and future real onboard sensors.

## Current admitted slice

Implemented now:

- multi-source `missioncore.dataset-gateway-catalog/v3`, exposed read-only at
  `GET /api/v1/lidar/dataset-gateway`;
- path-free `missioncore.dataset-admission/v1` worker evidence instead of a
  static React status;
- bounded `missioncore.dataset-native-scan-preview/v1` (GOOSE) and `/v2`
  (RELLIS smoke) artifacts, selected by source at
  `GET /api/v1/lidar/dataset-gateway/preview?source_id=...`;
- explicit `native-scan`, `normalized-scan` and `rolling-local-map`
  representations;
- a lossless GOOSE/SemanticKITTI frame reader for little-endian float32 XYZI
  and packed uint32 semantic/instance labels;
- count, finite-value and maximum-point safety gates;
- immutable point-aligned arrays;
- a fail-closed K1 `lio_pcl` boundary;
- worker storage admission for `D:\NDC_MISSIONCORE\datasets` and
  `/mnt/d/NDC_MISSIONCORE/datasets`;
- a dedicated, honest dataset catalog in **Полигон → Датасеты**;
- live admission states (`downloading`, `verifying`, `frame-ready`) and a real
  `Открыть` action;
- one admitted GOOSE validation frame with source colors, normalized remission
  and an independent ground-truth view;
- a pinned RELLIS-3D v1.1 compatibility smoke using the official Ouster example
  frame `000104`, its native `131,072` XYZI points, point-aligned labels,
  official ontology colors, explicit FLU sensor axes and a versioned
  `ground / non-ground / ignore` evaluation policy;
- a published, dimensioned MuCAR-3/VLS-128 Patchwork++ input profile:
  sensor frame `x-forward / y-left / z-up`, physical height `2.24 m`, native
  one-revolution scan and explicit absence of deskew/full vehicle TF claims;
- a reproducible Current/Patchwork++ A/B artifact with point-aligned masks,
  disagreement views, independent-label metrics, latency and exact provider
  identities;
- a separate **Парк → Диагностика LiDAR** surface containing only real sensor
  recordings and their operational evidence.

Not implemented:

- no browser-triggered large-artifact download;
- no implicit coordinate conversion;
- no fake ring/timestamp reconstruction for K1 MQTT evidence;
- no model training or production promotion;
- no full RELLIS Ouster archive, pose set, algorithm comparison or ROS bag
  admission yet;
- no rolling-map implementation yet.

## Product surface boundary

The gateway is not part of device quality diagnostics.

- **Парк → Диагностика LiDAR** answers whether a selected real sensor recording
  is present, reproducible and operationally usable. It never mixes public
  dataset frames into the selected device evidence.
- **Наблюдение** opens a concrete live or recorded spatial scene.
- **Данные** owns source-of-record, retention, replay preparation and export.
- **Полигон → Датасеты** is the single operator surface for admitted evaluation
  inputs. Opening one dataset exposes its source fragments, sparse annotated
  scans, visual overlays and useful analysis calculated only for the selected
  fragment.
- Internal replay-run identity, provenance and immutable artifacts remain a
  backend evidence contract. They are not a second operator navigation item
  and are not presented as vehicle motion.

Before compatible source evidence exists, the catalog explains the blocked
storage gate and keeps `Открыть датасет` disabled. GOOSE becomes available only
after the worker manifest says `frame-ready`; RELLIS becomes available at
`smoke-ready` only for the pinned official example. Both bounded previews must
pass their own identity, point-alignment and safety checks.

## Why public recordings look different

GOOSE stores one VLS-128 revolution per annotated `.bin` file. A rotating
multi-channel sensor produces discrete scan lines, so a single sensor-frame
view looks like sparse rings.

The admitted `goose_3d_val.zip` uses `lidar/val/.../*_vls128.bin` even though
some GOOSE documentation examples call the point-cloud root `velodyne`. Mission
Core accepts either declared root but still requires an exactly aligned
`labels/val/.../*_goose.label`.

The current field review is explicitly an accumulated map-frame window. It
combines many source publications after pose registration. This fills surfaces
and hides the original scan pattern. The external K1 stream is also already a
post-LIO/modeling product and lacks the raw driver fields needed to reconstruct
an original scan.

Livox sensors additionally use a scan pattern that differs from classic fixed
vertical channels. Time integration therefore changes their visual density in
a different way. “Ring-like” is a sensor geometry property, not a universal
quality target.

## Canonical processing profiles

### P0 — native evidence

Required:

- source ID and immutable frame ID;
- XYZ and the original return/remission/intensity field;
- semantic and instance labels when present;
- calibration/mounting/timing evidence as separate metadata;
- no accumulation and no hidden world transform.

Output: `native-scan`.

### P1 — normalized perception scan

Ordered operations:

1. decode and apply only evidenced factory calibration;
2. assign an explicit sensor coordinate frame;
3. deskew when per-point time and synchronized motion are available;
4. apply bounded range and field-of-view policy;
5. remove the vehicle/self mask;
6. apply named outlier and voxel policies;
7. retain a reversible index/provenance map to the native frame.

Output: `normalized-scan`.

### P2 — inference

Ground, semantic and object providers consume P1. Patchwork++ belongs here. It
does not own P0/P1 or P3.

Output: point-aligned predictions and reproducible metrics against labels.

### P3 — rolling local map

Ordered operations:

1. bind each normalized scan to an evidenced pose;
2. transform to `odom` or a declared local-map frame;
3. deduplicate with a named voxel policy;
4. expire points by TTL or travelled distance;
5. keep dynamic points short-lived or track them separately;
6. publish bounded map state and its contributing frame identities.

Output: `rolling-local-map`.

This is the stage that should stop static geometry from “jumping”. Deskew
reduces within-scan motion distortion; registration stabilizes scans across
time; TTL/dynamic filtering prevents stale ghosts.

## First dataset sequence

1. [Done] Admit `/mnt/d/NDC_MISSIONCORE/datasets` on the Windows/WSL worker.
2. [Done] Verify free space and record archive size/hash/license.
3. [Done] Download only the GOOSE 3D validation archive first (published size
   3.3 GB).
4. [Done] Import one labeled frame and expose it in React as `native-scan`.
5. [Done] Show native remission, the original semantic palette and
   ground-truth superclass coloring.
6. [Patchwork-specific profile done; general normalization still pending] Admit
   the published VLS-128 axes and physical height without claiming a complete
   numeric vehicle TF or deskewed `normalized-scan`.
7. [One-frame A/B done] Run the current ground heuristic and pinned
   Patchwork++ against the same native scan and independent labels.
8. [Done] Add deterministic sensor-degradation profiles for range, FOV,
   density, noise and dropout without modifying native source frames.
9. [Done] Expand the A/B to all 961 validation frames and seal the result as a
   Polygon replay-shadow run. Add a rolling-map sequence with localization
   evidence only after this qualification boundary.

## Acceptance checklist

- [x] Representations cannot be silently interchanged.
- [x] Large artifacts require operator-admitted D-only storage.
- [x] GOOSE XYZI and labels remain point aligned.
- [x] Invalid length and non-finite frames fail closed.
- [x] K1 mapped increments cannot claim raw-scan fields.
- [x] React exposes an honest catalog/empty state before dataset bytes exist.
- [x] Dataset Gateway is isolated from real-sensor diagnostics and placed under
  Polygon qualification.
- [x] Worker D root configured.
- [x] GOOSE validation archive hash recorded.
- [x] First real labeled frame visible in React.
- [x] Patchwork-specific axes and physical-height profile admitted.
- [ ] Complete vehicle transform and general `normalized-scan` admitted.
- [x] Current local-percentile baseline measured against ground truth.
- [x] Patchwork++ one-frame accuracy measured against ground truth.
- [x] Current/Patchwork++ validation-split gate qualified.
- [x] Sensor-degradation matrix qualified.
- [x] Dataset catalog accepts more than one independently identified source.
- [x] Official RELLIS Ouster example passes the shared SemanticKITTI reader.
- [x] RELLIS axes, ontology colors and versioned ground-target/ignore mapping
  are visible in the same Dataset workflow.
- [ ] Full RELLIS Ouster SemanticKITTI scans, labels and poses admitted on
  worker D.
- [ ] Current/Patchwork++ RELLIS comparison qualified without obstacle loss.
- [ ] Rolling local map with pose/TTL/dynamic policy qualified.

## RELLIS S0 compatibility evidence

RELLIS is the independent second-source check, not extra decoration in the
catalog. GOOSE and RELLIS share the ingress format and viewer, but retain
separate source identity, sensor domain, ontology, licensing and results.

The pinned smoke input is the official repository example at commit
`c17a118fcaed1559f03cc32cc3a91dedc557f8b8`:

- point file: `utils/example/000104.bin`;
- label file: `utils/example/000104.label`;
- source points: `131,072`;
- point SHA-256:
  `ed81a9c3636d55b17d78058c72545d5d22419beecf174d50596d23ae178752af`;
- label SHA-256:
  `9b8c65b710873e931af4ac6dfc7d3dd2298696514ab721e50300bd55ad5b634e`;
- official ontology config SHA-256:
  `573379a232ac561805987466c391a61fd5ad338be7fb9c4c2842f3f28067e0ad`;
- bounded browser preview: `20,000` deterministic even-index points;
- coordinate frame: right-handed, `x` forward, `y` left, `z` up; no vehicle
  transform, pose registration or deskew is claimed;
- license: `CC-BY-NC-SA-3.0`; this is a research qualification source, not an
  unrestricted commercial runtime dependency.

Mission Core ground policy v1 treats `dirt`, `grass`, `asphalt`, `concrete` and
`mud` as ground; clear structures, vegetation, people, vehicles and rubble as
non-ground; and `void`, `water`, `sky`, generic `object` and `puddle` as
`ignore`. The ignore set is excluded from future metrics instead of being
silently counted as either free ground or obstacle. This mapping is a Mission
Core evaluation decision, not an upstream RELLIS claim.

The smoke closes reader, alignment, axes, palette and mapping compatibility
only. The next gate admits the `14 GB` Ouster SemanticKITTI scans plus the
`174 MB` labels and `174 MB` poses to D-only worker storage. Full ROS bags are
not needed for the ground cross-check. Patchwork++ may be compared only after a
physical Ouster mounting-height profile is evidenced; no height is inferred
from the example cloud.

## First GOOSE admission evidence

- worker root: canonical D-only root, path never exposed by the HTTP API;
- source URL:
  `https://goose-dataset.de/storage/goose_3d_val.zip`;
- observed archive bytes: `3,498,402,435`;
- observed SHA-256:
  `0be9e0f8459bafcbc92ff7c3cc366e9b4e2f6e1e9bdf50e6439e1557e864c26f`;
- archive integrity: ZIP structure, bounded expansion, safe paths, one LICENSE,
  one label mapping and aligned point/label frames;
- license artifact: Creative Commons Attribution-ShareAlike 4.0 International;
- first deterministic frame:
  `2022-07-22_flight__0071_1658494234334310308`;
- source points: `169,883`;
- semantic classes present: `17`;
- independently labeled artificial/natural ground: `45,968` points
  (`27.0586%`);
- browser preview: deterministic even-index sample of `50,000` points,
  visualization-only.

GOOSE does not publish a checksum beside this download. The recorded SHA-256 is
therefore Mission Core's observed content pin after a TLS download, not a claim
of vendor-signed authenticity. Any future byte change creates a new admission
decision rather than silently replacing this installation.

## First independent ground result

The current `missioncore-local-percentile-ground/v1` provider was run against
all `169,883` points, excluding `353` GOOSE void points from scoring:

- Ground IoU: `49.6165%`;
- precision: `73.5892%`;
- recall: `60.3659%`;
- F1: `66.3249%`;
- artificial-ground recall: `95.2364%`;
- natural-ground recall: `49.4516%`;
- obstacle non-ground recall: `79.6145%`;
- provider latency on the worker: `3,858.16 ms`.

This is the first concrete product value from the public dataset. The current
heuristic looks plausible on a dense map and is strong on artificial ground,
but it misses about half of the independently labeled natural ground and is far
from a real-time full-scan provider. The UI exposes `Current` and `Ошибки`
views, so the failure geometry is inspectable instead of being hidden behind
one aggregate score.

The provider now uses a bounded grid-neighborhood index while preserving the
previous exact-radius result. This removes the previous all-points scan for
every occupied cell, but the measured latency still classifies it as a
diagnostic baseline rather than an onboard candidate.

## First Patchwork++ A/B result

GOOSE's dimensioned MuCAR-3 schematic provides the two vertical dimensions
needed by this algorithm-specific gate: `base_link` is `0.64 m` above ground
and the VLS-128 optical center is `1.60 m` above `base_link`. The admitted
Patchwork++ height is therefore `2.24 m`. The same published schematic declares
the sensor axes as `x` forward, `y` left and `z` up. An independent fit to
GOOSE-labeled near-field ground observed a `-2.18 .. -2.14 m` intercept; this
was a non-calibrating cross-check, not the source of the height.

This narrowly admits the input required by Patchwork++ on the native
sensor-centric scan. It does **not** claim a complete numeric vehicle transform,
per-point timing, deskew or a general `normalized-scan`.

Official Patchwork++ `v1.4.1`, source commit
`3e6903a1d5537a4cc2ace897b0bbb98a92d6014c`, was run against the same first
frame and independent labels as Current:

| Metric | Current | Patchwork++ |
| --- | ---: | ---: |
| Ground IoU | `49.6165%` | `60.3702%` |
| Precision | `73.5892%` | `72.6612%` |
| Recall | `60.3659%` | `78.1130%` |
| F1 | `66.3249%` | `75.2886%` |
| Artificial-ground recall | `95.2364%` | `98.9688%` |
| Natural-ground recall | `49.4516%` | `71.5853%` |
| Obstacle non-ground recall | `79.6145%` | `92.1729%` |
| Worker latency | `3966.53 ms` | `15.89 ms` |

Reproducibility pins:

- benchmark identity:
  `2a6d05f54a9e2ac727d9c850c1133f2fb539bfeddbd97c07cfd198ccb239162c`;
- full point-aligned prediction SHA-256:
  `190f455c6e47911921b7f6454913e1bb2d0b8b5814ee2e34d7b63295afddc7ef`;
- bounded browser preview SHA-256:
  `e23ca573103faf931523415e6c263248737eb6600f482b63de685b725bbc28c3`;
- Patchwork++ binary SHA-256:
  `be8038b2098c83fe53841aa8ae19e362910e9056fe0ee7b9304c1ee5c5941094`.

Patchwork++ wins this frame by `10.75` percentage points of Ground IoU, raises
natural-ground recall by `22.13` points and is roughly `250x` faster in this
run. The result is deliberately `one-frame-diagnostic`: it makes Patchwork++
the candidate for validation-split and degradation qualification, not an
accepted navigation or safety provider.

## Validation-split qualification

The immutable R1 replay-shadow run
`goose-ground-035de3ae6155844b636d` processed all `961` aligned validation
frames directly from the D-only archive. It is bound to Mission Core commit
`d6decbe05ccecd32d6a745767ee7a795bd1c88b1`, qualification identity
`035de3ae6155844b636d89d8f23b36e561edab105720fa850094a5c6f680c0ef`
and the same pinned Patchwork++ source/binary as the one-frame diagnostic.

| Validation micro metric | Current | Patchwork++ |
| --- | ---: | ---: |
| Ground IoU | `47.4199%` | `66.3974%` |
| Natural-ground recall | `51.7650%` | `76.2215%` |
| Obstacle non-ground recall | `93.5831%` | `94.6666%` |
| Assigned fraction | `100%` | `100%` |
| Latency p50 | `3527.02 ms` | `16.04 ms` |
| Latency p95 | `6115.18 ms` | `23.40 ms` |
| Maximum latency | `11162.62 ms` | `34.12 ms` |

The predeclared nominal gates passed: Ground IoU gain is `18.98` percentage
points (required `>= 7`), natural-ground recall gain is `24.46` points
(required `>= 10`), Patchwork++ obstacle non-ground recall is `94.67%`
(required `>= 90%`), assigned fraction is `100%` (required `>= 99.9%`) and
p95 latency is `23.40 ms` (required `<= 50 ms`). No frame exceeded the
catastrophic regression boundary of `-20` Ground-IoU points; the worst observed
delta was `-13.51` points.

| Deterministic profile | Source coverage | Ground IoU | Natural recall | p95 latency |
| --- | ---: | ---: | ---: | ---: |
| `range-20m` | `52.70%` | `63.1304%` | `72.1331%` | `16.29 ms` |
| `range-40m` | `80.03%` | `68.5958%` | `80.0635%` | `20.74 ms` |
| `density-50` | `50.00%` | `66.3575%` | `76.8925%` | `11.78 ms` |
| `density-25` | `25.00%` | `65.5975%` | `76.8987%` | `5.99 ms` |
| `noise-05m` | `100%` | `63.4378%` | `70.7234%` | `23.28 ms` |
| `dropout-30` | `70.00%` | `66.4658%` | `76.6721%` | `16.24 ms` |
| `front-180` | `51.48%` | `67.6924%` | `77.8012%` | `11.82 ms` |

Every degradation profile stayed inside the predeclared `15`-point Ground-IoU
loss, `20`-point natural-recall loss and `50 ms` p95 limits. The sealed
decision is therefore `shadow-candidate`, explicitly
`promoted_to_navigation_or_safety = false`.

The first aggregate-only Polygon screen was rejected as an operator product:
five selected failure previews could not let an operator verify the decision.
Commit `b037076` adds a separate immutable visual derivative bound to the
qualification report:

- schema `missioncore.goose-ground-review-pack/v1`;
- identity
  `6ddc2de0154196088049b8654d9187fba0c52e28783e5ada6be5266dd16bd641`;
- all `961/961` validation frames in source order;
- deterministic `12,000`-point frame previews with remission, public
  point-aligned ground truth, Current and Patchwork++ masks;
- compact size `67 MB`, versus multiple gigabytes for equivalent JSON;
- direct modes for geometry, ground truth, both providers and both error maps.

The subsequent product review found a second semantic error: the `961` frames
were presented as one playable recording. They are actually `8` independent
GOOSE validation sequences:

- `2022-07-22_flight` — `151` annotated scans;
- `2022-08-30_siegertsbrunn_feldwege` — `103`;
- `2022-09-21_garching_uebungsplatz_2` — `123`;
- `2022-12-07_aying_hills` — `133`;
- `2023-01-20_aying_mangfall_2` — `191`;
- `2023-03-03_garching_2` — `106`;
- `2023-05-15_neubiberg_rain` — `73`;
- `2023-05-17_neubiberg_sunny` — `81`.

Each admitted `.bin` is one annotated VLS-128 revolution. Within those eight
sequences the validation scans are sparse: observed adjacent timestamps range
from about `0.1 s` to `167.5 s`. The annotated ZIP contains neither a
continuous playback stream nor a pose chain that could support visually
continuous ego-motion. Mission Core therefore:

- never plays across a sequence boundary;
- labels Play as an accelerated scan review, not real-time playback;
- exposes the exact source frame number and timestamp gap;
- keeps a fixed sensor-centric origin and preserves the operator camera within
  one sequence instead of refitting every frame;
- does not interpolate missing scans or invent a route.

Continuous vehicle motion, odometry and synchronized sensor playback require
the separately admitted raw GOOSE ROS bags plus localization. Those assets are
not part of the current `3.3 GB` annotated validation archive.

The source archive and full-resolution crash-resume cache remain only on worker
D. A bounded review mirror may be served by a Mission Core backend, but SSH is
not a product data plane. The replay UI does not render the unrelated live
Ackermann rover and does not depend on Simulation Worker online status.

Primary source evidence:

- [GOOSE MuCAR-3 sensor setup](https://goose-dataset.de/docs/mucar3/);
- [GOOSE paper, Figure 3](https://arxiv.org/pdf/2310.16788);
- [Patchwork++ v1.4.1](https://github.com/url-kaist/patchwork-plusplus/tree/v1.4.1).
