宇树VR遥操与IL——从avp_teleoperate(xr_teleoperate)到unitree_IL_lerobot:如何基于G1进行manipulation开发_宇树机器人二次开发
前言
如之前的文章所述,我司「七月在线」正在并行开发多个订单,目前正在全力做好每一个订单,因为保密协议的原因,暂时没法拿出太多细节出来分享
但可以持续解读我们所创新改造或二次开发的对象,即解读paper和开源库「当然 有些paper/库还没开始用,但也可以提前解读,作为关注了解」
而对于我司人形开发的订单,截止到25年4月,背后的机器人多半基于这几家:宇树、智元、傅利叶、乐聚「之所以用的这几家,一半因为我和这些公司熟,一半因为客户已有其中某一家或某几家的本体 需在其基础上做定制开发,如其它厂商看到 有兴趣合作,欢迎私我,比如星动纪元、星海图、众擎等等」
- 通过此文《Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月的idp3落地实践)》可知,傅利叶 把idp3 装进了lerobot
- 类似的,宇树 通过此开源库「unitree_IL_lerobot」,也把lerobot 集成了下
该库包含了π0策略
且无论咱们是用傅利叶集成的lerobot——idp3,还是宇树集成的lerobot——π0,都是可以用宇树开源的摇操代码avp_teleoperate(后升级为:xr_teleoperate,详见本文第二部分) 去收集数据的
相当于
ipd3 π0 ACT 附录:直接支持3d输入的vla 第一步 摇操采集 可以宇树VR摇操采集3d数据
也可以通过ipd3官方开源的摇操代码采集3d点云数据 可以宇树VR摇操采集3d数据,然后3d 改成2d数据,以去适配π0的 数据输入格式
当然,本质上也是可以用ipd3的摇操代码采集3d点云数据,然后再转换成2d宇树VR摇操采集3d数据
毕竟其改造的Open-television任意摇操方式 第二步 动作预测 要么傅利叶集成idp3的lerobot库:Fourier-Lerobot,做模仿学习
要么直接通过ipd3官方库做模仿学习 宇树集成的unitree_IL_lerobot lerobot官方库:包含π0 π0官方库 那自然可以用Open-television中所用的ACT策略 直接VLA交互
如此,本文便来了,如果读此文的你也正在宇树比如G1上开发,欢迎私我,邀你进『七月具身:VR摇操与GROOT群』,更多则参见《七月具身:人形二次开发线下营》
第一部分(选读) Apple Vision Pro实现Unitree 人形机器人的远程操作
接下来,我们通过此教程《Apple Vision Pro 遥操作示例》
- avp基于此文《UC San Diego的三大机器人:AnyTeleop、Open-TeleVision、Bunny-VisionPro——从RGB相机到VR远程控制机器人》第二部分介绍的Open-television改造
- avp对应的GitHub地址为:github.com/unitreerobotics/avp_teleoperate
详细介绍下如何使用 Apple Vision Pro 进行遥操作,以控制宇树科技的 Unitree H1_2 或G1 手臂的示例程序
- 至于如果买的是meta quest的——我司七月这边6月初便买的这个,则还参考这个链接:teleop based on Quest 3/3S
- Q: 其他人形机器人可以使用该例程吗?
A: 不可以直接使用,但可以借鉴。包括但不限于修改 URDF、IK 解算程序以及关节映射等代码但后来官方GitHub表示该仓库实现了使用 XR设备(比如 Apple Vision Pro、PICO 4 Ultra Enterprise 或 Meta Quest 3) 对 宇树(Unitree)人形机器人 的遥操作控制——包括G1,我司七月长沙具身团队 也自行花了整整一天的时间搞定了下
VR摇操宇树人形机器人G1
开发者只需佩戴 Vision Pro,即可通过摄像头进行手势追踪以操作机器人
以下是网络拓扑图,以G1机器人为例
1.1 Ubuntu、双臂 inverse kinematics 环境配置、unitree_dds_wrapper 配置
- Ubuntu 20.04 和 Ubuntu 22.04 操作系统下进行测试
- 双臂 inverse kinematics 环境配置
该部分用于配置人形机器人 H1 双臂(共14个自由度)的末端位姿逆运动学求解相关的软件库
Apple Vision Pro 获取左右两个手腕位姿后,使用 pinocchio 和 CasADi 库加载 URDF 并进行逆运动学计算,求解出到达该位姿的关节电机角度值
meshcat 库则用于调试时在 Web 端进行可视化显示unitree@Host:~$ conda create -n tv python=3.8unitree@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 环境内执行,除非另有说明 - 注意,原来h1_2分支中的临时版本:unitree_dds_wrapper 配置
该部分用于配置计算机主机与人形机器人的 unitree_dds_wrapper,可以使用python
实现主机和机器人之间的通信、控制。请执行下面命令进行安装# 安装python版本的 unitree_dds_wrappergit clone https://github.com/unitreerobotics/unitree_dds_wrapper.gitcd unitree_dds_wrapper/pythonpip3 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 .
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.gitcd avp_teleoperatepip 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 主机连接到同一个路由器
ps,我司长沙具身团队用的meta quest 3也做了如下设置
首先,安装mkcert
- 安装brew
sudo apt-get install build-essential procps curl file gitcd ~/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
- 配置环境变量
eval \"$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)\"
- 使用 brew 安装mkcert
brew install mkcert
接下来,生成证书
- 查看本机(你自己的办公电脑) IP 地址
(tv) unitree@Host:~/avp_teleoperate$ ifconfig | grep inet
- 假设本机 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/
- 系统防火墙设置
sudo ufw allow 8012
- 在 Apple Vision Pro 中安装证书
mkcert -CAROOT
上面命令可以获取到 rootCA.pem 的路径。然后通过苹果的隔空投送功能把 rootCA.pem 文件发送到 Apple Vision Pro
注意: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/teleoppython 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 上使用手部追踪进行遥操作。
PICO 4 Ultra Enterprise 的系统规格如下:
系统版本:5.12.6.U;Android 版本号:14;软件版本号:c000_cf01_bv1.0.1_sv5.12.6_202412121344_sparrow_b4244_user
浏览器版本:4.0.28 beta version
Meta-Quest 3 的系统规格如下:
系统版本:49829370066100510;版本:62.0.0.273.343.570372087;运行时版本:62.0.0.269.341.570372063;操作系统版本:SQ3A.220605.009.A1
更多配置步骤信息,您可以查看该 issue
1.3 硬件清单:涉及VR、头部的双目相机、手腕上的深度相机D405
硬件清单如下所示
1.3.1 VR和头部的双目相机
H1可搭载 Inspire Robotics (RH56DFX) 的仿人五指灵巧手,该灵巧手具有6个自由度和12个运动关节,可以模拟人手实现复杂动作
具体可参考该文档
普通 USB 免驱动双目相机
戴在机器人头部,主要作用是辅助操作人员,通过 Apple Vision Pro 观看到机器人视角下工作空间的视野
供参考的购买链接
Q: 双目相机可以换为其他型号吗?
A: 任意型号 USB 免驱动双目相机均可(推荐使用 FOV 较大的相机,保证操作时充足的视野)。新相机可通过 teleop/image_server/ 下的客户端 image_client.py 和服务端 image_server.py 程序进行测试

