跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

宇树 G1 人形机器人 VR 遥操作及 LeRobot 集成开发指南

宇树 G1 人形机器人支持通过 Apple Vision Pro 或 Meta Quest 等 XR 设备进行 VR 遥操作。文章对比了 avp_teleoperate 与升级版 xr_teleoperate 架构差异,涵盖环境配置、硬件清单(深度相机、灵巧手)、图像推流及服务启动流程。同时介绍了如何将采集的遥操作数据转换为 LeRobot 格式,利用 pi0、Diffusion Policy 或 ACT 策略进行模型训练与真机测试,实现从数据采集到策略部署的完整开发链路。

心动瞬间发布于 2026/4/8更新于 2026/7/2344 浏览
宇树 G1 人形机器人 VR 遥操作及 LeRobot 集成开发指南

前言

本文介绍基于宇树 G1 人形机器人的 VR 遥操作与 LeRobot 数据训练流程。通过整合开源库 unitree_IL_lerobot,可实现从数据采集到策略部署的完整开发链路。

第一部分 基于宇树开源的 avp(xr 以前的版本) 摇操程序:让苹果 VR 摇操机器人

本部分基于教程《Apple Vision Pro 遥操作示例》进行说明。 avp 基于 Open-TeleVision 改造,对应 GitHub 地址为:github.com/unitreerobotics/avp_teleoperate

详细介绍如何使用 Apple Vision Pro 进行遥操作,以控制宇树科技的 Unitree H1_2 或 G1 手臂的示例程序。

开发者只需佩戴 Vision Pro,即可通过摄像头进行手势追踪以操作机器人。

以下是网络拓扑图,以 G1 机器人为例。

1.1 Ubuntu、双臂 inverse kinematics 环境配置、unitree_dds_wrapper 配置

  1. Ubuntu 20.04 和 Ubuntu 22.04 操作系统下进行测试

注意,原来 h1_2 分支中的临时版本:unitree_dds_wrapper 配置 该部分用于配置计算机主机与人形机器人的 unitree_dds_wrapper,可以使用 python 实现主机和机器人之间的通信、控制。请执行下面命令进行安装

# 安装 python 版本的 unitree_dds_wrapper
git clone https://github.com/unitreerobotics/unitree_dds_wrapper.git
cd unitree_dds_wrapper/python
pip3 install -e .

但后来宇树更新为了 Python 版控制通信库:unitree_sdk2_python 故用下面这个即可

# 安装 unitree_sdk2_python 库 (tv)
unitree@Host:~$ git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
(tv) unitree@Host:~$ cd unitree_sdk2_python
(tv) unitree@Host:~$ pip install -e .

双臂 inverse kinematics 环境配置 该部分用于配置人形机器人 H1 双臂(共 14 个自由度)的末端位姿逆运动学求解相关的软件库 Apple Vision Pro 获取左右两个手腕位姿后,使用 pinocchio 和 CasADi 库加载 URDF 并进行逆运动学计算,求解出到达该位姿的关节电机角度值 meshcat 库则用于调试时在 Web 端进行可视化显示

unitree@Host:~$ conda create -n tv python=3.8
unitree@Host:~$ conda activate tv
# 如果您使用 `pip install`,请确保 pinocchio 版本为 3.1.0
(tv) unitree@Host:~$ conda install pinocchio -c conda-forge
(tv) unitree@Host:~$ pip install meshcat
(tv) unitree@Host:~$ pip install casadi

注意 使用 pip 安装的 pinocchio 有可能不是最新版本 3.1.0,本环境需要使用 3.1.0 版本,请仔细检查 必须先安装 pinocchio 并确保安装成功,然后再进行 TeleVision 的环境配置。安装顺序颠倒可能导致会安装好的 TeleVision 环境出错 下文所有终端命令都应该在 conda 的 tv 环境内执行,除非另有说明

1.2 TeleVision 环境配置和 Apple Vision Pro 通信配置

本例程在 TeleVision 开源项目基础上修改完成,下述部分配置也可参考该项目的 README 及相关页面。在此,Isaac Gym 仿真环境用于测试配置正确性

1.2.1 基本环境配置和 Isaac Gym 安装

使用 git 克隆本项目「avp_teleoperate」至本地后,进入到项目路径下,安装基本功能库:

cd ~
git clone https://github.com/unitreerobotics/avp_teleoperate.git
cd avp_teleoperate
pip install -r requirements.txt

之后,在 Isaac Gym 下载页面下载 Isaac Gym 安装包并解压,然后到 IsaacGym_Preview_4_Package/isaacgym/python 目录下执行下面命令:

pip install -e .
1.2.2 证书生成相关配置

由于苹果不允许在非 HTTPS 连接上使用 WebXR。要在本地测试应用程序,需要创建一个自签名证书并在客户端上安装它。您需要一台 Ubuntu 机器和一个路由器。将 Apple Vision Pro 和 Ubuntu 主机连接到同一个路由器

首先,安装 mkcert

使用 brew 安装 mkcert

brew install mkcert

配置环境变量

eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"

安装 brew

sudo apt-get install build-essential procps curl file git
cd ~
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

当要求输入回车键时,请按下回车。然后继续执行:

echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"' >> $HOME/.bash_profile

接下来,生成证书

在 Apple Vision Pro 中安装证书

mkcert -CAROOT

上面命令可以获取到 rootCA.pem 的路径。然后通过苹果的隔空投送功能把 rootCA.pem 文件发送到 Apple Vision Pro

系统防火墙设置

sudo ufw allow 8012

假设本机 IP 地址是 192.168.123.2 创建证书

mkcert -install && mkcert -cert-file cert.pem -key-file key.pem 192.168.123.2 localhost 127.0.0.1

