Pico Teleoperation
This tutorial uses the teleop publisher for live Pico / XR retargeting, its built-in mjviser server to inspect the retargeted G1 motion, and the root project tracking policy for execution.
1. Start the Pico retarget publisher
uv run --project venv/pico sim2real/teleop/pico_retarget_pub.py
Open the mjviser URL printed by the publisher and keep it open until the retargeted G1 motion looks correct.
2. Choose the execution backend
Sim2Sim
Start the MuJoCo execution process:
uv run sim2real/sim_env/base_sim.py
In another terminal, start the tracking policy against the live motion stream:
uv run sim2real/rl_policy/tracking.py \
--policy-config checkpoints/mimic-lite/roa/policy.yaml \
--motion-backend zmq \
--controller pico
Sim2Real
For hardware, first choose the deployment path in Robot I/O. The Pico-specific policy flags stay the same:
uv run sim2real/rl_policy/tracking.py \
--policy-config checkpoints/mimic-lite/roa/policy.yaml \
--motion-backend zmq \
--controller pico
Add only the robot I/O flag or bridge process required by the mode you chose.
Pico Controls
- Press
Ato enter the init pose. - Press
A+Bto enter policy mode. - Press
Xto unpause the motion flow.
DH116S hand control
The Pico publisher also sends the left and right analog trigger values as
normalized hand-grip commands on TCP port 5593. The left trigger controls the
left DH116S and the right trigger controls the right DH116S.
Install the repo-local SDK once on the computer with the DH116S CANFD adapters:
./third_party/dh116s_sdk/install.sh
uv sync --project venv/dh116s
The installer detects aarch64 or x86_64 and writes the runtime under
third_party/dh116s_sdk/python. Then start the hand process from the root
project environment:
uv run --project venv/dh116s --no-sync scripts/dh116s_control.py \
--hand-dir double \
--connect tcp://<pico-publisher-ip>:5593
The hardware process enables and homes every requested hand during startup.
Clear the workspace around both hands before launching it. If either hand fails
to initialize in double mode, the process disconnects and exits.
The default hardware mapping is left hand can0 / node 1 and right hand
can1 / node 1. To validate the ZMQ stream and the conservative 40% grasp
mapping without importing the SDK or moving hardware, run:
uv run --project venv/dh116s --no-sync \
scripts/dh116s_control.py --dry-run --hand-dir double
When the grip stream becomes stale, the process keeps the last commanded hand
pose. Stopping the process disconnects the SDK without automatically opening
the hands. Use --hand-dir left or --hand-dir right for staged bring-up.
Notes
pico_retarget_pub.pypublishes the live motion stream consumed by the tracking policy and opens the retarget mjviser server.- Hand-grip messages use their own ZMQ port and do not change the existing Pico button protocol.
sim2real/sim_env/base_sim.pyis the sim2sim execution backend.- For real hardware, Robot I/O lists the inline and bridge deployment modes.
- If the publisher and policy run on different machines, add
--motion-zmq-connect tcp://<publisher_ip>:28701.