Cyberwave is in Private Beta.
Request early access to get access to the Cyberwave dashboard.
For articulated joint control and saved poses, see
Joints & Poses.
Prerequisites
the-robot-studio/so101, unitree/go2) with cw.twin(slug). Call
cw.affect("simulation") or cw.affect("live") before locomotion and joint MQTT so commands and
cached state target the right runtime.
Managing assets and twins
To instantiate a twin, query the available assets from the catalog. The search returns both the public assets at cyberwave.com/catalog and the private assets available to your organization.add_to_environment() creates a deep copy of the twin in the target environment, marks the
original as deleted, and deletes the source environment if it has no twins left.
Scene layout
Editor placement does not go over MQTT. Useedit_position / edit_rotation to move the twin
in the environment scene.
Locomotion
Locomotion twins (Go2, UGV, …) accept velocity-style commands. The SDK publishes a burst of MQTT messages plus an explicitstop so edge drivers with velocity watchdogs stay alive.
move() / rotate() for locomotion — use edit_rotation() for editor layout only.
Command catalog
Each asset can declare MQTT commands incw-driver.yml (metadata["mqtt"]["commands"]). The SDK
binds twin.commands.<name>(**kwargs) at runtime. Locomotion names delegate to twin.locomotion
(burst); other names publish once.
twin.describe(), twin.commands.get_schema().
Inbound MQTT (listen)
Subscribe to catalog inbound topics with twin.listen(filters=[…]). It returns a session;
call session.stop() when done. Cached state is read with get_joints(), pose.get(), etc.
joints, pose, power). This replaces the
deprecated subscribe_position() / subscribe_rotation().
Runtime mode (affect)
cw.affect("simulation") and cw.affect("live") set config.runtime_mode and the default
control source_type. Inbound MQTT updates land in separate buckets; get_joints() reads the
bucket for the active mode.
affect() is chainable: cw.affect("simulation").twin("unitree/go2"). "real-world" is accepted
as an alias for "live".
Simulation vs. live
Usemode="simulation" for a simulator-first client, or cw.affect() to switch an existing
client between sim and live.
- Live publishes state updates as
edge. - Simulation publishes state updates as
sim. - Locomotion and other control helpers target
telein live mode andsim_telein simulation.
source_type explicitly or set CYBERWAVE_SOURCE_TYPE.
Accepted raw values: "sim", "sim_tele", "tele", "edge", "edit". This same mode selection
drives twin.get_frame(source="cloud") — see Frames & Cameras.
Teleop policy
In live mode, attach a workspace controller policy before joint/locomotion MQTT when the platform expects teleop routing.Live Teleoperation
How teleoperation and runtime mode work in the Environment Editor.
Pose reads
| Twin kind | get_pose() meaning | Preferred handle |
|---|---|---|
| Manipulator (arm) | Joint-space (alias for get_joints()) | twin.get_joints() / twin.joints.get() |
| Locomote (Go2, …) | World pose from MQTT | twin.pose.get() |
Discovery
MQTT contract
The MQTT command envelope ({source_type, command, data, timestamp}) and the outbound telemetry
rate limits are documented on the contract home:
MQTT API Reference
Command envelopes, source types, and outbound rate limits.
Per-hardware guides
Robotic Arms
Per-arm joints and calibration.
Robotic Dogs
Locomotion and gaits for quadrupeds.