把生成的 cert.pem 和 key.pem 两个文件拷贝到项目的 teleop 目录下:

cp cert.pem key.pem ~/avp_teleoperate/teleop/

查看本机 (你自己的办公电脑) IP 地址

(tv) unitree@Host:~/avp_teleoperate$ ifconfig | grep inet

注意:Apple Vision Pro 接收文件前需要启动文件接收功能,方法是:设置 >> 通用 >> 隔空投送 >> 所有人 (10 分钟)

1.2.3 启用 Apple Vision Pro 的 WebXR 相关功能、进入 VR

设置 >> Apps >> Safari 浏览器 >> 高级 >> 功能标志 >> 启用 WebXR 相关功能

提醒:在新版本 Vision OS 2 系统中,该步骤有所不同:将证书通过 AirDrop 复制到 Apple Vision Pro 设备后,将会在设置 APP 中左上角账户栏的下方出现证书相关信息栏,点击进去即可启用对该证书的信任

接下来,便可以进入 VR

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" 并且允许跟踪,就可以看到如下画面:

如 avp 官方 GitHub 所说 已经尝试在 PICO 4 Ultra Enterprise 和 Meta-Quest 3 上使用手部追踪进行遥操作。

更多配置步骤信息,您可以查看该 issue

1.3 硬件清单:涉及 VR、头部的双目相机、手腕上的深度相机 D405

硬件清单如下所示

1.3.1 VR 和头部的双目相机
物品名称数量渲染图说明
Apple Vision Pro1文章配图参考 Apple 官方网址
计算机1/x86_64 架构
人形机器人 H11/具体型号为 H1_2
灵巧手1文章配图H1 可搭载 Inspire Robotics (RH56DFX) 的仿人五指灵巧手,该灵巧手具有 6 个自由度和 12 个运动关节,可以模拟人手实现复杂动作
头部双目相机1文章配图普通 USB 免驱动双目相机,戴在机器人头部,主要作用是辅助操作人员,通过 Apple Vision Pro 观看到机器人视角下工作空间的视野
头部相机支架1文章配图avp_teleoperate/hardware/head_stereo_camera_mount.STEP

Q: 双目相机可以换为其他型号吗? A: 任意型号 USB 免驱动双目相机均可(推荐使用 FOV 较大的相机,保证操作时充足的视野)。新相机可通过 teleop/image_server/ 下的客户端 image_client.py 和服务端 image_server.py 程序进行测试

1.3.2 手腕上的深度相机 D405

戴机器人手腕上的英特尔 RealSense D405 相机

2文章配图Depth Camera D405 – Intel® RealSense™ Depth and Tracking Cameras
腕部相机环形支架2文章配图Link

有两个点值得提一下以上,可以通过 avp 官方 GitHub 确认:github.com/unitreerobotics/avp_teleoperate/blob/main/README_zh-CN.md

1.4 启动程序

在执行遥操作的程序前,需要预先启动一些服务支撑的程序

1.4.1 开启灵巧手服务

可以参考《RH56DFX 灵巧手开发》配置相关环境和编译控制程序

  1. 首先到 该网址 下载灵巧手控制接口程序,并将之拷贝到 机器人 Unitree H1_2 的 PC2 中

其次,在 PC2 中解压完成后,使用下述命令进行编译

unitree@PC2:~$ sudo apt install libboost-all-dev libspdlog-dev
# 构建项目
unitree@PC2:~$ cd h1_inspire_service & mkdir build & cd build
unitree@PC2:~/h1_inspire_service/build$ cmake .. -DCMAKE_BUILD_TYPE=Release
unitree@PC2:~/h1_inspire_service/build$ make
# 终端 1. 运行 h1 inspire 手部服务
unitree@PC2:~/h1_inspire_service/build$ sudo ./inspire_hand -s /dev/ttyUSB0
# 终端 2. 运行示例
unitree@PC2:~/h1_inspire_service/build$ ./h1_hand_example

如果发现左右灵巧手所有手指不断循环张开、闭合动作则表示成功。确认成功后,关闭 Terminal 2 中的 ./h1_hand_example 程序即可

1.4.2 开启图像推流服务 image_server

图像推流服务开启以后,可以在主机终端使用 image_client.py 测试通信是否成功(测试成功后记得关闭该程序):

(tv) unitree@Host:~/avp_teleoperate/teleop/image_server$ python image_client.py

把 avp_teleoperate/teleop/image_server 目录中的 image_server.py 拷贝到机器人 Unitree G1/H1/H1_2 的 开发计算单元 PC2 中,并在 PC2 内执行下面命令:

# 提醒 1:可以通过 scp 命令将 image_server.py 传输到 PC2,然后使用 ssh 远程登录 PC2 后执行它。
# 假设开发计算单元 PC2 的 ip 地址为 192.168.123.164,那么传输过程示例如下:
# 先 ssh 登录 PC2,创建图像服务器的文件夹
(tv) unitree@Host:~$ ssh [email protected] "mkdir -p ~/image_server"
# 将本地的 image_server.py 拷贝至 PC2 的~/image_server 目录下
(tv) unitree@Host:~$ scp ~/avp_teleoperate/teleop/image_server/image_server.py [email protected]:~/image_server/
# 提醒 2:目前该图像传输程序支持 OpenCV 和 Realsense SDK 两种读取图像的方式,请阅读 image_server.py 的 ImageServer 类的注释以便您根据自己的相机硬件来配置自己的图像传输服务
# 现在位于宇树机器人 PC2 终端
unitree@PC2:~/image_server$ python image_server.py
# 您可以看到终端输出如下:
# {'fps': 30, 'head_camera_type': 'opencv', 'head_camera_image_shape': [480, 1280], 'head_camera_id_numbers': [0]}
# [Image Server] Head camera 0 resolution: 480.0 x 1280.0
# [Image Server] Image server has started, waiting for client connections...

