前言
本文解读基于宇树人形机器人的二次开发与开源库,重点介绍如何基于 G1 进行 manipulation 开发。目前市面上的人形机器人开发多基于宇树、智元、傅利叶等厂商本体。
- 傅利叶将 idp3 封装进了 Lerobot。
- 宇树通过开源库
unitree_IL_lerobot集成了 Lerobot,该库包含了π0策略。
无论使用哪种集成方案,都可以使用宇树开源的摇操代码(如 xr_teleoperate)去收集数据。
第一部分 基于宇树开源的 avp(xr 以前的版本) 摇操程序:让苹果 VR 摇操机器人
本部分介绍如何使用 Apple Vision Pro 进行遥操作,以控制宇树科技的 Unitree H1_2 或 G1 手臂的示例程序。 avp 基于 Open-television 改造,对应的 GitHub 地址为:github.com/unitreerobotics/avp_teleoperate。
开发者只需佩戴 Vision Pro,即可通过摄像头进行手势追踪以操作机器人。
以下是网络拓扑图,以 G1 机器人为例。
1.1 Ubuntu、双臂 inverse kinematics 环境配置、unitree_dds_wrapper 配置
- 操作系统:Ubuntu 20.04 和 Ubuntu 22.04。
- 通信库:原 h1_2 分支中的临时版本
unitree_dds_wrapper已更新为 Python 版控制通信库unitree_sdk2_python。
# 安装 unitree_sdk2_python 库 (tv)
unitree@Host:~$ git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
cd unitree_sdk2_python
pip install -e .
- 双臂 inverse kinematics 环境配置:用于求解末端位姿逆运动学相关的软件库。使用 pinocchio 和 CasADi 库加载 URDF 并进行逆运动学计算。
conda create -n tv python=3.8
conda activate tv
# 确保 pinocchio 版本为 3.1.0
conda install pinocchio -c conda-forge
pip install meshcat
pip install casadi
注意:使用 pip 安装的 pinocchio 有可能不是最新版本 3.1.0,本环境需要使用 3.1.0 版本。
1.2 TeleVision 环境配置和 Apple Vision Pro 通信配置
1.2.1 基本环境配置和 Isaac Gym 安装
cd ~
git clone https://github.com/unitreerobotics/avp_teleoperate.git
cd avp_teleoperate
pip install -r requirements.txt
下载 Isaac Gym 安装包并解压,执行 pip install -e .。
1.2.2 证书生成相关配置
由于苹果不允许在非 HTTPS 连接上使用 WebXR,需要创建自签名证书。
- 安装 mkcert:
brew install mkcert eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" sudo apt-get install build-essential procps curl file git - 生成证书:
mkcert -CAROOT # 获取 rootCA.pem 路径,通过隔空投送发送到 Apple Vision Pro mkcert -install && mkcert -cert-file cert.pem -key-file key.pem 192.168.123.2 localhost 127.0.0.1 cp cert.pem key.pem ~/avp_teleoperate/teleop/ - 防火墙设置:
sudo ufw allow 8012
1.2.3 启用 Apple Vision Pro 的 WebXR 相关功能、进入 VR
设置 >> Apps >> Safari 浏览器 >> 高级 >> 功能标志 >> 启用 WebXR 相关功能。
启动程序:
cd ~/avp_teleoperate/teleop
python teleop_hand.py
在 Apple Vision Pro 的浏览器输入 https://192.168.123.2:8012?ws=wss://192.168.123.2:8012,点击 "Enter VR"。
1.3 硬件清单:涉及 VR、头部的双目相机、手腕上的深度相机 D405
| 物品名称 | 数量 | 说明 |
|---|---|---|
| Apple Vision Pro | 1 | 参考 Apple 官方网址 |
| 计算机 | 1 | x86_64 架构 |
| 人形机器人 H1 | 1 | 具体型号为 H1_2 |
| 灵巧手 | 1 | H1 可搭载 Inspire Robotics (RH56DFX) 的仿人五指灵巧手 |
| 头部双目相机 | 1 | 普通 USB 免驱动双目相机,推荐使用 FOV 较大的相机 |
| 头部相机支架 | 1 | GitHub 链接 |
1.3.2 手腕上的深度相机 D405
戴机器人手腕上的英特尔 RealSense D405 相机。需配合腕部相机环形支架及左右腕相机支架使用。
1.4 启动程序
1.4.1 开启灵巧手服务
参考《RH56DFX 灵巧手开发》配置相关环境和编译控制程序。
- 下载灵巧手控制接口程序,拷贝到机器人 PC2 中。
- 编译并运行:
sudo apt install libboost-all-dev libspdlog-dev cd h1_inspire_service & mkdir build & cd build cmake .. -DCMAKE_BUILD_TYPE=Release make sudo ./inspire_hand -s /dev/ttyUSB0 ./h1_hand_example
1.4.2 开启图像推流服务 image_server
将 image_server.py 拷贝到机器人 PC2 中执行:
python image_server.py
注意检查 OpenCV 读取图像时的参数是否与双目相机硬件匹配,以及默认 5555 端口是否可用。
1.4.3 启动遥操作程序
务必确保 G1 已经进入调试模式(阻尼:长按 L2 + 单击 B,或零力矩:长按 L2 + 单击 Y)。
操作员 A 戴上 Apple Vision Pro,访问 https://192.168.123.2:8012?/ws=wss://192.168.123.2:8012。
操作员 B 在终端按下 r 键启动远程操作程序。
启动命令示例:
# 1. G1(29DoF) 机器人 + Dex3-1 灵巧手
python teleop_hand_and_arm.py --arm=G1_29 --hand=dex3
# 2. 仅 G1(29DoF) 机器人
python teleop_hand_and_arm.py
# 3. 开启数据可视化 + 录制
python teleop_hand_and_arm.py --arm=G1_23 --record
1.5 avp_teleoperate 与 OpenTeleVision 的差异对比
| 特性 | avp_teleoperate | OpenTeleVision |
|---|---|---|
| 项目定位 | Unitree 专用,支持多种机型 | 学术研究项目,通用框架 |
| 核心架构 | 分层设计(图像、姿态、控制) | 功能模块化(模仿学习、远程操作) |
| 技术实现 | 工业级控制,Pinocchio IK | WebRTC 通信,ACT/DETR 模型 |
第二部分 xr_teleoperate:avp_teleoperate 的升级版
2025 年 7 月,宇树开源的 avp_teleoperate 升级为了 xr_teleoperate,支持了更多灵巧手且 XR 设备支持模式扩展为手部跟踪和控制器跟踪两种。
2.1 安装
系统依然是 Ubuntu 20.04 或 Ubuntu 22.04。
2.1.1 基础环境
conda create -n tv python=3.10 pinocchio=3.1.0 numpy=1.26.4 -c conda-forge
conda activate tv
git clone https://github.com/unitreerobotics/xr_teleoperate.git
cd xr_teleoperate
git submodule update --init --depth 1
cd teleop/televuer
pip install -e .
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem
cd ../robot_control/dex-retargeting/
pip install -e .
cd ../../../
pip install -r requirements.txt
2.1.2 unitree_sdk2_python
git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
cd unitree_sdk2_python
pip install -e .
注意:在 xr_teleoperate >= v1.1 版本中,unitree_sdk2_python 仓库的 commit 必须是等于或高于特定版本。
2.2 仿真部署
2.2.1 环境配置
启动仿真:
conda activate unitree_sim_env
cd ~/unitree_sim_isaaclab
python sim_main.py --device cpu --enable_cameras --task Isaac-PickPlace-Cylinder-G129-Dex3-Joint --enable_dex3_dds --robot_type g129
2.2.2 启动遥操
启动参数说明:
--record: 启用数据录制模式--motion: 启用运动控制模式--headless: 启用无图形界面模式--sim: 启用仿真模式
基础控制参数:
--xr-mode: hand (手势跟踪) / controller (手柄跟踪)--arm: G1_29 / G1_23 / H1_2 / H1--ee: dex1 / dex3 / inspire1 / brainco
启动命令示例:
python teleop_hand_and_arm.py --xr-mode=hand --arm=G1_29 --ee=dex3 --sim --record
2.3 真机部署
2.3.1 图像服务
将 image_server.py 复制到机器人 PC2 并执行:
python image_server.py
测试通信:
python image_client.py
2.3.2 BrainCo 手部服务
手动启动两个巧手的服务:
sudo ./brainco_hand --id 126 --serial /dev/ttyUSB1
sudo ./brainco_hand --id 127 --serial /dev/ttyUSB2
2.3.3 启动遥操
- 未开启运动控制模式时,确保机器人进入调试模式。
- 开启运动控制模式时,右手柄按钮 A 为退出功能,双摇杆按键同时按下为软急停。
第三部分 unitree_IL_lerobot 的安装与运行
依据宇树官方的 Github:unitreerobotics/unitree_IL_lerobot。
3.1 环境安装与数据采集、转换
3.1.1 环境安装
git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
cd unitree_sdk2_python && pip install -e .
git clone --recurse-submodules https://github.com/unitreerobotics/unitree_IL_lerobot.git
git submodule update --init --recursive
conda create -y -n unitree_lerobot python=3.10
conda activate unitree_lerobot
cd lerobot && pip install -e .
cd .. && pip install -e .
3.1.2 数据采集
可以使用 avp/xr 现采的数据,也可以从 HuggingFace 加载数据集:unitreerobotics/G1_ToastedBread_Dataset。
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset
import tqdm
episode_index = 1
dataset = LeRobotDataset(repo_id="unitreerobotics/G1_ToastedBread_Dataset")
from_idx = dataset.episode_data_index["from"][episode_index].item()
to_idx = dataset.episode_data_index["to"][episode_index].item()
for step_idx in tqdm.tqdm(range(from_idx, to_idx)):
step = dataset[step_idx]
3.1.3 数据转换
将 json 格式转换为 lerobot 格式:
python unitree_lerobot/utils/convert_unitree_json_to_lerobot.py \
--raw-dir $HOME/datasets/g1_grabcube_double_hand \
--repo-id your_name/g1_grabcube_double_hand \
--robot_type Unitree_G1_Dex3 \
--push_to_hub true
3.2 训练与测试
3.2.1 训练
训练 pi0:
python lerobot/scripts/train.py \
--dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \
--policy.type=pi0
训练 diffusion policy:
python lerobot/scripts/train.py \
--dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \
--policy.type=diffusion
训练 ACT:
python lerobot/scripts/train.py \
--dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \
--policy.type=act
3.2.2 真机测试
python unitree_lerobot/eval_robot/eval_g1/eval_g1.py \
--policy.path=unitree_lerobot/lerobot/outputs/train/... \
--repo_id=unitreerobotics/G1_ToastedBread_Dataset


