论文标题: Generalizable Humanoid Manipulation with 3D Diffusion Policies
作者: Yanjie Ze, Zixuan Chen, Wenhao Wang, Tianyi Chen, Xialin He, Ying Yuan, Xue Bin Peng, Jiajun Wu
机构: Stanford University / Simon Fraser University / UPenn / UIUC / CMU
arXiv: 2410.10803 (v3, 2025-09-09)
项目主页: https://humanoid-manipulation.github.io
代码: https://github.com/LeCAR-Lab/humanoid-manipulation

一句话总结:斯坦福团队用"上全身遥操作 + 自我中心 3D 点云 + 改进版扩散策略"三件套,让一台 25 自由度的全尺寸人形机器人,只用一个场景训练的数据,零样本泛化到厨房、会议室、办公室等一堆从没见过的真实场景——而且整个推理跑在机器人本机算力上,15Hz 实时。


一、介绍

1.1 问题在哪

人形机器人autonomous操作是机器人学几十年来的圣杯。2024 年硬件层面已经很热闹了——Boston Dynamics 的电动 Atlas、特斯拉 Optimus、Figure 01、宇树 H1,个个都像从科幻片里走出来的。但一谈到"让机器人自己学会干活",现状就很尴尬:

  • HumanPlus、OmniH2O 能全身遥操作人形机器人,但学到的操作技能只认训练时那个场景,换个厨房就废;
  • OpenTeleVision、HATO 平台不支持移动底座和腰部自由度,工作空间小得可怜;
  • Robot Utility Model 倒是能泛化到新环境,但它靠的是20 个场景的数据堆出来的泛化。

论文的 Table I 把这个领域摸了个底朝天:所有已有人形系统里,没有一个同时做到"场景泛化 + 严格的大规模真机评测"。Real-world episodes 这一栏,多数工作 50~300 次就收工了。

1.2 两个死结

这个局面背后是两个相互锁死的问题:

死结一:数据贵。 人形机器人 in-the-wild 的数据采集成本极高。不像桌面机械臂可以摆十张桌子批量采,人形机器人遥操作本身就慢、累、贵。所以大家只能在单一场景里采数据——而单一场景的数据又喂不出泛化能力。

死结二:算法弱。 主流视觉运动策略(Diffusion Policy 这类 2D 图像方案)本质上是在死记硬背像素和场景外观。场景一变、光照一变、物体一变,策略直接懵圈。而 3D 方案(DP3)虽然在桌面机械臂上展示了物体/视角泛化,但它依赖精确的相机外参标定和精细的点云分割——这两件事在"相机装在会动的脑袋上"的人形机器人上根本没法做。

1.3 本文的答案:iDP3 系统

作者(第一作者 Yanjie Ze 就是 DP3 的一作,属于自己革自己的命)给出的方案是一个完整的真机系统,三大件:

  1. 上全身遥操作系统:Apple Vision Pro 采集人头/双手/手腕的 3D 位姿,映射到机器人的头、腰、双臂、双手共 25 个自由度——注意,腰部和主动视觉(头)也纳入遥操作,这是和双臂遥操作系统的本质区别;
  2. 人形机器人平台:Fourier GR-1 固定在可移动、可升降的小车上,头部装一台 RealSense L515 固态激光雷达相机;
  3. Improved 3D Diffusion Policy(iDP3):把 DP3 从"世界坐标系 + 第三人称"改造成"相机坐标系 + 自我中心(egocentric)"的 3D 学习算法,专门解决人形机器人上无法标定、无法分割点云的痛点。

一个视频编码工程师的类比:这套思路很像编码器从"全局参考帧"走向"局部参考帧"。传统 3D 策略把点云变换到世界坐标系(相当于依赖全局参考帧 + 精确的时域运动矢量),一旦相机位姿(全局运动)估计出错,整个表示就崩了;iDP3 直接在相机坐标系里工作(局部坐标、自我中心),相当于每帧都自成参考——全局运动估计的误差被彻底绕开了。代价是失去了"世界系里切一刀就能分割目标物体"的便利,这就是后文"放大视觉输入"要还的债。

1.4 核心结果预告

  • 2253 次真机评测 rollout(Table I 中碾压式领先,第二名 BunnyVisionPro 只有 540 次);
  • 只用一个场景的数据,新场景下 Pick&Place 成功率 9/10,Pour 9/10,而最强的 2D 基线(DP + finetuned R3M)只有 2/10 和 1/10;
  • 训练只要 30 分钟(同设置下 DP 要 80 分钟),机载算力推理 15Hz。

