深度⏱ ~4 min
里程碑
⭐ 为何重要

利用 Apple Vision Pro 头显内置的手/腕追踪实现免穿戴实时双臂灵巧 teleop,并叠加触觉反馈以增强临场感与抓取可靠性。以低延迟和安全为先,专门面向为模仿学习采集双手灵巧数据,是 VR + 灵巧手数据采集的事实标准之一,与 Open-TeleVision 共同定义了头显式 teleop 形态。

机器人双臂 + 多指灵巧手
数据集自采双臂灵巧 IL 数据
上真机
实时
输入模态vision,proprioception,tactile

论文:Ding, Qin, Zhu, Jia, Yang, Yang, Qi, Wang. Bunny-VisionPro: Real-Time Bimanual Dexterous Teleoperation for Imitation Learning. ICRA 2025, HKU + UCSD. arXiv:2407.03162(2024). 🌐 · 真机平台:2× UFactory xArm-7 + 2× Ability Hand(每只 6 主动 DoF,含四连杆;30 指尖 FSR)。

一句话直觉

戴上一副 Apple Vision Pro。

你的双手就能实时遥控两只机械臂加灵巧手

还能感受到机器人摸到了什么——靠一枚 1.2 美元的振动马达。

Bunny-VisionPro 之于灵巧遥操,就像 USB-C 之于外设。

它是统一、即插即用的接口层。

前端输入和后端硬件各管各,中间这层把两边接起来。

是什么·为什么

要解决的问题:让操作员用 VR 头显实时遥控双臂 + 灵巧手。

还要补上「触觉反馈」这块被遗忘的拼图。📎

老办法的两条死胡同📎

  • GripperALOHA / GELLO。

leader 和 follower 必须同构。

碰撞避免、奇异处理全压在操作员身上。

长时操作极易出错。

  • Dexterous 类:AnyTeleop / DexPilot。

用相机 / VR 输入手势。

arm motion 计算依赖重型 GPU

多数只设计单臂。

Glove-based(MANUS)又贵且要求特定手型。

转身:用 Apple Vision Pro 当输入前端。

它廉价、开箱即用,能追踪双手腕 + 手指。📎

但在后端做三件之前的系统没同时做好的事:

  1. 实时处理 loop joint 的灵巧手 retargeting;

loop joint 是四连杆那种欠驱动结构。

  1. 碰撞避免 + 奇异避免 直接做进 motion 控制环,不甩给操作员;
  2. 给操作员 低成本触觉反馈,让「看不见的接触」变得可感知。

方法核心(大白话):整套系统是三段解耦的流水线,每段独立进程。

  • 第一段·手指 retargeting:手指 pose 翻译成机器人手关节角。

关键 trick 处理「loop joint」。

loop joint 是四连杆那种结构——比如 Ability Hand。

4 个关节里只有 1 个主动,其余被动跟着动。

一般的优化器(SQP)对这种约束又慢又不稳。

Bunny-VisionPro 把优化变量降维。

从「全部 n 个关节」降到「只有 k 个主动关节」。

被动关节位置由主动关节算出。

梯度也通过链式法则 backprop 回去。

结果:四连杆 retargeting 提速 10 倍以上。

单 CPU 核跑到 300 Hz。📎

  • 第二段·手臂 motion control:把腕部位姿喂给一个统一优化。

这个优化同时管三件事:到位(IK)、不撞自己、不卡奇异姿态。

trick:把每个机械臂 link 近似成一堆球。

球对之间算「1 / 距离」就拿到可微的碰撞代价。

CPU 上 > 60 Hz,不用 GPU。📎

  • 第三段·触觉反馈:机器人指尖的力传感器(FSR)有零漂问题。

先减 baseline 再 low-pass 滤波。

然后用 PWM 驱动一颗 1.2 美元的振动马达(ERM)告诉操作员「摸到了」。

整套触觉闭环成本不到 10 美元。📎

为什么这三段解耦:避免一环阻塞拖累全链路。

任何一段慢了,其它两段照常跑。

各段频率不同。

输入 30 Hz、retargeting 300 Hz。

arm motion 60 Hz、haptic 独立。

三段并行(加 Vision Pro 输入流),互不阻塞。📎

一句话类比:Bunny-VisionPro 之于灵巧遥操,类比 USB-C。

统一接口、即插即用、前后端解耦。

注意边界:它只覆盖双臂 + 手,不含下半身。

振动只告诉你「有没有接触」,不是力的大小 / 方向。

怎么做

Hand Motion Retargeting(Sec.III):把「人手指 pose → 机器人手关节角」建模成在线优化。📎