1.3.2 手腕上的深度相机D405
戴机器人手腕上的英特尔 RealSense D405相机——这个相当于就是深度相机




有两个点 值得提一下
- 以上,可以通过avp 官方GitHub 确认:github.com/unitreerobotics/avp_teleoperate/blob/main/README_zh-CN.md
- 我司长沙具身团队在采购上面的深度相机——比如D405时,还考虑到希望采购的两个深度相机还可以在我司采买的两个松灵piper上使用「相当于要让两个深度相机,既可以用在G1两个手腕上,又可以用在松灵piper上」
然通过和松灵售后的沟通发现,想在piper上用,松灵售后只有435的结构件最终考虑到如友人w所说的:“g1的相机支架是个弧形,难改,到时候改出来不配套就不行了”,加之松灵售后可以给我们435的结构件的图纸
于是我们决定修改435的结构件以适配405「即拿适配435的结构件图纸 让3d打印店 改成可以适配405」,才得以解决
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_\" 消息获取灵巧手状态
- 首先到 该网址oss-global-cdn.unitree.com/static 下载灵巧手控制接口程序,并将之拷贝到 机器人 Unitree H1_2 的 PC2 中
- 其次,在 PC2 中解压完成后,使用下述命令进行编译
unitree@PC2:~$ sudo apt install libboost-all-dev libspdlog-dev# 构建项目unitree@PC2:~$ cd h1_inspire_service & mkdir build & cd buildunitree@PC2:~/h1_inspire_service/build$ cmake .. -DCMAKE_BUILD_TYPE=Releaseunitree@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 程序即可
- 双臂可以进行遥操作,但是灵巧手却不会动,怎么办?
- A: 程序中,双臂和灵巧手的控制指令是分开的。先通过上面「开启灵巧手服务」内容中所述的 h1_hand_example 程序检测灵巧手是否正常工作
1.4.2 开启图像推流服务image_server
- 把 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 unitree@192.168.123.164 \"mkdir -p ~/image_server\"# 将本地的image_server.py拷贝至PC2的~/image_server目录下(tv) unitree@Host:~$ scp ~/avp_teleoperate/teleop/image_server/image_server.py unitree@192.168.123.164:~/image_server/# 提醒2:目前该图像传输程序支持OpenCV和Realsense SDK两种读取图像的方式,请阅读image_server.py的ImageServer类的注释以便您根据自己的相机硬件来配置自己的图像传输服务# 提醒3——来自七月在线:需要在PC2的终端上配置conda环境,建议安装Python3.8的环境,配置完成后,需要安装zmq、opencv-python、pyrealsense2# 现在位于宇树机器人 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端口是否可用
- 图像推流服务开启以后,可以在主机终端使用 image_client.py 测试通信是否成功(测试成功后记得关闭该程序):
(tv) unitree@Host:~/avp_teleoperate/teleop/image_server$ python image_client.py
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 配置的图像服务器参数相同
- 根据你的机器人配置选择不同的启动参数。以下是一些启动命令示例:
# 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
- 程序如果正常启动,终端最后一行将停留在 “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 地址匹配
对我司长沙具身团队所用的quest 3来讲,如上面提到的这个链接-avp_teleoperate/issues/32所述,我们做了端口转发、无线设置等操作,故上面的IP地址是主机(办公电脑)链接WiFi的IP地址——确保与quest 3的IP地址在同一网段下 说白了 就是让quest3 也连主机所连的WiFi比如主机ip地址是192.168.0.34,quest 3的ip地址是192.168.0.38,故访问的这个地址https://192.168.0.34:8012/?ws=wss://192.168.0.34:8012
- 点击 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:请在录制数据时注意您的硬盘空间大小
最后,特别提醒下,每次重新遥操时,需要重启Quest3,确保是先启动python程序,后进入VR
1.5 avp_teleoperate与OpenTeleVision的差异对比
1.5.1 核心架构的差异对比
明确支持多种Unitree机型:G1 (29DoF/23DoF)、H1 (4DoF)、H1_2 (7DoF)等
基于OpenTeleVision等开源项目构建,但进行了针对性优化
更通用的远程操作框架,支持多种VR设备
除了远程操作,还包含模仿学习功能
分层设计——明确分为三大模块:
image_server(图像传输)
open_television(姿态获取),将OpenTeleVision作为组件集成,通过tv_wrapper进行封装
robot_control(机器人控制)
机器人特化:为特定机器人型号设计了专用控制器和逆运动学计算
- 针对G1、H1_2等不同型号实现了专用控制器
- 对Dex3和Inspire手部实现了专用控制
- 使用Pinocchio库进行精确的逆运动学计算
入口程序:单一的teleop_hand_and_arm.py作为主入口,集成了所有功能
网络通信:更复杂的WebRTC通信架构,支持多种设备
研究工具:包含完整的数据收集、处理和训练流程
多入口设计:有teleop_hand.py和teleop_active_cam.py等不同功能入口
图像处理
- 使用专门的image_server、image_client架构
- 支持多相机同步(头部和手腕相机)
通用VR交互
- 使用WebRTC实现跨设备通信
- 支持本地和网络流式传输
学习功能
- 包含完整的模仿学习管线
- 使用ACT和DETR等深度学习模型
模拟环境
- 与Isaac Gym等模拟器集成
- 提供模拟测试环境
- 复用了OpenTeleVision的远程操作接口,但进行了重组织
- 添加了大量针对Unitree机器人的专有代码
- 更通用的实现,但缺少针对特定机器人的优化
总结一下
- 架构组织不同
avp_teleoperate更关注控制层次,分为图像、姿态获取、机器人控制等层
OpenTeleVision更关注功能模块,分为远程操作和模仿学习等功能 - 代码复用关系
avp_teleoperate是在OpenTeleVision基础上的应用和扩展
保留了核心远程操作理念,但重新组织了代码结构以适应特定机器人 - 技术选择
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遥操强脑灵巧手(单只右手)
七月具身:3天搞定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:在 xr_teleoperate >= v1.1 版本中,unitree_sdk2_python 仓库的 commit 必须是等于或高于 404fe44d76f705c002c97e773276f2a8fefb57e4 版本
- 注意2:原 h1_2 分支中的 unitree_dds_wrapper 为临时版本,现已全面转换到上述正式的 Python 版控制通信库:unitree_sdk2_python
- 注意3:命令前面的所有标识符是为了提示:该命令应该在哪个设备和目录下执行。
p.s. 在 Ubuntu 系统 ~/.bashrc 文件中,默认配置: PS1=\'${debian_chroot:+($debian_chroot)}\\u@\\h:\\w\\$ \'
以(tv) unitree@Host:~$ pip install meshcat 命令为例:
(tv) 表示 shell 此时位于 conda 创建的 tv 环境中;
unitree@Host:~ 表示用户标识 unitree 在设备 Host 上登录,当前的工作目录为 $HOME;$ 表示当前 shell 为 Bash;
pip install meshcat 是用户标识 unitree 要在 设备 Host 上执行的命令
可以参考 Harley Hahn\'s Guide to Unix and Linux 和 Conda User Guide 来深入了解这些知识
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 设备(比如手势或手柄)来控制实际机器人动作,也支持在虚拟仿真中运行。你可以根据需要,通过命令行参数来配置运行方式。
以下是本程序的启动参数说明:
- 基础控制参数
⚙️ 参数 📜 说明 🔘 目前可选值 📌 默认值 --xr-mode
选择 XR 输入模式(通过什么方式控制机器人) hand
(手势跟踪)
controller
(手柄跟踪)hand
--arm
选择机器人设备类型(可参考 0. 📖 介绍) G1_29
G1_23
H1_2
H1
G1_29
--ee
选择手臂的末端执行器设备类型(可参考 0. 📖 介绍) dex1
dex3
inspire1
brainco
无默认值模式开关参数 - 模式开关参数
⚙️ 参数 📜 说明 --record
【启用数据录制模式】
按 r 键进入遥操后,按 s 键可开启数据录制,再次按 s 键可结束录制并保存本次 episode 数据。
继续按下 s 键可重复前述过程。--motion
【启用运动控制模式】
开启本模式后,可在机器人运控程序运行下进行遥操作程序。
手势跟踪模式下,可使用 R3遥控器 控制机器人正常行走;手柄跟踪模式下,也可使用手柄摇杆控制机器人行走。--headless
【启用无图形界面模式】
适用于本程序部署在开发计算单元(PC2)等无显示器情况--sim
【启用仿真模式】
根据上述参数说明以及仿真环境配置,我们假设选择手势跟踪来控制 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热点
- 浏览器应用(如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)按钮,使用非安全方式继续登录服务器 - 进入Vuer网页界面允许后,点击Virtual Reality按钮。在后续的所有对话框后,启动 VR 会话。界面如下图所示
- 与此同时,您将在 XR 头显设备中看到机器人的第一人称视野。同时,终端打印出链接建立的信息:
websocket is connected. id:dbb8537d-a58c-4c57-b49d-cbb91bd25b90default socket worker is up, adding clientEvents Uplink task running. id:dbb8537d-a58c-4c57-b49d-cbb91bd25b90
- 然后,将手臂形状支架到与机器人初始姿势相接近的姿势。这一步是为了避免在实际部署时,初始姿势偏差过大导致机器人产生过大的摆动
机器人初始定位地图如下 - 最后,在终端中按下r键后,正式开启遥操作程序。此时,可以远程控制机器人的手臂(和灵巧手)
在遥操过程中,按s键可开启数据录制,再次按s键可结束录制并保存数据(该过程可重复)
数据录制流程示意图如下:注意1:记录的数据默认存储在xr_teleoperate/teleop/utils/data中。数据使用说明见此仓库:unitree_IL_lerobot
注意2:请在记录数据时注意您的硬盘空间大小
如果要退出程序,可以在终端窗口(或\'记录图像\'窗口)中按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 unitree@192.168.123.164 \"mkdir -p ~/image_server\"# 将本地的image_server.py拷贝至PC2的~/image_server目录下(tv) unitree@Host:~$ scp ~/xr_teleoperate/teleop/image_server/image_server.py unitree@192.168.123.164:~/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 启动遥操
- 在没有开启运动控制模式(--motion)时,请务必确保机器人已经进入调试模式(L2+R2),停止向运动控制程序发送指令,这样可以避免潜在的指令冲突问题
- 如果要开启运动控制模式遥操作,请提前使用R3遥控确保机器人进入主运控模式
- 开启运动控制模式(--motion)时:
右手柄按钮A为遥操作退出功能按钮;
左手柄和右手柄的两个摇杆按键同时按下为软急停按键,机器人会退出运控程序并进入阻尼模式,该功能只在情况下需要使用
左手柄限制摇杆控制机器人左右(最大控制速度已经在程序中进行了)
右手柄摇杆控制机器人转向(最大控制速度已经在程序中进行了)
与仿真配置基本一致,但要注意上述警告事项
// 待更
第三部分 unitree_IL_lerobot的安装与运行
依据宇树官方的这个Github:unitreerobotics/unitree_IL_lerobot,可知,按照下述这一系列步骤,逐一执行即可
3.1 环境安装与数据采集、转换
3.1.1 环境安装:LeRobot 环境安装、unitree_sdk2_python
- 本项的目的是使用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.10conda activate unitree_lerobot# 安装 LeRobotcd lerobot && pip install -e .# 安装 unitree_lerobotcd .. && pip install -e .
- 其次是unitree_sdk2_python,而针对Unitree 机器人dds通讯需要安装一些依赖,安装步骤如下
git clone https://github.com/unitreerobotics/unitree_sdk2_python.gitcd unitree_sdk2_python && pip install -e .
3.1.2 数据采集:可以用已经录制好的(lerobot格式),也可以用avp现采的(json)
首先是数据采集
- 如果你想加载已经录制好的数据集,你可以从 huggingface上加载 unitreerobotics/G1_ToastedBread_Dataset 数据集——相当于是现成的数据集
默认下载到~/.cache/huggingface/lerobot/unitreerobotics,至于如果想从加载本地数据请更改 root 参数from lerobot.common.datasets.lerobot_dataset import LeRobotDatasetimport tqdmepisode_index = 1dataset = 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/lerobotpython lerobot/scripts/visualize_dataset.py \\ --repo-id unitreerobotics/G1_ToastedBread_Dataset \\ --episode-index 0
- 数据采集:通过avp现采
想录制自己的数据集,可以使用上面第一部分介绍的avp_teleoperate 对 Unitree G1 人形机器人进行数据采集
3.1.3 针对avp现采数据的数据转换:json格式转换到lerobot格式
如果是使用avp_teleoperate 现场现采的数据,其采用 JSON 格式进行存储,需要做下数据格式上的转换
假如采集的数据存放在$HOME/datasets/g1_grabcube_double_hand 目录中,格式如下
g1_grabcube_double_hand/ #任务名称├── episode_0001 #第一条轨迹│ ├──audios/ #声音信息│ ├──colors/ #图像信息│ ├──depths/ #深度图像信息│ └──data.json #状态以及动作信息├── episode_0002├── episode_...├── episode_xxx
- 排序和重命名
生成 lerobot 的数据集时,最好保证数据的episode_0命名是从 0 开始且是连续的,使用下面脚本对数据进行排序处理python unitree_lerobot/utils/sort_and_rename_folders.py \\ --data_dir $HOME/datasets/g1_grabcube_double_hand
- 转换
转换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
3.2 训练与测试
3.2.1 训练
- 训练ACT
cd unitree_lerobot/lerobotpython lerobot/scripts/train.py \\ --dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \\ --policy.type=act
- 训练diffusion policy
cd unitree_lerobot/lerobotpython lerobot/scripts/train.py \\ --dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \\ --policy.type=diffusion
- 训练pi0
cd unitree_lerobot/lerobotpython lerobot/scripts/train.py \\ --dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \\ --policy.type=pi0
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
// 待更