跳到主要内容

Pico 4 VR 真机遥操作

Pico Sim2Sim 跑通后,使用本教程把同一条实时 Pico 输入路径部署到 真实 Unitree G1。

Pico 头显 -> Teleopit host -> retarget -> RL policy -> g1_bridge_sdk -> G1

有两种部署方式:

部署方式Teleopit 运行位置主要区别
Wired PC-to-G1外部工作站或笔记本real_robot.network_interface 设置为 PC 上连接 G1 的以太网接口
OnboardG1 onboard 计算机在 onboard 计算机安装 Teleopit;通常使用 eth0

两种方式都使用 Pico4InputProvider 和进程内 pico-bridge receiver。不存在单独的 onboard Pico 输入模式。

Teleopit 面向 pico-bridge 0.2.1 及其 pico_native tracking 语义。

1. 安装运行时依赖

在运行 Teleopit 的机器上安装 Pico 和 sim2real 依赖:

pip install -e '.[pico4]'
git submodule update --init --recursive
bash scripts/setup/setup_g1_bridge.sh

验证 Pico receiver 导入:

python -c "from pico_bridge import PicoBridge; print('OK')"

2. 选择网络接口

real_robot.network_interface 是用于 Unitree DDS 通信的 Linux 网卡接口。

对于 wired PC-to-G1 部署:

  1. 用网线连接 PC 和 G1。
  2. 在 PC 上运行 ifconfig
  3. 使用连接到机器人的以太网接口,例如 enp130s0
  4. 确保 Pico 头显所在网络可以访问运行 Teleopit 的 PC。

对于 onboard 部署:

  1. 在机器人 onboard 计算机上运行 Teleopit。
  2. 确保 Pico 头显所在网络可以访问 onboard 计算机。
  3. 除非机器人网络不同,否则使用 real_robot.network_interface=eth0
  4. 如果 Pico discovery 广播了错误地址,设置 input.bridge_advertise_ip=<host-ip>

Arm Onboard 的 RealSense 配置

pico-bridge PC receiver 在所需 Python 依赖可用时支持 Arm 机器。对于需要 RealSense 预览的 Arm onboard 计算机,应在当前 Conda 环境中从 conda-forge 安装 pyrealsense2, 不要依赖 pip 包:

pip uninstall pyrealsense2
conda install -c conda-forge pyrealsense2

这只影响可选的 RealSense 预览路径(input.video.enabled=true)。Pico 追踪和机器人控制 本身不需要 RealSense。

3. 运行控制器

Wired PC 示例:

python scripts/run/run_sim2real.py \
--config-name pico4_sim2real \
controller.policy_path=track.onnx \
real_robot.network_interface=enp130s0

Onboard 示例:

python scripts/run/run_sim2real.py \
--config-name pico4_sim2real \
controller.policy_path=track.onnx \
real_robot.network_interface=eth0

可选 HDF5 录制

在负责 Pico 输入和 RealSense 的机器上安装 recording extra:

pip install -e '.[recording]'

运行录制配置:

python scripts/run/run_sim2real.py \
--config-name sim2real_record \
controller.policy_path=track.onnx \
real_robot.network_interface=enp130s0 \
recording.task="walk forward"

终端控制为:R 开始 episode,S 保存,D 丢弃,Q 关闭。可以录制 STANDINGMOCAPARMS 和暂停状态的 mocap;已经保存的 episode 不支持再丢弃。 episode 会保存为 data/recordings/sim2real_hdf5/episodes/ 下的 .h5 文件, 压缩 MP4 sidecar 视频保存在 data/recordings/sim2real_hdf5/videos/ 下。 HDF5 episode 以 30 Hz 保存 frame_indextimestamp 同步数组,以及 observation.state(68)observation.mode(1)action(36)action.hand(12)

操作流程

始终把 Unitree 遥控器拿在手里。L1+R1 是进入 DAMPING 的急停路径。

