论文标题: Behavior Robot Suite: Streamlining Real-World Whole-Body Manipulation for Everyday Household Activities
作者: Yunfan Jiang, Ruohan Zhang, Josiah Wong, Chen Wang, Yanjie Ze, Hang Yin, Cem Gokmen, Shuran Song, Jiajun Wu, Li Fei-Fei
机构: Stanford University
发表: CoRL 2025 (Seoul), arXiv:2503.05652 (v2, 2025-08-24)
项目主页: https://behavior-robot-suite.github.io
关键词: 全身操作、移动操作、遥操作、行为克隆、扩散策略、家庭任务

一句话总结:李飞飞/宋舒然联合团队(上一期 iDP3 的一作 Yanjie Ze 也在作者列表里)推出 BRS 框架——500 美元的 Joy-Con 运动孪生臂遥操作系统 JoyLo + 自回归全身动作解码策略 WB-VIMA,让一台双臂 + 4-DoF 躯干 + 全向底盘的轮式机器人,在真实家庭环境里擦马桶、倒垃圾、收拾派对残局,子任务平均成功率 88%,部分接触密集子任务甚至反超人类遥操作


一、介绍

1.1 从 BEHAVIOR-1K 里挖出的三条真理

这篇论文的起点很有意思:作者没有先造机器人,而是先做数据考古。他们拿 BEHAVIOR-1K(1000 个由普通人票选的家庭任务基准)做了一轮统计分析,得出三个结论:

  1. 双臂协调(Bimanual):搬大件、抱重物绕不开两只手;
  2. 稳定精确的导航(Navigation):取个东西经常要跨越半个屋子;
  3. 广域末端可达性(Reachability):作者统计了家庭任务相关物体的高度分布(Figure 2),发现物体高度呈多峰分布——0.09 m(地上)、0.49 m(低位台面)、0.94 m(桌面)、1.43 m(高处架子)。四个峰横跨从地板到超过成年人舒适举手高度(182.9 cm)的范围。

视频编码工程师的类比:这个多峰分布非常像码率-失真曲线上的"关键采样点"——你不能只在中间高度布置工作空间,就像不能用单一 QP 应对全场景编码。机器人的"运动空间编码能力"必须在垂直维度上全范围覆盖,这就是为什么固定躯干的单臂机器人注定干不了家务。

1.2 现有系统的缺口

论文的 Table 1 对比了 16 个真机系统,得出一个尖锐的结论:没有一个系统同时做到"手臂 + 躯干 + 移动底盘的同步控制"

  • Mobile ALOHA:双臂 + 底盘,但没有独立躯干控制;
  • ACE、BiDex:灵巧手很强,但原地不动;
  • TidyBot++:有底盘,底盘还不解耦(需要两个操作员,或者用腿当躯干用);
  • 更要命的是,多数系统的遥操作接口(VR 手柄、AVP 头显)基于逆运动学(IK),在移动操作场景下奇异构型频发、手抖、不协调。

硬件复杂了,学习也更难:21 个自由度(底盘 3 + 躯干 4 + 双臂 12 + 夹爪 2)怎么建模?直接 flatten 成一个 21 维向量喂给策略网络,底盘/躯干的小误差会沿着运动学链放大成末端执行器的大偏差——论文算了笔账:R1 机器人中立位下,膝关节 0.17 rad(10°)的偏差会让末端偏移 0.14 m。抓杯子级精度的任务,0.14 m 就是灾难。

1.3 BRS 的答案:硬件接口 + 学习算法双创新

BRS = BEHAVIOR ROBOT SUITE,两个核心组件:

  1. JoyLo(Joy-Con on Low-cost Kinematic-twin arms):运动学孪生臂 + 任天堂 Joy-Con 手柄的全身遥操作接口,总成本 ~$499.5(附录有完整 BOM 表),自带双边触觉反馈,不需要力传感器;
  2. WB-VIMA(Whole-Body VIsuoMotor Attention policy):Transformer 观测编码 + 自回归全身动作解码——底盘动作先出,躯干条件于底盘,双臂条件于躯干+底盘,按运动学层级链式生成 21-DoF 动作。

真实家庭环境、五项长时程任务、每项 15 次随机化评测,子任务平均成功率 88%,端到端任务峰值成功率 93%(Put Items onto Shelves)。


二、原理

2.1 机器人本体:Galaxea R1

  • 双臂:各 6-DoF + 平行爪夹爪(行程 0~100 mm,额定夹持力 100 N,单臂负载 5 kg,臂展 923 mm),关节阻抗控制器,输入为目标关节位置;
  • 躯干 4-DoF:腰旋转 + 髋弯曲 + 两个类膝关节,可站立↔深蹲平滑切换,额定力矩 108 N·m、峰值 304 N·m——这个力矩设计就是为了硬扛"用整个身体拉开门"这种接触密集动作;
  • 全向底盘:3 轮转向 + 3 轮驱动,最大速度 1.5 m/s,偏航 3 rad/s,前进加速度 2.5 m/s²,离地间隙 30 mm;
  • 传感器:头部 ZED 2 + 双腕 ZED-Mini(三路 RGB-D,60 Hz,1344×376)+ RealSense T265 视觉里程计(200 Hz,给底盘提供速度/加速度反馈);
  • 算力:机载 Jetson Orin 负责传感器,策略推理在局部局域网连接的 RTX 4090 工作站上(延迟 0.02 s,后面细说这套异步部署)。

