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 的以太网接口 |
| Onboard | G1 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 部署:
- 用网线连接 PC 和 G1。
- 在 PC 上运行
ifconfig。 - 使用连接到机器人的以太网接口,例如
enp130s0。 - 确保 Pico 头显所在网络可以访问运行 Teleopit 的 PC。
对于 onboard 部署:
- 在机器人 onboard 计算机上运行 Teleopit。
- 确保 Pico 头显所在网络可以访问 onboard 计算机。
- 除非机器人网络不同,否则使用
real_robot.network_interface=eth0。 - 如果 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 关闭。可以录制
STANDING、MOCAP、ARMS 和暂停状态的 mocap;已经保存的 episode 不支持再丢弃。
episode 会保存为 data/recordings/sim2real_hdf5/episodes/ 下的 .h5 文件,
压缩 MP4 sidecar 视频保存在 data/recordings/sim2real_hdf5/videos/ 下。
HDF5 episode 以 30 Hz 保存 frame_index 和 timestamp 同步数组,以及
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 B | 在 MOCAP / 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 命令。
STANDING 和 DAMPING 会让 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_l6和hands.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