Teleop Project (Onboard Orin)
Use this path when Pico / XR tooling runs directly on the G1 onboard Orin. The root project still provides the policy runtime and scripts/real_bridge.py.
Setup
uv --project venv/teleop sync
Choose the setup path that matches the onboard Orin image:
JetPack 5
Download the JetPack 5 prebuilt package bundle and extract it at the repo root so prebuilt/ exists.
Install XRoboToolkit PC Service from the prebuilt bundle:
sudo apt install -y \
./prebuilt/jetpack5-aarch64/xrobotservice/XRoboToolkit-PC-Service_1.0.0.0_arm64_ubuntu20.04.deb
JetPack 6
If the onboard Orin is already on JetPack 6, for example after flashing Sonic, do not download the JetPack 5 prebuilt bundle.
Download the arm64 .deb for XRoboToolkit PC Service from:
https://github.com/XR-Robotics/XRoboToolkit-PC-Service/releases
sudo apt install -y ./XRoboToolkit*.deb
Start the service:
bash /opt/apps/roboticsservice/runService.sh
Clone the Pico SDK repos
mkdir -p external
git clone https://github.com/YanjieZe/XRoboToolkit-PC-Service-Pybind.git \
external/XRoboToolkit-PC-Service-Pybind
git clone https://github.com/XR-Robotics/XRoboToolkit-PC-Service.git \
external/XRoboToolkit-PC-Service
git -C external/XRoboToolkit-PC-Service checkout orin
These repos are used to build xrobotoolkit_sdk. They are separate from the installable XRoboToolkit PC Service .deb.
JetPack 5 only: replace the upstream aarch64 gRPC package
Build the JetPack 5 compatible package first by following XRobot gRPC JetPack 5, then replace the upstream directory:
export sdk_grpc="external/XRoboToolkit-PC-Service/RoboticsService/Redistributable/linux_aarch64/grpc"
export local_grpc="prebuilt/jetpack5-aarch64/xrobot-grpc"
rm -rf "$sdk_grpc.upstream"
mv "$sdk_grpc" "$sdk_grpc.upstream"
cp -a "$local_grpc" "$sdk_grpc"
If the onboard Orin is on JetPack 6, skip this section and keep the upstream linux_aarch64/grpc directory.
Build and install xrobotoolkit_sdk
bash scripts/setup/setup_xrobot_pybind.sh --arch aarch64
Verify Installation
Start the live retarget publisher on the G1 onboard Orin:
uv --project venv/teleop run sim2real/teleop/pico_retarget_pub.py \
--bind tcp://*:28701 \
--publish_hz 50 \
--actual_human_height 1.80
In a second terminal, run the realtime viewer and point it at the G1 Orin IP:
uv --project venv/teleop run sim2real/teleop/realtime_viewer.py \
--connect tcp://<g1-orin-ip>:28701 \
--viewer_hz 50
If the viewer updates with live G1 retargeted motion, the onboard teleop stack is ready.
Notes
- Run
uv syncin the repo root as well when the onboard machine also runs the policy and bridge processes. - When the Pico publisher runs on a separate PC, point policy-side ZMQ arguments at that machine's IP.