下面逐层拆解。


二、原理

整个系统按数据流走一遍:人在 AVP 里遥操作 → 采集 (观测, 动作) 对 → 训练 iDP3 → 部署到没见过的场景。四个模块分别讲。

2.1 硬件平台:为什么不走腿?

Fourier GR-1 是全尺寸人形机器人,全身 29 自由度。本文只启用上半身 25 个自由度:头 + 腰 + 双臂 + 双手(Inspire 灵巧手),下半身锁死, mobility 交给一台可升降的推车。

这个决策看起来"不够酷",但工程上极其清醒:

  • 腰部自由度必须安全才能用。 人形机器人弯腰前倾时质心前移,平衡控制很容易翻车。固定在推车上之后,即使腰前倾也不会摔倒,可以放心用腰——而腰部自由度恰恰是把工作空间从"桌面双臂"扩展到"不同高度桌面"的关键;
  • 桌子高度问题是真实世界泛化的头号变量。 实验室里所有桌子一样高,现实中厨房台面、会议桌、办公桌高度五花八门。升降推车一刀解决了"全身控制"这个复杂度大坑,作者也坦承等全身控制技术成熟后这套学习框架同样适用;
  • 传感器选型很较真。 头上装的是 RealSense L515 固态激光雷达。之前有工作(RISE)证明 D435 这类结构光深度相机精度不够会让 DP3 表现拉胯。但作者也试过 Livox Mid-360 这类传统激光雷达,结论是分辨率和帧率撑不起接触密集型的实时操作——这是深度传感器在机器人操作领域的真实现状:要么精度不够,要么帧率不够,两头堵。

2.2 数据采集:上全身遥操作

遥操作系统用 Apple Vision Pro 采集人头、双手、手腕的实时 3D 位置和朝向,然后分两路解算机器人关节角:

  • 双臂:RelaxedIK 逆运动学,跟踪人类手腕位姿 → 机械臂关节角;
  • 头 + 腰:直接用人类头部的旋转 → 机器人头/腰关节角。头动腰跟着动,等于把"人看向哪"直接映射成机器人的主动视觉。

同时把 L515 的实时画面回传给操作员,实现沉浸式自我中心遥操作。

两个藏在工程细节里的坑:

  1. 延迟约 0.5 秒。 L515 点云吞吐量太大,吃满了机载电脑的带宽和 CPU。作者还试过再加一个手腕雷达——延迟直接爆炸,数据采集不可行,作罢。这就是为什么最后只有一个头载传感器;
  2. 动作空间选关节角,不选末端位姿。 作者实测过用末端执行器位姿作为本体感知/动作,发现真机上计算末端位姿要走运动学链、累积噪声大,直接用目标关节位置作为动作空间精度更高。这个选择和很多机械臂工作(爱用末端 EE pose)正好相反,原因在于人形机器人全身 25 自由度的正/逆运动学误差比 7-DoF 臂大得多。

每条示教轨迹记录:(点云 + 图像 + 关节位置) → 目标关节位置。注意下文实验里"1 条 demonstration"的定义是 20 轮成功执行打包,这个数据打包方式后面效果对比时会用到。

2.3 算法核心:iDP3 的四处关键改造

原版 DP3 的流程:点云 → 变换到世界坐标系 → FPS 采样 → MLP 编码 → 拼上本体感知 → Diffusion Policy 出动作。这套在人形机器人上有四个致命伤,iDP3 对症下药:

改造一:自我中心 3D 表示(相机坐标系,最核心的一刀)

DP3 及大多数 3D 策略把点云从相机系变换到世界系,好处是在固定的世界系里可以按空间位置切掉背景、分割出目标物体。但人形机器人的相机长在头上——头一动,外参就变,每个时刻都要重新标定,实际上不可能。

iDP3 的选择:干脆不做相机系 → 世界系的变换,直接在相机坐标系里表示点云。这带来一个漂亮的副产品——视角不变性(view invariance)。直觉上有点反常:相机系下的点云明明随视角变化,为什么反而视角不变了?