三路相机的点云融合是个值得注意的细节:相机到机器人基座的变换用 500 Hz 的正运动学实时更新(相机长在会动的头和腕上,外参时刻在变——还记得上一期 iDP3 的做法吗?那里是干脆不变换、留在相机系;BRS 的选择是靠高频 FK 硬算变换,融合到机器人基座坐标系),然后空间裁剪 + FPS 下采样到 4096 点。两条技术路线,各有取舍。

2.2 JoyLo:把"全身"装进 500 美元

JoyLo 的设计哲学是在两个极端之间找平衡:

  • 动觉示教(kinesthetic teaching):精确但慢、不可规模化;
  • 动作重定向(VR/AVP 那类 IK 映射):无接触但存在具身失配(embodiment mismatch)和奇异构型问题。

JoyLo 选了傀儡师(puppeteering)路线:两根 3D 打印的运动孪生臂(运动学结构与机器人手臂一一对应),操作员握着臂末端的 Joy-Con。分工明确:

  • 运动孪生臂 → 直接映射机器人双臂关节角(关节空间直连,无 IK);
  • 左摇杆 → 底盘速度(前后/左右/旋转);
  • 右摇杆 → 腰 + 髋;
  • 方向键 → 躯干高度(站/蹲);
  • 扳机键 → 夹爪开合。

三个设计亮点:

  1. 免费触觉反馈(双边遥操作)。JoyLo 臂与机器人臂运动学耦合,机器人关节位置反过来"顶"JoyLo 臂,力矩公式为 τ = Kp(q_robot − q_JoyLo) + Kd(q̇_robot − q̇_JoyLo) − K。机器人碰到障碍,操作员手上直接感受到比例阻力——不需要任何力传感器,硬件只有 16 个 Dynamixel XL330 电机($382.4)+ 一个 Joy-Con($70)+ U2D2 通信转换器 + 电源和 3D 打印件,合计 $499.5;
  2. 运动学约束即安全网。操作员被孪生臂的物理关节限位"物理锁死",想生成机器人做不到的动作都难,采集到的演示天然可执行;
  3. 单操作员全身控制。对比 TidyBot++(需要双人协作:一人底盘一人手臂),Joy-Con 摇杆让一个人同时管全身上下,这也是 Table 1 里"Single-operator mobile base control"那一列的底气。

2.3 WB-VIMA:给 21 个自由度排出"先来后到"

WB-VIMA 的核心洞察:机器人具身空间存在天然的层级结构——底盘在运动学链最上游,躯干居中,手臂在最末端。上游的误差会向下放大(0.17 rad → 0.14 m),所以下游动作的规划必须以上游动作为条件

架构分两块(对应论文 Figure 4):

块一:多模态观测注意力(观测编码侧,重)

  • 彩色点云(每点 6 维:RGB + XYZ,共 4096 点)→ PointNet 编码 → 点云 token E_pcd;
  • 本体感知(底盘速度 3 维 + 躯干关节 4 维 + 双臂关节 12 维 + 夹爪宽度 2 维,共 21 维)→ MLP → 本体 token E_prop;
  • 过去 T_o=2 步的观测 token + 动作读取 token E_a 组成序列,过因果自注意力 Transformer(2 层、8 头、256 维、GEGLU 激活)——动作 token 只看历史观测,不看未来。

注意点云是带颜色的:DP3 用纯几何点云(丢弃 RGB),WB-VIMA 保留颜色通道,让策略能区分"要擦的镜子"和"镜子前的墙"这类几何相同、语义不同的东西。消融实验证明这一条很关键(后文效果对比)。

块二:自回归全身动作解码(动作生成侧,轻)

三个独立的 UNet 去噪扩散网络,按层级链式解码:

底盘 (3-DoF)→作为条件躯干 (4-DoF)→作为条件双臂+夹爪 (14-DoF)\text{底盘 }(3\text{-DoF}) \xrightarrow{\text{作为条件}} \text{躯干 }(4\text{-DoF}) \xrightarrow{\text{作为条件}} \text{双臂+夹爪 }(14\text{-DoF})底盘 (3-DoF)作为条件躯干 (4-DoF)作为条件双臂+夹爪 (14-DoF)