注意:这里需要检查 OpenCV 读取图像时的参数是否与双目相机硬件匹配,以及对于推流使用的默认 5555 端口是否可用

特别提醒:本地代码运行前,g1 上的 image_serve(视频流) 要开启

1.4.3 启动遥操作程序

在需要使用 SDK 进行开发调试时,请务必确保 G1 已经进入调试模式「阻尼:① 长按 L2 + 单击 B,或零力矩:长按 L2 + 单击 Y 模式下,遥控器 长按 L2 + 单击 R2 进入调试模式」,以停止运动控制程序发送指令,这样可以避免潜在的指令冲突问题。可按下 L2+A 来确认是否进入了调试模式

最好有两名操作员来运行此程序,称为 操作员 A 和 操作员 B

首先,操作员 B 需要执行以下步骤:修改 ~/avp_teleoperate/teleop/teleop_hand_and_arm.py 中 if name == 'main': 代码下方的 img_config 图像客户端配置,它应该与 上面的「1.3.2 开启图像推流服务」节中,你在 PC2 配置的图像服务器参数相同程序如果正常启动,终端最后一行将停留在 'Please enter the start signal (enter 'r' to start the subsequent program):' 的字符串输出

然后,操作员 A 需要执行以下步骤:戴上 Apple Vision Pro 设备。在 Apple Vision Pro 上打开 Safari,访问:https://192.168.123.2:8012?/ws=wss://192.168.123.2:8012 注意:此 IP 地址应与你的 主机 IP 地址匹配

点击 Enter VR 并选择 Allow 以启动 VR 会话你将会在 Apple Vision Pro 中看到机器人的第一人称视野

接下来,操作员 B 可以在终端中按下 r 键以启动远程操作程序

此时,操作员 A 可以远程控制机器人的手臂(和灵巧手)

如果使用了--record 参数,那么操作员 B 可以在打开的'record image'窗口中按 s 键开始录制数据,再次按 s 键停止。可以根据需要重复此操作进行多次录制 注意 1:录制的数据默认存储在 avp_teleoperate/teleop/utils/data 中,使用说明见此仓库:unitree_IL_lerobot。注意 2:请在录制数据时注意您的硬盘空间大小

根据你的机器人配置选择不同的启动参数。以下是一些启动命令示例:

# 1. G1(29DoF) 机器人 + Dex3-1 灵巧手 (实际上,G1_29 是--arm 的默认参数,可以选择不填写)
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=G1_29 --hand=dex3
# 2. 仅 G1(29DoF) 机器人
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py
# 3. G1 (23DoF) 机器人
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=G1_23
# 4. H1_2 机器人 + 一代 Inspire 灵巧手
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=H1_2 --hand=inspire1
# 5. H1 机器人
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=H1
# 6. 如果您想开启数据可视化 + 录制,还可以追加 --record 选项
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=G1_23 --record

最后,特别提醒下,每次重新遥操时,需要重启 Quest3,确保是先启动 python 程序,后进入 VR

1.5 avp_teleoperate 与 OpenTeleVision 的差异对比

1.5.1 核心架构的差异对比
avp_teleoperateOpenTeleVision
项目定位与目标由 Unitree Robotics 开发,专注于使用 Apple Vision Pro 控制 Unitree 系列机器人
明确支持多种 Unitree 机型:G1 (29DoF/23DoF)、H1 (4DoF)、H1_2 (7DoF) 等
基于 OpenTeleVision 等开源项目构建,但进行了针对性优化
学术研究项目,有 CoRL 2024 论文支持
更通用的远程操作框架,支持多种 VR 设备
除了远程操作,还包含模仿学习功能
核心架构差异

分层设计——明确分为三大模块:

\rightarrow  image_server(图像传输)

\rightarrow  open_television(姿态获取),将 OpenTeleVision 作为组件集成,通过 tv_wrapper 进行封装

\rightarrow  robot_control(机器人控制)
机器人特化:为特定机器人型号设计了专用控制器和逆运动学计算

  - 针对 G1、H1_2 等不同型号实现了专用控制器
  - 对 Dex3 和 Inspire 手部实现了专用控制
  - 使用Pinocchio库进行精确的逆运动学计算
入口程序:单一的 teleop_hand_and_arm.py 作为主入口,集成了所有功能

功能模块化:act(模仿学习) 和 teleop(远程操作) 两大功能模块
网络通信:更复杂的 WebRTC 通信架构,支持多种设备
研究工具:包含完整的数据收集、处理和训练流程
多入口设计:有 teleop_hand.py 和 teleop_active_cam.py 等不同功能入口
技术实现差异

图像处理
  - 使用专门的 image_server、image_client 架构
  - 支持多相机同步(头部和手腕相机)

通用 VR 交互
  - 使用 WebRTC 实现跨设备通信
  - 支持本地和网络流式传输
学习功能
  - 包含完整的模仿学习管线
  - 使用 ACT 和 DETR 等深度学习模型

模拟环境
  - 与 Isaac Gym 等模拟器集成
  - 提供模拟测试环境

源码依赖与复用- 在 LICENSE 中明确指出基于 OpenTeleVision 构建
- 复用了 OpenTeleVision 的远程操作接口,但进行了重组织
- 添加了大量针对 Unitree 机器人的专有代码
- 作为原始项目,提供了基础架构
- 更通用的实现,但缺少针对特定机器人的优化