控制动作
Unitree remote Start进入 STANDING
Unitree remote Y进入 MOCAP
Pico/controller A暂停 / 恢复实时动捕
Pico/controller BMOCAP / ARMS 之间切换
Unitree remote X返回 STANDING
Unitree remote L1+R1急停(DAMPING

只在 Pico 追踪稳定后进入 MOCAP。Teleopit 会在切换前验证连续动捕帧;验证失败时, 机器人会保持在 STANDING

运行时行为

Pico sim2real 使用共享的实时参考时间线:

Pico body frames -> retarget -> reference buffer -> observation -> policy -> G1 joints

进入 STANDING 时,Teleopit 会释放当前 Unitree 模式,进入 debug/low-level 控制, 短暂锁住当前关节,重置 policy 状态,并在不改变 policy target 的情况下执行 Kp ramp。

进入 MOCAP 时,Teleopit 会重新 arm 进程隔离的 reference worker,重置其中的 GMR 状态 和实时 reference buffer,然后等待新的已验证 reference,再开始跟踪实时 mocap 命令。 STANDINGDAMPING 会让 reference worker 保持 disarmed,避免冷启动帧在进入 mocap 之前 warm-start retargeting。

ARMS 会保持同一条实时 retargeting 时间线继续运行,但发送给 motion tracker 的参考会被组合: 身体、腰部和腿部保持站立姿态,双臂跟随实时 retarget 结果。进入或离开 ARMS 时会重置 policy/reference 对齐,并使用同一套 Kp ramp 安全路径。

暂停 / 恢复

Pico 暂停/恢复是 mocap-session control event。

  • ACTIVE:暂停键冻结当前参考姿态。
  • PAUSED:再次按下会清空 policy/reference 状态,预热实时 buffer,重新居中 yaw/XY 对齐, 并从实时 mocap 恢复。
注意

恢复时请保持静止,并尽量接近暂停时的姿态。这样可以减少实时追踪恢复时的参考突变。

可选 LinkerHand 控制

Pico sim2real 可以用 Pico 输入控制 LinkerHand:

  • gripper:按住同侧 grip 作为 deadman,同侧 trigger 控制对应手闭合。 该模式支持 hands.driver=linkerhand_l6hands.driver=linkerhand_o6; 速度和张开/闭合姿态来自对应 driver 配置。
  • vr_hand_pose:只支持 L6,通过 somehand 重定向 Pico 手部 pose,并下发连续 L6 手部目标。 如果某侧手部 pose 消失,该侧会保持上一条手势命令。这个模式使用 Teleopit 的 Pico landmark 适配器和 somehand 0.2.0 公开的 somehand.api,并始终将 L6 速度设为最大值。默认配置使用 60 Hz 的低延时 somehand 路径并减少平滑,所以响应会更快, 但可能比标准 somehand 设置更抖。

hands.enabled=true 时,手控会在所有 sim2real 模式中保持生效。退出和手控运行时失败会发送配置的张开姿态。

如果主 Pico profile 没有包含手控支持,先安装本地手控包:

git submodule update --init --recursive
pip install -e third_party/linkerhand-python-sdk
pip install -e third_party/somehand
scripts/setup/download_somehand_l6_assets.sh

测试或运行手控前,先开启 CAN 接口:

sudo /usr/sbin/ip link set can0 up type can bitrate 1000000
sudo /usr/sbin/ip link set can1 up type can bitrate 1000000

启用完整 sim2real 前,先用独立开合测试验证灵巧手连接。测试默认一直运行到 Ctrl-C:

python scripts/dev/test_linkerhand_l6.py \
--hand-type both \
--left-can can0 \
--right-can can1

O6 独立开合测试需要加上 O6 driver:

python scripts/dev/test_linkerhand_l6.py \
--driver linkerhand_o6 \
--hand-type both \
--left-can can0 \
--right-can can1

如果要用实时 Pico gripper 输入测试 O6,再加 --mode gripper

然后在 Pico sim2real 中启用 L6 gripper 控制:

hands.enabled=true
hands.driver=linkerhand_l6
hands.mode=gripper
hands.linkerhand_l6.left_can=can0
hands.linkerhand_l6.right_can=can1

O6 gripper 控制使用:

hands.enabled=true
hands.driver=linkerhand_o6
hands.mode=gripper
hands.linkerhand_o6.left_can=can0
hands.linkerhand_o6.right_can=can1

连续 VR 手部 pose 控制使用:

hands.enabled=true
hands.driver=linkerhand_l6
hands.mode=vr_hand_pose
hands.linkerhand_l6.left_can=can0
hands.linkerhand_l6.right_can=can1

可选 RealSense 预览

将 G1 RealSense 彩色相机推送回 Pico 头显:

python scripts/run/run_sim2real.py \
--config-name pico4_sim2real \
controller.policy_path=track.onnx \
real_robot.network_interface=enp130s0 \
input.video.enabled=true \
input.video.device=<optional-realsense-serial>

如果视频失败,控制会继续运行,除非设置了 input.video.fail_on_error=true

常用参数

# G1 DDS 网卡接口
real_robot.network_interface=enp130s0

# Pico 超时时间
input.pico4_timeout=30

# 覆盖 Pico discovery 广播 IP
input.bridge_advertise_ip=192.168.1.20

# 进入 MOCAP 前要求的连续有效动捕帧数
mocap_switch.check_frames=10

# 更换 Pico 暂停键
input.pause_button=right_axis_click

# 开启 LinkerHand gripper 控制
hands.enabled=true
hands.driver=linkerhand_l6
hands.mode=gripper

# 开启头显视频预览
input.video.enabled=true

故障排查

现象可能原因解决方法
没有收到 LowState网卡错误或 G1 网络未连接检查网线和 real_robot.network_interface
TimeoutError: No Pico4 body data头显未连接或追踪未激活检查头显 app、网络和 input.pico4_timeout
无法进入 debug modeUnitree mode 释放失败停止其他机器人模式后再次按 Start
机器人进入 STANDING 但不进入 MOCAP动捕验证失败保持追踪稳定,查看 mocap_switch.check_frames 日志
Pico 暂停没有返回 STANDING这是预期行为Pico 暂停只冻结 mocap;按遥控器 X 返回 STANDING
LinkerHand 不动hands.enabled=false、gripper deadman 未按住、SDK/资产未安装,或 CAN 通道错误设置 hands.enabled=truehands.mode,运行 scripts/dev/test_linkerhand_l6.py,并检查所选 driver 的 left_can / right_can
视频预览不可用RealSense 或视频源失败检查相机权限、input.video.source 和日志