send_controller_command) node provides a direct way to dispatch controller commands to a digital twin. Unlike Virtual Controller (which resolves commands dynamically from upstream strings), this node lets you explicitly select the twin, controller policy, and specific command at configuration time.
Palette category: Actuation. Runs on cloud (Celery MQTT or inference dispatch) and edge (worker
client.mqtt.publish, keyboard/teleop only). Model controllers (mlmodel/vla) are cloud-only.Configuration flow
The inspector guides you through a three-step cascade:- Select digital twin — choose the target twin in the bound environment
- Select controller policy — pick from compatible controllers (filtered by the twin’s asset)
- Select command (keyboard/teleop) or configure instruction (model controllers)
keyboard_bindings and display_config.widgets. For model controllers the instruction input accepts a text prompt for inference.
Inputs
Keyboard/teleop controllers
When a keyboard or teleop controller is selected:- The command dropdown shows all available actuations with labels and key bindings
- The
paramsinput can override the binding’s defaultplaygrounddata (velocity, etc.) - At runtime the node publishes to
cyberwave/twin/{uuid}/commandwith the same MQTT payload shape as keyboard teleoperation
MQTT payload
Model controllers (mlmodel/vla)
When a model controller is selected:- The instruction input accepts a natural language prompt (e.g. “pick up the red block”)
- Additional parameters (max_steps, mode) can be passed via
params - At runtime the node dispatches inference through
ControllerPolicyExecutionService - Model controllers run cloud-only — edge compilation will fail
Outputs
When to use
Related nodes
- Virtual Controller — dynamic command resolution from upstream strings
- Info Controller — read controller policy metadata
- Send MQTT — generic MQTT publish