> 技术文档 > 宇树VR遥操与IL——从avp_teleoperate(xr_teleoperate)到unitree_IL_lerobot:如何基于G1进行manipulation开发_宇树机器人二次开发

宇树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 手臂的示例程序

  1. 至于如果买的是meta quest的——我司七月这边6月初便买的这个,则还参考这个链接:teleop based on Quest 3/3S
  2. 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 配置

  1. Ubuntu 20.04 和 Ubuntu 22.04 操作系统下进行测试
  2. 双臂 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 环境内执行,除非另有说明

  3. 注意,原来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

  1. 安装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
  2. 配置环境变量
    eval \"$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)\"
  3. 使用 brew 安装mkcert
    brew install mkcert

接下来,生成证书

  1. 查看本机(你自己的办公电脑) IP 地址
    (tv) unitree@Host:~/avp_teleoperate$ ifconfig | grep inet
  2. 假设本机 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/
  3. 系统防火墙设置
    sudo ufw allow 8012
  4. 在 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和头部的双目相机

物品名称 数量 渲染图 说明 Apple Vision Pro 1

参考 Apple 官方网址 计算机 1 / x86_64 架构 人形机器人 H1 1 / 具体型号为 H1_2 灵巧手 1

H1可搭载 Inspire Robotics (RH56DFX) 的仿人五指灵巧手,该灵巧手具有6个自由度和12个运动关节,可以模拟人手实现复杂动作

具体可参考该文档

头部双目相机 1

普通 USB 免驱动双目相机

戴在机器人头部,主要作用是辅助操作人员,通过 Apple Vision Pro 观看到机器人视角下工作空间的视野
供参考的购买链接

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

头部相机支架 1 avp_teleoperate/hardware/head_stereo_camera_mount.STEP at main · unitreerobotics/avp_teleoperate · GitHub M4x14 螺钉 2 M2x4 自攻螺钉 4

1.3.2 手腕上的深度相机D405

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

2 Depth Camera D405 – Intel® RealSense™ Depth and Tracking Cameras 腕部相机环形支架 2 https://github.com/unitreerobotics/avp_teleoperate/blob/g1/hardware/wrist_ring_mount.STEP 左腕相机支架 1 https://github.com/unitreerobotics/avp_teleoperate/blob/g1/hardware/left_wrist_D405_camera_mount.STEP 右腕相机支架 1 https://github.com/unitreerobotics/avp_teleoperate/blob/g1/hardware/right_wrist_D405_camera_mount.STEP

有两个点 值得提一下

  1. 以上,可以通过avp 官方GitHub 确认:github.com/unitreerobotics/avp_teleoperate/blob/main/README_zh-CN.md
  2. 我司长沙具身团队在采购上面的深度相机——比如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

  1. 使用因时官方SDK控制
    用户可以根据因时灵巧手官方通讯协议自行编写程序控制灵巧手
  2. 使用宇树灵巧手SDK控制
    H1通信建立在DDS框架之上,为便于使用unitree_sdk2进行控制灵巧手。宇树提供将串口收发的数据转为DDS消息的示例程序

关于宇树SDK接口的说明

  1. 用户向 \"rt/inspire/cmd\" 话题发送 \"unitree_go::msg::dds::MotorCmds_\" 消息控制灵巧手
    从 \"rt/inspire/state\" 话题接受 \"unitree_go::msg::dds::MotorStates_\" 消息获取灵巧手状态
  1. 首先到 该网址oss-global-cdn.unitree.com/static 下载灵巧手控制接口程序,并将之拷贝到 机器人 Unitree H1_2 的 PC2 中
  2. 其次,在 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

  1. 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端口是否可用

  2. 图像推流服务开启以后,可以在主机终端使用 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 需要执行以下步骤:

  1. 修改 ~/avp_teleoperate/teleop/teleop_hand_and_arm.py 中 if __name__ == \'__main__\': 代码下方的 img_config 图像客户端配置,它应该与 上面的「1.3.2 开启图像推流服务」 节中,你在 PC2 配置的图像服务器参数相同
  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
  3. 程序如果正常启动,终端最后一行将停留在 “Please enter the start signal (enter \'r\' to start the subsequent program):” 的字符串输出

然后,操作员 A 需要执行以下步骤:

  1. 戴上 Apple Vision Pro 设备。
  2. 在 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

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

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

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


如果使用了--record参数,那么操作员 B 可以在打开的“record image”窗口中按 s 键开始录制数据,再次按 s 键停止。可以根据需要重复此操作进行多次录制

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

最后,特别提醒下,每次重新遥操时,需要重启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设备
除了远程操作,还包含模仿学习功能 核心架构差异

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

\\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遥操强脑灵巧手(单只右手)

    七月具身: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. 注意1:在 xr_teleoperate >= v1.1 版本中,unitree_sdk2_python 仓库的 commit 必须是等于或高于 404fe44d76f705c002c97e773276f2a8fefb57e4 版本
  2. 注意2:原 h1_2 分支中的 unitree_dds_wrapper 为临时版本,现已全面转换到上述正式的 Python 版控制通信库:unitree_sdk2_python
  3. 注意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

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

接下来,执行以下步骤:

  1. 戴上您的XR头显设备(比如apple Vision pro或pico4 ultra enterprise等)
  2. 连接对应的WiFi热点
  3. 浏览器应用(如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)按钮,使用非安全方式继续登录服务器

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

  5. 与此同时,您将在 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
  6. 然后,将手臂形状支架到与机器人初始姿势相接近的姿势。这一步是为了避免在实际部署时,初始姿势偏差过大导致机器人产生过大的摆动
    机器人初始定位地图如下

  7. 最后,在终端中按下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 启动遥操

  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

  1. 本项的目的是使用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 .
  2. 其次是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)

首先是数据采集

  1. 如果你想加载已经录制好的数据集,你可以从 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
  2. 数据采集:通过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
  1. 排序和重命名
    生成 lerobot 的数据集时,最好保证数据的episode_0命名是从 0 开始且是连续的,使用下面脚本对数据进行排序处理
    python unitree_lerobot/utils/sort_and_rename_folders.py \\ --data_dir $HOME/datasets/g1_grabcube_double_hand
  2. 转换
    转换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 训练

  1. 训练ACT
    cd unitree_lerobot/lerobotpython lerobot/scripts/train.py \\ --dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \\ --policy.type=act 
  2. 训练diffusion policy
    cd unitree_lerobot/lerobotpython lerobot/scripts/train.py \\ --dataset.repo_id=unitreerobotics/G1_ToastedBread_Dataset \\ --policy.type=diffusion
  3. 训练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

// 待更