总结一下

  1. 架构组织不同 avp_teleoperate 更关注控制层次,分为图像、姿态获取、机器人控制等层 OpenTeleVision 更关注功能模块,分为远程操作和模仿学习等功能
  2. 代码复用关系 avp_teleoperate 是在 OpenTeleVision 基础上的应用和扩展 保留了核心远程操作理念,但重新组织了代码结构以适应特定机器人
  3. 技术选择 avp_teleoperate 更注重工业级控制和精确的机器人运动学 OpenTeleVision 更注重通用性、研究功能和跨平台支持
1.5.2 代码结构上的差异对比

avp_teleoperate 的代码结构:

├── LICENSE                       # 声明基于 OpenTeleVision 等开源项目构建
├── README.md                     # 主要文档(多语言版本)
├── requirements.txt              # 依赖项
├── assets/                       # 机器人模型文件
│   ├── g1/                       # G1 机器人模型(URDF 和 STL 文件)
│   ├── h1_2/                     # H1_2 机器人模型
│   ├── inspire_hand/             # Inspire 手部模型
│   └── unitree_hand/             # Unitree Dex3 手部模型
├── hardware/                     # 硬件设计文件(摄像头支架等)
├── img/                          # 图片资源(安装指导等)
└── teleop/                       # 远程操作核心代码
    ├── teleop_hand_and_arm.py    # 主程序入口
    ├── image_server/             # 图像传输服务
    │   ├── image_client.py
    │   └── image_server.py
    ├── open_television/          # 基于 OpenTeleVision 的包装
    │   ├── constants.py
    │   ├── television.py
    │   └── tv_wrapper.py
    ├── robot_control/            # 机器人控制代码
    │   ├── hand_retargeting.py
    │   ├── robot_arm_ik.py
    │   ├── robot_arm.py
    │   ├── robot_hand_inspire.py
    │   ├── robot_hand_unitree.py
    │   └── dex_retargeting/      # 精细手部动作重定向
    └── utils/                    # 工具函数
        ├── episode_writer.py
        ├── mat_tool.py
        ├── rerun_visualizer.py
        └── weighted_moving_filter.py

而 OpenTeleVision 的代码结构为

├── LICENSE
├── README.md
├── requirements.txt
├── act/                          # 模仿学习模块(ACT 模型)
│   └── detr/                     # 目标检测模型
├── assets/                       # 资源文件
├── img/                          # 图片资源
├── scripts/                      # 各种脚本(处理数据、训练等)
│   ├── post_process.py
│   ├── replay_demo.py
│   └── deploy_sim.py
└── teleop/                       # 远程操作核心代码
    ├── dynamixel/                # Dynamixel 电机控制
    ├── webrtc/                   # WebRTC 网络通信
    ├── TeleVision.py             # 核心远程操作类
    ├── Preprocessor.py           # 数据预处理
    ├── constants_vuer.py         # 常量定义
    ├── motion_utils.py           # 运动工具函数
    ├── teleop_active_cam.py      # 主动相机控制
    └── teleop_hand.py            # 手部远程操作入口

可以看出,avp_teleoperate 代码的整体结构与 TeleVision 保持一致,以下是与 Unitree Robot 相关的文件目录

avp_teleoperate/
├── act                           # 存放模仿学习策略相关文件
├── assets                        # 存放机器人 URDF 相关文件
├── scripts                       # 存放一些工具类文件
├── teleop                        # 存放遥操作主要文件
│   ├── image_server/             # 图像推流服务端与客户端相关代码
│   │   ├── image_client.py       # 客户端(仅用于测试 Unitree H1_2 上的图像推流服务是否正常)
│   │   └── image_server.py       # 服务端(捕获相机的图像并通过网络对外发送,该代码在 Unitree H1_2 上运行)
│   ├── robot_control/            # 存放 IK 解算、手臂控制相关文件
│   │   ├── robot_arm_ik.py       # 双臂 IK 解算代码
│   │   ├── robot_arm.py          # 双臂控制代码
│   │   ├── robot_hand.py         # 机械手控制代码
│   │   ├── teleop_hand_and_arm.py# 遥操作的启动程序代码
│   │   └── teleop_hand.py        # 可用于测试环境配置

第二部分 xr_teleoperate:avp_teleoperate 的升级版

25 年 7 月 17 日,为了搞人形机器人的另一个方向——灵巧操作,对比过市面上好几款灵巧手,考虑到最终总得选择一款,故暂时先下单买了一支强脑二代灵巧手

因为长沙分部的同事此前没搞过灵巧手,故在我司上海同事、强脑技术支持、宇树技术支持的联合指导下,快速摸索,3 天即进入了灵巧手的二次开发状态,这三天中,最深刻的就是其中的一惊一喜

  • 惊的是,7.18 日下午,我们准备把 G1 的假手换成强脑灵巧手时,拆盖的时候,最后一个螺丝打滑了,就因为这个螺丝打滑的问题,把我们折腾的够呛 最后在 LEBA.Cui 的建议下,吉云的帮助下,找到了长沙一汽修厂的鄢总,通过一专业工具 瞬间搞定

喜的是,7.19 日上午,我们发现宇树此前开源的 avp_teleoperate 升级为了 xr_teleoperate,然后刚好支持了强脑二代手『你就说巧不巧吧,可能我们也无形中催促了他们一把,嗯,可能』,且 XR 设备支持模式扩展为手部跟踪和控制器跟踪两种

文章配图

最终于 7.19 日晚上,我们搞定了 VR 遥操强脑灵巧手 (单只右手)

2.1 安装

xr 整个系统的示意图和原来 avp 的差不太多

文章配图

至于系统依然是 Ubuntu 20.04 或 Ubuntu 22.04