loss 由两项组成:fingertip keypoint 距离项 + 时序平滑项。

距离项让 scaled 人手 keypoint 向量贴近机器人手的对应向量。

机器人手那一边的向量由 forward kinematics 算出。

α 是人手-机器人手尺寸缩放因子。

平滑项惩罚相邻帧关节变化,权重 β。

求解用 SQP(Sequential Quadratic Programming),迭代解二次近似。

关键贡献·loop joint 实时处理:四连杆结构(如 Ability Hand)的关节数 > 实际 DoF。

n 个关节里只有 k 个主动,其余 n-k 个被动。

被动关节位置是主动关节的函数。

直接在 SQP 里加 affine 约束,非线性 FK 会让求解不稳且慢。

Bunny-VisionPro reformulate 到降维空间:forward pass 用 c_j 显式算被动关节;backward pass 把被动关节的梯度 backprop 到主动关节。

优化变量从 n 降到 k,无需 SQP 处理 affine 近似。

结果:四连杆 retargeting 提速 10.2 倍,单 CPU 核跑到 300 Hz📎

Arm Motion Control(Sec.IV):把传统 closed-form IK 重写成统一优化。📎

loss = IK 项 + 奇异项 + 碰撞项。

IK 项:位置用 L2、旋转用四元数内积转角度。

奇异项:用 manipulability index(可操作度)作可微目标。

只在最小奇异值 s_0 < s_low 时触发

这样既保证可微性、又避免在非奇异区无谓扰动。

碰撞项:避免 GJK 在 convex mesh 上的高开销。

把每个 link 建模为 m 个球体的集合,自碰撞代价是所有球对的 1 / 距离之和。

仅对需要检查的球对(同 link 或父子 link 跳过)计算。

简化让距离函数可微、计算快。

整套 motion control 在 CPU 上 > 60 Hz,无需 GPU

Human Haptic Feedback(Sec.V):用 Eccentric Rotating Mass(ERM)振动马达。

每个 1.2 美元,加廉价 ELEGOO UNO 板。📎

两步处理:

Step I — 触觉信号处理。

每只 Ability Hand 的 30 个指尖 FSR 有 zero-drift 问题,且被包裹材料加重。

开机时采 baseline、运行时插值减 baseline、再加 low-pass filter。

Step II — 振动马达驱动。

ERM 需恒定电压,用 PWM(pulse-width modulation)模拟连续触觉强度。

每个 ERM 串一颗 BJT,保证每路独立调、只在 pulse width 内激活、抗电路噪声。

Bimanual 协调(Appendix):机器人两手初始间距与操作员两手间距不一致。

直接 teleop 会导致机器人手飘移到与人手不同的相对位置。

设计多种 initialization mode。

机器人开始动时把 robot hands 与 operator hands 对齐。

不同任务选不同模式。📎

通信与流水线:Vision Pro 通过 Apple ARKit stream 把手 / 腕 pose 流到主控机。

三个模块各跑独立进程,避免一环阻塞拖累全链路。📎

常见误区(先抛一个,完整版见末尾):「触觉反馈就是力反馈」——错。

ERM 振动马达只能告诉操作员「有没有接触」,不能传达力的方向与大小。

精细力控任务(拧螺丝、捏鸡蛋)仍受限。

这是 Bunny-VisionPro 与 MANUS / SenseGlove 等专业力反馈手套的关键差距。

深度

Hand Retargeting loss 精确形式(Eq.1)

$$\mathcal{L}_{hand} = \sum_{i=1}^{N}\|\alpha v_i - FK_i(q)\|^2_2 + \beta\|\Delta q\|^2_2 \quad \text{s.t.}\ q^l \le q \le q^u$$

逐项读:第一项让 scaled 人手 keypoint 向量 α v_i 与机器人手前向运动学 FK_i(q) 输出的 keypoint 向量距离最小;第二项是时序平滑;约束是关节限位。

求解用 SQP。📎

Loop joint backward pass 的精确梯度:被动关节位置 q_j = c_j(q_1, ..., q_k)。

被动关节的损失梯度通过链式法则 backprop 到主动关节:

$$grad_i = \frac{\partial \mathcal{L}}{\partial q_i} + \sum_{j=k+1}^{n}\frac{\partial c_j}{\partial q_i}\frac{\partial \mathcal{L}}{\partial q_j}$$

这样优化变量维数从 n 降到 k。📎

Arm Motion Control loss 精确形式(Eq.4–6)

$$\mathcal{L}_{arm} = \mathcal{L}_{ik} + \mathcal{L}_{sin} + \mathcal{L}_{col}$$

