Docker Images
The full robot stack is published as four images on Docker Hub, each available in three tags (jazzy, humble, jetson-humble):
The
jetson-humble driver image ships with optimized defaults for constrained hardware.
Quick Start
When connected to the Cyberwave platform, the edge-core service automatically pulls and starts all required containers based on the asset metadata configured for your twin. For local development with Docker Compose, see the driver README.ROS 2 Topics
The driver publishes standard ROS 2 topics that any ROS 2 node can consume independently:
All robot-specific topics are namespaced as
twin_<your-twin-uuid> by default.
Key Environment Variables
Obstacle Avoidance
WhenGO2_OBSTACLE_AVOIDANCE=true (the default), velocity commands are routed
through the Go2’s firmware obstacle avoidance pipeline instead of the standard
Sport API. The firmware fuses ultrasonic and LiDAR sensors to detect obstacles
and will override velocity commands to prevent collisions.
On startup the driver sends SwitchSet and UseRemoteCommandFromApi to the
robot so the firmware accepts velocity commands from the ROS 2 stack rather than
only the physical remote controller.
To disable:
Obstacle Avoidance & Teleoperation
There are two layers of obstacle avoidance on the Go2:- Onboard — the robot’s built-in ultrasonic + LiDAR avoidance at the firmware level.
- Driver-level — path planning avoidance through costmaps constructed in real time by the navigation stack.
GO2_OBSTACLE_AVOIDANCE=true (configurable in the twin metadata;
enabled by default), the driver activates both layers for autonomous
navigation.
Recommended teleoperation during mapping:
- Cyberwave keyboard controller — obstacle avoidance is active (onboard + driver-level). This is the recommended way to drive the robot while building a map of your environment.
- Unitree physical remote — always retains onboard obstacle avoidance regardless of driver configuration.
AES-128 Key (firmware ≥ 1.1.15)
Go2 firmware 1.1.15+ uses a per-device AES-128 key (data2=3 protocol) to
encrypt the WebRTC LAN handshake. Without this key, both the driver node and
native video node will fail to connect.
Fetch the key using the unitree_webrtc_connect CLI (requires the Unitree
account used in the Unitree Go/Explore mobile app):
shared_env:
Older firmware (below 1.1.15) uses a static key built into the driver and does
not require this variable. If
GO2_AES_128_KEY is unset and the robot returns
data2=3, the driver will log a clear error with instructions.Robot IP discovery
The driver validates that the Go2 is reachable before starting any ROS 2 node, so you get a fast failure instead of a silent WebRTC hang. Resolution order:ROBOT_IP(from env or Edge Core metadata) — probed via TCP on port 9991.- If unreachable (or unset), each address in
ROBOT_IP_FALLBACKSis tried. - First address that responds is used for the entire stack.
- If nothing responds, the container exits with an error and pushes a
robot_unreachablealert to Cyberwave (if SDK credentials are available).
Custom networks: If your Go2 is on a different subnet (e.g. behind a
router), override the fallback list:
ROBOT_IP (preferred address) and ROBOT_IP_FALLBACKS
(safety net). If the preferred IP is unreachable, the driver automatically
falls through to the fallback list.
The probe uses a TCP socket connect on port 9991 (Go2 WebRTC signaling) with a
2-second timeout per address. No WebRTC handshake is attempted. Simulation
launches skip the check entirely.
Config Profiles
Set
CONFIG_PROFILE=jetson or use the jetson-humble Docker image which sets this automatically.
Edge Core metadata
When using Cyberwave Edge Core for managed deployment, the driver stack is configured through twin/asset metadata. Edge Core reads this metadata, pulls images, and injects environment variables automatically.Multi-container configuration
The Go2 ROS 2 stack runs as multiple cooperating containers. Define the stack inmetadata.drivers using the services array:
services array. To
set the robot IP or fallback list, add them to shared_env:
edge_configs per-device pattern.
Stream Recording
The Go2 driver streams video to the Cyberwave media service via WebRTC. Each stream can request server-side recording (producing MP4 artifacts for later replay).
Default behavior (no env vars set):
camera_bridge— records by default (true).occupancy_grid_bridge,local_costmap_bridge,global_costmap_bridge— do not record by default.
CYBERWAVE_ENABLE_RECORDING— if set, overrides everything.- Per-bridge env var (e.g.
CYBERWAVE_ENABLE_RECORDING_PREVIEW) — overrides the built-in default. - Built-in default.
Recording is handled by the media service SFU, not on the edge device.
Enabling recording adds negligible load to the robot’s hardware.
Jetson Performance Tuning
Running the full Go2 stack on a Jetson Orin Nano (or similar constrained hardware) requires tuning runtime rates and encoder settings. Add these to your.env file or Edge Core shared_env:
These values are tuned for a Jetson Orin Nano running the full stack (driver +
Nav2 + SLAM). If your board has more headroom (e.g. Orin NX) or less (e.g.
other services running), you can adjust camera and pointcloud rates
accordingly.