2.1.1 基础环境
# 创建 conda 基础环境
(base) unitree@Host:~$ conda create -n tv python=3.10 pinocchio=3.1.0 numpy=1.26.4 -c conda-forge
(base) unitree@Host:~$ conda activate tv
# 克隆本仓库
(tv) unitree@Host:~$ git clone https://github.com/unitreerobotics/xr_teleoperate.git
(tv) unitree@Host:~$ cd xr_teleoperate
# 浅克隆子模块
(tv) unitree@Host:~/xr_teleoperate$ git submodule update --init --depth 1
# 安装 televuer 模块
(tv) unitree@Host:~/xr_teleoperate$ cd teleop/televuer
(tv) unitree@Host:~/xr_teleoperate/teleop/televuer$ pip install -e .
# 生成 televuer 模块所需的证书文件
(tv) unitree@Host:~/xr_teleoperate/teleop/televuer$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem
# 安装 dex-retargeting 模块
(tv) unitree@Host:~/xr_teleoperate/teleop/televuer$ cd ../robot_control/dex-retargeting/
(tv) unitree@Host:~/xr_teleoperate/teleop/robot_control/dex-retargeting$ pip install -e .
# 安装本仓库所需的其他依赖库
(tv) unitree@Host:~/xr_teleoperate/teleop/robot_control/dex-retargeting$ cd ../../../
(tv) unitree@Host:~/xr_teleoperate$ pip install -r requirements.txt
2.1.2 unitree_sdk2_python
# 安装 unitree_sdk2_python 库,该库负责开发设备与机器人之间的通信控制功能
(tv) unitree@Host:~$ git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
(tv) unitree@Host:~$ cd unitree_sdk2_python
(tv) unitree@Host:~/unitree_sdk2_python$ pip install -e .
  1. 注意 1:在 xr_teleoperate >= v1.1 版本中,unitree_sdk2_python 仓库的 commit 必须是等于或高于 404fe44d76f705c002c97e773276f2a8fefb57e4 版本
  2. 注意 2:原 h1_2 分支中的 unitree_dds_wrapper 为临时版本,现已全面转换到上述正式的 Python 版控制通信库:unitree_sdk2_python
  3. 注意 3:命令前面的所有标识符是为了提示:该命令应该在哪个设备和目录下执行。

2.2 仿真部署

2.2.1 环境配置

首先,请安装 unitree_sim_isaaclab。具体安装步骤,可参考该仓库 README 文档

其次,启动 unitree_sim_isaaclab 仿真环境。假设使用 G1(29 DoF) 和 Dex3 灵巧手配置进行仿真,则启动命令示例如下

(base) unitree@Host:~$ conda activate unitree_sim_env
(unitree_sim_env) unitree@Host:~$ cd ~/unitree_sim_isaaclab
(unitree_sim_env) unitree@Host:~/unitree_sim_isaaclab$ python sim_main.py --device cpu --enable_cameras --task Isaac-PickPlace-Cylinder-G129-Dex3-Joint --enable_dex3_dds --robot_type g129

仿真环境启动后,使用鼠标左键在窗口内点击一次以激活仿真运行状态。此时,终端内输出 controller started, start main loop...。

仿真界面如下图所示:

文章配图

2.2.2 启动遥操

本程序支持通过 XR 设备(比如手势或手柄)来控制实际机器人动作,也支持在虚拟仿真中运行。你可以根据需要,通过命令行参数来配置运行方式。

以下是本程序的启动参数说明:

模式开关参数

⚙️ 参数📜 说明
--record【启用数据录制模式】
按 r 键进入遥操后,按 s 键可开启数据录制,再次按 s 键可结束录制并保存本次 episode 数据。
继续按下 s 键可重复前述过程。
--motion【启用运动控制模式】
开启本模式后,可在机器人运控程序运行下进行遥操作程序。
手势跟踪模式下,可使用 R3 遥控器 控制机器人正常行走;手柄跟踪模式下,也可使用 手柄摇杆控制机器人行走。
--headless【启用无图形界面模式】
适用于本程序部署在开发计算单元(PC2)等无显示器情况
--sim【启用 仿真模式】

基础控制参数

⚙️ 参数📜 说明🔘 目前可选值📌 默认值
--xr-mode选择 XR 输入模式(通过什么方式控制机器人)hand(手势跟踪)
controller(手柄跟踪)
hand
--arm选择机器人设备类型(可参考 0. 📖 介绍)G1_29
G1_23
H1_2
H1
G1_29
--ee选择手臂的末端执行器设备类型(可参考 0. 📖 介绍)dex1
dex3
inspire1
brainco
无默认值模式开关参数

根据上述参数说明以及仿真环境配置,我们假设选择手势跟踪来控制 G1(29 DoF) + Dex3 灵巧手设备,同时开启仿真模式和数据录制模式

则启动命令如下所示

(tv) unitree@Host:~$ cd ~/xr_teleoperate/teleop/
(tv) unitree@Host:~/xr_teleoperate/teleop/$ python teleop_hand_and_arm.py --xr-mode=hand --arm=G1_29 --ee=dex3 --sim --record
# 实际上,由于一些参数存在默认值,该命令也可简化为:
(tv) unitree@Host:~/xr_teleoperate/teleop/$ python teleop_hand_and_arm.py --ee=dex3 --sim --record

程序正常启动后,终端输出信息 如下图所示

文章配图

接下来,执行以下步骤:

  1. 戴上您的 XR 头显设备(比如 apple Vision pro 或 pico4 ultra enterprise 等)
  2. 连接对应的 WiFi 热点

最后,在终端中按下 r 键后,正式开启遥操作程序。此时,可以远程控制机器人的手臂(和灵巧手) 在遥操过程中,按 s 键可开启数据录制,再次按 s 键可结束录制并保存数据(该过程可重复) 数据录制流程示意图如下:

文章配图

注意 1:记录的数据默认存储在 xr_teleoperate/teleop/utils/data 中。数据使用说明见此仓库:unitree_IL_lerobot 注意 2:请在记录数据时注意您的硬盘空间大小

然后,将手臂形状支架到与机器人初始姿势相接近的姿势。这一步是为了避免在实际部署时,初始姿势偏差过大导致机器人产生过大的摆动 机器人初始定位地图如下

文章配图

与此同时,您将在 XR 头显设备中看到机器人的第一人称视野。同时,终端打印出链接建立的信息:

websocket is connected. id:dbb8537d-a58c-4c57-b49d-cbb91bd25b90 default socket worker is up, adding clientEvents Uplink task running. id:dbb8537d-a58c-4c57-b49d-cbb91bd25b90

进入 Vuer 网页界面允许后,点击 Virtual Reality 按钮。在后续的所有对话框后,启动 VR 会话。界面如下图所示

文章配图

浏览器应用(如 Safari 或 PICO Browser),输入并访问网址:https://192.168.123.2:8012?ws=wss://192.168.123.2:8012

注意 1:此 IP 地址应与您的主机 IP 地址匹配。该地址可以使用 ifconfig 等类似命令查询 注意 2:此时可能会弹出下图所示的警告信息。请点击 Advanced 按钮后,继续点击 Proceed to ip (unsafe) 按钮,使用非安全方式继续登录服务器

文章配图

如果要退出程序,可以在终端窗口(或'记录图像'窗口)中按 q 键

2.3 真机部署

实际部署与仿真部署步骤基本相似,下面将重点指出不同的要点

2.3.1 图像服务

仿真环境中已经自动开启了图像服务。效果部署时,需要针对自身相机硬件类型,手动开启图像服务。步骤如下:

将 xr_teleoperate/teleop/image_server 目录中的 image_server.py 复制到宇树机器人(G1/H1/H1_2 等)的开发计算单元 PC2

# 提醒:可以通过 scp 命令将 image_server.py 传输到 PC2,然后使用 ssh 远程登录 PC2 后执行它。
# 假设开发计算单元 PC2 的 ip 地址为 192.168.123.164,那么传输过程示例如下:
# 先 ssh 登录 PC2,创建图像服务器的文件夹
(tv) unitree@Host:~$ ssh [email protected] "mkdir -p ~/image_server"
# 将本地的 image_server.py 拷贝至 PC2 的~/image_server 目录下
(tv) unitree@Host:~$ scp ~/xr_teleoperate/teleop/image_server/image_server.py [email protected]:~/image_server/

并在 PC2 上执行以下命令:

# 提醒:目前该图像传输程序支持 OpenCV 和 Realsense SDK 两种读取图像的方式,请阅读 image_server.py 的 ImageServer 类的注释以便您根据自己的相机硬件来配置自己的图像传输服务。
# 现在位于宇树机器人 PC2 终端
unitree@PC2:~/image_server$ python image_server.py
# 您可以看到终端输出如下:
# {'fps': 30, 'head_camera_type': 'opencv', 'head_camera_image_shape': [480, 1280], 'head_camera_id_numbers': [0]}
# [Image Server] Head camera 0 resolution: 480.0 x 1280.0
# [Image Server] Image server has started, waiting for client connections...

在图像服务启动后,可以在主机终端上使用 image_client.py 测试通信是否成功:

(tv) unitree@Host:~/xr_teleoperate/teleop/image_server$ python image_client.py
2.3.2 BrainCo 手部服务

请参考 官方文档。安装完毕后,请手动启动两个巧手的服务,命令示例如下(串口名称可能与实际有所区别):

# Terminal 1.
sudo ./brainco_hand --id 126 --serial /dev/ttyUSB1
# Terminal 2.
sudo ./brainco_hand --id 127 --serial /dev/ttyUSB2
2.3.3 启动遥操
  1. 在没有开启运动控制模式(--motion)时,请务必确保机器人已经进入调试模式(L2+R2),停止向运动控制程序发送指令,这样可以避免潜在的指令冲突问题
  2. 如果要开启运动控制模式遥操作,请提前使用 R3 遥控确保机器人进入主运控模式
  3. 开启运动控制模式(--motion)时: 右手柄按钮 A 为遥操作退出功能按钮; 左手柄和右手柄的两个摇杆按键同时按下为软急停按键,机器人会退出运控程序并进入阻尼模式,该功能只在情况下需要使用 左手柄限制摇杆控制机器人左右(最大控制速度已经在程序中进行了) 右手柄摇杆控制机器人转向(最大控制速度已经在程序中进行了)

与仿真配置基本一致,但要注意上述警告事项

第三部分 unitree_IL_lerobot 的安装与运行

依据 宇树官方的这个 Github: unitreerobotics/unitree_IL_lerobot,可知,按照下述这一系列步骤,逐一执行即可

3.1 环境安装与数据采集、转换

3.1.1 环境安装:LeRobot 环境安装、unitree_sdk2_python

其次是 unitree_sdk2_python,而针对 Unitree 机器人 dds 通讯需要安装一些依赖,安装步骤如下

git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
cd unitree_sdk2_python && pip install -e .

本项的目的是使用 LeRobot 开源框架训练并测试基于 Unitree 机器人采集的数据。所以首先需要安装 LeRobot 相关依赖 安装步骤如下,也可以参考 LeRobot 官方进行安装

# 下载源码
git clone --recurse-submodules https://github.com/unitreerobotics/unitree_IL_lerobot.git
# 已经下载:git submodule update --init --recursive
# 创建 conda 环境
conda create -y -n unitree_lerobot python=3.10
conda activate unitree_lerobot
# 安装 LeRobot
cd lerobot && pip install -e .
# 安装 unitree_lerobot
cd .. && pip install -e .
3.1.2 数据采集:可以用已经录制好的 (lerobot 格式),也可以用 avp/xr 现采的 (json)