IK 项(Eq.5):$\mathcal{L}_{ik} = \beta_{pos}\|p_{ee} - p_{wrist}\|_2 + \beta_{rot}\cdot\arccos(2\langle q_{ee}, q_{wrist}\rangle^2 - 1)$。

位置用 L2、旋转用四元数内积转角度。

奇异项 $\mathcal{L}_{sin}$(Eq.6 左):用 manipulability index 作可微目标。

只在最小奇异值 $s_0 < s_{low}$ 时触发

$$\mathcal{L}_{sin} = \begin{cases} \frac{1-\sqrt{\det[JJ^T]}}{\lambda}, & s_0 < s_{low} \\ 0, & \text{otherwise} \end{cases}$$

碰撞项 $\mathcal{L}_{col}$(Eq.6 右):把每个 link 建模为 m 个球体的集合,自碰撞代价是所有需要检查球对的 1/距离之和(同 link 或父子 link 跳过):

$$\mathcal{L}_{col} = \sum_{i=1}^{m}\sum_{j=1}^{m}\frac{\mathbb{1}(e_i, e_j)}{dist(e_i, e_j) + \epsilon}$$

简化让距离函数可微、计算快。📎

Profiling(Table 1):loop-joint retargeting 在 i7-12700KF 单核 300 Hz;motion control(含碰撞 + 奇异)> 60 Hz;haptic PWM 独立进程。📎

Telekinesis benchmark(Table 2,10 个单臂任务):与 Teleskinesis [Qin 2021] 与 AnyTeleop [Qin 2023] 对比,9/10 任务匹配或超越

scissor pickup 略低——Ability Hand DoF 受限,难以插入剪刀环。📎

自定义双手任务(Fig.1):3 个短时(grasp toy / clean pan / uncover-and-pour)+ 3 个长时(wipe glass / sweep floor / prepare coffee)。

对比 AnyTeleop+(集成 Vision Pro 手部追踪、相同硬件):📎

  • 任务成功率 +11%;
  • 完成时间 −45%(长时任务优势尤其明显);
  • 用 Bunny-VisionPro 采的 demo 训 IL policy对未见姿态 / 物体泛化 +20%

注:teleop 对比实验未启用触觉反馈(demo 采集早于触觉模块完成);触觉在独立 user study(untrained 操作员)评估,显示提升操作精度与沉浸感。📎

局限

  1. 触觉反馈是振动型(ERM)、不是力反馈:操作员只能感知「有没有接触」,不能感知力的方向与大小;精细力控任务仍受限。📎
  2. Vision Pro 手部追踪精度依赖光照与遮挡:手互相遮挡、快速运动时丢追踪,需重初始化。📎
  3. initialization mode 仍是手工:每个任务需选合适模式,未做到自适应。
  4. 未做全身 / locomotion:只覆盖双臂 + 手,下半身由其他系统(HOVER / HumanPlus / OmniH2O)负责——所以 Bunny-VisionPro 与全身 teleop 栈在实际部署里常常组合使用📎
  5. FSR zero-drift 的 baseline 校准对包裹材料敏感:换指尖包裹要重做校准。

研究者视角

图谱定位:Bunny-VisionPro 是 T07 人形遥操栈的VR 成熟期代表节点(转折 4)。📎

它与 Open-TeleVision [Cheng 2024, arXiv:2407.01512] 几乎同期、互补,2024.07 后大量 humanoid 双手工作(包括 1X、Figure、Unitree 生态)以两者为数据采集底座。🌐

演化谱系

  • 建立在:AnyTeleop / dex-retargeting [Qin 2023, arXiv:2307.04577](fingertip keypoint vector retargeting 范式)、DexPilot [Handa 2019]、ALOHA [Zhao 2023]、TeleMoMa [2324.07037](双手协作)。🌐
  • 同期 / 对照:Open-TeleVision [Cheng 2024](同样基于 Vision Pro,但聚焦沉浸式反馈与不同 retargeting 实现);HumanPlus [Fu 2024](全身 teleop,hand 部分用 HaMeR,10 Hz)。
  • 直接引出:便携全身 dex teleop 趋势(HumanoidExo [2510.03022]、RealDexUMI [2606.06033]、NuExo)、低成本触觉手套(DOGlove [2502.07730])、humanoid VLA 数据采集栈(GR00T N1、Helix)。🌐

