PayloadActuatorDriver controls a non-imaging payload: a sprayer, dropper, claw, sampler, winch, or any other actuator your plugin triggers.
The interface
actuate returns DriverError::InvalidParam when command.action_id is not in PayloadCapabilities::actions, and args and metadata are msgpack value maps.
Capabilities
actions is the tuple of action_id strings the driver accepts in PayloadCommand. metadata holds driver-specific values (maximum payload mass, refill volume, firmware version).
Commands
action_id is mandatory. args is a free-form dict the driver validates; raise ValueError on unknown keys.
State
busy=True while an action is in flight. Your plugin calls actuate itself; serialise calls per session in your plugin. A driver that sees a sustained fault reports it under metadata["error"] and raises DriverError on the next actuate call.
Opening the driver from your plugin
Your plugin opens the driver inon_start and calls actuate when its GCS half or a mission action asks for it. The pattern is on Driver layer. A GPIO-driven actuator needs hardware.gpio_out; a serial one needs hardware.uart. Risk levels are on Permissions.
Next steps
Driver layer
The shared contract and the manifest table.
Permissions
The capability catalog and risk levels.
Hardware testing
Test with a mock backend before the bench.