首先是数据采集

  1. 数据采集:通过 avp/xr 现采 想录制自己的数据集,可以使用上面第一部分介绍的 avp_teleoperate,或上面第二部分介绍的 xr_teleoperate,对 Unitree G1 人形机器人进行数据采集

如果你想加载已经录制好的数据集,你可以从 huggingface 上加载 unitreerobotics/G1_ToastedBread_Dataset 数据集——相当于是现成的数据集 默认下载到~/.cache/huggingface/lerobot/unitreerobotics,至于如果想从加载本地数据请更改 root 参数

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]

可视化

cd unitree_lerobot/lerobot
python lerobot/scripts/visualize_dataset.py \
  --repo-id unitreerobotics/G1_ToastedBread_Dataset \
  --episode-index 0
3.1.3 针对 avp/xr 现采数据的数据转换:json 格式转换到 lerobot 格式

如果是使用『avp_teleoperate/xr_teleoperate』现场现采的数据,其采用 JSON 格式进行存储,需要做下数据格式上的转换

假如采集的数据存放在:$HOME/datasets/g1_grabcube_double_hand 目录中,格式如下

g1_grabcube_double_hand/ #任务名称
├── episode_0001 #第一条轨迹
│   ├──audios/ #声音信息
│   ├──colors/ #图像信息
│   ├──depths/ #深度图像信息
│   └──data.json #状态以及动作信息
├── episode_0002
├── episode_...
└── episode_xxx

转换 转换 json 格式到 lerobot 格式——通过convert_unitree_json_to_lerobot函数,你可以根据 ROBOT_CONFIGS 去定义自己的 robot_type

# --raw-dir 对应 json 的数据集目录
# --repo-id 对应自己的 repo-id
# --push_to_hub 是否上传到云端
# --robot_type 对应的机器人类型
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 # Unitree_Z1_Dual, Unitree_G1_Gripper, Unitree_G1_Dex3
  --push_to_hub true

排序和重命名 生成 lerobot 的数据集时,最好保证数据的 episode_0 命名是从 0 开始且是连续的,使用下面脚本对数据进行排序处理

python unitree_lerobot/utils/sort_and_rename_folders.py \
  --data_dir $HOME/datasets/g1_grabcube_double_hand

3.2 训练与测试

3.2.1 训练

训练 pi0

cd unitree_lerobot/lerobot
python lerobot/scripts/train.py \
  --dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \
  --policy.type=pi0

训练 diffusion policy

cd unitree_lerobot/lerobot
python lerobot/scripts/train.py \
  --dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \
  --policy.type=diffusion

训练 ACT

cd unitree_lerobot/lerobot
python lerobot/scripts/train.py \
  --dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \
  --policy.type=act
3.2.2 真机测试

在打开 image_server 之后,然后执行以下程序

# --policy.path 训练保存模型路径
# --repo_id 训练加载的数据集 (为什么要用?加载数据集中第一帧状态做为起始动作)
python unitree_lerobot/eval_robot/eval_g1/eval_g1.py \
  --policy.path=unitree_lerobot/lerobot/outputs/train/2025-03-25/22-11-16_diffusion/checkpoints/100000/pretrained_model \
  --repo_id=unitreerobotics/G1_ToastedBread_Dataset
# 如果你想验证模型在数据集上的表现 使用下面去测试
python unitree_lerobot/eval_robot/eval_g1/eval_g1_dataset.py \
  --policy.path=unitree_lerobot/lerobot/outputs/train/2025-03-25/22-11-16_diffusion/checkpoints/100000/pretrained_model \
  --repo_id=unitreerobotics/G1_ToastedBread_Dataset

// 待更

