RFC: Cross-embodiment AirStack — platform modules and trait-based compatibility #380
andrewjong
started this conversation in
Ideas
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
RFC: Cross-embodiment AirStack — platform modules and trait-based compatibility
This RFC extends RFC: Modular AirStack (#379) to a future goal: AirStack generalizing across form factors — different multirotors with different sensors, quadrupeds, wheeled robots, humanoids — while reusing autonomy modules across embodiments. It depends on the modularity framework's concepts (rungs, slots,
module.yaml,stack.yaml,doctor, conformance marks, the registry); read #379 first. It is split out so the modularity RFC stays focused; nothing here blocks or changes the plan in #379 — this is what that plan enables later.The rung/ladder model from #379 fits this problem, but it forces honesty about which rungs are universal and which are secretly multirotor-shaped.
1. What varies by embodiment vs. what doesn't
Walking the ladder top to bottom, the reusability gradient is clear:
tasks/navigate) — fully portable. "Go to this pose" means the same thing to a drone, a quadruped, and a rover. The most embodiment-neutral rung.ros2_controlvs. vendor SDKs (Unitree, Spot); "land" vs. "stop" vs. "sit."Design goal: keep the top of the ladder shared; make the bottom of the ladder swappable as a unit.
2. Embodiment = a
platformmodule typeThe platform is a first-class module in the #379 framework — the biggest one, but structurally just another module:
stack.yamlgains a top-levelplatform:key, and everything else composes against it. The current PX4/multirotor stack — MAVROS interface, trajectory controller, takeoff/landing tasks, hover-based safety monitor — becomes the reference platform module.3. Compatibility by traits, not platform enumeration
The wrong move is modules declaring
embodiments: [multirotor, quadruped, ...]— that list rots the day someone adds a hexapod. Instead, modules declare requirements on traits anddoctormatches them against the platform's declarations:{workspace: se3, hover_capable: true}→ doctor rejects it on the rover, with a reason.{workspace: se2*}→ runs on rover and quadruped; on a drone only via an adapter (a fixed-altitude SE(2)→SE(3) shim — adapters being ordinary small modules).tasks/navigate→ runs everywhere.The payoff: latent assumptions become declared ones. Today "this planner assumes it can hover" lives in someone's head and fails in the field; under traits it's a manifest line and a sync-time error. Prior art:
ros2_control's hardware-interface abstraction for the bottom layer; Nav2 is the cautionary tale of what happens when SE(2) assumptions are baked in rather than declared.Two generalizations this forces, both healthy:
tasks/takeoffdoesn't exist on a rover, so behavior trees are composed against the platform'sprovides_tasks, which doctor verifies statically ("this BT calls takeoff; platform doesn't provide it").4. Testing transfers better than expected
tests/waypoint_checker.pyis already embodiment-neutral — it judges an odometry track against corridors and tolerances, indifferent to whether the track was flown, walked, or driven. Conformance marks therefore become parameterized by trait:waypoint_navigationruns on anything providingtasks/navigate;takeoff_hover_landgates onhover_capableand simply isn't in a rover platform's conformance set. Each platform module ships its sim integration (Isaac asset + SITL/controller), so the same harness brings up "platform X + module Y" — and platform-compat badges slot into the registry alongside version badges.5. Migration path — same forcing-function trick as #379
Do NOT build the trait system speculatively for robots we don't have. Sequencing (this is "Phase 5" relative to #379's plan — only after its phases 1–4 are proven):
platform: px4_multirotoris what reveals the real seams — every place the refactor hurts is a hidden multirotor assumption in a "shared" layer.Split out from the design session behind #379 (2026-08-04) to keep that RFC focused on modularity. Comments welcome — especially from anyone with quadruped/rover/humanoid integration experience who can pressure-test the trait list.
All reactions