Skip to main content

Robot I/O Modes

robot_io controls how the policy reads robot state and sends low-level commands. It is separate from:

  • inference_backend, which controls ONNX / TensorRT policy inference.
  • motion_backend, which controls the reference motion source.

For sim2sim with sim_env/base_sim.py, keep the policy on --robot-io zmq. For sim2real deployment, choose one of the three modes below.

Quick Choice​

ModeProcessesUse when
--robot-io inline --robot g1policy onlyPreferred G1 path when the policy runs on a machine with unitree_interface; avoids the extra ZMQ bridge hop.
--robot-io zmq + scripts/g1/real_bridge.pypolicy + Python DDS bridgeUse the G1 split-process bridge based on unitree_sdk2py.
--robot-io zmq + scripts/g1/real_bridge_cpp.pypolicy + unitree_interface bridgeKeep the ZMQ contract while using the unitree_interface robot binding.
tip

If hardware tests show violent joint shaking, or high-dynamic / high-speed motions look much worse than expected, suspect unstable ZMQ I/O latency first. Try --robot-io inline before retuning the policy or gains.

Inline​

Inline mode creates the G1 RobotIO backend inside BasePolicy. The policy runtime reads normalized RobotState values and sends commands through the backend without starting a bridge process.

uv run sim2real/rl_policy/tracking.py \
--robot-io inline \
--policy-config checkpoints/mimic-lite/roa/policy.yaml

Use this path first for real deployment when latency jitter matters. Add --robot-interface <robot_network_interface> only when the robot network interface is not the default eth0.

ZMQ With scripts/g1/real_bridge.py​

This mode keeps the policy and robot bridge in separate processes. The bridge uses unitree_sdk2py, publishes low_state over ZMQ, and applies low_cmd from ZMQ to the robot.

Terminal 1:

uv run scripts/g1/real_bridge.py

Terminal 2:

uv run sim2real/rl_policy/tracking.py \
--policy-config checkpoints/mimic-lite/roa/policy.yaml

Add --interface <robot_network_interface> to the bridge command only when the robot network interface is not the default eth0.

ZMQ With scripts/g1/real_bridge_cpp.py​

This mode keeps the same ZMQ contract as scripts/g1/real_bridge.py, but the bridge uses unitree_interface for robot I/O.

Terminal 1:

uv run scripts/g1/real_bridge_cpp.py

Terminal 2:

uv run sim2real/rl_policy/tracking.py \
--policy-config checkpoints/mimic-lite/roa/policy.yaml

Add --interface <robot_network_interface> to the bridge command only when the robot network interface is not the default eth0.

Rule Of Thumb​

Use inline for the normal real-robot deploy path. Use ZMQ bridge mode when you need process isolation, want to debug the policy and robot bridge separately, or are running sim2sim with base_sim.py.