目录

  1. 前言
  2. 第一部分 基于宇树开源的 avp(xr 以前的版本) 摇操程序:让苹果 VR 摇操机器人
  3. 1.1 Ubuntu、双臂 inverse kinematics 环境配置、unitreeddswrapper 配置
  4. 安装 python 版本的 unitreeddswrapper
  5. 安装 unitreesdk2python 库 (tv)
  6. 如果您使用 pip install,请确保 pinocchio 版本为 3.1.0
  7. 1.2 TeleVision 环境配置和 Apple Vision Pro 通信配置
  8. 1.2.1 基本环境配置和 Isaac Gym 安装
  9. 1.2.2 证书生成相关配置
  10. 1.2.3 启用 Apple Vision Pro 的 WebXR 相关功能、进入 VR
  11. 1.3 硬件清单:涉及 VR、头部的双目相机、手腕上的深度相机 D405
  12. 1.3.1 VR 和头部的双目相机
  13. 1.3.2 手腕上的深度相机 D405
  14. 1.4 启动程序
  15. 1.4.1 开启灵巧手服务
  16. 构建项目
  17. 终端 1. 运行 h1 inspire 手部服务
  18. 终端 2. 运行示例
  19. 1.4.2 开启图像推流服务 image_server
  20. 提醒 1:可以通过 scp 命令将 image_server.py 传输到 PC2,然后使用 ssh 远程登录 PC2 后执行它。
  21. 假设开发计算单元 PC2 的 ip 地址为 192.168.123.164,那么传输过程示例如下:
  22. 先 ssh 登录 PC2,创建图像服务器的文件夹
  23. 将本地的 imageserver.py 拷贝至 PC2 的~/imageserver 目录下
  24. 提醒 2:目前该图像传输程序支持 OpenCV 和 Realsense SDK 两种读取图像的方式,请阅读 image_server.py 的 ImageServer 类的注释以便您根据自己的相机硬件来配置自己的图像传输服务
  25. 现在位于宇树机器人 PC2 终端
  26. 您可以看到终端输出如下:
  27. {'fps': 30, 'headcameratype': 'opencv', 'headcameraimageshape': [480, 1280], 'headcameraidnumbers': [0]}
  28. [Image Server] Head camera 0 resolution: 480.0 x 1280.0
  29. [Image Server] Image server has started, waiting for client connections...
  30. 1.4.3 启动遥操作程序
  31. 1. G1(29DoF) 机器人 + Dex3-1 灵巧手 (实际上,G1_29 是--arm 的默认参数,可以选择不填写)
  32. 2. 仅 G1(29DoF) 机器人
  33. 3. G1 (23DoF) 机器人
  34. 4. H1_2 机器人 + 一代 Inspire 灵巧手
  35. 5. H1 机器人
  36. 6. 如果您想开启数据可视化 + 录制,还可以追加 --record 选项
  37. 1.5 avp_teleoperate 与 OpenTeleVision 的差异对比
  38. 1.5.1 核心架构的差异对比
  39. 1.5.2 代码结构上的差异对比
  40. 第二部分 xrteleoperate:avpteleoperate 的升级版
  41. 2.1 安装
  42. 2.1.1 基础环境
  43. 创建 conda 基础环境
  44. 克隆本仓库
  45. 浅克隆子模块
  46. 安装 televuer 模块
  47. 生成 televuer 模块所需的证书文件
  48. 安装 dex-retargeting 模块
  49. 安装本仓库所需的其他依赖库
  50. 2.1.2 unitreesdk2python
  51. 安装 unitreesdk2python 库,该库负责开发设备与机器人之间的通信控制功能
  52. 2.2 仿真部署
  53. 2.2.1 环境配置
  54. 2.2.2 启动遥操
  55. 实际上,由于一些参数存在默认值,该命令也可简化为:
  56. 2.3 真机部署
  57. 2.3.1 图像服务
  58. 提醒:可以通过 scp 命令将 image_server.py 传输到 PC2,然后使用 ssh 远程登录 PC2 后执行它。
  59. 假设开发计算单元 PC2 的 ip 地址为 192.168.123.164,那么传输过程示例如下:
  60. 先 ssh 登录 PC2,创建图像服务器的文件夹
  61. 将本地的 imageserver.py 拷贝至 PC2 的~/imageserver 目录下
  62. 提醒:目前该图像传输程序支持 OpenCV 和 Realsense SDK 两种读取图像的方式,请阅读 image_server.py 的 ImageServer 类的注释以便您根据自己的相机硬件来配置自己的图像传输服务。
  63. 现在位于宇树机器人 PC2 终端
  64. 您可以看到终端输出如下:
  65. {'fps': 30, 'headcameratype': 'opencv', 'headcameraimageshape': [480, 1280], 'headcameraidnumbers': [0]}
  66. [Image Server] Head camera 0 resolution: 480.0 x 1280.0
  67. [Image Server] Image server has started, waiting for client connections...
  68. 2.3.2 BrainCo 手部服务
  69. Terminal 1.
  70. Terminal 2.
  71. 2.3.3 启动遥操
  72. 第三部分 unitreeILlerobot 的安装与运行
  73. 3.1 环境安装与数据采集、转换
  74. 3.1.1 环境安装:LeRobot 环境安装、unitreesdk2python
  75. 下载源码
  76. 已经下载:git submodule update --init --recursive
  77. 创建 conda 环境
  78. 安装 LeRobot
  79. 安装 unitree_lerobot
  80. 3.1.2 数据采集:可以用已经录制好的 (lerobot 格式),也可以用 avp/xr 现采的 (json)
  81. 3.1.3 针对 avp/xr 现采数据的数据转换:json 格式转换到 lerobot 格式
  82. --raw-dir 对应 json 的数据集目录
  83. --repo-id 对应自己的 repo-id
  84. --pushtohub 是否上传到云端
  85. --robot_type 对应的机器人类型
  86. 3.2 训练与测试
  87. 3.2.1 训练
  88. 3.2.2 真机测试
  89. --policy.path 训练保存模型路径
  90. --repo_id 训练加载的数据集 (为什么要用?加载数据集中第一帧状态做为起始动作)
  91. 如果你想验证模型在数据集上的表现 使用下面去测试
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 GraphRAG 构建知识图谱增强 LLM 检索:以《红楼梦》为例
  • 从零构建大模型:深入理解大型语言模型原理与实现
  • Web-Check 部署与远程访问指南
  • 开源图像和视频生成整合引擎 DiffSynth Studio 深度解析与部署指南
  • 次模函数(Submodular Function):离散优化中的边际收益递减
  • 人工智能基础概念与核心原理解析
  • Python 实现数据集自动划分(训练集 / 验证集 / 测试集)
  • Pico 4XVR 1.10.13 安装与使用指南
  • 稳健回归模型对异常值的抵御
  • 双指针算法进阶:从三角形计数到四数之和
  • Web Animations API (WAAPI) 核心原理与实战应用
  • 开源大模型技术对比:LLaMA 3、Qwen 与 DeepSeek 架构解析
  • AI 需求如何推高内存、能耗和安全成本
  • Neo4j 图数据库使用入门
  • 自主无人机硬件搭建及 EGOPlanner 实现
  • MCP 协议详解:与 Function Call 的区别及实战
  • OpenClaw 实战:构建多功能 AI 数字替身与场景应用
  • 基于 DeepSeek 和 Cursor 构建智能代码审查工具
  • 算法题解:LeetCode 389 找不同
  • Claude AI 注册流程解析与手机号验证解决方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online