直观理解:策略先想好"我要开到洗碗机前面"(底盘),再决定"身体怎么俯身"(躯干),最后才规划"手怎么伸进碗架"(双臂)。下游的每一级都以最终(去噪后)的上游动作为条件,因此上游动作的意图会自动传导到下游规划里,误差不再单向放大——这就是"coordinated whole-body action"的字面实现。

一个与扩散策略惯例不同的效率设计:扩散去噪只从动作读取 token 出发,观测编码器和 Transformer 每次推理只跑一遍,三个轻量 UNet 反复迭代去噪。重编码器 + 轻动作头的组合,换来 10 Hz 控制频率下的实时推理。

2.4 训练与部署

  • 损失:三个解码器各自的噪声预测 MSE 之和(标准 DDPM 行为克隆);
  • 数据:JoyLo 采集,机器人 100 Hz 运行、10 Hz 记录,动作每 0.1 s 发一次、重复执行 10 次;
  • 优化:AdamW,lr 7e-4,warmup 1000 步 + 余弦衰减 30 万步,DDP 多卡训练;
  • 扩散:训练 100 步 DDPM 调度,推理只用 16 步 DDIM
  • 部署:异步推理——策略推理在后台持续跑,切换到新预测轨迹时丢弃头几步动作来补偿推理延迟,保证控制循环永不阻塞。0.02 s 有效延迟,10 Hz 发指令。

这个"丢头几步"的 trick 值得展开:扩散策略一次预测未来 Ta=8 步,但推理期间机器人还在动,等动作算出来时前几步已经"过期"了。与其阻塞等待,不如永远执行"下一条轨迹的后几步",用流水线重叠掩盖延迟——和视频解码流水线里预取参考帧、跳过过期帧是同一个思路。


三、公式

3.1 扩散策略基座

DDPM 前向加噪:q(xk∣xk−1)q(x^k|x^{k-1})q(xkxk1) 逐步注入高斯噪声,网络 ϵθ(xk,k)\epsilon_\theta(x^k, k)ϵθ(xk,k) 学习预测所加噪声,训练目标:

L=Ek,x0,ϵ[MSE(ϵk, ϵθ(⋅∣k))]L = \mathbb{E}_{k, x^0, \epsilon}\left[\text{MSE}\left(\epsilon^k,\ \epsilon_\theta(\cdot \mid k)\right)\right]L=Ek,x0,ϵ[MSE(ϵk, ϵθ(k))]

反向去噪分布(论文附录 A 式 A.1):

xk−1∼N(μk(xk, ϵθ(xk,k)), σk2I)x^{k-1} \sim \mathcal{N}\left(\mu^k\left(x^k,\ \epsilon_\theta(x^k, k)\right),\ \sigma_k^2 \mathbf{I}\right)xk1N(μk(xk, ϵθ(xk,k)), σk2I)

  • xkx^kxk:第 kkk 级噪声下的动作轨迹(这里 x0x^0x0 是未来 8 步的动作序列);
  • μk(⋅)\mu^k(\cdot)μk():由当前含噪样本和预测噪声计算的去噪均值;
  • σk2\sigma_k^2σk2:预定义噪声调度下的方差。

3.2 自回归全身动作解码(核心公式,论文式 1)

WB-VIMA 联合学习三个去噪网络 ϵbase,ϵtorso,ϵarms\epsilon_{\text{base}}, \epsilon_{\text{torso}}, \epsilon_{\text{arms}}ϵbase,ϵtorso,ϵarms,解码顺序严格按运动学层级:

abasek−1∼N(μk(abasek, ϵbase(abasek∣Ea,k)), σk2I)a_{\text{base}}^{k-1} \sim \mathcal{N}\left(\mu^k\left(a_{\text{base}}^k,\ \epsilon_{\text{base}}\left(a_{\text{base}}^k \mid E_a, k\right)\right),\ \sigma_k^2 I\right)abasek1N(μk(abasek, ϵbase(abasekEa,k)), σk2I)

atorsok−1∼N(μk(atorsok, ϵtorso(atorsok∣abase0, Ea,k)), σk2I)a_{\text{torso}}^{k-1} \sim \mathcal{N}\left(\mu^k\left(a_{\text{torso}}^k,\ \epsilon_{\text{torso}}\left(a_{\text{torso}}^k \mid a_{\text{base}}^0,\ E_a, k\right)\right),\ \sigma_k^2 I\right)atorsok1N(μk(atorsok, ϵtorso(atorsokabase0, Ea,k)), σk2I)

aarmsk−1∼N(μk(aarmsk, ϵarms(aarmsk∣atorso0, abase0, Ea,k)), σk2I)a_{\text{arms}}^{k-1} \sim \mathcal{N}\left(\mu^k\left(a_{\text{arms}}^k,\ \epsilon_{\text{arms}}\left(a_{\text{arms}}^k \mid a_{\text{torso}}^0,\ a_{\text{base}}^0,\ E_a, k\right)\right),\ \sigma_k^2 I\right)aarmsk1N(μk(aarmsk, ϵarms(aarmskatorso0, abase0, Ea,k)), σk2I)