答案是:对操作任务而言,真正重要的是相机与物体的相对几何关系。世界系点云里,机器人一移动,同一物体在不同 episode 里的坐标天差地别,策略学到的是"世界坐标 → 动作"的映射,全局位姿一变就崩;相机系点云里,“杯子在我左前方 30cm"这个描述天然只依赖相对几何,机器人挪了位置,看到的相对几何不变,策略行为就不变。作者自己都承认这个结果"surprisingly”——他们没有做任何显式的等变/不变性设计(对比 EquiBot、Equivariant Diffusion Policy 那一堆等变网络的工作), viewpoint invariance 是坐标系选择的免费赠品。

改造二:放大视觉输入(Scaling Up Vision Input)

没有了世界系分割,背景点云(桌面、墙、路人)全混进来了,又不想引入分割大模型(foundation model 的开销和不可控性)。iDP3 的解法简单粗暴:别分割了,把点数堆上去。DP3 用 FPS 采 1024 个点,iDP3 直接上 4096 个,用足够密的点云让策略自己"看见"整个场景,让网络自己学会关注哪部分。

简单,但在真机消融里真有效(1024 → 4096,总成功率 56/129 → 75/139),8192 点则饱和回落(72/132)。

改造三:视觉编码器换金字塔卷积

DP3 用纯 MLP 编码点云。iDP3 换成金字塔卷积编码器(Conv + 多层金字塔特征聚合),作者发现两点:从人类示教数据学习时,卷积比全连接行为更平滑(抖动更少);不同层金字塔特征融合能提精度。消融显示 Conv 单独用反而比 Linear 差(49/131 vs 58/127),必须 Conv+Pyramid 合体才到 75/139——特征聚合那一层才是关键。

改造四:拉长预测时域(Longer Prediction Horizon)

人类示教自带手抖,L515 点云自带噪声,两者叠加导致 DP3 原版的短时域预测(horizon=4)完全学不动——消融表里 horizon=4 的成绩是惨烈的 0/0,一个动作都发不出来。拉到 16 步后 75/139;再拉到 32 反而降到 55/130。这个"钟形曲线"很有信息量:时域太短学不会(噪声掩盖意图),太长则要预测的不确定性指数增长,两头都不行,16 是甜点。

其他实现细节:

  • 点云采样:抛弃 FPS(慢),改用体素采样 + 均匀采样的级联,既保证点覆盖整个 3D 空间,推理还更快;
  • 扩散过程:训练 50 步 DDPM,推理用 DDIM 加速到 10 步;
  • 优化:AdamW,300 epochs;
  • 动作空间:目标关节位置;观测:相机系点云 + 关节位置。

2.4 部署:为什么能无缝换场景

训练时不标定、不分割,意味着部署时也不需要对新场景做任何标定/分割工作——策略吃的是相机系原始点云,到哪都能直接吃。加上机载算力 15Hz 实时推理,"带机器人去新场景 → 升降推车调高度 → 开跑"就是全部部署流程。


三、公式

iDP3 的数学骨架就是标准扩散策略(DDPM 训练 + DDIM 采样),本节把关键公式过一遍,并标注 iDP3 改动的落点。

3.1 扩散策略的动作生成

策略 πθ\pi_\thetaπθ​ 对动作序列做条件去噪。前向加噪过程:

q(ak(i)∣ak(i−1),O)=N(ak(i); 1−βi ak(i−1), βiI)q(a_k^{(i)} \mid a_k^{(i-1)}, \mathcal{O}) = \mathcal{N}\left(a_k^{(i)};\ \sqrt{1-\beta_i}\, a_k^{(i-1)},\ \beta_i \mathbf{I}\right)q(ak(i)​∣ak(i−1)​,O)=N(ak(i)​; 1−βi​​ak(i−1)​, βi​I)

  • ak(i)a_k^{(i)}ak(i)​:第 kkk 步动作序列(这里是连续 16 步目标关节位置向量)在第 iii 级噪声下的版本;
  • βi\beta_iβi​:第 iii 级噪声方差调度;
  • O\mathcal{O}O:观测条件(相机系点云特征 + 本体感知)。

训练目标是最小化去噪网络的噪声预测误差:

L=Ek,ϵ,i[∥ϵ−ϵθ(ak(i), i, O)∥2]L = \mathbb{E}_{k, \epsilon, i}\left[\left\| \epsilon - \epsilon_\theta\left(a_k^{(i)},\ i,\ \mathcal{O}\right) \right\|^2\right]L=Ek,ϵ,i​[​ϵ−ϵθ​(ak(i)​, i, O)​2]

  • ϵ∼N(0,I)\epsilon \sim \mathcal{N}(0, \mathbf{I})ϵ∼N(0,I) 是真实加入的高斯噪声;
  • ϵθ\epsilon_\thetaϵθ​ 是以观测为条件的去噪网络(1D 时序 U-Net 类架构,条件特征拼进输入)。

推理时从纯噪声出发迭代去噪。DDIM 把 DDPM 的 50 步采样压缩到 10 步,其确定性更新式:

a(i−1)=αˉi−1 a(i)−1−αˉi ϵθ(a(i),i,O)αˉi⏟预测的干净动作 a^(0)+1−αˉi−1 ϵθ(a(i),i,O)a^{(i-1)} = \sqrt{\bar\alpha_{i-1}}\ \underbrace{\frac{a^{(i)} - \sqrt{1-\bar\alpha_i}\,\epsilon_\theta(a^{(i)}, i, \mathcal{O})}{\sqrt{\bar\alpha_i}}}_{\text{预测的干净动作 } \hat a^{(0)}} + \sqrt{1-\bar\alpha_{i-1}}\ \epsilon_\theta(a^{(i)}, i, \mathcal{O})a(i−1)=αˉi−1​​ 预测的干净动作 a^(0)αˉi​​a(i)−1−αˉi​​ϵθ​(a(i),i,O)​​​+1−αˉi−1​​ ϵθ​(a(i),i,O)

其中 αˉi=∏j=1i(1−βj)\bar\alpha_i = \prod_{j=1}^{i}(1-\beta_j)αˉi​=∏j=1i​(1−βj​)。这是 iDP3 能在机载算力上跑 15Hz 的关键之一——10 步 DDIM 推理换掉 50 步 DDPM。

3.2 视觉编码(iDP3 改动落点)

观测点云 P∈RN×3P \in \mathbb{R}^{N \times 3}P∈RN×3(N=4096N=4096N=4096,DP3 为 1024)先经过采样级联:

Psparse=UniformSample(VoxelSample(P,r))P_{\text{sparse}} = \text{UniformSample}\left(\text{VoxelSample}(P, r)\right)Psparse​=UniformSample(VoxelSample(P,r))

体素下采样(体素尺寸 rrr)先在空间上均匀覆盖整个场景,再均匀随机采样到目标点数——对比 FPS 的 O(N2)O(N^2)O(N2) 复杂度,这一级联在保持空间覆盖的同时大幅提速。

然后是金字塔卷积编码:

fv=concat[ϕ1(Psparse), ϕ2(ϕ1(Psparse)), ϕ3(ϕ2(ϕ1(Psparse)))]f_v = \text{concat}\left[\phi_1(P_{\text{sparse}}),\ \phi_2(\phi_1(P_{\text{sparse}})),\ \phi_3(\phi_2(\phi_1(P_{\text{sparse}})))\right]fv​=concat[ϕ1​(Psparse​), ϕ2​(ϕ1​(Psparse​)), ϕ3​(ϕ2​(ϕ1​(Psparse​)))]

其中 ϕ1,ϕ2,ϕ3\phi_1, \phi_2, \phi_3ϕ1​,ϕ2​,ϕ3​ 为逐级降维、逐级扩感受野的卷积层,各层输出拼接作为最终视觉特征——这就是消融表里"Linear+Pyramid"和"Conv+Pyramid"差异的来源:金字塔聚合才是提分的那个组件。

3.3 关键的"负公式":没有的那一步

iDP3 最重要的一步其实是删掉了这个变换:

Pworld=Rwc⋅Pcamera+twc(iDP3 中被移除)P_{\text{world}} = R_{wc} \cdot P_{\text{camera}} + t_{wc} \quad \text{(iDP3 中被移除)}Pworld​=Rwc​⋅Pcamera​+twc​(iDP3 中被移除)

Rwc,twcR_{wc}, t_{wc}Rwc​,twc​ 是相机到世界的外参。DP3 需要精确的 (Rwc,twc)(R_{wc}, t_{wc})(Rwc​,twc​) 做两件事:世界系分割 + 世界系动作映射。人形机器人的头部相机让 (Rwc,twc)(R_{wc}, t_{wc})(Rwc​,twc​) 每帧都在变且无法精确在线估计——所以与其估计它,不如让策略在相机系里直接学。删掉一个变换,换来免标定、免分割、视角不变三连,这是全文性价比最高的一行"代码"。


