Skip to main content

What are Workflows?

Workflows in Cyberwave let you create automated sequences of robot operations. Connect nodes visually to build complex behaviors without writing procedural code.
Workflows run on Cyberwave’s cloud infrastructure, ensuring reliable execution even when your local machine is offline.

Workflow Components

Nodes

Nodes are the building blocks of workflows. Each node performs a specific action:

Twin Nodes

Control digital twin position, rotation, and state

Joint Nodes

Set individual joint positions or run trajectories

Condition Nodes

Branch based on sensor data or twin state

Delay Nodes

Add timing between operations

Connections

Connections define the execution flow between nodes:
  • Sequential: Execute nodes one after another
  • Parallel: Execute multiple nodes simultaneously
  • Conditional: Branch based on conditions

Creating a Workflow

Using the SDK

from cyberwave import Cyberwave

client = Cyberwave()

# Create a new workflow
workflow = client.api.workflow_create({
    "name": "Pick and Place",
    "description": "Move arm to pick position, grip, move to place position, release"
})

# Add nodes
pick_node = client.api.workflow_node_create(workflow.uuid, {
    "type": "joint_control",
    "config": {
        "twin_uuid": "your-twin-uuid",
        "joints": {"shoulder": 45, "elbow": 30}
    }
})

grip_node = client.api.workflow_node_create(workflow.uuid, {
    "type": "gripper",
    "config": {
        "action": "close",
        "force": 0.8
    }
})

# Connect nodes
client.api.workflow_connection_create(workflow.uuid, {
    "source_node": pick_node.uuid,
    "target_node": grip_node.uuid
})

Using the Dashboard

  1. Navigate to Workflows in the dashboard
  2. Click Create Workflow
  3. Drag nodes from the palette to the canvas
  4. Connect nodes by dragging from output to input ports
  5. Configure each node’s parameters
  6. Click Save and Run

Executing Workflows

Manual Execution

# Execute a workflow
execution = client.api.workflow_execute(workflow.uuid)
print(f"Execution ID: {execution.uuid}")
print(f"Status: {execution.status}")

Triggered Execution

Workflows can be triggered by:
  • Schedule: Run at specific times (cron)
  • Events: Run when sensor data matches conditions
  • API: Trigger from external systems

Monitoring Executions

Track workflow execution status and results:
# Get execution details
execution = client.api.workflow_execution_get(execution_uuid)

print(f"Status: {execution.status}")
print(f"Started: {execution.started_at}")
print(f"Completed: {execution.completed_at}")

# Get node-level execution details
for node_execution in execution.node_executions:
    print(f"  {node_execution.node_name}: {node_execution.status}")

Example: Inspection Workflow

A typical inspection workflow might include:
┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│ Move to     │───▶│ Capture     │───▶│ Analyze     │
│ Position 1  │    │ Image       │    │ Image       │
└─────────────┘    └─────────────┘    └─────────────┘

                         ┌───────────────────┴───────────────────┐
                         ▼                                       ▼
                  ┌─────────────┐                         ┌─────────────┐
                  │ Pass:       │                         │ Fail:       │
                  │ Move Next   │                         │ Alert       │
                  └─────────────┘                         └─────────────┘

Best Practices

Create separate workflows for distinct operations rather than one large workflow. This makes debugging and maintenance easier.
Include condition nodes to handle failure cases gracefully. Consider what should happen if a joint can’t reach its target.
Name nodes and workflows descriptively. “Move to inspection position” is better than “Node 1”.

Next Steps