符号逐个拆:

  • abase∈RTa×3a_{\text{base}} \in \mathbb{R}^{T_a \times 3}abaseRTa×3:底盘轨迹(前进/横移/偏航速度),Ta=8T_a = 8Ta=8 步;
  • atorso∈RTa×4a_{\text{torso}} \in \mathbb{R}^{T_a \times 4}atorsoRTa×4:躯干轨迹(腰/髋/双膝);
  • aarms∈RTa×14a_{\text{arms}} \in \mathbb{R}^{T_a \times 14}aarmsRTa×14:双臂 12 关节 + 夹爪 2 宽度;
  • EaE_aEa:经注意力聚合后的动作读取 token(所有观测信息的汇总);
  • 上标 kkk:去噪步;a0a^0a0完全去噪后的干净动作

三个关键细节:① 每级条件用的是 a0a^0a0(去噪完成的上游动作)而不是中间含噪版本——先让底盘把动作想完整,躯干和手臂才参照它规划;② 三条链共享同一个 EaE_aEa,观测信息是一份;③ 三条链独立并行迭代去噪,但依赖关系是串行的,整体仍是流水线式的链式生成。

3.3 误差放大的量化论证

论文用这个数字论证自回归解码的必要性:R1 中立位下,膝关节角偏差 Δθ=0.17 rad\Delta\theta = 0.17\ \text{rad}Δθ=0.17 rad 沿运动学链放大为末端偏移:

ΔxEEF≈0.14 m(放大系数≈0.82 m/rad)\Delta x_{\text{EEF}} \approx 0.14\ \text{m} \quad (\text{放大系数} \approx 0.82\ \text{m/rad})ΔxEEF0.14 m(放大系数0.82 m/rad)

意思是:如果你把 21 维动作 flatten 了独立预测,底盘和躯干的建模误差无法被手臂"看见"和补偿,末端漂移直接超出手爪抓取容差(论文的杯子/碗尺寸级别任务)。自回归条件的本质是让误差变成显式信息流而非隐式扰动

3.4 观测融合与 JoyLo 力矩

三路相机点云融合到机器人基座系:

Pego-centric=⋃camera(Pcamera(Rcamera)⊤+(tcamera)⊤)P_{\text{ego-centric}} = \bigcup_{\text{camera}} \left( P_{\text{camera}} (R_{\text{camera}})^\top + (t_{\text{camera}})^\top \right)Pego-centric=camera(Pcamera(Rcamera)+(tcamera))

其中 Rcamera,tcameraR_{\text{camera}}, t_{\text{camera}}Rcamera,tcamera 由 500 Hz 正运动学实时给出(头和手腕都在动,外参是时变量)。

JoyLo 双边遥操作力矩(第 2.2 节已述):

τ=Kp(qrobot−qJoyLo)+Kd(q˙robot−q˙JoyLo)−K\tau = K_p (q_{\text{robot}} - q_{\text{JoyLo}}) + K_d (\dot{q}_{\text{robot}} - \dot{q}_{\text{JoyLo}}) - Kτ=Kp(qrobotqJoyLo)+Kd(q˙robotq˙JoyLo)K

机器人关节(leader 端的 follower)与孪生臂的偏差产生反向力矩,操作员手感 = 机器人的"触觉"。


四、图示

4.1 BRS 系统总览

┌─────────────────────── BRS 全家桶 ───────────────────────────────┐
│                                                                   │
│  [硬件] Galaxea R1           [接口] JoyLo (~$500)                │
│  ┌────────────────┐          ┌──────────────────┐                │
│  │ 头 ZED2+腕 ZED-Mini│       │ 运动孪生臂×2      │                │
│  │   ↓ 500Hz FK     │        │  → 双臂关节角直连  │                │
│  │ 融合彩色点云4096点 │        │ Joy-Con:          │                │
│  │ 双臂 6DoF×2+夹爪   │◀──────│  左摇杆→底盘速度   │                │
│  │ 躯干 4DoF (腰髋膝) │        │  右摇杆→腰+髋     │                │
│  │ 全向底盘 3DoF      │        │  方向键→躯干高度   │                │
│  └────────────────┘          │  扳机→夹爪       │                │
│                               │ 触觉: τ=KpΔq+KdΔq̇ │                │
│                               └──────────────────┘                │
│            ↓ 采集 (100Hz 控制/10Hz 记录)                           │
│  [算法] WB-VIMA                                                   │
│  ┌────────────────────────────────────────────────┐              │
│  │ 彩色点云→PointNet→E_pcd ─┐                      │              │
│  │ 本体感知21维→MLP→E_prop ─┼→ 因果自注意力 Transformer │              │
│  │ 动作读取 token E_a ──────┘        │               │              │
│  │              ┌───────────────────┘               │              │
│  │              ▼  自回归扩散解码 (UNet×3)            │              │
│  │   底盘 3DoF ──条件──▶ 躯干 4DoF ──条件──▶ 双臂 14DoF │              │
│  └────────────────────────────────────────────────┘              │
│            ↓ 异步部署 (RTX 4090, 0.02s 延迟, 10Hz)                │
│  [任务] 擦马桶 | 倒垃圾 | 收纳上架 | 铺衣服 | 清理派对残局            │
└───────────────────────────────────────────────────────────────────┘