四、图示

4.1 系统总览(对应论文 Figure 2)

┌─────────────────────── 学习与部署流水线 ───────────────────────┐
│                                                                │
│  [数据采集]                [平台]              [算法]           │
│                                                                │
│  人类戴 AVP          GR-1 全尺寸人形        改进 3D Diffusion   │
│  ┌──────────┐       ┌──────────────┐      ┌─────────────┐      │
│  │ 头/手/腕  │─IK──▶ │ 头:L515雷达   │     │ 相机系点云    │      │
│  │ 3D位姿    │       │ 腰+双臂+灵巧手│───▶ │ 4096点       │      │
│  └──────────┘       │ 固定腿+推车   │     │ 金字塔卷积编码 │      │
│  上全身遥操作         └──────────────┘     │ horizon=16   │      │
│  (含腰+主动视觉)           ▲               └──────┬──────┘      │
│                            │                      │             │
│                     升降推车调高度           机载算力 15Hz 推理    │
│                            │                      │             │
│                            ▼                      ▼             │
│              ┌──────────── 单场景训练 ────────────┐              │
│              │         零样本泛化到新场景           │              │
│              │   厨房 │ 会议室 │ 办公室 │ 走廊...  │              │
│              └────────────────────────────────────┘              │
└────────────────────────────────────────────────────────────────┘

4.2 世界系 vs 相机系(对应论文 Figure 3,核心思想图)

        DP3 及其他 3D 策略                    iDP3
   ┌─────────────────────────┐      ┌─────────────────────────┐
   │      世界坐标系           │      │     相机坐标系            │
   │                         │      │                         │
   │   z          ▲ 相机      │      │  z ▲   ▲ 相机            │
   │   │        /            │      │   │   /  (点云就在       │
   │   └──x──▶物体          │      │   └─x─▶   这个系里)      │
   │                         │      │                         │
   │  需要精确外参 R,t 变换     │      │  不做任何变换             │
   │  相机一动 → 需重新标定     │      │  相机动 → 表示自动跟着走   │
   │  靠世界系坐标做分割        │      │  不分割 → 点数堆上去       │
   │  机器人移动 → 直接失效     │      │  移动机器人/人形 → 天然适配 │
   └─────────────────────────┘      └─────────────────────────┘

4.3 iDP3 四处改造 vs DP3 原版

 DP3 原版                          iDP3 改造               消融收益
┌────────────────┐   ①相机系表示    ┌────────────────┐
│ 世界系点云      │ ──────────────▶ │ 相机系(自我中心) │  ← 免标定/免分割/视角不变
│ FPS 1024 点    │ ──────────────▶ │ 体素+均匀 4096点 │  ← 56/129 → 75/139
│ MLP 编码器     │ ──────────────▶ │ Conv+金字塔编码  │  ← 58/127 → 75/139
│ horizon = 4    │ ──────────────▶ │ horizon = 16    │  ← 0/0 → 75/139 (!!)
│ FPS 采样       │ ──────────────▶ │ 体素+均匀级联    │  ← 推理更快
└────────────────┘                 └────────────────┘

4.4 泛化能力对照表(Table I 精华版)

系统头部遥操腰部物体泛化视角泛化场景泛化真机评测次数
DP3✗✗✓✓✗186
HumanPlus✗✗✗✗✗160
OmniH2O✗✗✗✗✗90
OpenTeleVision✓✗✗✗✗75
ManiWhere✗✗✓✓✓200
本文 iDP3✓✓✓✓✓2253

五、踩坑点

这一节是全文含金量最高的部分之一——作者把真机系统的坑如实交代了,按"范式级 / 工程级"分类整理。

范式级(方法论层面的坑)

坑 1:2D 图像方案在真机上的"训练场景过拟合"是结构性的。
最强的 2D 基线 DP(✶R3M) 在训练设置下甚至比 iDP3 还强(99/147 vs 75/139),但新场景里直接塌方:Pick&Place 2/10、Pour 1/10。加了 Random Crop + Color Jitter 增强也没用——增强解决的是"颜色/裁剪"级别的扰动,解决不了"整个场景外观分布漂移"。论文 Figure 6 给了失败案例:连训练时见过的物体在新场景里都抓不住。教训:图像方案的泛化上限被像素分布锁死,跟增强技巧关系不大。

