Skip to content

Commit 9146914

Browse files
committed
Correct the trained policy loop and publish representative demos
Real InternVLA-N1 runs exposed places where the service diverged from the model's closed-loop semantics. Preserve one-action-per-frame execution and S2 history across cloud-edge steps, then document and publish the verified Habitat and RoboNix TUI paths without redundant media.
1 parent f9e2fb1 commit 9146914

30 files changed

Lines changed: 1156 additions & 204 deletions

CHANGELOG.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,50 @@
22

33
All notable public changes are recorded here.
44

5+
## 0.4.1 — 2026-07-29
6+
7+
Fixes correctness defects exposed by running the trained InternVLA-N1 S1/S2
8+
policy through the complete RoboNix Service loop rather than through mocks.
9+
Capability ids and configuration compatibility are unchanged.
10+
11+
### Fixed
12+
13+
- the edge now executes one primitive action per observation while retaining the
14+
remainder of the model's four-step action chunk. It previously handed the
15+
whole chunk to the controller, which either moved repeatedly without a fresh
16+
frame or discarded the tail when `action_steps_to_execute: 1` was used.
17+
- cloud action-only outputs are preserved and drained one per frame. This covers
18+
STOP and the upstream LOOK_DOWN flow; an unsupported camera-look request is
19+
resolved by a second S2 pass in the cloud instead of being sent to a
20+
chassis-only robot.
21+
- frames consumed by S1 between cloud requests are replayed through S2's
22+
`step_no_infer` path. S2 therefore keeps the same episode history and step
23+
count as the moving body instead of repeatedly planning from an artificially
24+
short history and failing to recognize arrival.
25+
- an exhausted action chunk now forces one fresh cloud synchronization before a
26+
run is failed. RGB packaging is converted to the byte range expected by PIL,
27+
`continuous_traj` is defined for the S1 runner, and normalized Habitat depth
28+
is scaled only when the incoming values are actually in `[0, 1]`.
29+
- the Habitat bridge can pin an episode so comparison lanes start from the same
30+
scene state across process restarts.
31+
32+
### Added
33+
34+
- trained-policy Pilot manifests for the complete Habitat + RoboNix TUI path,
35+
including a Naive ECC baseline fixture.
36+
- regression coverage for action-chunk draining, action-only cloud responses,
37+
LOOK_DOWN handling, S2 history replay, and forced synchronization.
38+
39+
### Changed
40+
41+
- the public demo set is reduced to three representative recordings:
42+
Naive ECC/Ours robustness, Edge Only/Ours completion time, and the complete
43+
RoboNix TUI path. Superseded grid and single-lane videos were removed.
44+
- both READMEs now lead with this repository's cloud–edge runtime contribution.
45+
InternVLA-N1 model provenance is stated once; the remaining explanation
46+
focuses on deployment, scheduling, runtime correctness, and RoboNix
47+
integration.
48+
549
## 0.4.0 — 2026-07-27
650

751
Closes two defects found by reading this service against the executor's async

CITATION.cff

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ cff-version: 1.2.0
22
message: If you use this software, please cite the repository and the upstream InternNav/InternVLA work.
33
title: RoboNix Compute Optimization
44
type: software
5-
version: 0.4.0
6-
date-released: 2026-07-27
5+
version: 0.4.1
6+
date-released: 2026-07-29
77
authors:
88
- family-names: Cao
99
given-names: Hangyu

README.md

Lines changed: 74 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -23,63 +23,65 @@
2323
<a id="what-this-adds"></a>
2424
## 🎯 What this adds to RoboNix
2525

