Any vehicle: write an adapter
An adapter is one package behind one interface. The mission core, the safety gate, the operator API and the records stay untouched.
// the whole contract a vehicle adapter implements
class VehicleTransport {
start() · stop()
send_arm() · send_set_mode() · run_prearm_checks()
send_position_setpoint() · send_velocity_setpoint()
hold() · land() · return_to_launch() · emergency_stop()
get_state() · get_health() · get_identity()
subscribe_state() · subscribe_health() · subscribe_estimator()
capabilities() · supports() · capability_profile()
}
- Declare a profile: kinematic class and frame, safe actions backed by real behavior, the emergency action, telemetry confidence, known limits.
- Register by name: the fleet configuration selects the adapter; an unknown name fails startup.
- Pass the suite: ten fail-closed scenarios, including a seeded mismatch that must fail, fix the authority level from L0 to L5.
Authority levels: L0 observe only · L1 supervisory: arm, hold, return, land, emergency action · L2 route execution · L3 full authority, with enforced route leases · L4 onboard safety mirror · L5 signed, expiring leases in a partitioned mesh.
Proof: the ground-robot adapter maps four native ROS 2 topics onto this interface with no MAVLink, and it ran in the same mixed-fleet mission as the PX4 drones.