Modular AirStack 5/9: asm_macvo extraction (−65% image), full flatten, split stacks, doctor - #392
Merged
Merged
Conversation
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
changed the base branch from
rfc/s4-optitrack-flatten-local
to
develop
August 24, 2026 20:31
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stack 5/9 · base:
rfc/s4-optitrack-flatten-localThe 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
module lock --build. MAC-VO stays a pinned git submodule in the module repo.config_filecollisions were real).lite_offload_global(:onboard/:offboard) with an explicitbridge.yaml;tools/gen_dds_router.pygenerates 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_defaultadded.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.mdv1.0.0) replacing the informal checklist.Validation
full_macvowiring baseline blessed on the composed module image (macvo_node + full sensor graph present).full_default(liveliness/sensors/takeoff/autonomy) and split-stack liveliness+wiring green.🤖 Generated with Claude Code