Skip to content

Modular AirStack 5/9: asm_macvo extraction (−65% image), full flatten, split stacks, doctor - #392

Merged
andrewjong merged 8 commits into
developfrom
rfc/s5-macvo-flatten-split
Aug 24, 2026
Merged

Modular AirStack 5/9: asm_macvo extraction (−65% image), full flatten, split stacks, doctor#392
andrewjong merged 8 commits into
developfrom
rfc/s5-macvo-flatten-split

Conversation

@andrewjong

Copy link
Copy Markdown
Member

Stacked PR — merge the stack bottom-up with merge commits (squash-merging a lower PR orphans the commits every higher PR builds on). When the PR below merges, GitHub retargets this one to develop automatically. Each PR bumps VERSION (0.20.0-alpha.N), so check-version-increment passes at every level and each merge publishes images.

Stack 5/9 · base: rfc/s4-optitrack-flatten-local

The heavyweight extraction and the completion of the stack model: MACVO leaves trunk for castacks/asm_macvo, every remaining layer flattens, and split stacks + doctor + the interface conventions spec land.

What's inside

  • MACVO trunk-removal: torch/TensorRT/weights move into the module's tier-2 Docker layer. Robot image: 17.1 GB → 6.06 GB (−65%) — the 11.3 GB layer is paid only by MACVO users via module lock --build. MAC-VO stays a pinned git submodule in the module repo.
  • P5-E3 full flatten: perception/sensors/global/behavior into stack entries; generic launch args prefixed per module (ROS 2 launch configurations are global across includes — config_file collisions were real).
  • Split stack lite_offload_global (:onboard/:offboard) with an explicit bridge.yaml; tools/gen_dds_router.py generates the DDS-router config deterministically. Control-setpoint/trajectory topics crossing a bridge are a hard error (doctor gate Isaac Sim environment/ROS2/SITL #2). lite_default added.
  • airstack doctor [--live|--snapshot] (observe-and-report; exactly two hard gates), airstack stack list|new|diff, and the versioned interface conventions spec (docs/robot/autonomy/interface_conventions.md v1.0.0) replacing the informal checklist.

Validation

  • full_macvo wiring baseline blessed on the composed module image (macvo_node + full sensor graph present).
  • Full conformance on full_default (liveliness/sensors/takeoff/autonomy) and split-stack liveliness+wiring green.

🤖 Generated with Claude Code

andrewjong and others added 8 commits August 22, 2026 04:02
2026-08-20 runs show v=0.5 landings completing at 45.1-45.2s against a 45s
send_goal cap (TARGET_ALTITUDE/v + 15 + 10): a coin flip producing spurious
landing timeouts on 3-robot campaigns (legacy AND stack identically) and the
optitrack e2e (v=1.0, 40s cap). The constant now covers the
velocity-independent overhead (touchdown detection, land-detector dwell,
disarm): max(45, alt/v + 35).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The dogfood case for Docker dep tiers: macvo_ros2 (+ the 116MB MAC-VO
submodule) moves to the module, and Dockerfile.robot sheds the SKIP_MACVO
payload — TensorRT apt blocks, torch/torchvision/onnx/tensorrt pips, the 14
MACVO-only pips (audited: only tabulate has another consumer, supplied by the
tests venv, never the image), ~220MB model weights, and the
huggingface/matplotlib fix block. numpy~=1.26 pin kept (own-risk change,
deferred). Behavior note: matplotlib now stays in published images (the fix
block previously uninstalled it).

- perception.launch.xml: launch_macvo gate removed; the module ships the
  canonical macvo.launch.xml (also fixes the node's hardcoded camera_info sub)
- stacks/full_macvo: includes the module launch under the perception
  namespace (graph-identical to the committed wiring.md); modules.repos pins
  asm_macvo; README documents 'airstack module add asm_macvo'
- topic_keepalive: macvo rows removed
- compose SKIP_MACVO/SKIP_TENSORRT args dropped; docs/skills re-pointed

Image-size measurement and wiring.md regeneration follow in the next commits.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ender-pipeline nodes

- keepalive macvo edges (3) gone from legacy golden + full_default +
  full_droan_cpu — verified the diffs contained exactly those edges before
  re-blessing; legacy and full_default remain graph-identical (83/402)
- normalize_graph now excludes Isaac SDG render-pipeline writer nodes and the
  PX4MultirotorGraph clock publisher: their visibility on the robot domain is
  timing-dependent (join the graph when the render pipeline spins up), which
  made goldens flaky; RFC #380 §1 later normalizes sim sensor endpoints to
  vehicle-manifest ids properly
- all three baselines verified drift-clean on live bring-ups

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…image

Captured with asm_macvo synced + module lock --build (tier-2 layer on the
slim base). Strictly more truthful than the E2-era baseline: macvo_node now
present with its real publishers (the old capture raced the first-ever model
load and saw macvo topics only via subscribers), the anonymous perception
static TF is the module's named macvo_ned_tf, and the keepalive phantom rows
are gone. Verified drift-clean on an independent bring-up.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ks; prefix generic launch args

- canonical module launch files (prefixed described args, set_remap in
  namespace groups, params via yaml): stereo_image_proc, topic_keepalive,
  lidar_point_cloud_filter, random_walk_planner (also fixes the old orphan's
  name= bug), drone_safety_monitor; stack entries wire every layer flat
  except interface (stays wrapped BY DESIGN until the RFC #380 platform-module
  refactor — it is the safety boundary) and logging (already self-contained)
- generic launch-config names killed (the global-collision class that bit
  asm_optitrack): interpolate_dds_router config_file/args →
  dds_router_config_file/dds_router_args, gossip publish_rate →
  gossip_publish_rate, domain_bridge likewise — deprecated aliases kept and
  execution-tested; all trunk callers updated
- allowlist 16→14 (deleted two dead orphan launches); add-ros2-package
  template no longer teaches remap-in-module patterns
- frozen legacy files untouched except graph-neutral arg-name call sites

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ions spec, stack CLI

- stacks/lite_default (onboard-lite) + stacks/lite_offload_global — the first
  SPLIT stack: onboard/offboard entry files + bridge.yaml explicitly listing
  every boundary crossing (seeded from the legacy dds_router allowlist;
  set_trajectory_mode deliberately NOT bridged — the legacy config bridged it,
  violating what is now doctor hard gate #2)
- tools/gen_dds_router.py: bridge.yaml → deterministic DDS-router config;
  --check enforces hard gate #2 (control/trajectory topics in a bridge)
- airstack doctor: compose-time checks (manifests, overlay, dep-conflict gate,
  stack anatomy, bridge gate) — observe-and-report except the two RFC-
  enumerated hard gates; --live diffs the running graph vs wiring.md + flags
  unblessed control-setpoint publishers; --snapshot writes hardware-observed
  wiring.md with unverified-in-CI provenance
- airstack stack list|new|diff (diff compares generated wiring, not XML)
- docs/robot/autonomy/interface_conventions.md v1.0.0: the versioned narrow-
  waist spec (names/types/QoS/frames/rate/placement per interchange point,
  verified against observed wiring; fixes stale PointStamped claims)
- 45+ new unit tests; integrate-module-into-layer rewritten for stacks;
  create-stack skill; .agents README index rebuilt (was 8 rows, now 22)

Split-stack live two-host bring-up deferred to P6 (needs hosts: placement).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Onboard-lite topology observed live; verified no global-layer nodes present.
All four pre-existing baselines passed drift-clean through the E3a flatten —
the refactor is machine-proven graph-preserving.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@andrewjong
andrewjong changed the base branch from rfc/s4-optitrack-flatten-local to develop August 24, 2026 20:31
@andrewjong
andrewjong merged commit 54efefe into develop Aug 24, 2026
2 of 3 checks passed
@andrewjong
andrewjong deleted the rfc/s5-macvo-flatten-split branch August 24, 2026 20:31
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