BRS 深度解析:斯坦福全家桶让轮式机器人承包家务,JoyCon 手柄立大功
论文标题: 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 个由普通人票选的家庭任务基准)做了一轮统计分析,得出三个结论:
- 双臂协调(Bimanual):搬大件、抱重物绕不开两只手;
- 稳定精确的导航(Navigation):取个东西经常要跨越半个屋子;
- 广域末端可达性(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,两个核心组件:
- JoyLo(Joy-Con on Low-cost Kinematic-twin arms):运动学孪生臂 + 任天堂 Joy-Con 手柄的全身遥操作接口,总成本 ~$499.5(附录有完整 BOM 表),自带双边触觉反馈,不需要力传感器;
- 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);
- 左摇杆 → 底盘速度(前后/左右/旋转);
- 右摇杆 → 腰 + 髋;
- 方向键 → 躯干高度(站/蹲);
- 扳机键 → 夹爪开合。
三个设计亮点:
- 免费触觉反馈(双边遥操作)。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;
- 运动学约束即安全网。操作员被孪生臂的物理关节限位"物理锁死",想生成机器人做不到的动作都难,采集到的演示天然可执行;
- 单操作员全身控制。对比 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(xk∣xk−1) 逐步注入高斯噪声,网络 ϵθ(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)xk−1∼N(μ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)abasek−1∼N(μk(abasek, ϵbase(abasek∣Ea,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)atorsok−1∼N(μk(atorsok, ϵtorso(atorsok∣abase0, 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)aarmsk−1∼N(μk(aarmsk, ϵarms(aarmsk∣atorso0, abase0, Ea,k)), σk2I)
符号逐个拆:
- abase∈RTa×3a_{\text{base}} \in \mathbb{R}^{T_a \times 3}abase∈RTa×3:底盘轨迹(前进/横移/偏航速度),Ta=8T_a = 8Ta=8 步;
- atorso∈RTa×4a_{\text{torso}} \in \mathbb{R}^{T_a \times 4}atorso∈RTa×4:躯干轨迹(腰/髋/双膝);
- aarms∈RTa×14a_{\text{arms}} \in \mathbb{R}^{T_a \times 14}aarms∈RTa×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})ΔxEEF≈0.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(qrobot−qJoyLo)+Kd(q˙robot−q˙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)
| 任务 | 子任务链 | 核心能力 | 演示数 | 人类平均用时 |
|---|---|---|---|---|
| 收拾派对残局 | 开洗碗机→取碗→装碗→关上 | 稳定导航 | 138 | 210 s |
| 擦马桶 | 取海绵→开盖→刷→关盖→冲水 | 广域可达 | 103 | 120 s |
| 倒垃圾 | 拾袋→开门→出门→丢进垃圾桶 | 稳定导航 | 122 | 130 s |
| 收纳上架 | 地上抬箱→放到四层货架对应层 | 广域可达 | 100 | 60 s |
| 铺衣服 | 开衣柜→取衣架→铺到沙发床→关柜 | 双臂协调 | 98 | 120 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_pcd | 4096(XYZ+RGB,6 通道) | FPS 采样 |
| PointNet | hidden 256,depth 2,GELU | 输出 256 维 token |
| 本体 MLP | 输入 21,hidden 256,depth 3,ReLU | 输出 256 维 token |
| Transformer | 2 层 / 8 头 / 256 维 / GEGLU / dropout 0.1 | 因果自注意力 |
| 观测窗口 T_o | 2 步 | |
| 动作时域 T_a | 8 步 | |
| UNet | hidden [64,128],kernel 2 | 三个独立去噪头 |
| 扩散 | 训练 DDPM 100 步,推理 DDIM 16 步 | |
| 优化器 | AdamW,lr 7e-4,wd 0.1 | warmup 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-VIMA | DP3 | RGB-DP | ACT |
|---|---|---|---|---|---|
| 收拾派对残局 | 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-VIMA | DP3 | RGB-DP | ACT |
|---|---|---|---|---|
| 收拾派对残局 | 0 | 13 | 2 | 2 |
| 擦马桶 | 0 | 0 | 2 | 0 |
| 倒垃圾 | 1 | 9 | 3 | 5 |
| 收纳上架 | 0 | 0 | 0 | 1 |
| 铺衣服 | 0 | 7 | 3 | 1 |
端到端成功率 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-VIMA | 93% | 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 名参与者随机顺序使用三种接口完成"收拾派对残局":
| 指标 | JoyLo | VR 手柄 | 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。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)