Skip to main content
The bridge runs as a ROS node called zrt_teleop_bridge. The leader runs on the operator machine, under /leader. The follower runs on the robot machine, under /follower.

Settings

Set these in your params file. One file can serve both machines when the joint ranges come from calibration_profile, because each machine reads its own calibration. With joint_min and joint_max, each machine needs its own values for its own arm. The room id and token come from the ZERORUNTIME_MEETING_ID and ZERORUNTIME_AUTH_TOKEN environment variables.

Services

All services are std_srvs/srv/Trigger. The few that need input read it from parameters, so set those first with ros2 param set. The full name is /<namespace>/zrt_teleop_bridge/<service>. For example:
To answer calls on the robot, list the method names in its params file as rpc_methods. Each call is published on rpc/requests, and the reply is the rpc_reply_<method> parameter (JSON, default {"ok": true}).

Recording

Recording runs on the robot machine and goes to the cloud (billed). Start it with start_recording, and wait until the log shows cloud recording: ready. While it’s on, each take_control starts an episode and each release_control ends it. If the cloud isn’t ready in time, it records on the robot machine only; a local copy is kept there either way.
leave stops the recording. After join, call start_recording again.

Cameras

Connect cameras to the robot machine. The operator sees them as video. By default the follower bridge streams every USB camera, as cam0, cam1, and so on. To choose, set ZERORUNTIME_CAMERAS before you start it: camera names, comma-separated, or none for no cameras. To list the names, run this on the robot machine:
It ends with a ready line to copy, for example:
Or list the cameras in the robot machine’s params file. This wins over ZERORUNTIME_CAMERAS:
Handles are device paths: /dev/v4l/by-path/..., /dev/v4l/by-id/..., or /dev/videoN (which can change after a reboot). A bare number like '0' is not a camera: it streams a test pattern. camera_labels is optional. You can also set camera_width, camera_height, and camera_fps (defaults 640, 480, and 30).

Policy mode

A policy, such as a trained model, can control the robot instead of a leader arm. Start the leader bridge in policy mode:
Then call take_control as usual, and publish trajectory_msgs/JointTrajectory messages to /leader/zrt_teleop_bridge/action_chunk. Each message is a short list of joint positions, evenly spaced in time, in the same units as the leader’s topic. The robot plays them in order, and a new message replaces the current one. Read the robot’s position from /leader/zrt_teleop_bridge/remote/follower_states. max_misalignment is ignored in policy mode, and release_control and estop work as usual. The example project shows how to start policy mode, and its fake_chunk shortcut sends one test chunk.

Monitoring

Limitations

  • The bridge can’t turn off the motors. When it stops, the robot holds its position.
  • Only position control is supported.

What’s next

Quickstart

Connect your own ROS 2 robot.

ROS 2 adapters

Build your own ROS 2 node with the SDK.