坑 2:微调预训练模型 vs 从头训,在单任务精度上 2D 反而占优。
DP(✶R3M) 靠微调 R3M 预训练编码器,单任务精度全场第一。iDP3 从头训 3D 编码器打不过它——因为目前根本没有机器人领域的预训练 3D 视觉模型。这是整个 3D 机器人学习路线的软肋:2D 有 ImageNet/R3M 的十年积累,3D 是一片空白。

坑 3:预测时域不是越长越好,是个钟形曲线。
horizon: 4 → 8 → 16 → 32 对应 0/0 → 33/88 → 75/139 → 55/130。短了学不会(人类示教抖动 + 传感器噪声把短时意图完全淹没),长了不确定性爆炸。所有做扩散策略的人都要自己趟一遍这条曲线。

坑 4:动作空间选择——关节角优于末端位姿。
反直觉但合理:真机上计算末端位姿本身带噪声(运动学链误差),把带噪的量作为动作目标等于给策略雪上加霜。在人形这种长运动学链平台上尤其明显。

坑 5:消融里 Conv 单独用是负收益。
Conv 编码器单独上 49/131,比 Linear(DP3 编码器)的 58/127 还差,必须配金字塔特征聚合才能到 75/139。盲目"MLP 换 CNN"不一定是改进,架构组件要成套上。

工程级(真机系统的坑)

坑 6:LiDAR 带宽/延迟陷阱。
L515 一台就把机载 CPU/带宽吃满,遥操作延迟 ~0.5s;再加一台腕部雷达延迟直接爆炸、采集不可行。多传感器堆料在机器人上不是免费的。

坑 7:深度传感器精度天花板。
D435 精度不够 → DP3 表现差;Livox Mid-360 分辨率/帧率不够 → 无法接触密集操作;L515 也不完美——作者明说"当前 3D 观测相当 noisy,限制了 iDP3 性能"。3D 方案的性能上限被传感器硬件卡着。

坑 8:遥操作数据不可规模化。
AVP 遥操作搭建容易,但人很累,实验室内部没法批量采集;精细操作(拧螺丝)用 AVP 遥操作采集极慢,反而 ALOHA 那种低成本双臂主从更适合精细任务。作者结论很直白:“高质量操作数据的规模化是主要瓶颈”。

坑 9:腿不敢用。
下身锁死不是因为腿没用,而是当前人形硬件上"边走边保持平衡操作"还太难。升降推车是务实妥协。


六、源码拆解

论文未在正文贴代码,但作者开源了完整实现(LeCAR-Lab/humanoid-manipulation 与独立的 improved-3d-diffusion-policy 仓库)。以下按论文 Section III-C 的实现细节 + 公开仓库结构,重建核心训练/推理流程的伪代码(标注对应出处)。

6.1 点云采样:体素 + 均匀级联(对应论文 “Implementation Details”)

# 伪代码:对应论文 III-C 节 "cascade of voxel sampling and uniform sampling"
# 替换 DP3 的 FPS —— 目的:空间覆盖均匀 + 推理更快 (FPS 是 O(N^2))
def voxel_uniform_sample(point_cloud: Tensor, voxel_size: float,
                         num_points: int) -> Tensor:
    # point_cloud: (N_raw, 3) 相机系原始点云 —— 注意: 无世界系变换!
    coords = torch.floor(point_cloud / voxel_size).long()       # 体素栅格化
    # 每个体素内随机取一个代表点, 得到空间均匀覆盖的稀疏集合
    voxel_unique, idx = unique_voxel_with_representative(coords, point_cloud)
    # 再均匀随机采样到固定点数 (iDP3: 4096, DP3: 1024)
    if voxel_unique.shape[0] >= num_points:
        sel = torch.randperm(voxel_unique.shape[0])[:num_points]
    else:  # 点不足则有放回补齐
        sel = torch.randint(0, voxel_unique.shape[0], (num_points,))
    return voxel_unique[sel]

6.2 金字塔卷积视觉编码器(对应论文 “Improved Visual Encoder” + 消融 Table III)