4.2 自回归解码 vs Flatten 解码(核心思想对比)

     传统做法: Flatten 21-DoF                WB-VIMA: 自回归分层解码
┌──────────────────────────┐         ┌──────────────────────────────┐
│  [base│torso│arms]        │         │  E_a (观测汇总 token)          │
│   一个向量, 一起预测        │         │    │                          │
│        │                 │         │    ▼                          │
│        ▼                 │         │  底盘 UNet → a_base (3DoF)     │
│  误差互相不知道            │         │    │ a_base (干净版)            │
│   底盘差 0.1rad           │         │    ▼                          │
│        │ (手臂看不见!)     │         │  躯干 UNet → a_torso (4DoF)    │
│        ▼                 │         │    │ a_torso + a_base           │
│   末端漂 0.14m → 任务失败  │         │    ▼                          │
│                          │         │  双臂 UNet → a_arms (14DoF)    │
│  安全违规: 撞桌/超力矩     │         │  下游"看见"上游意图 → 协调       │
└──────────────────────────┘         └──────────────────────────────┘

4.3 具身自由度与传感器布局速查表

组件自由度控制方式关键参数
全向底盘3(x/y/yaw 速度)速度控制器≤1.5 m/s,加速度 ≤2.5 m/s²
躯干4(腰转/髋弯/双膝)关节阻抗(目标位置)额定力矩 108 N·m,峰值 304 N·m
双臂2×6 = 12关节阻抗(目标位置)臂展 923 mm,负载 5 kg
夹爪2目标开口宽度行程 0~100 mm,夹持力 100 N
头部相机ZED 2 RGB-D,60 Hz深度范围 0.2~3 m
腕部相机ZED-Mini ×2,60 Hz深度范围 0.1~1 m
里程计RealSense T265,200 Hz底盘速度/加速度反馈

4.4 五项家庭任务(对应论文 Figure 1 & 附录 D.1)

任务子任务链核心能力演示数人类平均用时
收拾派对残局开洗碗机→取碗→装碗→关上稳定导航138210 s
擦马桶取海绵→开盖→刷→关盖→冲水广域可达103120 s
倒垃圾拾袋→开门→出门→丢进垃圾桶稳定导航122130 s
收纳上架地上抬箱→放到四层货架对应层广域可达10060 s
铺衣服开衣柜→取衣架→铺到沙发床→关柜双臂协调98120 s

五、踩坑点

论文 Limitations 部分写得非常坦诚,加上失败模式分析(Figure 10),按老规矩分范式级/工程级整理。

范式级

坑 1:长时程任务的复合误差(compounding errors)。
子任务成功率 88% 看着漂亮,但端到端成功率只有 58%(峰值 93%)——6 个子任务连乘,误差滚雪球。“清理派对残局”(6 个子任务)的 ET 是 40%,而人类遥操作也只有 68%。作者开出的药方:人类纠错数据学习(RoboCopilot 路线)或引入模型化任务规划。模仿学习做长时程任务,子任务精度再高也架不住连乘——这是行为克隆的宿敌。

坑 2:操作员视角 ≠ 机器人视角。
JoyLo 是第三人称遥操作:操作员用自己的眼睛看机器人,还得一边保证自己不入镜、一边保证目标物体在机器人相机视野内。否则采到的数据部分可观测,策略训练直接受害。作者提出未来用主动感知(操作员看机器人之所见)解决——但这又回到了 AVP 头显方案的老路和它的协调性问题。

坑 3:点云的白天/黑夜问题。
RGB-D 立体相机在弱光和反光表面下退化严重。白天采的数据策略夜里可能就废了——纯几何点云没这问题但丢了语义,彩色点云有语义但怕光照。作者提到可以上 FoundationStereo 改善深度质量。

坑 4:数据封闭于单一具身。
全部数据来自 R1 一台机器人,没有跨具身迁移,数据量也不足以支撑场景级泛化。作者的展望:接入 VLA 大模型补场景理解、用仿真合成数据和人类视频扩充。这与上一期 iDP3 的"单场景泛化"路线刚好互补——iDP3 靠表示学习解决泛化,BRS 目前靠数据内随机化(每任务至少两类随机化:起点位置、物体摆放、实例、干扰物)。

坑 5:人类遥操作本身就是天花板之一。
看附录数值表:擦马桶的 ST-2(开马桶盖)人类遥操作成功率只有 72%,铺衣服的 ST-1(开衣柜门)只有 56%——人类自己开这些铰接件都费劲(第三人称视角 + 全身不协调)。而 WB-VIMA 这两个子任务做到 80% 和 87%,反超人类。反过来说,训练数据里就混着人类失败演示,策略的天花板部分取决于示教质量——JoyLo 的价值正在于此。