26-
RoboNix already has metric navigation (`robonix.service.navigation` / Nav2:
27-
go to a `PoseStamped`). It did **not** have a packaged, Pilot-callable service
28-
that follows a **natural-language route** while keeping the heavy dual-system
29-
VLN stack deployable on an edge robot. That is what this package is.
26+
This repository turns a dual-system VLN S1/S2 inference path into a
27+
**deployable, callable, and observable RoboNix cloud–edge navigation service**.
28+
S1 keeps the edge action loop moving while S2 refreshes high-level semantic
29+
context in the cloud; this repository owns when they communicate, how model
30+
history advances correctly, how timeouts and late results are handled, and how
31+
the runtime binds to RoboNix lifecycle and robot I/O.
3032

3133
| RoboNix gets | Detail |
3234
| --- | --- |
33-
| An instruction-following navigation **service** | `robonix.service.navigation.vln` — sibling of Nav2. A coordinate goes to Nav2; a sentence such as *"walk down the hallway and stop at the kitchen door"* comes here. |
34-
| Direct Pilot / Executor use | Four MCP tools: `navigate`, `navigate/status`, `navigate/cancel`, `telemetry`. Pilot discovers them on the service; the executor owns the async poll lifecycle. Nothing else has to be deployed alongside. |
35-
| Standard robot I/O only | Consumes `camera/{rgb,depth,intrinsics}`, chassis `odom` / map `pose`, and drives `chassis/move`. No RoboNix-core patch, no vendor SDK. |
36-
| A cloud–edge compute plan that fits real robots | Slow S2 semantic latents on a GPU host; fast S1 actions on the edge (~**0.60 GB** vs **16.63 GB** Edge Only). On Orin+A100 the control loop is **2.22×** faster than Edge Only at nearly the same SR, and recovers **+6.1 SR / +12.7 SPL** over Naive ECC. |
37-
38-
**Identity.** The catalog capability is *instruction-following VLN navigation*.
39-
Cloud–edge scheduling, key-latent sync, and telemetry are how that capability
40-
stays accurate under edge memory and network limits — they are not a separate
41-
package users deploy.
42-
43-
**Project boundary.** Publishable RoboNix Service (`package_manifest.yaml`,
44-
Atlas provider, five contracts). Cloud S2 is part of this same runtime on a
45-
GPU host outside the robot deployment. An HTTP lifecycle API remains for
35+
| A genuinely split cloud–edge runtime | Heavy S2 runs on a cloud GPU and lightweight S1 runs at the edge; the edge never has to materialize the complete dual-system model. |
36+
| Adaptive collaboration without blocking control | Key-latent synchronization, active/pending buffers, adaptive timeouts, and late-response absorption let S1 keep moving without consuming stale context indefinitely. |
37+
| Preserved closed-loop model semantics | One action is executed per observation while short-trajectory tails are retained; edge-only frames are replayed into S2 history, and S2 LOOK_DOWN / STOP actions are handled correctly. |
38+
| A complete RoboNix Service surface | Four MCP tools — `navigate`, `navigate/status`, `navigate/cancel`, `telemetry` — plus standard camera, pose, and chassis contracts, with no RoboNix-core patch. |
39+
| Measured system gains | Edge model memory is about **0.60 GB** versus **16.63 GB** for Edge Only. On Orin+A100 the control loop is **2.22×** faster at nearly the same SR, while recovering **+6.1 SR / +12.7 SPL** over Naive ECC. |
40+
41+
The concrete S1/S2 model and weights are InternVLA-N1; the rest of this document
42+
focuses on this repository's cloud–edge deployment, runtime correctness,
43+
scheduling, and RoboNix integration.
44+
45+
The catalog identity is `robonix.service.navigation.vln` because the external
46+
RoboNix boundary is a long-running navigation service; cloud–edge compute
47+
optimization is its core implementation. Cloud S2 belongs to the same runtime
48+
on a GPU host outside the robot deployment. An HTTP lifecycle API remains for
4649
non-RoboNix orchestrators. See
4750
[RoboNix Integration Boundary](#robonix-integration-boundary).
4851

4952
<a id="demo-video"></a>
5053
## 🎬 Demo Video
5154

52-
Each reel is one R2R-CE episode with **left = Naive ECC** and **right = Ours**;
53-
the HUD carries steps, per-step latency, wall clock, and the terminal verdict.
55+
These recordings run the trained InternVLA-N1 policy through the RoboNix
56+
Service control path in Habitat / R2R-CE. They are **real-policy simulation
57+
demos, not physical-robot validation**. The two representative reels cover
58+
robustness and actual task completion time without a redundant grid or
59+
single-lane clip.
5460

5561
<div align="center">
5662

57-
**1 · We succeed · they hang**
63+
**1 · Robustness: Naive ECC times out, Ours succeeds**
5864

5965
<a href="docs/assets/demo/habitat_comparison_fail.mp4">
6066
<img width="100%" src="docs/assets/demo/habitat_comparison_fail.gif" alt="Fail reel: Naive ECC TIMEOUT vs Ours SUCCEEDED">
6167
</a>
6268

6369
<sub><a href="docs/assets/demo/habitat_comparison_fail.mp4">habitat_comparison_fail.mp4</a></sub>
6470

65-
**2 · Both succeed · we finish first**
71+
**2 · Completion time: Edge Only and Ours succeed, Ours is about 2× faster**
6672

6773
<a href="docs/assets/demo/habitat_comparison_speed.mp4">
68-
<img width="100%" src="docs/assets/demo/habitat_comparison_speed.gif" alt="Speed reel: both SUCCEEDED, Ours faster">
74+
<img width="100%" src="docs/assets/demo/habitat_comparison_speed.gif" alt="Speed reel: Edge Only and Ours both succeed, Ours finishes first">
6975
</a>
7076

7177
<sub><a href="docs/assets/demo/habitat_comparison_speed.mp4">habitat_comparison_speed.mp4</a></sub>
7278

73-
**3 · 8×2 episode grid** — left Naive ECC · right Ours
74-
75-
<img width="62%" src="docs/assets/demo/habitat_comparison_grid.gif" alt="8×2 Habitat comparison grid GIF">
76-
7779
</div>
7880

79-
Secondary single-lane clip (no comparison HUD):
80-
[habitat_demo.mp4](docs/assets/demo/habitat_demo.mp4).
81-
Rebuild the reels with `scripts/demo/make_demo_reels.py` (fail / speed / grid),
82-
or see [Demo filming in Habitat](#demo-filming).
81+
The complete RoboNix TUI sequence — startup, instruction entry, tool invocation,
82+
and terminal state — appears under
83+
[RoboNix Integration Boundary](#robonix-integration-boundary) instead of being
84+
duplicated here.
8385

8486
<a id="results"></a>
8587
## ⚡ Results
@@ -151,6 +153,13 @@ in [Benchmark Results](#benchmark-results).
151153
<a id="news"></a>
152154
## 📰 News
153155

156+
- **2026-07-29 — v0.4.1:** Corrected the trained InternVLA-N1 service loop:
157+
one action per observed frame, S2 history replay across edge-only steps,
158+
action-only STOP / LOOK_DOWN handling, forced refresh after an exhausted
159+
action chunk, valid RGB/depth packaging, and reproducible Habitat episode
160+
pinning. The public demos are now limited to two representative Habitat
161+
comparisons plus the complete RoboNix TUI path. See
162+
[CHANGELOG.md](CHANGELOG.md).
154163
- **2026-07-27 — v0.4.0:** Two safety and liveness fixes, both breaking.
155164
`config.mode` is now required — it used to default to `mock`, so an
156165
unconfigured deployment silently got a stub policy that reported runs as
@@ -181,73 +190,41 @@ in [Benchmark Results](#benchmark-results).
181190
<a id="demo-filming"></a>
182191
## 🎥 Demo filming in Habitat
183192

184-
Demos are shot in **Habitat / R2R-CE**, not on a physical robot. The point of
185-
the comparison reel is that viewers can *see* two things at once: **we finish**
186-
when a weak cloud–edge baseline does not, and **we are faster** when both
187-
finish. Numbers in the HUD must come from that run's telemetry; the Orin+A100
188-
tables above stay the project-wide summary.
193+
The public repository keeps only three representative assets: Naive ECC/Ours
194+
robustness, Edge Only/Ours completion time, and the complete RoboNix TUI path.
195+
The first two run the real model policy in **Habitat / R2R-CE**, which is not a
196+
physical-robot test. The TUI recording validates invocation through Pilot and
197+
Executor.
189198

190-
### What to compare
191-
192-
| Lane | Strategy | What the audience should notice |
193-
| --- | --- | --- |
194-
| **A · Naive ECC** | `naive_ecc` — reuse a stale latent, no key-latent switching | Slow or stuck under delay; often `FAILED` / timeout |
195-
| **B · Ours** | `ours` — this service's online switcher | Same instruction & scene; shorter wall clock; `SUCCEEDED` |
196-
| **C · Edge Only** *(optional)* | Full dual-system on the edge (no cloud split) | Succeeds but step latency / edge memory stay high |
197-
198-
Keep instruction, episode id, and camera view identical across lanes. Change
199-
only the strategy (and, when stressing A, the injected RTT).
200-
201-
### Shot list (simple version for the filming team)
202-
203-
1. Pick **8 episodes** from `benchmarks/r2r_ce/demo_episodes.yaml` (or run the
204-
scout mode of `scripts/demo/run_comparison.sh` to fill success/fail pairs).
205-
2. For each episode, record **A then B** (and C if you have time) with
206-
`ANALYSIS_SAVE_VIDEO=1`. Do **not** speed up the decision/motion segment;
207-
only idle tails may be 2× in the edit.
208-
3. Burn in a fixed HUD, e.g.
209-
`[A] Naive ECC · step 12 · 498 ms · 41.2 s · FAIL` vs
210-
`[B] Ours · step 12 · 224 ms · 18.7 s · SUCCEEDED`.
211-
4. Prefer ≥4 episodes where both succeed but B is clearly faster, and ≥2 where
212-
**B succeeds and A fails**.
213-
5. Compose the public reel with
214-
`python scripts/demo/compose_side_by_side.py …` (left A / right B, endpoint
215-
freeze with green/red badge).
216-
217-
### One-command record + compose
199+
Comparison recordings must lock the same instruction, episode, and camera
200+
start. The Naive ECC reel changes only synchronization strategy; the Edge Only
201+
reel changes only placement. HUD state and wall clock come from that run rather
202+
than from the aggregate benchmark table.
218203

219204
```bash
220-
# Paths below match a typical dual-A100 workstation; override as needed.
221205
export INTERNNAV_ROOT=/path/to/InternNav
222206
export ROBONIX_COMPUTE_DATA_ROOT=/path/to/vln_data # contains vln_ce/, scene_data/
223207
export ROBONIX_COMPUTE_MODEL_DIR=/path/to/InternVLA-N1
224208
export ROBONIX_COMPUTE_S1_MODEL_DIR=/path/to/InternVLA-N1-S1
225209
export PYTHON_BIN=/path/to/conda/envs/habitat/bin/python
226210

227-
# Record Naive ECC vs Ours for the curated episode list (writes mp4 + telemetry).
228211
bash scripts/demo/run_comparison.sh \
229212
--episodes-file benchmarks/r2r_ce/demo_episodes.yaml \
230213
--strategies naive_ecc,ours \
231214
--rtt-delay-ms 200 \
232215
--output-dir outputs/demo_comparison
233216

234-
# Hero reels from recorded lane mp4s (fail = they hang / we succeed;
235-
# speed = both succeed, we finish first). Optional RTT remapping / setpts
236-
# is fine for the public “result” clips — see make_demo_reels.py.
217+
# Robustness reel: Naive ECC vs Ours.
237218
python scripts/demo/make_demo_reels.py --mode fail \
238219
--left outputs/.../naive_ecc/.../0206.mp4 \
239220
--right outputs/.../ours/.../0206.mp4 \
240221
--out docs/assets/demo/habitat_comparison_fail.mp4
241222

223+
# Completion-time reel: Edge Only vs Ours.
242224
python scripts/demo/make_demo_reels.py --mode speed \
243-
--left outputs/.../naive_ecc/.../0206.mp4 \
225+
--left outputs/.../edge_only/.../0206.mp4 \
244226
--right outputs/.../ours/.../0206.mp4 \
245227
--out docs/assets/demo/habitat_comparison_speed.mp4
246-
247-
# 8×2 contact-sheet GIF (TSV: left_mp4\\tright_mp4\\tlabel per line)
248-
python scripts/demo/make_demo_reels.py --mode grid \
249-
--grid-pairs outputs/demo_grid_clips/pairs.tsv \
250-
--out docs/assets/demo/habitat_comparison_grid.gif
251228
```
252229

253230
Full field list, episode selection criteria, and editing rules:
@@ -303,11 +280,11 @@ contracts, so `rbnx boot` starts the provider and Atlas registers it. See
303280
[CAPABILITY.md](CAPABILITY.md) for the capability manual and
304281
[config.spec](config.spec) for every config field.
305282

306-
It is the **instruction-following sibling of `robonix.service.navigation`**
307-
(Nav2): both own a long-running navigation runtime and expose the same
308-
navigate / status / cancel triple, but Nav2's goal is a metric `PoseStamped`
309-
while this one's is a sentence. A coordinate goes to Nav2; a route description
310-
comes here.
283+
`navigation.vln` names the external RoboNix capability boundary: it accepts an
284+
instruction and manages a long-running navigation task. Our contribution is the
285+
cloud–edge execution behind that boundary — split S1/S2 deployment, adaptive
286+
synchronization, consistent model history, failure handling, and step-level
287+
telemetry — rather than redefining the VLN model itself.
311288

312289
| Contract | Transport | Purpose |
313290
| --- | --- | --- |
@@ -317,6 +294,23 @@ comes here.
317294
| `robonix/service/navigation/vln/navigate/cancel` | MCP | Abort the active run (idempotent) |
318295
| `robonix/service/navigation/vln/telemetry` | MCP | Per-run sync / timeout / reuse / latency counters |
319296

297+
### Complete RoboNix TUI path
298+
299+
The recording keeps the full `rbnx chat` sequence: startup, instruction entry,
300+
Pilot selecting the `navigate` tool, Executor polling, and terminal output.
301+
Naive ECC is on top and Ours is below; both complete the same kind of task, while
302+
Ours reaches a terminal result first. This validates the **RoboNix integration
303+
path and wall-clock completion behavior**; it does not replace the full R2R-CE
304+
benchmark.
305+
306+
<div align="center">
307+
<a href="docs/assets/demo/robonix_tui_demo.mp4">
308+
<img width="100%" src="docs/assets/demo/robonix_tui_demo.jpg" alt="RoboNix TUI: Naive ECC on top, Ours below">
309+
</a>
310+
<br>
311+
<sub><a href="docs/assets/demo/robonix_tui_demo.mp4">robonix_tui_demo.mp4</a> — click the image to play the full video</sub>
312+
</div>
313+
320314
Natural-language invocation needs nothing else deployed alongside: pilot
321315
discovers these MCP contracts on the service directly, and because
322316
`navigate`, `navigate/status` and `navigate/cancel` form an async contract
@@ -1238,7 +1232,7 @@ and citing it:
12381232
author = {Cao, Hangyu and Zheng, Zihao},
12391233
title = {RoboNix Compute Optimization},
12401234
year = {2026},
1241-
version = {0.4.0},
1235+
version = {0.4.1},
12421236
url = {https://github.com/i6bimua/service-navigation-vln-rbnx}
12431237
}
12441238
```

0 commit comments

Comments
 (0)