跳到主要内容
宇树 G1 机器人 VR 遥操与模仿学习开发:xr_teleoperate 集成 unitree_IL_lerobot | 极客日志
Python AI 算法
宇树 G1 机器人 VR 遥操与模仿学习开发:xr_teleoperate 集成 unitree_IL_lerobot 宇树 G1 人形机器人 VR 遥操作与模仿学习开发流程。涵盖 avp_teleoperate 及升级版 xr_teleoperate 环境配置、硬件连接(Vision Pro/Quest)、图像推流服务启动。支持手势与手柄控制,实现数据采集并转换为 LeRobot 格式。集成 pi0、Diffusion Policy 等策略进行训练与真机测试,提供从遥操到模型部署的完整技术路径。
奇形怪状 发布于 2026/4/7 更新于 2026/4/25 3 浏览前言
本文介绍基于宇树 G1 人形机器人的 VR 遥操作与模仿学习开发流程,涵盖从开源遥操程序 xr_teleoperate 到 LeRobot 框架的集成实践。
无论是傅利叶集成的 Lerobot(idp3),还是宇树集成的 Lerobot(π0),均可使用宇树开源的遥操代码(如 avp_teleoperate 及其升级版 xr_teleoperate)去收集数据。
第一部分 基于宇树开源的 avp(xr 以前的版本) 摇操程序:让苹果 VR 摇操机器人
1.1 Ubuntu、双臂 inverse kinematics 环境配置、unitree_dds_wrapper 配置
Ubuntu 20.04 和 Ubuntu 22.04 操作系统下进行测试
注意,原来 h1_2 分支中的临时版本:unitree_dds_wrapper 配置。该部分用于配置计算机主机与人形机器人的通信控制。建议使用 Python 版控制通信库:unitree_sdk2_python。
git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
cd unitree_sdk2_python
pip install -e .
双臂 inverse kinematics 环境配置
该部分用于配置人形机器人 H1 双臂(共 14 个自由度)的末端位姿逆运动学求解相关的软件库。Apple Vision Pro 获取左右两个手腕位姿后,使用 pinocchio 和 CasADi 库加载 URDF 并进行逆运动学计算,求解出到达该位姿的关节电机角度值。meshcat 库则用于调试时在 Web 端进行可视化显示。
conda create -n tv python=3.8
conda activate tv
conda install pinocchio -c conda-forge
pip install meshcat
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 install mkcert
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv) "
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 中安装证书:
上面命令可以获取到 rootCA.pem 的路径。然后通过苹果的隔空投送功能把 rootCA.pem 文件发送到 Apple Vision Pro。
假设本机 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/
(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 中左上角账户栏的下方出现证书相关信息栏,点击进去即可启用对该证书的信任。
cd ~/avp_teleoperate/teleop
python teleop_hand.py
如 avp 官方 GitHub 所说,已经尝试在 PICO 4 Ultra Enterprise 和 Meta-Quest 3 上使用手部追踪进行遥操作。
1.3 硬件清单:涉及 VR、头部的双目相机、手腕上的深度相机 D405
1.3.1 VR 和头部的双目相机 物品名称 数量 说明 Apple Vision Pro 1 参考 Apple 官方网址 计算机 1 x86_64 架构 人形机器人 H1 1 具体型号为 H1_2 灵巧手 1 H1 可搭载 Inspire Robotics (RH56DFX) 的仿人五指灵巧手 头部双目相机 1 普通 USB 免驱动双目相机,戴在机器人头部,主要作用是辅助操作人员 头部相机支架 1 参考 GitHub 仓库 hardware 目录
Q: 双目相机可以换为其他型号吗?
A: 任意型号 USB 免驱动双目相机均可(推荐使用 FOV 较大的相机,保证操作时充足的视野)。新相机可通过 teleop/image_server/ 下的客户端 image_client.py 和服务端 image_server.py 程序进行测试。
1.3.2 手腕上的深度相机 D405 戴机器人手腕上的英特尔 RealSense D405 相机 2 深度相机 腕部相机环形支架 2 参考 GitHub 仓库 hardware 目录 左腕相机支架 1 参考 GitHub 仓库 hardware 目录 右腕相机支架 1 参考 GitHub 仓库 hardware 目录
有两个点值得提一下以上,可以通过 avp 官方 GitHub 确认。
1.4 启动程序 在执行遥操作的程序前,需要预先启动一些服务支撑的程序。
1.4.1 开启灵巧手服务 可以参考《RH56DFX 灵巧手开发》配置相关环境和编译控制程序。
关于控制方式,因时机械手官方 SDK 通过串口进行通讯,H1 提供一个 USB 转串口模块,用户可以将该 USB 插在 H1 开发计算单元 (PC2, PC3) 上进行通讯控制灵巧手。此时端口通常为/dev/ttyUSB0 使用因时官方 SDK 控制。
用户可以根据因时灵巧手官方通讯协议自行编写程序控制灵巧手使用宇树灵巧手 SDK 控制。
H1 通信建立在 DDS 框架之上,为便于使用 unitree_sdk2 进行控制灵巧手。宇树提供将串口收发的数据转为 DDS 消息的示例程序。
关于宇树 SDK 接口的说明用户向 "rt/inspire/cmd" 话题发送 "unitree_go::msg::dds::MotorCmds_" 消息控制灵巧手,从 "rt/inspire/state" 话题接受 "unitree_go::msg::dds::MotorStates_" 消息获取灵巧手状态。
首先到该网址下载灵巧手控制接口程序,并将之拷贝到 机器人 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
unitree@PC2:~/h1_inspire_service/build$ sudo ./inspire_hand -s /dev/ttyUSB0
unitree@PC2:~/h1_inspire_service/build$ ./h1_hand_example
如果发现左右灵巧手所有手指不断循环张开、闭合动作则表示成功。确认成功后,关闭 Terminal 2 中的 ./h1_hand_example 程序即可。
双臂可以进行遥操作,但是灵巧手却不会动,怎么办?A: 程序中,双臂和灵巧手的控制指令是分开的。先通过上面「开启灵巧手服务」内容中所述的 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 内执行下面命令:
(tv) unitree@Host:~$ ssh [email protected] "mkdir -p ~/image_server"
(tv) unitree@Host:~$ scp ~/avp_teleoperate/teleop/image_server/image_server.py [email protected] :~/image_server/
unitree@PC2:~/image_server$ python image_server.py
注意:这里需要检查 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):' 的字符串输出。
对我司长沙具身团队所用的 quest 3 来讲,如上面提到的这个链接所述,我们做了端口转发、无线设置等操作,故上面的 IP 地址是主机 (办公电脑) 链接 WiFi 的 IP 地址——确保与 quest 3 的 IP 地址在同一网段下。说白了 就是让 quest3 也连主机所连的 WiFi。
接下来,操作员 B 可以在终端中按下 r 键以启动远程操作程序。
此时,操作员 A 可以远程控制机器人的手臂(和灵巧手)。
如果使用了--record 参数,那么操作员 B 可以在打开的'record image'窗口中按 s 键开始录制数据,再次按 s 键停止。可以根据需要重复此操作进行多次录制。注意 1:录制的数据默认存储在 avp_teleoperate/teleop/utils/data 中,使用说明见此仓库:unitree_IL_lerobot。注意 2:请在录制数据时注意您的硬盘空间大小。
根据你的机器人配置选择不同的启动参数。以下是一些启动命令示例:
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=G1_29 --hand=dex3
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=G1_23
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=H1_2 --hand=inspire1
(tv) unitree@Host:~/avp_teleoperate/teleop$ python teleop_hand_and_arm.py --arm=H1
(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_teleoperate OpenTeleVision 项目定位与目标 由 Unitree Robotics 开发,专注于使用 Apple Vision Pro 控制 Unitree 系列机器人 明确支持多种 Unitree 机型:G1 (29DoF/23DoF)、H1 (4DoF)、H1_2 (7DoF) 等 基于 OpenTeleVision 等开源项目构建,但进行了针对性优化 学术研究项目,有 CoRL 2024 论文支持 更通用的远程操作框架,支持多种 VR 设备 除了远程操作,还包含模仿学习功能 核心架构差异 分层设计 ——明确分为三大模块:
image_server(图像传输)
open_television(姿态获取), 将 OpenTeleVision 作为组件集成,通过 tv_wrapper 进行封装
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 机器人的专有代码 - 作为原始项目,提供了基础架构 - 更通用的实现,但缺少针对特定机器人的优化
架构组织不同:avp_teleoperate 更关注控制层次,分为图像、姿态获取、机器人控制等层;OpenTeleVision 更关注功能模块,分为远程操作和模仿学习等功能。
代码复用关系:avp_teleoperate 是在 OpenTeleVision 基础上的应用和扩展;保留了核心远程操作理念,但重新组织了代码结构以适应特定机器人。
技术选择:avp_teleoperate 更注重工业级控制和精确的机器人运动学;OpenTeleVision 更注重通用性、研究功能和跨平台支持。
1.5.2 代码结构上的差异对比 ├── LICENSE
├── README.md
├── requirements.txt
├── assets/
│ ├── g1/
│ ├── h1_2/
│ ├── inspire_hand/
│ └── unitree_hand/
├── hardware/
├── img /
└── teleop/
├── teleop_hand_and_arm.py
├── image_server/
│ ├── image_client.py
│ └── image_server.py
├── open_television/
│ ├── 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
├── LICENSE
├── README.md
├── requirements.txt
├── act/
│ └── detr/
├── assets/
├── img /
├── scripts/
│ ├── post_process.py
│ ├── replay_demo.py
│ └── deploy_sim.py
└── teleop/
├── dynamixel/
├── 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 基础环境
(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
(tv) unitree@Host:~/xr_teleoperate$ cd teleop/televuer
(tv) unitree@Host:~/xr_teleoperate/teleop/televuer$ pip install -e .
(tv) unitree@Host:~/xr_teleoperate/teleop/televuer$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem
(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
(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:在 xr_teleoperate >= v1.1 版本中,unitree_sdk2_python 仓库的 commit 必须是等于或高于 404fe44d76f705c002c97e773276f2a8fefb57e4 版本。
注意 2:原 h1_2 分支中的 unitree_dds_wrapper 为临时版本,现已全面转换到上述正式的 Python 版控制通信库:unitree_sdk2_python 。
注意 3:命令前面的所有标识符是为了提示:该命令应该在哪个设备和目录下执行。
2.2 仿真部署
2.2.1 环境配置 其次,启动 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_29G1_23H1_2H1G1_29--ee选择手臂的末端执行器设备类型(可参考 0. 📖 介绍) dex1dex3inspire1brainco无默认值模式开关参数
根据上述参数说明以及仿真环境配置,我们假设选择手势跟踪来控制 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
戴上您的 XR 头显设备(比如 apple Vision pro 或 pico4 ultra enterprise 等)
连接对应的 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 会话。界面如下图所示。
注意 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。
(tv) unitree@Host:~$ ssh [email protected] "mkdir -p ~/image_server"
(tv) unitree@Host:~$ scp ~/xr_teleoperate/teleop/image_server/image_server.py [email protected] :~/image_server/
unitree@PC2:~/image_server$ python image_server.py
在图像服务启动后,可以在主机终端上使用 image_client.py 测试通信是否成功:
(tv) unitree@Host:~/xr_teleoperate/teleop/image_server$ 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 启动遥操
在没有开启运动控制模式(--motion)时,请务必确保机器人已经进入调试模式(L2+R2),停止向运动控制程序发送指令,这样可以避免潜在的指令冲突问题。
如果要开启运动控制模式遥操作,请提前使用 R3 遥控确保机器人进入主运控模式。
开启运动控制模式(--motion)时:
右手柄按钮 A 为遥操作退出功能按钮;
左手柄和右手柄的两个摇杆按键同时按下为软急停按键,机器人会退出运控程序并进入阻尼模式,该功能只在情况下需要使用。
左手柄限制摇杆控制机器人左右(最大控制速度已经在程序中进行了)。
右手柄摇杆控制机器人转向(最大控制速度已经在程序中进行了)。
第三部分 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
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 数据采集:可以用已经录制好的 (lerobot 格式),也可以用 avp/xr 现采的 (json)
数据采集:通过 avp/xr 现采
想录制自己的数据集,可以使用上面第一部分介绍的 avp_teleoperate,或上面第二部分介绍的 xr_teleoperate,对 Unitree G1 人形机器人进行数据采集。
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。
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
排序和重命名
生成 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 训练 cd unitree_lerobot/lerobot
python lerobot/scripts/train.py \
--dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \
--policy.type=pi0
cd unitree_lerobot/lerobot
python lerobot/scripts/train.py \
--dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \
--policy.type=diffusion
cd unitree_lerobot/lerobot
python lerobot/scripts/train.py \
--dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \
--policy.type=act
3.2.2 真机测试 在打开 image_server 之后,然后执行以下程序:
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
目录
前言 第一部分 基于宇树开源的 avp(xr 以前的版本) 摇操程序:让苹果 VR 摇操机器人 1.1 Ubuntu、双臂 inverse kinematics 环境配置、unitreeddswrapper 配置 安装 unitreesdk2python 库 (tv) 如果您使用 pip install,请确保 pinocchio 版本为 3.1.0 1.2 TeleVision 环境配置和 Apple Vision Pro 通信配置 1.2.1 基本环境配置和 Isaac Gym 安装 1.2.2 证书生成相关配置 1.2.3 启用 Apple Vision Pro 的 WebXR 相关功能、进入 VR 1.3 硬件清单:涉及 VR、头部的双目相机、手腕上的深度相机 D405 1.3.1 VR 和头部的双目相机 1.3.2 手腕上的深度相机 D405 1.4 启动程序 1.4.1 开启灵巧手服务 构建项目 终端 1. 运行 h1 inspire 手部服务 终端 2. 运行示例 1.4.2 开启图像推流服务 image_server 提醒 1:可以通过 scp 命令将 image_server.py 传输到 PC2,然后使用 ssh 远程登录 PC2 后执行它。 假设开发计算单元 PC2 的 ip 地址为 192.168.123.164,那么传输过程示例如下: 先 ssh 登录 PC2,创建图像服务器的文件夹 将本地的 imageserver.py 拷贝至 PC2 的~/imageserver 目录下 提醒 2:目前该图像传输程序支持 OpenCV 和 Realsense SDK 两种读取图像的方式,请阅读 image_server.py 的 ImageServer 类的注释以便您根据自己的相机硬件来配置自己的图像传输服务 提醒 3——来自七月在线:需要在 PC2 的终端上配置 conda 环境,建议安装 Python3.8 的环境,配置完成后,需要安装 zmq、opencv-python、pyrealsense2 现在位于宇树机器人 PC2 终端 您可以看到终端输出如下: {'fps': 30, 'headcameratype': 'opencv', 'headcameraimageshape': [480, 1280], 'headcameraidnumbers': [0]} [Image Server] Head camera 0 resolution: 480.0 x 1280.0 [Image Server] Image server has started, waiting for client connections... 1.4.3 启动遥操作程序 1. G1(29DoF) 机器人 + Dex3-1 灵巧手 (实际上,G1_29 是--arm 的默认参数,可以选择不填写) 2. 仅 G1(29DoF) 机器人 3. G1 (23DoF) 机器人 4. H1_2 机器人 + 一代 Inspire 灵巧手 5. H1 机器人 6. 如果您想开启数据可视化 + 录制,还可以追加 --record 选项 1.5 avp_teleoperate 与 OpenTeleVision 的差异对比 1.5.1 核心架构的差异对比 1.5.2 代码结构上的差异对比 第二部分 xrteleoperate:avpteleoperate 的升级版 2.1 安装 2.1.1 基础环境 创建 conda 基础环境 克隆本仓库 浅克隆子模块 安装 televuer 模块 生成 televuer 模块所需的证书文件 安装 dex-retargeting 模块 安装本仓库所需的其他依赖库 2.1.2 unitreesdk2python 安装 unitreesdk2python 库,该库负责开发设备与机器人之间的通信控制功能 2.2 仿真部署 2.2.1 环境配置 2.2.2 启动遥操 实际上,由于一些参数存在默认值,该命令也可简化为: 2.3 真机部署 2.3.1 图像服务 提醒:可以通过 scp 命令将 image_server.py 传输到 PC2,然后使用 ssh 远程登录 PC2 后执行它。 假设开发计算单元 PC2 的 ip 地址为 192.168.123.164,那么传输过程示例如下: 先 ssh 登录 PC2,创建图像服务器的文件夹 将本地的 imageserver.py 拷贝至 PC2 的~/imageserver 目录下 提醒:目前该图像传输程序支持 OpenCV 和 Realsense SDK 两种读取图像的方式,请阅读 image_server.py 的 ImageServer 类的注释以便您根据自己的相机硬件来配置自己的图像传输服务。 现在位于宇树机器人 PC2 终端 您可以看到终端输出如下: {'fps': 30, 'headcameratype': 'opencv', 'headcameraimageshape': [480, 1280], 'headcameraidnumbers': [0]} [Image Server] Head camera 0 resolution: 480.0 x 1280.0 [Image Server] Image server has started, waiting for client connections... 2.3.2 BrainCo 手部服务 Terminal 1. Terminal 2. 2.3.3 启动遥操 第三部分 unitreeILlerobot 的安装与运行 3.1 环境安装与数据采集、转换 3.1.1 环境安装:LeRobot 环境安装、unitreesdk2python 下载源码 已经下载:git submodule update --init --recursive 创建 conda 环境 安装 LeRobot 安装 unitree_lerobot 3.1.2 数据采集:可以用已经录制好的 (lerobot 格式),也可以用 avp/xr 现采的 (json) 3.1.3 针对 avp/xr 现采数据的数据转换:json 格式转换到 lerobot 格式 --raw-dir 对应 json 的数据集目录 --repo-id 对应自己的 repo-id --pushtohub 是否上传到云端 --robot_type 对应的机器人类型 3.2 训练与测试 3.2.1 训练 3.2.2 真机测试 --policy.path 训练保存模型路径 --repo_id 训练加载的数据集 (为什么要用?加载数据集中第一帧状态做为起始动作) 如果你想验证模型在数据集上的表现 使用下面去测试 相关免费在线工具 加密/解密文本 使用加密算法(如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