工程级

坑 6:躯干误差沿运动学链放大。
0.17 rad → 0.14 m,这是把 flatten 动作空间的建模误差变成显式问题的量化账。任何做多自由度机器人的都该先算一遍自己平台的"放大系数"再决定动作空间建模方式。

坑 7:底盘/躯干失控 = 硬件自杀。
Figure 9 的对照组实验:锁死髋关节去开门、锁死底盘去拉洗碗机门,结果是门/洗碗机纹丝不动,机械臂关节力矩飙升,产生可能损坏硬件的过度受力。基线策略(DP3 撞桌 13 次、RGB-DP 手臂失力 2 次、ACT 撞门框)在评测里就是这么烧电机的。"安全违规数"作为评测指标不是情怀,是真金白银。

坑 8:IK 接口在移动操作下的奇异性。
用户研究里用雅可比矩阵条件数阈值检测奇异构型——VR 手柄和 AVP 的奇异性比例分别比 JoyLo 高 78% 和 85%。静态桌面上 IK 够用,底盘一动 + 躯干一弯,IK 的工作空间约束和操作员直觉严重脱节(70% 的参与者实验前认为 IK 更好用,实验后 100% 倒戈 JoyLo)。

坑 9:异步推理的头几步丢弃。
扩散策略预测 8 步、推理有延迟,直接执行会执行"过期动作"。解法是丢弃新轨迹头几步补偿延迟——步数丢多少是个工程玄学,丢少了动作不连续,丢多了浪费预测时域。


六、源码拆解

代码全开源(behavior-robot-suite.github.io),以下按论文正文 + 附录 C 的实现细节重建核心伪代码。

6.1 机器人控制接口(对应附录 Pseudocode 1)

# 对应论文附录 Pseudocode 1: R1 控制器 Python 接口
from brs_ctrl.robot_interface import R1Interface

robot = R1Interface(...)   # ROS 通信, 100Hz 控制回路
robot.control(
    arm_cmd={              # 双臂: 目标关节位置 (阻抗控制)
        "left":  left_arm_target_q,
        "right": right_arm_target_q,
    },
    gripper_cmd={          # 夹爪: 目标开口宽度 (mm, 0~100)
        "left":  left_gripper_target_width,
        "right": left_gripper_target_width,
    },
    torso_cmd=torso_target_q,              # 躯干: 目标关节位置
    base_cmd=mobile_base_target_velocity,  # 底盘: 目标速度 (vx, vy, wyaw)
)

注意接口设计的动作空间选择:上位机(关节位置)+ 底盘(速度)的混合控制——臂/躯干是位置级阻抗,底盘是速度级。这与上一期 iDP3"全关节位置作为动作"的选择不同:轮式底盘天然是速度控制对象,硬拆成位置反而不自然。

6.2 WB-VIMA 主干(对应论文 Section 3 + 附录 C.2)

# 伪代码:WB-VIMA。对应论文 Fig.4 架构 + 附录 C.2 超参数
class WB_VIMA(nn.Module):
    def __init__(self):
        self.pointnet = PointNet(in_ch=6, out=256, depth=2)    # 彩色点云: N=4096, XYZ+RGB
        self.prop_mlp = MLP(in=21, hidden=256, depth=3)        # 本体: 底盘3+躯干4+臂12+爪2
        self.attention = TransformerDecoder(                   # 多模态观测注意力
            embed=256, layers=2, heads=8, dropout=0.1, act=GEGLU)
        # 三个独立 UNet 去噪头 (hidden=[64,128], kernel=2)
        self.eps_base  = UNet1D(cond_dim=256)
        self.eps_torso = UNet1D(cond_dim=256 + 3)   # 额外条件: 干净的 a_base
        self.eps_arms  = UNet1D(cond_dim=256 + 3 + 4)  # 条件: a_base + a_torso

    def encode_obs(self, pcd_history, prop_history):
        # 过去 To=2 步的观测 token + 动作读取 token, 因果自注意力
        tokens = []
        for pcd, prop in zip(pcd_history, prop_history):
            e_pcd  = self.pointnet(normalize_xyz(pcd), rgb(pcd)/255.0)
            e_prop = self.prop_mlp(prop)
            tokens += [e_pcd, e_prop, action_readout_token]
        S = self.attention(stack(tokens))      # 因果 mask: 动作只看历史
        return S[..., -1, :]                   # 取最后的动作读取 token E_a

    @torch.no_grad()
    def act(self, obs):
        E_a = self.encode_obs(obs)             # 编码器每次推理只跑一遍!
        a_base = ddim_sample(self.eps_base,  cond=E_a,               steps=16)
        a_torso = ddim_sample(self.eps_torso, cond=[E_a, a_base],    steps=16)
        a_arms  = ddim_sample(self.eps_arms,  cond=[E_a, a_base, a_torso], steps=16)
        return concat(a_base, a_torso, a_arms)  # (Ta=8, 21)