核心贡献的四条独立线

  1. VR-based 灵巧 teleop 的事实开源标准之一——与 Open-TeleVision 并列。
  2. 首次把「loop joint 实时 retargeting」做工程化:四连杆、欠驱动手的 retargeting 之前要么离线、要么靠 GPU;降维 + backward backprop 让单 CPU 核跑到 300 Hz。📎
  3. 碰撞 + 奇异内建进 motion control:把 ALOHA 系把碰撞甩给操作员的痛点直接解决——这是长时双手任务完成时间 −45% 的主因。
  4. $1.2 触觉反馈:把「vision-based teleop 无触觉」的默认设定打破,开启 DOGlove、TCDM 手套等低成本触觉 teleop 一脉。

副产品·dex-retargeting 中间件的事实推广:与 AnyTeleop 共享同一 retargeting 思路(minimize fingertip keypoint vector distance),让 dex-retargeting 成为灵巧 teleop 的 de facto 接口层,被 iDP3、Open-TeleVision 直接复用。📎

Open problems

  1. 触觉反馈的力 / 方向信息:ERM 只给「有没有接触」。

一个低成本(< $100)能传力方向 / 大小的振动或力反馈接口仍未成熟。[未确认]

  1. 多模式 input 的统一:VR / RGB / 外骨骼 / MoCap 各有 fallback 场景,自动切换的统一接口未出现(OmniH2O 走了 kinematic pose 这条线,但 hand 部分仍各自为政)。
  2. 初始化模式的自适应:当前仍手工选模式,能否根据任务自动选 / 在线调整是开放方向。[未确认]

常见误区

「Bunny-VisionPro 的触觉就是力反馈」 —— 错。

ERM 振动马达只能告诉操作员「有没有接触」,不能传达力的方向与大小。

精细力控任务(拧螺丝、捏鸡蛋)仍受限。

这是「接触事件反馈」,不是「力反馈」——与 MANUS / SenseGlove 等专业力反馈手套的差距是数量级的。📎

「loop joint 直接在 SQP 里加约束就行」 —— 错。

非线性 FK 让 SQP 在 affine 近似下不稳且慢。

Bunny-VisionPro 的贡献是把优化变量从 n 降到 k(主动关节数),用 forward / backward pass 把被动关节的梯度 backprop 到主动关节。

降维 + backprop 才是提速 10× 的关键。📎

「碰撞避免要靠 GPU 才能实时」 —— 错。

Bunny-VisionPro 把每个 link 近似成一堆球,球对距离的 1/距离和是可微、低计算量的代价。

CPU 上 > 60 Hz。

用 sphere approximation 避开了 GJK 在 convex mesh 上的高开销,是工程化的关键 trade-off。📎

「Bunny-VisionPro 解决了全身 teleop」 —— 错。

它只覆盖双臂 + 手,不含下半身(locomotion)。

全身 teleop 由 HOVER / HumanPlus / OmniH2O 负责——实际部署里 Bunny-VisionPro 与全身 teleop 栈常常组合使用。

它是「双手灵巧遥操」的事实标准之一,不是全身方案。📎

「teleop 对比的 +11% / −45% 是触觉带来的」 —— 错。

teleop 对比实验未启用触觉反馈(demo 采集早于触觉模块完成)。

+11% / −45% 主要来自把碰撞 + 奇异内建进 motion control、以及 loop joint retargeting 提速。

触觉在独立 user study 评估,提升的是操作精度与沉浸感,不是 teleop benchmark 数字。📎

检查点

Q1

老办法里 Gripper 类(ALOHA / GELLO)和 Dexterous 类(AnyTeleop / DexPilot)分别卡在什么地方?Bunny-VisionPro 在后端做好的三件事是什么?

💡 参考答案

  • Gripper 类(ALOHA / GELLO):leader / follower 必须同构,碰撞避免 / 奇异处理全压在操作员身上,长时操作易出错。
  • Dexterous 类(AnyTeleop / DexPilot):arm motion 计算依赖重型 GPU、多数只设计单臂;glove-based 又贵且要求特定手型。
  • Bunny-VisionPro 在后端做好的三件事:(a) 实时处理 loop joint 灵巧手 retargeting;(b) 把碰撞避免 + 奇异避免直接做进 motion 控制环,不甩给操作员;(c) 给操作员低成本触觉反馈。
Q2

「loop joint」是什么?为什么四连杆结构的灵巧手 retargeting 用一般的 SQP 优化器又慢又不稳?Bunny-VisionPro 用什么 trick 把它提速 10 倍以上?

💡 参考答案

  • loop joint:四连杆那种欠驱动结构,比如 Ability Hand——n 个关节里只有 k 个主动,其余被动跟着动。
  • 为什么慢 / 不稳:在 SQP 里加 affine 约束近似被动关节,非线性 FK 会让求解不稳且慢。
  • 提速 trick:把优化变量从「全部 n 个关节」降维到「只有 k 个主动关节」。被动关节位置由主动关节算出(forward pass),梯度通过链式法则 backprop 到主动关节(backward pass)。结果 300 Hz 单 CPU 核。
