Recon
Robot Live Socket
Drive a Rhombus robot and read its telemetry over a WebSocket: getting the socket URL, frame formats, the commands you send and the telemetry you receive, generated from the robot's AsyncAPI specification.
Each Rhombus robot has a live WebSocket for control and telemetry: you send commands such as velocity, posture and emergency stop, and receive the robot's pose, state, planned path, behavior events and sensor data. The message reference below is generated from the robot's AsyncAPI specification, so it always matches what the service publishes.
Connect
- Call
getAllMediaUrisfor the robot and takewanLiveRobotUri, awss://URL on the robot's media host. - Open a WebSocket to that URL with a credential (see Authenticate).
- Send commands as text frames holding JSON. Every command needs
typeandtimestamp(Unix epoch milliseconds); the robot silently drops a command without them. - Read messages from the robot as binary frames holding UTF-8 JSON, and switch on their
type.
Authenticate
The socket accepts an API key, an OAuth access token or a federated token. Send it on the WebSocket handshake:
| Client | Credential | How |
|---|---|---|
| Server or native app | API key | Headers x-auth-scheme: and x-auth-apikey |
| Server or native app | OAuth access token whose grant includes the physical scope | Header Authorization: |
| Browser | Federated token minted by your backend | Query parameters ?x-auth-scheme=federated-token (or the same names as headers, from clients that can set them) |
- Moving a robot is a physical action, so an OAuth token needs the
physicalscope: without it the handshake is refused with 403PERMISSION_REQUIREDandWWW-Authenticate: Bearer error="insufficient_scope", scope="physical". - Partner credentials also send the client organization's UUID in the
x-auth-orgheader. - A refused handshake returns 401 (credential missing, unknown, expired or revoked) or 403 (valid but not allowed) with the JSON error body described in Errors.
- If the credential is deleted or revoked, or its role changes, the open socket closes with code
1008within 60 seconds. Check the credential before reconnecting.
See Media and streams for how each credential works on the media hosts.
Connection behavior
If the robot isn't connected to the media host in the URL, the handshake is refused with 403: get wanLiveRobotUri again (the robot's media host can change) and retry later. If the robot is connected but its control channel isn't ready, the socket sends a reconnect message as a text frame and stays open: close it and try again shortly. The socket closes after 180 seconds without traffic.
New message types, fields and enum values can be added at any time, so ignore what you don't recognize. A BEHAVIOR_EVENT can arrive twice when the robot retries a delivery; deduplicate by its event_uuid.
Commands move a physical machine. Keep emergency stop (CMD_EMERGENCY_STOP_LOCK) one action away in any interface you build, stop sending velocity commands when your operator lets go of the control, and test in a clear area.
Messages you send
| Message | Summary |
|---|---|
CMD_ACTION | Run a platform-specific action; see the action field for the values each robot platform supports. |
CMD_EMERGENCY_STOP_LOCK | Engage the emergency stop. The robot stays stopped until CMD_EMERGENCY_STOP_UNLOCK. |
CMD_EMERGENCY_STOP_UNLOCK | Release the emergency stop. |
CMD_INITIALIZE_POSE | Set the robot's localization estimate to a pose in the map frame. |
CMD_NAVIGATE_CANCEL | Cancel navigation: the current pose, waypoint, home, route/patrol, idle docking or exploration activity, plus queued ones. Low-battery docking continues. |
CMD_POSTURE | Adjust body posture. axes is a sparse map of platform-specific axis name to value (e.g. pitch in rad); empty or missing axes returns to neutral. |
CMD_VEL | Teleoperate with a velocity twist in the robot base frame: linear [x, y, z] in m/s, angular [x, y, z] in rad/s. |
CMD_ACTION
Run a platform-specific action; see the action field for the values each robot platform supports.
Supported values by robot platform; other values are ignored.
| Platform | Actions |
|---|---|
| go2, go2_v2, go2_2d | GO2_STAND_UP, GO2_SIT, GO2_LAY_DOWN, GO2_WALK_MODE, GO2_POSE_MODE, GO2_TERRAIN_WALK_MODE, GO2_ECONOMIC_GAIT_MODE, GO2_HELLO, GO2_ENABLE_AVOIDANCE_MODE, GO2_ENABLE_FREE_AVOID, ENABLE_RH_SIMPLE_AVOIDANCE, DISABLE_ALL_AVOIDANCE |
| diablo, diablo_2dlidar | DIABLO_STAND_MODE, DIABLO_CAR_MODE, ENABLE_RH_SIMPLE_AVOIDANCE, DISABLE_ALL_AVOIDANCE |
| turtlebot4 | ENABLE_RH_SIMPLE_AVOIDANCE, DISABLE_ALL_AVOIDANCE |
Epoch milliseconds
Available options: CMD_ACTION
{
"action": "GO2_STAND_UP",
"timestamp": 1727800000000,
"type": "CMD_ACTION"
}CMD_EMERGENCY_STOP_LOCK
Engage the emergency stop. The robot stays stopped until CMD_EMERGENCY_STOP_UNLOCK.
Epoch milliseconds
Available options: CMD_EMERGENCY_STOP_LOCK
{
"timestamp": 1727800000000,
"type": "CMD_EMERGENCY_STOP_LOCK"
}CMD_EMERGENCY_STOP_UNLOCK
Release the emergency stop.
Epoch milliseconds
Available options: CMD_EMERGENCY_STOP_UNLOCK
{
"timestamp": 1727800000000,
"type": "CMD_EMERGENCY_STOP_UNLOCK"
}CMD_INITIALIZE_POSE
Set the robot's localization estimate to a pose in the map frame.
Epoch milliseconds
Available options: CMD_INITIALIZE_POSE
{
"pose": {
"orientation": [
0,
0,
0,
1
],
"position": [
0.5,
0,
0
]
},
"timestamp": 1727800000000,
"type": "CMD_INITIALIZE_POSE"
}CMD_NAVIGATE_CANCEL
Cancel navigation: the current pose, waypoint, home, route/patrol, idle docking or exploration activity, plus queued ones. Low-battery docking continues.
Epoch milliseconds
Available options: CMD_NAVIGATE_CANCEL
{
"timestamp": 1727800000000,
"type": "CMD_NAVIGATE_CANCEL"
}CMD_POSTURE
Adjust body posture. axes is a sparse map of platform-specific axis name to value (e.g. pitch in rad); empty or missing axes returns to neutral.
Hold time; absent holds until replaced
Epoch milliseconds
Available options: CMD_POSTURE
{
"axes": {
"pitch": -0.1
},
"duration_ms": 5000,
"timestamp": 1727800000000,
"type": "CMD_POSTURE"
}CMD_VEL
Teleoperate with a velocity twist in the robot base frame: linear [x, y, z] in m/s, angular [x, y, z] in rad/s.
Epoch milliseconds
Available options: CMD_VEL
{
"timestamp": 1727800000000,
"twist": {
"angular": [
0,
0,
0.2
],
"linear": [
0.3,
0,
0
]
},
"type": "CMD_VEL"
}Messages you receive
| Message | Summary |
|---|---|
BEHAVIOR_EVENT | Activity lifecycle and progress: STARTED, PROGRESS, SUSPENDED, RESUMED, COMPLETED, FAILED, CANCELED or REJECTED. |
LASER_SCAN | Nearest obstacle per angular sector around the robot. |
OCCUPANCY_GRID | Live occupancy grid of the map being built or used. |
PLANNED_PATH | Planned navigation path as [x, y] points. |
ROBOT_STATE | Robot state: locomotion, battery, navigation mode and latest pose. |
TELEMETRY | Robot pose sample. correlationId is the activity_uuid of the activity in progress. |
reconnect | Sent by the cloud when the robot is not connected; reconnect later. |
BEHAVIOR_EVENT
Activity lifecycle and progress: STARTED, PROGRESS, SUSPENDED, RESUMED, COMPLETED, FAILED, CANCELED or REJECTED.
Available options: IDLE, MANUAL_CMD_VEL, MANUAL_ACTION, MANUAL_POSTURE, NAVIGATE_TO_POSE, NAVIGATE_TO_HOME, NAVIGATE_TO_WAYPOINT, ROUTE_RUN, LOW_BATTERY_DOCKING, IDLE_DOCKING, DWELLING, EMERGENCY, EXPLORE_AND_MAP, EXPLORE_AREA, MAINTENANCE_HOLD, UNKNOWN
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
Available options: STARTED, PROGRESS, SUSPENDED, RESUMED, COMPLETED, FAILED, CANCELED, REJECTED, UNKNOWN
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
Available options: BEHAVIOR_EVENT
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
{
"activity": "ROUTE_RUN",
"activity_uuid": "kX9mQ2rTSa6vL0pWcYb1Ng",
"battery": {
"start_pct": 91
},
"description": "Patrol run",
"distance_remaining": 6.4,
"estimated_time_remaining_sec": 18,
"event": "PROGRESS",
"event_uuid": "Q1w2E3r4T5y6U7i8O9p0AQ",
"goal_pose": {
"orientation": [
0,
0,
0.7071,
0.7071
],
"position": [
4.2,
-1.5,
0
]
},
"navigation_time_sec": 42.5,
"originator_uuid": "Zx8Cv7Bn6Mm5Ll4Kk3Jj2A",
"phase": "NAVIGATE_TO_WAYPOINT",
"phase_uuid": "G7Qpbx5-RnC9av0WwS3jbA",
"prediction": {
"available": true,
"confidence": "HIGH",
"consumption_pct": 4.5,
"distance_basis": "planned",
"distance_m": 120
},
"priority": 50,
"route_uuid": "Pz5Lc8Xe1Wa4Ru7Ty0Io3Q",
"started_at_ms": 1727799950000,
"timestamp": 1727800000000,
"type": "BEHAVIOR_EVENT",
"waypoint_index": 2,
"waypoint_total": 5,
"waypoint_uuid": "Hw4Rt7Yp2Kd9Vs3Bn6Mq1w"
}LASER_SCAN
Nearest obstacle per angular sector around the robot.
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
Covered sectors; a missing sector is a blind spot
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
Meters, parallel to indices; null = covered but clear out to max_range_m
Total sector count around the robot
Available options: LASER_SCAN
{
"frame": "base_footprint",
"indices": [
0,
1,
2,
35
],
"max_range_m": 3,
"ranges": [
1.25,
null,
2.4,
0.8
],
"sectors": 36,
"timestamp": 1727800000000,
"type": "LASER_SCAN"
}OCCUPANCY_GRID
Live occupancy grid of the map being built or used.
base64(zlib(width*height bytes, row-major)). Each byte is the ROS occupancy value + 1: 0 unknown, 1 free, 2-101 occupied 1-100%
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
Map-frame pose of cell (0,0): [x m, y m, yaw rad]
Items: 3 to 3
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
Meters per cell
Available options: OCCUPANCY_GRID
{
"data_compressed": "eJxjYASC1FRGBgZGRgAFWwDS",
"height": 3,
"origin": [
-10,
-5,
0
],
"resolution": 0.1,
"timestamp": 1727800000000,
"type": "OCCUPANCY_GRID",
"width": 4
}PLANNED_PATH
Planned navigation path as [x, y] points.
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
Available options: PLANNED_PATH
{
"frame": "map",
"poses": [
[
1.2,
-0.4
],
[
1.8,
-0.2
],
[
2.5,
0.1
]
],
"timestamp": 1727800000000,
"type": "PLANNED_PATH"
}ROBOT_STATE
Robot state: locomotion, battery, navigation mode and latest pose.
Available options: DISABLED, RH_SIMPLE_AVOIDANCE, DOCKING_AVOIDANCE, GO2_AVOIDANCE_MODE, GO2_FREE_AVOID
Positive = charging
Percent, 0-100
Available options: OFF, CHARGING, DISCHARGING, FULL, NOT_CHARGING, UNKNOWN
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
Available options: DISABLED, MAPPING, NAVIGATING
Available options: DISCONNECTED, OPERATIONAL, EMERGENCY_STOP
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
Available options: ROBOT_STATE
{
"avoidance_mode": "GO2_AVOIDANCE_MODE",
"battery_current_ma": -3200,
"battery_level": 82,
"battery_state": "DISCHARGING",
"battery_voltage_mv": 28600,
"latest_transform": {
"frame": "map",
"transform": {
"rotation": [
0,
0,
0.38,
0.92
],
"translation": [
1.2,
-0.4,
0
]
}
},
"locomotion_state": "STANDING",
"map_uuid": "bL0cfvn7Squz3-swZjifpg",
"navigation_stack_state": "NAVIGATING",
"operational_state": "OPERATIONAL",
"return_home": {
"available": true,
"confidence": "HIGH",
"distance_basis": "planned",
"distance_m": 38.5,
"required_pct": 7.2,
"sufficient": true
},
"timestamp": 1727800000000,
"type": "ROBOT_STATE"
}TELEMETRY
Robot pose sample. correlationId is the activity_uuid of the activity in progress.
Available options: IDLE, MANUAL_CMD_VEL, MANUAL_ACTION, MANUAL_POSTURE, NAVIGATE_TO_POSE, NAVIGATE_TO_HOME, NAVIGATE_TO_WAYPOINT, ROUTE_RUN, LOW_BATTERY_DOCKING, IDLE_DOCKING, DWELLING, EMERGENCY, EXPLORE_AND_MAP, EXPLORE_AREA, MAINTENANCE_HOLD, UNKNOWN
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
base 64 (url-safe) uuid string
Example: "AAAAAAAAAAAAAAAAAAAAAA"
Available options: TELEMETRY
{
"activity": "ROUTE_RUN",
"correlationId": "kX9mQ2rTSa6vL0pWcYb1Ng",
"frame": "map",
"mapUuid": "bL0cfvn7Squz3-swZjifpg",
"timestamp": 1727800000000,
"transformation": {
"rotation": [
0,
0,
0.38,
0.92
],
"translation": [
1.2,
-0.4,
0
]
},
"type": "TELEMETRY"
}reconnect
Sent by the cloud when the robot is not connected; reconnect later.
Available options: reconnect
{
"action": "reconnect",
"reason": "device_not_connected"
}