6.3 JoyLo 双边遥操作控制(对应论文 Section 2 + 附录 B.2)

# 伪代码:JoyLo 双边遥操作。对应论文 Sec.2 力矩公式 + 附录 B
JOYLO_KP = [0.5]*6    # 电流式阻抗: 力 ∝ 电机电流
JOYLO_KD  = [0.01]*6

def joylo_loop():
    q_leader  = dynamixel.read_all()      # 孪生臂电机, 400~500Hz (SDK)
    thumb     = joycon.read_sticks()      # 蓝牙 66Hz
    buttons   = joycon.read_buttons()

    # 摇杆 → 低全身: 底盘速度 + 腰髋 + 躯干高度 + 夹爪
    base_v   = thumb.left  -> base_velocity_cmd        # 左摇杆
    waist_hip = thumb.right -> torso_upper_cmd         # 右摇杆
    torso_h  = buttons.dpad -> torso_height_cmd        # 方向键
    gripper  = buttons.trigger -> gripper_width_cmd    # 扳机

    q_follower = robot.get_joint_positions()           # 机器人实际关节
    # 双边反馈: 机器人状态"顶"回孪生臂 → 操作员手感 = 机器人触觉
    tau = JOYLO_KP*(q_follower - q_leader) + JOYLO_KD*(qd_follower - qd_leader) - K
    dynamixel.set_torque(tau)

    # 数据记录: 10Hz 存 RGB/深度/点云/关节状态/里程计/动作指令
    if buttons.save_pressed:  dataset.append(...)

6.4 异步部署(对应附录 C.5)

# 伪代码:异步策略推理。对应附录 C.5 部署细节
def async_policy_loop():
    while True:
        obs = obs_buffer.latest()           # 10Hz 采样的最新观测
        traj = policy.act(obs)              # 后台持续推理, 预测 8 步
        traj = traj[skip_steps:]            # 丢弃头几步补偿推理延迟!
        action_queue.push(traj)             # 不阻塞控制循环

def robot_control_loop():                   # 100Hz, 永不等待策略
    while True:
        cmd = action_queue.next()           # 0.1s 发一次, 重复执行 10 次
        robot.control(cmd)

6.5 关键超参数表(附录 Table A.V~A.VIII 汇总)

超参数备注
点云点数 N_pcd4096(XYZ+RGB,6 通道)FPS 采样
PointNethidden 256,depth 2,GELU输出 256 维 token
本体 MLP输入 21,hidden 256,depth 3,ReLU输出 256 维 token
Transformer2 层 / 8 头 / 256 维 / GEGLU / dropout 0.1因果自注意力
观测窗口 T_o2 步
动作时域 T_a8 步
UNethidden [64,128],kernel 2三个独立去噪头
扩散训练 DDPM 100 步,推理 DDIM 16 步
优化器AdamW,lr 7e-4,wd 0.1warmup 1000 步,余弦衰减 30 万步
数据划分90% 训练 / 10% 验证
控制/采样频率100 Hz 控制,10 Hz 记录,指令每 0.1s 重复 10 次
推理延迟0.02 s(RTX 4090,异步)

七、效果对比

7.1 主实验:五项家庭任务(论文 Figure 5 + 附录 Tables A.IX-XIII)

每方法每任务 15 次随机化评测。ET = 端到端整任务,ST = 子任务。

端到端(ET)成功率:

任务人类遥操作WB-VIMADP3RGB-DPACT
收拾派对残局68% (50/73)40% (6/15)0%0%0%
擦马桶61% (100/164)53% (8/15)0%0%0%
倒垃圾76% (96/127)53% (8/15)0%0%0%
收纳上架89% (93/104)93% (14/15)20%13%0%
铺衣服50% (54/108)53% (8/15)0%0%0%

安全违规数(碰撞/电机过力失能):

任务WB-VIMADP3RGB-DPACT
收拾派对残局01322
擦马桶0020
倒垃圾1935
收纳上架0001
铺衣服0731

端到端成功率 WB-VIMA 比 DP3 和 RGB-DP 分别高 13 倍和 21 倍;子任务平均高 1.6 倍和 3.4 倍;ACT 整任务全军覆没。五个任务里 WB-VIMA 的安全违规合计只有 1 次,基线合计 48 次。

两个"反超人类"的名场面

  • 擦马桶 ST-2(开马桶盖):WB-VIMA 80% vs 人类遥操作 72%;
  • 铺衣服 ST-1(开衣柜门):WB-VIMA 87% vs 人类遥操作 56%。

接触密集的铰接件操作上,"只用成功演示训练的策略"比会手抖、会全身不协调的真人遥操作更稳——模仿学习从成功数据里蒸馏出了比示教者本人更一致的全身动作。

