- The Piper mirrored as a digital twin in a Cyberwave environment
- The physical arm paired to that twin through the Cyberwave Edge over its CAN bus
- The Keyboard controller jogging joints live from the dashboard
- A Python SDK script setting joints on the same arm, switchable between simulation and live
Architecture at a glance
Who provides what. Cyberwave provides: the digital twin, the Piper edge
driver, MQTT transport, Live Mode, the Keyboard controller, and the Python
SDK. You provide: the arm, the USB-to-CAN adapter, and a host (laptop, Pi, or
Jetson) to run the edge on.
Prerequisites
- Hardware: AgileX Piper 6-DOF arm, its power supply, and the USB-to-CAN adapter. The Piper speaks CAN at 1 Mbps, not USB serial, so the adapter is mandatory.
- Edge host: a laptop, Raspberry Pi, or Jetson physically connected to the CAN adapter.
- Credentials: a Cyberwave account (request access) and, for Step 7, an API key.
- SDK baseline: Python 3.10+ and the Python SDK.
- Hardware reference: AgileX Piper documentation and the Piper catalog page (bill of materials, drivers, troubleshooting).
Step 1: Bring up the Piper hardware
Prove the arm is alive over CAN before involving Cyberwave. The canonical procedure is in the AgileX Piper documentation; the steps that matter for this guide:- Mount and power. Bolt the Piper to a stable surface so it cannot tip on a full-reach move, connect the supplied power adapter, and switch it on.
- Wire the CAN link. Connect the Piper CAN cable to the USB-to-CAN adapter, then plug the adapter into the edge host.
- Bring up the CAN interface (Linux edge hosts). Enable the interface at the Piper’s 1 Mbps bitrate:
On macOS you can skip this; the Cyberwave Edge handles the adapter passthrough during pairing in Step 3.
- Sanity-check actuation. Run AgileX’s own bring-up / enable utility and confirm all six joints report and the arm holds position under power.
ip -details link show can0 reports the interface UP at 1000000
bitrate, and AgileX’s test tool reads back all six joint states. The CAN path
is healthy.Step 2: Create the environment and twin
- Open the Cyberwave dashboard and click New Environment. Name it
Piper Quickstart. - In the left panel, click Add from Catalog, search for
Piper, and add the AgileX Piper twin. - Position the twin to roughly match the real arm’s placement on your desk. Exact pose does not matter for control; it only affects how the scene renders.
Step 3: Pair the arm through the edge
Pairing installs the Piper driver on the edge host and binds the physical arm to the twin from Step 2. Open a terminal on the host wired to the CAN adapter. If it is a remote box, SSH in first:pair command:
- Logs the edge host into Cyberwave
- Prompts for the target environment (pick
Piper Quickstart) - Detects the USB-to-CAN adapter and installs the Piper edge driver
- Handles USB/CAN passthrough on macOS automatically
- Binds the physical arm to the Piper twin you select
The Piper shows online in the dashboard with a green presence indicator,
and the Piper driver is listed as active under the twin. If not, re-run the
pair command; it is idempotent and safe to run repeatedly.
Step 4: Provide Cyberwave credentials
Pairing authenticated the edge host. To drive the arm from the SDK in Step 7, the machine running your Python also needs an API key and a target environment.- In the dashboard, go to Profile → API Tokens and create a key. Copy it; it is shown once.
- Grab the environment UUID from the environment’s URL or settings panel.
- Export both in the shell that will run your script:
Cyberwave() reads them automatically and cw.twin("agilex/piper") resolves to the Piper twin in that environment without any IDs hard-coded in your script. See Authentication for the full precedence rules.
Step 5: Select the environment and enter Live Mode
- Open the
Piper Quickstartenvironment. - Switch the toolbar toggle from Edit Mode to Live Mode. Live Mode is what connects the on-screen twin to the physical arm through the edge driver. In Edit Mode you are only arranging a scene.
- Select the Piper twin in the scene list. Since the arm is paired and online, the twin reflects its current joint state.
You are in Live Mode, the Piper twin is selected, and the rendered arm
matches the physical arm’s pose. This confirms the cloud-to-edge path before
you send any command.
Step 6: Assign the Keyboard controller
A controller is whatever is authorized to send commands to the twin: the keyboard, a teleop rig, an AI policy, or your SDK session. Proving the Keyboard controller end-to-end rules out pairing, MQTT, and the edge driver before you write any code. With the Piper twin selected in Live Mode:- Click Assign Controller.
- Pick Keyboard from the list.
- Use the on-screen key bindings to jog each joint and open/close the gripper. If the physical arm tracks the keys, the entire control path is healthy.
Jogging a joint in the dashboard moves the physical Piper, and the twin
tracks both. Keyboard control is verified end to end.
Step 7: Control the Piper from the SDK
The Python SDK exposes the same joint API for every arm in the catalog. Joint commands publish over MQTT oncyberwave/twin/{uuid}/joint_states; the Piper edge driver is subscribed and drives the joints over CAN.
Install the SDK:
cw.affect() selects the target. The same code drives the digital twin or the physical arm:
"simulation" first, then flip to "live" once it looks right. "real-world" is an accepted alias for "live".
The script prints the Piper’s joint names, moves the physical arm under
cw.affect("live"), and reads the resulting state back. You are now driving
the Piper from code.Reference
- SDK calls used:
Cyberwave(),cw.twin(),cw.affect(),arm.joints.list(),arm.joints.set(),arm.joints.get_all(),arm.joints.print_joint_states(). See Python SDK. - MQTT topic:
cyberwave/twin/{uuid}/joint_states. See MQTT API. - CAN transport: Piper bus runs at 1 Mbps; bring
can0up before pairing on Linux hosts. - Cross-links: Robotic Arms overview, Piper catalog page, SO-101 Quickstart (record + train loop), Key Concepts, Teleoperation.
Where to go next
Robotic Arms Overview
The 4-step pattern for any arm in the catalog.
Python SDK
Joints, frame capture, workflows, and the full API.
SO-101 Quickstart
Record demonstrations and train a model on an arm.