Skip to main content
The Send Controller Command (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:
  1. Select digital twin — choose the target twin in the bound environment
  2. Select controller policy — pick from compatible controllers (filtered by the twin’s asset)
  3. Select command (keyboard/teleop) or configure instruction (model controllers)
For keyboard/teleop controllers the command dropdown lists every available actuation from the policy’s keyboard_bindings and display_config.widgets. For model controllers the instruction input accepts a text prompt for inference.

Inputs

FieldTypeRequiredDescription
twin_uuidstringYesTarget twin. Set in inspector (Twin combobox).
controller_policy_uuidstringYesController policy. Set in inspector (Controller dropdown).
commandstringNoActuation string for keyboard/teleop controllers (e.g. move_forward). Set in inspector or wired from upstream.
paramsobjectNoCommand parameters (e.g. {"linear_x": 1.5}). Overrides binding defaults. Can be wired from upstream.
instructionstringNoText prompt for model/VLA controllers. Ignored for keyboard controllers.

Keyboard/teleop controllers

When a keyboard or teleop controller is selected:
  • The command dropdown shows all available actuations with labels and key bindings
  • The params input can override the binding’s default playground data (velocity, etc.)
  • At runtime the node publishes to cyberwave/twin/{uuid}/command with the same MQTT payload shape as keyboard teleoperation

MQTT payload

{
  "source_type": "tele",
  "command": "move_forward",
  "data": {"linear_x": 1.5},
  "timestamp": 1710000000.0
}
FieldCloud workflowEdge worker
source_typetele (live) or sim_tele (simulation)edge
commandSelected actuation slugSelected actuation slug
dataFrom params input or binding defaultsFrom params input
timestampServer-side time.time()Worker-side time.time()

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

FieldTypeDescription
twin_uuidstringTarget twin
controller_policy_uuidstringController policy used
controller_typestringe.g. teleop, mlmodel, vla
commandstringActuation or instruction sent
sentbooleanWhether the command was dispatched
topicstringMQTT topic (keyboard/teleop)
payloadobjectFull MQTT payload or inference result
source_typestringtele / sim_tele / edge

When to use

ScenarioRecommended node
Send a specific known command (e.g. “move forward at speed 1.5”)Send Controller Command
Resolve a dynamic command from voice/text inputVirtual Controller + Fuzzy Matcher pipeline
Send a raw MQTT message with custom topic and payloadSend MQTT
  • Virtual Controller — dynamic command resolution from upstream strings
  • Info Controller — read controller policy metadata
  • Send MQTT — generic MQTT publish