7.2 消融:两个组件缺一不可(Figure 6 + Tables A.XII/A.XIII)

变体收纳上架 ET开衣柜门(ST-1)开衣柜门安全违规
WB-VIMA93%87%0
去掉自回归全身解码40% (↓53%)33% (↓54%)0
去掉多模态观测注意力13% (↓80%)33%4 次碰撞

去掉多模态注意力的变体会无视视觉、过拟合本体感知——纯靠关节位置"盲拼"动作,直接撞出 4 次事故。仿真消融(擦桌子,100 rollouts × 5 次)还给出了渐进路线:从 vanilla Diffusion Policy 出发,加 Transformer 主干 → 加多模态注意力(+27%,超过 ACT)→ 加自回归全身解码(+45%)→ WB-VIMA。

7.3 JoyLo 用户研究:10 人三方对比(Figure 8 + 附录 D.4)

在 OmniGibson 仿真器里,10 名参与者随机顺序使用三种接口完成"收拾派对残局":

指标JoyLoVR 手柄Apple Vision Pro
任务成功率最高(ET 为 VR 的 5 倍)基准0 人完成整任务
完成时间(中位数)最快(比 VR 快 23%)基准
开洗碗机(ST-2)比 VR 高 67%基准
导航/取碗子任务比 AVP 快 71%/67%基准
奇异构型比例最低(比 VR 低 78%,AVP 低 85%)基准基准
回放成功率(数据质量)最高且持续成功较低较低
主观易用性投票100%(实验后)0%0%

最有意思的是认知反转:70% 的参与者实验前赌 IK 接口(VR/AVP)更直观,实验后 100% 倒戈 JoyLo。静态桌面 vs 移动全身操作,接口的胜负手完全不同——IK 在底盘+躯干联动场景下就是不行。

7.4 全身协调的必要性证明(Figure 9)

锁死对照实验:

  • 锁髋开门:门纹丝不动,臂关节力矩飙升 → 过度受力风险;
  • 锁底盘拉洗碗机门:同样失败,力矩激增。

开门靠"髋前倾 + 底盘前移"的惯性组合拳,拉洗碗机靠"底盘后移"的全身后坐力——单靠手臂根本拉不动,这些任务在物理上就要求全身协调,不是"手臂也能凑合做"的软需求。


八、总结

8.1 核心思想一句话

硬件便宜不等于系统简单——BRS 用"运动学孪生 + 摇杆分工"把全身遥操作做到 500 美元且自带触觉,再让策略网络沿运动学层级"自底向上"链式生成 21 维动作,用结构先验代替暴力参数,换来家庭长时程任务上对 flatten 基线的数量级碾压。

8.2 与上一期 iDP3 对读

有趣的是这两篇的关系:Yanjie Ze 同时是两边的作者,而两条技术路线几乎是镜像互补——

维度iDP3 (上一篇)BRS (本篇)
平台人形 GR-1 + 升降推车轮式双臂 + 4-DoF 躯干 + 全向底盘
核心难题场景泛化(单场景 → 全世界)全身协调(21-DoF 的联合建模)
点云处理相机系表示,不做变换500Hz FK 变换到基座系,三路融合
遥操作AVP 头显(IK 映射)运动孪生臂 + Joy-Con(关节直连)
动作建模单一扩散策略,horizon=16三级自回归扩散解码
观点相机外参不可靠 → 绕开坐标系变换多相机融合需要全局表示 → 硬算变换

同一批人面对相似问题给出不同答案,说明这不是教条,而是按平台约束做工程决策:单头相机 + 移动头部 → 表示留在相机系;三相机 + 高频 FK + 固定头部旋转轴 → 融合到基座系。做系统的应该学这个判断方式,而不是背结论。

8.3 边界

长时程复合误差未解(ET 58% vs ST 88% 的鸿沟);操作员第三人称视角导致的数据部分可观测;光照敏感;单具身封闭数据;推理依赖局域网工作站(Jetson Orin 只管传感器)——这些都是下一个迭代的靶子。作者点名的方向:人类纠错数据、VLA 大模型、跨具身迁移、FoundationStereo 增强深度。

8.4 延伸

用编码的视角收个尾:WB-VIMA 的自回归解码本质上是把 21 维动作空间做了一次"分级码率分配"——底盘是低频低维的"I 帧"(粗粒度意图),躯干是"P 帧"(参考底盘细化),手臂是精度需求最高的"B 帧"(参考全部上游)。flatten 建模相当于把所有帧同等对待,一处误码全片花屏;分层解码相当于给运动学链路加了抗误码的层级依赖。机器人学习正在重演很多信号处理领域早已解决的经典问题,只是换了变量名。


博客基于 arXiv:2503.05652v2 (2025-08-24, CoRL 2025) 撰写,所有实验数字均取自论文正文及附录 Tables A.IX-A.XIII。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