diff --git a/README.md b/README.md index 0b45d90..4198d5b 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,13 @@ 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%`. +Operator review of the later M4.8R3 LOW-STEP replay rejected its connected- +component camera boxes as the product representation for general static +obstacles. The replacement evaluation is terrain-relative and sequential: +GSeg3D plus Nav2 Ground Consistency first, TRAVEL as the class-free challenger, +and nvblox only as a separately measured occupancy/ESDF candidate. See the +[traversability and static-obstacle stack decision](docs/23_TRAVERSABILITY_AND_STATIC_OBSTACLE_STACK_DECISION.md). + See [the Dataset Gateway plan](docs/14_LIDAR_DATASET_GATEWAY.md), [the laboratory run canon](docs/15_LABORATORY_RUN_CANON.md) and [ADR 0021](docs/adr/0021-dataset-gateway-representation-boundary.md). diff --git a/config/perception/m49-traversability-candidate-manifest-v1.json b/config/perception/m49-traversability-candidate-manifest-v1.json new file mode 100644 index 0000000..33c7302 --- /dev/null +++ b/config/perception/m49-traversability-candidate-manifest-v1.json @@ -0,0 +1,67 @@ +{ + "schema_version": "missioncore.traversability-candidate-manifest/v1", + "decision_document": "docs/23_TRAVERSABILITY_AND_STATIC_OBSTACLE_STACK_DECISION.md", + "frozen_utc": "2026-08-26T13:53:55Z", + "source_contract": { + "source_id": "RAVNOVES00", + "expected_timeline_frames": 4489, + "input_representation": "registered-vendor-map-increment-plus-causal-local-support/v1", + "future_frames_allowed": false, + "missing_support_means_free": false + }, + "candidates": [ + { + "sequence": 1, + "candidate_id": "gseg3d-ground-consistency", + "role": "primary", + "components": [ + { + "repository": "https://github.com/dfki-ric/ground_segmentation_ros2.git", + "revision": "5c5ba6f5ca0d682db2d59b2ad2f6a317ee938b95", + "observed_ref": "refs/heads/master", + "license": "BSD-3-Clause" + }, + { + "repository": "https://github.com/dfki-ric/nav2_ground_consistency_costmap_plugin.git", + "revision": "41cec620efba6c370dccfc59a6ec1134775ff48a", + "observed_ref": "refs/heads/main", + "license": "BSD-3-Clause" + } + ] + }, + { + "sequence": 2, + "candidate_id": "travel", + "role": "class-free-challenger", + "components": [ + { + "repository": "https://github.com/url-kaist/TRAVEL.git", + "revision": "95dc2fbd66a343efd9060c45a5711b6307a950a4", + "observed_ref": "refs/heads/main", + "license": "GPL-3.0" + } + ] + }, + { + "sequence": 3, + "candidate_id": "isaac-ros-nvblox", + "role": "separate-gpu-occupancy-esdf-probe", + "components": [ + { + "repository": "https://github.com/NVIDIA-ISAAC-ROS/isaac_ros_nvblox.git", + "revision": "ef47346399c71a4342c03bdbec2136ec735da4b8", + "observed_ref": "refs/tags/v4.6-0", + "license": "Apache-2.0" + } + ] + } + ], + "execution_policy": { + "heavy_candidates_run_sequentially": true, + "allow_parallel_gauss_compute": false, + "allow_source_mutation": false, + "allow_navigation_or_actuation": false, + "allow_camera_resize_or_rectification": false, + "allow_new_semantic_model": false + } +} diff --git a/docs/22_MILESTONE_4_OBJECT_CENTRIC_RECORDED_REALTIME_CV.md b/docs/22_MILESTONE_4_OBJECT_CENTRIC_RECORDED_REALTIME_CV.md index 8811b5c..47104cb 100644 --- a/docs/22_MILESTONE_4_OBJECT_CENTRIC_RECORDED_REALTIME_CV.md +++ b/docs/22_MILESTONE_4_OBJECT_CENTRIC_RECORDED_REALTIME_CV.md @@ -1539,6 +1539,11 @@ production navigation cutover. The result remains replay-simulated; physical-live authority, commands, actuation, planner-authoritative free space and collision-safety acceptance are false. The next milestone boundary is M4.9 recorded-realtime release-candidate validation using this frozen graph. +Subsequent operator visual review rejected the LOW-STEP connected-component +camera boxes as a general static-obstacle product path. That decision does not +alter the immutable M4.8R3 runtime evidence; it redirects the next perception +evaluation to the terrain-relative sequence in +[`docs/23_TRAVERSABILITY_AND_STATIC_OBSTACLE_STACK_DECISION.md`](23_TRAVERSABILITY_AND_STATIC_OBSTACLE_STACK_DECISION.md). ## Implementation order diff --git a/docs/23_TRAVERSABILITY_AND_STATIC_OBSTACLE_STACK_DECISION.md b/docs/23_TRAVERSABILITY_AND_STATIC_OBSTACLE_STACK_DECISION.md new file mode 100644 index 0000000..f1b786a --- /dev/null +++ b/docs/23_TRAVERSABILITY_AND_STATIC_OBSTACLE_STACK_DECISION.md @@ -0,0 +1,278 @@ +# Traversability and class-free static-obstacle stack decision + +Date: 2026-08-26 +Status: accepted for sequential recorded-replay evaluation; not accepted for +navigation or actuation + +## Decision summary + +Mission Core stops treating the M4.8R3 `LOW-STEP` connected-component and +camera-box projection as the product path for general static-obstacle +perception. M4.8R3 remains immutable evidence that a bounded occupied-only +heuristic can execute in the realtime envelope. Operator review of the complete +visual result rejected its obstacle quality and representation: + +- isolated vegetation, curb edges and sparse returns become false obstacles; +- bins, carts, thin posts, railings and hemispheres are inconsistently lost; +- spatially unrelated points merge into large rectangular camera regions; +- one-frame components flicker without ground/obstacle evidence competition; +- 2D rectangles erase the free passage between separate 3D obstacles. + +This is an abstraction failure, not a threshold-tuning failure. A navigation +system requires a terrain-relative occupancy and traversability product, not a +detector that attempts to name every static object and not a bounding box as +the safety primitive. + +The sequential evaluation order is: + +1. **GSeg3D + Nav2 Ground Consistency + Nav2 Costmap** — primary candidate. +2. **TRAVEL + the same costmap boundary** — class-free challenger if the + primary candidate misses compact or thin obstacles or merges passages. +3. **Isaac ROS nvblox** — separate GPU occupancy/ESDF candidate after the CPU + terrain contour is measured; it is not stacked into the first test. + +RF-DETR remains the semantic risk provider for people, children, animals, +cars, trucks, motorcycles and bicycles. It does not decide the presence or +shape of an unknown static obstacle. Native `800x600` fisheye input remains +unchanged. + +## Required product representation + +```text +LiDAR + pose + optional IMU + | + v +terrain-relative ground / non-ground evidence + | + v +temporally stable local occupancy and UNKNOWN support state + | + v +robot-footprint collision cost + traversability + | + +----> planner / collision monitor (future authority gate) + | + +----> camera projection (diagnostic visualization only) + +camera RF-DETR ----> dynamic semantic risk hints ----------------+ +``` + +The canonical safety output is a costmap/elevation/occupancy product. Camera +boxes may be derived for operator review, but a box must never be the source of +occupied cells, clearance, passage width or a control action. + +## Candidate A — GSeg3D and Ground Consistency + +### GSeg3D + +[DFKI GSeg3D ROS 2](https://github.com/dfki-ric/ground_segmentation_ros2) +is a BSD-3-Clause ROS 2 component for CPU realtime processing of 3D LiDAR. It +publishes separate ground and obstacle point clouds and provides: + +- optional IMU gravity alignment; +- two-phase coarse/fine ground segmentation; +- configurable slope, local height and inlier thresholds; +- ROS 2 Humble and Jazzy support; +- no task-specific dataset or neural-network inference. + +Mission Core evaluates it as the first replacement for the current local +height connected-component heuristic. + +### Nav2 Ground Consistency + +[DFKI Ground Consistency](https://github.com/dfki-ric/nav2_ground_consistency_costmap_plugin) +is a BSD-3-Clause Nav2 costmap layer and is included in the current +[Nav2 outdoor 3D-LiDAR tutorial](https://ros-navigation.github.io/mkdocs.nav2.org/rolling/tutorials/general_tutorials/navigation2_with_ground_consistency_layer/navigation2_with_ground_consistency_layer/). +It consumes ground and non-ground point clouds and supplies the missing product +semantics: + +- ground and obstacle evidence compete per costmap cell; +- evidence accumulates and decays instead of trusting one point in one frame; +- obstacle height is evaluated relative to local ground; +- robot height and minimum clearance are explicit configuration inputs; +- sparse cells can use bounded neighboring-ground interpolation; +- a cell without reliable support can fail closed instead of becoming free. + +The first test keeps all free-space and actuation authority false. The layer is +evaluated only as a recorded-replay occupancy provider. + +### Nav2 boundary + +[Nav2 Costmap 2D](https://docs.nav2.org/configuration/packages/configuring-costmaps.html) +provides footprint-aware obstacle, voxel and inflation layers. A later physical +gate may add the independent +[Nav2 Collision Monitor](https://docs.nav2.org/rolling/configuration_and_development/configuration_guide/core_servers/collision_monitor/configuring_collision_monitor_node/), +but recorded replay does not publish commands. + +## Candidate B — TRAVEL + +[TRAVEL](https://github.com/url-kaist/TRAVEL) performs class-free traversable +ground detection and above-ground instance clustering. Its ROS 2 wrapper is +verified by the project on Humble and Jazzy. The published evaluation reports +roughly `20-30 Hz` and explicitly targets safe navigation in unseen urban and +wild environments without assigning names such as pole, vehicle or wall. + +TRAVEL is valuable when individual compact obstacles and the gaps between them +must remain spatially distinct. Its GPL-3.0 license prevents silent admission +into a proprietary product runtime. It is initially a benchmark/challenger; +distribution consequences require a separate decision. + +Primary reference: +[TRAVEL paper](https://arxiv.org/abs/2206.03190). + +## Candidate C — Isaac ROS nvblox + +[Isaac ROS nvblox](https://nvidia-isaac-ros.github.io/repositories_and_packages/isaac_ros_nvblox/index.html) +uses GPU-accelerated TSDF/ESDF reconstruction from depth and/or 3D LiDAR and +publishes a Nav2 costmap. Current NVIDIA documentation supports ROS 2 Jazzy on +x86_64 with an Ampere-or-newer NVIDIA GPU and at least 8 GiB VRAM; Worker 006's +RTX 4090 is inside that hardware class. + +Nvblox is evaluated separately because it answers dense occupied-space and +clearance questions well, but it is not by itself a complete terrain-relative +traversability classifier. Its official kernel timings are not an end-to-end +Mission Core FPS guarantee. + +## Candidates not admitted to the first sequence + +| Candidate | Reason not first | +| --- | --- | +| Autoware Universe | Mature road-vehicle perception and occupancy, but a large automotive/lane-driving stack for this rover-sized contour. | +| Offroad-Nav 2026 | Relevant complete pipeline, but currently ROS 1 Noetic; ROS 2 port is in development and the real-robot branch is not published. | +| `elevation_mapping_cupy` | Strong GPU elevation-map implementation, but the maintained integration remains ROS 1/catkin. It is retained as an algorithmic reference. | +| CMU AEDE/FAR/TARE | Proven research navigation components, but not the shortest supported ROS 2 product baseline for this test. | +| Additional image segmentation model | Consumes GPU and still cannot establish metric support, clearance or unknown space. | + +## Source representation boundary + +`RAVNOVES00` does not contain a conventional complete raw LiDAR scan per video +frame. Its `lio_pcl` stream is a registered vendor-map increment in the SLAM +map frame. Missing republication is not free-space evidence. + +Therefore every candidate run must preserve three distinct products: + +1. exact current registered increment; +2. bounded causal rolling support/occupancy in the map frame; +3. candidate ground/non-ground/costmap output with source lineage. + +For Candidate A, the evaluation adapter may present a bounded causal local +cloud in the current body frame. It may not use future frames, clear cells from +missing points, or relabel unobserved space as free. Dynamic-object semantics +remain outside this static replay adapter. + +## Operator-reviewed regression set + +The following RAVNOVES00 source frames are mandatory review anchors. They are +operator-reviewed engineering cases, not independent statistical ground truth. + +| Frame | Required observation | +| ---: | --- | +| 171 | The grass/curb region must not become a large blocking object; the visible bin must remain obstacle evidence when supported by LiDAR. | +| 306 | The cart and right hemisphere must not be lost while curb corners become dominant. | +| 368 | The hemisphere extent must stay compact; the right railing must remain obstacle evidence. | +| 402 | The near hemisphere must not inflate into a camera-sized rectangular exclusion zone. | +| 450 | Curb/ramp terrain must be evaluated relative to local ground instead of becoming arbitrary boxes. | +| 509 | Isolated vegetation or sparse returns must not immediately become a stable blocking object. | +| 525 | Sparse local returns must not merge into one large occupied camera rectangle. | +| 744 | The grass/curb strip must not be promoted into a wall. | +| 1122 | The compact hemisphere and both thin posts must be represented when LiDAR support is present. | +| 1856 | Two posts remain separate, two hemispheres remain separate, and the passages between them remain explicit. | + +## Acceptance contract + +### Quality + +- Static obstacle output is class-free and geometry-backed. +- All supported critical anchors above are occupied or conservatively unknown, + never false-free. +- Vegetation, curb edges and isolated returns do not create large persistent + lethal regions without sustained non-ground evidence. +- Separate posts and hemispheres remain separate at the costmap resolution. +- A camera rectangle cannot merge two distinct occupied regions or erase their + gap. +- Unobserved support, drop-offs and no-return regions remain `UNKNOWN/LETHAL` + until positive support is observed. +- No manual object-class annotation or detector training is permitted for this + gate. + +### Realtime and resource envelope + +- Process all `4,489` timeline frames with zero unaccounted loss. +- Isolated candidate output keeps up with at least the recorded `10 Hz` source + cadence. +- Integrated graph FPS regression is at most `5%` relative to the immutable + M4.8R3 `11.79902 FPS` reference. +- Candidate-stage p95 latency is at most `25 ms` and p99 at most `50 ms` in the + recorded replay contour. +- The primary CPU candidate does not add another neural model or consume the + RF-DETR GPU budget. +- CPU, RAM, GPU, VRAM, queue depth, supersession and output age are recorded; + no result is accepted only because it looks good in selected frames. + +### Authority + +Passing this document's tests accepts a recorded-replay perception provider. +It does not accept physical free space, navigation, commands, actuation, +collision safety or a robot body model. + +## Sequential execution plan + +### T0 — Worker and source preflight + +- Inventory Worker 006 OS/WSL, ROS 2, Docker, compiler, CPU/RAM and RTX 4090. +- Confirm the immutable RAVNOVES00 source and accepted M4.8R3 result locally on + the worker without copying private source evidence back to the Mac. +- Record a content-addressed candidate manifest and exact upstream revisions. + +The first T0 snapshot is recorded in +[`experiments/perception/M49_T0_TRAVERSABILITY_PREFLIGHT_2026-08-26.md`](../experiments/perception/M49_T0_TRAVERSABILITY_PREFLIGHT_2026-08-26.md). +Exact upstream revisions are frozen in +[`config/perception/m49-traversability-candidate-manifest-v1.json`](../config/perception/m49-traversability-candidate-manifest-v1.json). +T0 found the source and the accepted raw M4.8R3 run intact, but did not start a +build: the parallel GAUSS contour was active and free Worker memory had fallen +to approximately `669 MiB`. That is a resource-admission stop, not a candidate +failure. + +### T1 — Candidate A isolated qualification + +- Build GSeg3D and Ground Consistency in a new isolated `ndc-` worker contour. +- Run upstream sample/demo data first to prove the unmodified components. +- Measure component latency and memory before adding Mission Core adapters. + +### T2 — Candidate A RAVNOVES00 replay + +- Feed the bounded causal local cloud with exact pose lineage. +- Produce ground, non-ground, occupancy and unknown layers for all frames. +- Review the ten mandatory anchors and compute full-run stability/resource + metrics. +- Do not draw system camera boxes until the costmap result is sealed. + +### T3 — Candidate B challenger + +- Run TRAVEL against the identical source representation and anchors. +- Compare compact-obstacle recall, passage preservation, temporal stability and + CPU cost against Candidate A. +- Stop if Candidate A already passes and TRAVEL adds no measurable value that + justifies GPL runtime implications. + +### T4 — Candidate C occupancy/ESDF probe + +- Run nvblox separately with RF-DETR disabled for the isolated probe. +- Measure GPU/VRAM and 3D occupied-space quality. +- Admit it only if it supplies a measured capability missing from the accepted + CPU terrain contour inside the one-RTX-4090 production ceiling. + +### T5 — Product integration gate + +- Select one terrain provider and at most one justified occupancy complement. +- Re-enable the frozen RF-DETR semantic-risk provider. +- Repeat complete recorded-source-paced load acceptance. +- Publish a LAB only after the costmap/elevation outputs and limitations are + sealed. + +## Immediate next action + +Resume T1 for Candidate A only after the Worker resource gate in the T0 report +passes. No LOW-STEP tuning, new object model, camera resize, fisheye +rectification, manual dataset or parallel heavy Worker job is authorized by +this decision. diff --git a/experiments/perception/M49_T0_TRAVERSABILITY_PREFLIGHT_2026-08-26.md b/experiments/perception/M49_T0_TRAVERSABILITY_PREFLIGHT_2026-08-26.md new file mode 100644 index 0000000..0b4e6f7 --- /dev/null +++ b/experiments/perception/M49_T0_TRAVERSABILITY_PREFLIGHT_2026-08-26.md @@ -0,0 +1,95 @@ +# M4.9 T0 traversability candidate preflight — 2026-08-26 + +Status: source and revision preflight complete; Candidate A build not started +because the Worker resource-admission gate was closed + +## Purpose + +T0 verifies that the first terrain-relative candidate can be evaluated against +the immutable Mission Core source without colliding with another heavy Worker +job. It does not qualify obstacle quality, realtime performance, navigation or +actuation. + +The governing decision is +[`docs/23_TRAVERSABILITY_AND_STATIC_OBSTACLE_STACK_DECISION.md`](../../docs/23_TRAVERSABILITY_AND_STATIC_OBSTACLE_STACK_DECISION.md). +The exact upstream revisions are frozen in +[`config/perception/m49-traversability-candidate-manifest-v1.json`](../../config/perception/m49-traversability-candidate-manifest-v1.json). + +## Read-only Worker snapshot + +Observed at `2026-08-26T13:53:55Z` on Worker 006 +(`DESKTOP-OPJ8J04`): + +| Item | Observation | +| --- | --- | +| OS | Windows 11 Pro, version `10.0.26200`, build `26200` | +| CPU | Intel Core i9-13900KF, 24 cores / 32 logical processors | +| Physical memory | `100,502,708 KiB` visible; `685,344 KiB` free at the final snapshot | +| GPU | NVIDIA GeForce RTX 4090, driver `610.47`, `24,564 MiB` total VRAM | +| GPU snapshot | `9,131 MiB` used, `47%` utilization, `44 C` | +| WSL | `docker-desktop` running; Ubuntu 24.04, MissionCore-Sim and MissionCore-CVAT stopped | +| Mission Core inference | Canonical `ndc-mission-core-triton` remained healthy | +| Parallel work | GAUSS gateway and builder containers were healthy and active | + +No container, WSL distribution, service or source file was started, stopped, +rebuilt or modified during this inspection. + +## Source and baseline evidence + +The canonical RAVNOVES00 camera index, LiDAR pack, local-surface pack and native +fisheye video are present on the Worker at their existing content-addressed +paths. The accepted raw M4.8R3 full run is present at: + +`D:\NDC_MISSIONCORE\runtime\results\m48r3-static-occupancy-shadow\ravnoves00-full-exact6-near8-12fps-v1` + +Its `result.json` SHA-256 is +`0fe50546801d1284eb7af7ffcee0fbfc98985094c678256007b10eade0e54488`. +The raw result reports: + +- source `RAVNOVES00`, `4,489` frames at requested `12 Hz`; +- integrated runtime gate passed; +- graph completion p95 `56.74324 ms`; +- geometry p95/p99 `8.420913/13.732692 ms`; +- GPU utilization p95/maximum `54%/58%`; +- maximum GPU memory `9,743 MiB`. + +The separately sealed Mission Core product identity remains +`m48r3-static-occupancy-shadow-d1577870b098bcd0b67cc51798234f224b348ad3954ead72f3ce6df414875a29`. +This T0 check does not reopen or alter that evidence. + +## Frozen candidates + +| Order | Candidate | Exact revision | Admission role | +| ---: | --- | --- | --- | +| 1 | DFKI GSeg3D | `5c5ba6f5ca0d682db2d59b2ad2f6a317ee938b95` | Primary terrain-relative ground/non-ground provider | +| 1 | DFKI Nav2 Ground Consistency | `41cec620efba6c370dccfc59a6ec1134775ff48a` | Primary temporal costmap evidence layer | +| 2 | TRAVEL | `95dc2fbd66a343efd9060c45a5711b6307a950a4` | Class-free challenger | +| 3 | Isaac ROS nvblox `v4.6-0` | `ef47346399c71a4342c03bdbec2136ec735da4b8` | Separate GPU occupancy/ESDF probe | + +These SHAs were resolved directly from the official upstream repositories. A +moving branch name is not an executable test identity. + +## Resource-admission result + +**T1 was intentionally not started.** Free physical memory fell from roughly +`3.3 GiB` during the first inventory to `669 MiB` at the final snapshot while +the parallel GAUSS contour was active. Starting a ROS 2 image build or another +replay in that state would make the measurement invalid and could destabilize +unrelated work. + +Candidate A may start only when all of the following are true: + +1. no unrelated heavy Worker build or replay is active; +2. free physical memory is at least `16 GiB` before the build; +3. GPU utilization is at most `10%` before an integrated replay, unless the + active GPU process is an explicitly admitted part of that replay; +4. canonical Mission Core Triton is healthy and is not stopped or replaced; +5. the candidate uses a new `ndc-` isolated build/runtime contour. + +## Next command boundary + +The next authorized action is T1 Candidate A upstream qualification: build the +pinned GSeg3D and Ground Consistency revisions in an isolated ROS 2 contour, +run their upstream sample path, and record build identity, latency and memory. +RAVNOVES00 replay begins only after that unmodified upstream qualification +passes.