Q3

用「USB-C」或你自己举的类比,向一个没学过机器人的朋友解释:Bunny-VisionPro 是怎么让「操作员的手」和「机器人双臂」实时同步的?接口层把什么和什么解耦?

💡 参考答案

  • USB-C 类比:前端(操作员手势 / Vision Pro 输入)和后端(机器人双臂硬件)各管各,中间这一层接口把它们接起来。
  • 解耦的两边:输入侧(Vision Pro 提供的 30 Hz 手 / 腕 pose)与机器人侧(具体硬件 / 控制环)——中间这一层是「retargeting + motion control + haptic」三段流水线。
  • 重要边界:接口只覆盖双臂 + 手,不含下半身;触觉层只告诉操作员「有没有接触」,不是力的大小 / 方向。
Q4

碰撞避免传统上要靠 GPU 才能实时,Bunny-VisionPro 是怎么做到 CPU > 60 Hz 的?用 sphere approximation 替代 GJK 的关键 trade-off 是什么?

💡 参考答案

  • 做法:把每个机械臂 link 近似成一堆球(sphere approximation),自碰撞代价是所有需要检查球对的 1 / 距离之和。
  • 替代 GJK 的原因:GJK 在 convex mesh 上算开销大;sphere 球对距离函数可微、计算量低,CPU 即可跑 > 60 Hz。
  • 关键 trade-off:用精度换可微性 + 速度——球的近似比真实 mesh 粗糙,但能让碰撞代价进统一优化、和 IK / 奇异一起解。
Q5

Bunny-VisionPro 的触觉反馈用 1.2 美元的振动马达。操作员戴上手套后能感受到什么、不能感受到什么?为什么精细力控任务(拧螺丝、捏鸡蛋)仍受限?

💡 参考答案

  • 能感受到:有没有接触——ERM 振动马达通过 PWM 给出强度信号,告诉操作员机器人摸到了东西。
  • 不能感受到:力的方向与大小——ERM 只能给振动事件,不能传力的大小 / 方向。
  • 为什么精细力控受限:拧螺丝、捏鸡蛋这类任务需要力度调节(多少牛、哪个方向),振动信号无法传达这种连续力信息——所以与 MANUS / SenseGlove 等专业力反馈手套(单只 $1k+)有数量级差距。

FAQ

Q1:触觉反馈就是力反馈吗?

不是。

ERM 振动马达只能告诉操作员「有没有接触」,不能传达力的方向与大小。

真正的力反馈需要更贵的硬件(MANUS / SenseGlove 等专业手套,单只 $1k+)。

Bunny-VisionPro 的 $1.2 ERM 是「接触事件反馈」,是低成本的妥协。📎

Q2:为什么 Bunny-VisionPro 不覆盖下半身?

下半身(locomotion)控制目标完全不同——主要是平衡、步态,不是操作。

把它和双手灵巧操作塞进同一个 RL policy 会让训练不稳。

所以 Bunny-VisionPro 专注于双臂 + 手,下半身由 HOVER / HumanPlus / OmniH2O 等其它栈负责。

实际部署里常常组合使用——Bunny-VisionPro 管手,另一个系统管腿。📎

Q3:loop joint 是 Bunny-VisionPro 发明的吗?

不是。

loop joint(四连杆、欠驱动结构)是机械设计本身就有的,比如 Ability Hand、Shadow Hand 的部分手指。

Bunny-VisionPro 的贡献是第一个把 loop joint 的 retargeting 做到实时(300 Hz 单核 CPU),让这类廉价欠驱动手能上生产。📎

Q4:Bunny-VisionPro 和 Open-TeleVision 有什么区别?

两者几乎同期、都基于 Apple Vision Pro,但聚焦不同。

Bunny-VisionPro 重点在三段解耦的工程化(loop joint + 碰撞 + $1.2 触觉)。

Open-TeleVision 重点在沉浸式反馈(VR 内的机器人第一视角)与不同 retargeting 实现。

两者的 retargeting 都源自 AnyTeleop 的 dex-retargeting 范式。🌐

Q5:为什么我的 Bunny-VisionPro 复现双手任务飘移?

先查三处:(1) initialization mode 选对没——不同任务要不同模式;(2) α(人手-机器人手缩放)按操作员手长重新标定没;(3) 长时双手任务(如 prepare coffee)的初始化模式选错会导致两手初始位置错位、整个 episode 失败。📎