# 伪代码:对应 Table III 中 "Conv+Pyramid (iDP3)" 行
class PyramidConvEncoder(nn.Module):
    # 输入: (B, num_points, 3)  输出: 视觉特征向量
    def __init__(self, out_dim=256):
        # 三级卷积: 感受野逐级扩大, 通道逐级压缩
        self.conv1 = ConvPointNet(in_ch=3,   out_ch=32)   # 局部几何
        self.conv2 = ConvPointNet(in_ch=32,  out_ch=64)   # 中尺度
        self.conv3 = ConvPointNet(in_ch=64,  out_ch=128)  # 全场景尺度
        self.fuse  = nn.Linear(32 + 64 + 128, out_dim)    # 金字塔聚合 —— 消融证明这层是关键

    def forward(self, pc):
        h1 = self.conv1(pc)              # 浅层特征
        h2 = self.conv2(h1)              # 在 h1 基础上继续卷 → 金字塔
        h3 = self.conv3(h2)
        return self.fuse(torch.cat([h1, h2, h3], dim=-1))

注意消融的微妙之处:单独 Conv(49/131)< 单独 Linear(58/127)< Linear+Pyramid(66/134)< Conv+Pyramid(75/139)。金字塔聚合和卷积是乘法关系而非加法关系。

6.3 iDP3 策略主体(对应论文 III-C + 扩散策略标准结构)

# 伪代码:iDP3 主循环。对应论文 III-C 各改造点已用注释标出
class iDP3Policy(nn.Module):
    def __init__(self):
        self.vision  = PyramidConvEncoder()              # 改造③
        self.proprio_enc = MLP(robot_dof=25)             # 本体感知: 关节位置
        self.noise_pred_net = TemporalUNet(cond_dim=...) # 条件去噪网络
        # 扩散配置: 训练 50 步, DDIM 推理 10 步 (改造⑤)

    def encode_obs(self, point_cloud_raw, joint_pos):
        pc = voxel_uniform_sample(point_cloud_raw,       # 改造②: 4096 点
                                  voxel_size=0.01, num_points=4096)
        # 改造①: pc 保持相机系, 无 R@pc+t 变换, 无分割
        f_v = self.vision(pc)                            # (B, 256)
        f_p = self.proprio_enc(joint_pos)
        return torch.cat([f_v, f_p], dim=-1)

    def predict_action(self, obs):
        cond = self.encode_obs(obs.point_cloud, obs.joint_pos)
        a = torch.randn(B, horizon=16, action_dim=25)    # 改造④: horizon=16
        for i in reversed(ddim_schedule):                # 10 步 DDIM
            eps = self.noise_pred_net(a, i, cond)
            a = ddim_step(a, eps, i)
        return a   # 连续 16 步目标关节位置 → 取第一步(或滚动执行)

6.4 关键超参数表

超参数DP3iDP3备注
点云数量1024 (FPS)4096(体素+均匀)8192 饱和回退
点云坐标系世界系相机系核心改造
视觉编码器MLP (Linear)Conv + 金字塔聚合消融见 Table III
预测时域 horizon4164 时完全学不会
扩散训练步数5050DDPM
推理步数—10(DDIM)15Hz 机载推理
优化器 / 轮数AdamW / 300AdamW / 300与基线对齐
动作空间目标关节位置目标关节位置(25-DoF)实测优于末端位姿
训练耗时—30 分钟DP 同设置 80 分钟

七、效果对比

7.1 主实验:Pick&Place 精度与平滑度(Table II)

四组训练设置:1st/3rd = 自我中心/第三人称视角数据,-1/-2 = 1 或 2 条打包 demonstration(每条 = 20 轮成功执行)。数字格式:成功抓取 / 总抓取尝试。每种方法 100+ 次真机评测。

基线1st-11st-23rd-13rd-2总计
DP (ResNet18)0/07/347/3610/3624/106
DP3 原版0/00/00/00/00/0
DP (❄R3M 冻结)11/3310/2818/3823/3962/138
DP (✶R3M 微调)24/3927/3626/3822/3499/147
iDP3 (DP3 编码器)15/3412/2715/3216/3458/127
iDP321/3819/3019/3416/3775/139

三个信息点:

  1. 原版 DP3 在人形上是彻底的 0——不做任何改造,直接迁移 = 全灭。这行 0/0 是全文最有说服力的"存在性证明":不是 DP3 不好,是人形 + 人类示教这个 setting 完全超出了它的设计域;
  2. DP(✶R3M) 单任务最强(67.3% vs iDP3 的 53.9%),作者诚实地承认了这一点——但请看下一张表;
  3. "成功/尝试"的比值还隐含平滑度:抖动的策略会在目标附近徘徊、尝试次数少,这个双指标设计值得学习。

