From d8b7ed4526c5c43355532662d40cf5d7634537da Mon Sep 17 00:00:00 2001 From: DCCONSTRUCTIONS Date: Sat, 25 Jul 2026 21:38:22 +0300 Subject: [PATCH] feat: publish full RELLIS qualification --- README.md | 6 ++ .../control-station/src/styles/workspaces.css | 30 +++++++ .../src/workspaces/RellisDatasetReview.tsx | 42 +++++++-- docs/12_SIMULATION_POLYGON_PRODUCT_AND_SRS.md | 23 +++-- docs/14_LIDAR_DATASET_GATEWAY.md | 88 +++++++++++++++---- 5 files changed, 156 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index 7ae60cd..d703b55 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,12 @@ K1 `lio_pcl` remains a post-LIO vendor-map increment and is not promoted to a raw scan. Large dataset bytes are admitted only on the Windows/WSL worker under `D:\NDC_MISSIONCORE\datasets`; no archive is downloaded automatically. +The complete RELLIS-3D v1.1 release is now admitted there and its full +`2,413`-frame validation split is available in **Полигон → Датасеты**. The +sealed Current/Patchwork++ comparison rejected Patchwork++ for navigation: +despite much lower latency and a small Ground-IoU gain, obstacle non-ground +recall regressed from `80.46%` to `69.70%`. + See [the Dataset Gateway plan](docs/14_LIDAR_DATASET_GATEWAY.md) and [ADR 0021](docs/adr/0021-dataset-gateway-representation-boundary.md). diff --git a/apps/control-station/src/styles/workspaces.css b/apps/control-station/src/styles/workspaces.css index bd643cc..69e8e09 100644 --- a/apps/control-station/src/styles/workspaces.css +++ b/apps/control-station/src/styles/workspaces.css @@ -1665,6 +1665,36 @@ font-size: 0.82rem; } +.rellis-review__decision { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 1rem; + border-radius: 0.9rem; + background: rgb(var(--nodedc-danger-rgb) / 0.08); + padding: 0.78rem 0.9rem; +} + +.rellis-review__decision strong { + color: rgb(var(--nodedc-danger-rgb)); + font-size: 0.68rem; +} + +.rellis-review__decision span { + color: var(--nodedc-text-muted); + font-size: 0.58rem; + line-height: 1.45; + text-align: right; +} + +.rellis-review__decision[data-passed="true"] { + background: rgb(255 255 255 / 0.045); +} + +.rellis-review__decision[data-passed="true"] strong { + color: var(--nodedc-text-primary); +} + .polygon-review-summary, .polygon-review-unavailable, .polygon-review-analysis, diff --git a/apps/control-station/src/workspaces/RellisDatasetReview.tsx b/apps/control-station/src/workspaces/RellisDatasetReview.tsx index a890184..78ae3c3 100644 --- a/apps/control-station/src/workspaces/RellisDatasetReview.tsx +++ b/apps/control-station/src/workspaces/RellisDatasetReview.tsx @@ -10,8 +10,10 @@ import { type LidarGroundViewMode, } from "./LidarGroundPointCloud"; import { + fetchGroundQualification, fetchGroundReview, fetchGroundReviewFrame, + type GroundQualification, type GroundReview, type GroundReviewFrame, type GroundReviewFrameSummary, @@ -324,6 +326,7 @@ function qualifiedModeExplanation(mode: LidarGroundViewMode) { } function RellisQualifiedReview({ runId }: { runId: string }) { + const [qualification, setQualification] = useState(null); const [review, setReview] = useState(null); const [frame, setFrame] = useState(null); const [selectedSequence, setSelectedSequence] = useState(null); @@ -336,15 +339,20 @@ function RellisQualifiedReview({ runId }: { runId: string }) { useEffect(() => { const controller = new AbortController(); setError(null); + setQualification(null); setReview(null); setFrame(null); cache.current.clear(); - void fetchGroundReview(runId, { signal: controller.signal }) - .then((value) => { - if (controller.signal.aborted || !value) return; - setReview(value); - setSelectedSequence(value.frames[0]?.datasetSequenceId ?? null); - setSelectedFrame(value.frames[0]?.frameId ?? null); + void Promise.all([ + fetchGroundQualification(runId, { signal: controller.signal }), + fetchGroundReview(runId, { signal: controller.signal }), + ]) + .then(([qualificationValue, reviewValue]) => { + if (controller.signal.aborted || !qualificationValue || !reviewValue) return; + setQualification(qualificationValue); + setReview(reviewValue); + setSelectedSequence(reviewValue.frames[0]?.datasetSequenceId ?? null); + setSelectedFrame(reviewValue.frames[0]?.frameId ?? null); }) .catch((loadError: unknown) => { if (!controller.signal.aborted) setError(errorMessage(loadError)); @@ -440,7 +448,7 @@ function RellisQualifiedReview({ runId }: { runId: string }) {
RELLIS · FULL VALIDATION -

Пять последовательностей Ouster OS1 с покадровым сравнением

+

Две validation-последовательности Ouster OS1 с покадровым сравнением

Все {review.frameCount.toLocaleString("ru-RU")} validation-сканов выровнены с labels и pose index. Высота Patchwork++ определена только @@ -577,6 +585,26 @@ function RellisQualifiedReview({ runId }: { runId: string }) {

+ {qualification ? ( +
+ + {qualification.decision.passed + ? "Кандидат прошёл независимую проверку" + : "Patchwork++ не прошёл независимую проверку"} + + + Полный validation: obstacle recall{" "} + {formatPercent(qualification.current.micro.obstacleNonGroundRecall)} + {" → "} + {formatPercent(qualification.patchwork.micro.obstacleNonGroundRecall)}. + Алгоритм не принят для navigation/safety. + +
+ ) : null} +

Это независимая исследовательская проверка переносимости. Она не включает управление машиной и не принимает алгоритм для navigation/safety. diff --git a/docs/12_SIMULATION_POLYGON_PRODUCT_AND_SRS.md b/docs/12_SIMULATION_POLYGON_PRODUCT_AND_SRS.md index 81dc565..4d2e8fc 100644 --- a/docs/12_SIMULATION_POLYGON_PRODUCT_AND_SRS.md +++ b/docs/12_SIMULATION_POLYGON_PRODUCT_AND_SRS.md @@ -879,10 +879,11 @@ workflow: explicitly grouped into eight independent fragments; Play is bounded to one fragment and described as accelerated review of sparse annotated scans. - The catalog is multi-source. RELLIS-3D v1.1 appears as an independent Ouster - domain with its own license and admission state. Its current `smoke-ready` - view shows official frame `000104`, semantic colors, FLU axes and the - versioned `ground / non-ground / ignore` mapping; it does not show invented - algorithm metrics. + domain with its own license and admission state. Its complete admitted + release exposes the two real validation sequences and all `2,413` scans with + public ground truth, Current, Patchwork++ and error modes. Metrics come only + from the sealed qualification report and are scoped to the selected + sequence. - The dataset viewer exposes source frame number, nanosecond timestamp gaps, ground truth and Current/Patchwork++ overlays. - The fixed sensor-centric coordinate frame and operator camera are preserved @@ -899,11 +900,15 @@ The accepted `3.3 GB` annotated validation ZIP is not a continuous recording. Continuous ego-motion requires a separately admitted raw ROS bag and localization source. -RELLIS S0 uses only a bounded derivative of the pinned official example for -browser inspection. The full `14 GB` Ouster SemanticKITTI scans, labels and -poses remain a separate D-only admission gate. Its `CC-BY-NC-SA-3.0` license -means cross-dataset research evidence cannot silently become an unrestricted -commercial runtime or training dependency. +RELLIS has passed the full D-only release-admission gate: `13,556` aligned +scan/label pairs, official splits, five source sequences and complete LiDAR +pose coverage. The R1 validation run processed all `2,413` frames after a +train-only sensor-height calibration. Its Patchwork++ candidate was explicitly +rejected: Ground IoU improved by only `1.41` points while obstacle non-ground +recall fell from `80.46%` to `69.70%`. The result remains research evidence, +not navigation or safety authority. The `CC-BY-NC-SA-3.0` license also prevents +the source from silently becoming an unrestricted commercial runtime or +training dependency. The backend reads the configured repository from `MISSIONCORE_POLYGON_RUNS_ROOT` using diff --git a/docs/14_LIDAR_DATASET_GATEWAY.md b/docs/14_LIDAR_DATASET_GATEWAY.md index b559d11..ec27d1e 100644 --- a/docs/14_LIDAR_DATASET_GATEWAY.md +++ b/docs/14_LIDAR_DATASET_GATEWAY.md @@ -24,7 +24,7 @@ Implemented now: - 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 + (RELLIS) artifacts, selected by source at `GET /api/v1/lidar/dataset-gateway/preview?source_id=...`; - explicit `native-scan`, `normalized-scan` and `rolling-local-map` representations; @@ -40,10 +40,13 @@ Implemented now: `Открыть` 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 fail-closed admission of the complete official RELLIS-3D v1.1 release: + `13,556` aligned Ouster scans and labels, all five sequences, official + train/validation/test splits and complete LiDAR pose coverage; +- a full RELLIS validation viewer with its two real source sequences, + `2,413` source scans, ground truth, Current, Patchwork++ and error modes; +- a train-only, label-backed Ouster height calibration and a sealed R1 + Current/Patchwork++ qualification over every RELLIS validation frame; - 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; @@ -59,8 +62,8 @@ Not implemented: - 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 RELLIS ROS bag admission, continuous synchronized playback or production + promotion; - no rolling-map implementation yet. ## Product surface boundary @@ -82,9 +85,10 @@ The gateway is not part of device quality diagnostics. 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. +after the worker manifest says `frame-ready`; RELLIS becomes `dataset-ready` +only after all four pinned archives, every split pair and pose coverage pass +admission. Both bounded previews must pass their own identity, point-alignment +and safety checks. ## Why public recordings look different @@ -203,8 +207,10 @@ time; TTL/dynamic filtering prevents stale ghosts. - [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 +- [x] Full RELLIS Ouster SemanticKITTI scans, labels and poses admitted on worker D. +- [x] Current/Patchwork++ comparison executed and sealed over all `2,413` + RELLIS validation frames. - [ ] Current/Patchwork++ RELLIS comparison qualified without obstacle loss. - [ ] Rolling local map with pose/TTL/dynamic policy qualified. @@ -239,12 +245,60 @@ non-ground; and `void`, `water`, `sky`, generic `object` and `puddle` as 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. +The smoke closed reader, alignment, axes, palette and mapping compatibility +only. The complete release was then admitted from four pinned archives kept +exclusively on worker D: + +- scans: `15,037,868,425` bytes, SHA-256 + `4e2bb5654bda5b9d08b9ac1ddbd39bd6dd231163a77ff811f2f282f3bbdf8ee7`; +- labels: `182,265,710` bytes, SHA-256 + `03297c30b9f2182c74be93f8564d6ce1349237fcc4f89fc96479fe71bb40d905`; +- poses: `609,344` bytes, SHA-256 + `6deaf38a9cac3a480cfdb70fa9a1d9278f25c36f5efd2487a3c4a6a400250f67`; +- splits: `76,774` bytes, SHA-256 + `de639728e0058d7d477188028d9b811313a601884ef00d267ce13736be7cf54f`. + +Admission identity +`a3f3f161a5a7edccdf66cea75ecf9004b8f6a895282faabe661c075c15a82774` +proves `13,556` scan/label pairs, the official `7,800 / 2,413 / 3,343` +train/validation/test split counts, all five sequences and matching pose +coverage. No ROS bag is needed for this single-scan ground cross-check. + +## Full RELLIS qualification result + +The immutable R1 replay-shadow run +`rellis-ground-5b49d241a42b41d9b427` processed all `2,413` validation frames. +Its qualification identity is +`5b49d241a42b41d9b4279062c7517c99e16880e025cd2b70d3966d49f3ff6b7f`. +The physical-height input was calibrated from `64` deterministic +sequence-stratified **train** frames only: `1.0937 m` median height, +`0.0538 m` median absolute deviation and no validation labels used. + +| Validation micro metric | Current | Patchwork++ | +| --- | ---: | ---: | +| Ground IoU | `40.5450%` | `41.9599%` | +| Natural-ground recall | `72.2992%` | `93.2555%` | +| Obstacle non-ground recall | `80.4612%` | `69.7040%` | +| Assigned fraction | `100%` | `100%` | +| Latency p50 | `900.22 ms` | `8.58 ms` | +| Latency p95 | `1284.29 ms` | `13.98 ms` | +| Maximum latency | `1706.78 ms` | `20.50 ms` | + +The sealed decision is `qualification-rejected`. Patchwork++ improved Ground +IoU by only `1.41` percentage points against the required `2.00`, preserved +only `69.70%` of obstacle points against the required `90%`, and regressed +obstacle recall by `10.76` points against the allowed `1%`. Coverage, latency +and catastrophic per-frame regression gates passed, but none of those can +override obstacle loss. The provider therefore remains visualization and +research evidence only: +`promoted_to_navigation_or_safety = false`. + +The bound review-pack identity is +`1ee454fedd37bd56c3c9d07e17a3b5f59cdb29f7c1ae2086f8bc746149f3eb1b`. +It contains bounded `12,000`-point previews for every validation scan and keeps +the two real validation sequences separate. This lets an operator inspect raw +geometry, public ground truth, both predictions and both error maps before +changing the profile or acceptance thresholds. ## First GOOSE admission evidence