7.2 能力泛化:训练环境 vs 四种泛化设定(Table IV)

每个设定 10 次 rollout,Wipe 因所有方法都满分而未做泛化测试:

设定任务DP(✶R3M)iDP3
训练环境Pick&Place9/109/10
Pour9/109/10
Wipe10/1010/10
新物体Pick&Place3/109/10
Pour1/109/10
新视角Pick&Place2/109/10
Pour0/109/10
新场景(厨房)Pick&Place2/109/10
Pour1/109/10

全文最关键的对比就在这张表里:DP(✶R3M) 训练环境 90%+ 的精度是"虚胖",一旦出训练分布立刻崩到 0~30%;iDP3 训练环境同样 90%,但四种泛化设定全线稳在 90%,几乎没有衰减。也就是说 iDP3 在训练环境里"输"给 DP(✶R3M) 的那 13 个百分点,买到的是近乎零衰减的分布外鲁棒性——这笔账怎么算都划算。而且没有任何显式的等变/不变性设计,一切来自"相机系 3D 表示"这一个选择。

7.3 消融实验(Table III)

视觉编码器消融(总成绩):

  • Linear(DP3 原版):58/127
  • Conv:49/131
  • Linear+Pyramid:66/134
  • Conv+Pyramid(iDP3):75/139

点数消融:

  • 1024(DP3):56/129 → 2048:65/128 → 4096(iDP3):75/139 → 8192:72/132

预测时域消融:

  • 4(DP3):0/0 → 8:33/88 → 16(iDP3):75/139 → 32:55/130

7.4 训练效率(Figure 7)

方法训练时间
DP80 分钟
iDP330 分钟

用的是 3D 表示反而比 2D 图像训得快——因为点云特征维度远小于 224×224 图像的 CNN 特征图,且 3D 表示信息密度高、收敛快。示教数据越多差距越大。

7.5 大规模真机评测规模(Table I)

2253 次真机 rollout,比 Table I 中其余所有系统的评测量总和还多。在真机机器人学习这个"评测一次成本很高"的领域,评测规模本身就是可信度。


八、总结

8.1 核心思想一句话

把 3D 策略的坐标系从"世界"搬回"相机",用点数换分割,用金字塔卷积换平滑,用时域长度换噪声鲁棒——四个简单改动的组合拳,让单场景数据长出了跨场景泛化能力。

8.2 边界在哪里

  • 上半身 25-DoF + 推车,腿是锁死的——loco-manipulation(边走边操作)不在此文射程内;
  • 数据采集靠人遥操作,累且不可规模化,作者自己点名这是"主要瓶颈";
  • 深度传感器噪声限制性能上限,精细操作(拧螺丝类)采集困难;
  • 训练环境内精度仍不敌"预训练 2D 编码器微调",3D 缺少自己的 R3M/基础模型。

8.3 延伸与联系

用视频编码的视角再类比一次:iDP3 的相机系表示相当于把运动估计的参考系从全局 GOP 级下沉到每帧局部,牺牲一点压缩效率(需要更多点),换来对全局运动(相机/机器人位姿变化)的天然鲁棒——这与编码器设计中"局部性换鲁棒性"的经典权衡完全同构。

这条线往后走有三个明显方向:① 3D 版的"R3M 时刻"——机器人预训练 3D 视觉基础模型一旦出现,Table II 里 iDP3 输给 DP(✶R3M) 的那部分会补上;② 数据规模化——遥操作疲惫问题可能要靠仿真、视频学习或人类视频直接学习来解;③ 与全身控制合流——推车是权宜之计,iDP3 的学习框架与日益成熟的 humanoid whole-body control 迟早要拼到一起。事实上第一作者后续的工作也正是朝这些方向推进的。

对做系统的人来说,这篇论文最大的启示可能不是某个具体算法,而是那条朴素的方法论:当你的系统在一个环节(标定/分割)上持续欠账时,重新选择坐标系(问题表示)往往比修补环节本身更便宜。


博客基于 arXiv:2410.10803v3 (2025-09-09) 撰写,所有实验数字均取自论文正文及表格。

Logo

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

更多推荐