iDP3 深度解析:只用一个场景的数据,人形机器人凭什么能在整个世界干活?
论文标题: 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 的一作,属于自己革自己的命)给出的方案是一个完整的真机系统,三大件:
- 上全身遥操作系统:Apple Vision Pro 采集人头/双手/手腕的 3D 位姿,映射到机器人的头、腰、双臂、双手共 25 个自由度——注意,腰部和主动视觉(头)也纳入遥操作,这是和双臂遥操作系统的本质区别;
- 人形机器人平台:Fourier GR-1 固定在可移动、可升降的小车上,头部装一台 RealSense L515 固态激光雷达相机;
- 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 的实时画面回传给操作员,实现沉浸式自我中心遥操作。
两个藏在工程细节里的坑:
- 延迟约 0.5 秒。 L515 点云吞吐量太大,吃满了机载电脑的带宽和 CPU。作者还试过再加一个手腕雷达——延迟直接爆炸,数据采集不可行,作罢。这就是为什么最后只有一个头载传感器;
- 动作空间选关节角,不选末端位姿。 作者实测过用末端执行器位姿作为本体感知/动作,发现真机上计算末端位姿要走运动学链、累积噪声大,直接用目标关节位置作为动作空间精度更高。这个选择和很多机械臂工作(爱用末端 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−βiak(i−1), βiI)
- 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)αˉia(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 关键超参数表
| 超参数 | DP3 | iDP3 | 备注 |
|---|---|---|---|
| 点云数量 | 1024 (FPS) | 4096(体素+均匀) | 8192 饱和回退 |
| 点云坐标系 | 世界系 | 相机系 | 核心改造 |
| 视觉编码器 | MLP (Linear) | Conv + 金字塔聚合 | 消融见 Table III |
| 预测时域 horizon | 4 | 16 | 4 时完全学不会 |
| 扩散训练步数 | 50 | 50 | DDPM |
| 推理步数 | — | 10(DDIM) | 15Hz 机载推理 |
| 优化器 / 轮数 | AdamW / 300 | AdamW / 300 | 与基线对齐 |
| 动作空间 | 目标关节位置 | 目标关节位置(25-DoF) | 实测优于末端位姿 |
| 训练耗时 | — | 30 分钟 | DP 同设置 80 分钟 |
七、效果对比
7.1 主实验:Pick&Place 精度与平滑度(Table II)
四组训练设置:1st/3rd = 自我中心/第三人称视角数据,-1/-2 = 1 或 2 条打包 demonstration(每条 = 20 轮成功执行)。数字格式:成功抓取 / 总抓取尝试。每种方法 100+ 次真机评测。
| 基线 | 1st-1 | 1st-2 | 3rd-1 | 3rd-2 | 总计 |
|---|---|---|---|---|---|
| DP (ResNet18) | 0/0 | 7/34 | 7/36 | 10/36 | 24/106 |
| DP3 原版 | 0/0 | 0/0 | 0/0 | 0/0 | 0/0 |
| DP (❄R3M 冻结) | 11/33 | 10/28 | 18/38 | 23/39 | 62/138 |
| DP (✶R3M 微调) | 24/39 | 27/36 | 26/38 | 22/34 | 99/147 |
| iDP3 (DP3 编码器) | 15/34 | 12/27 | 15/32 | 16/34 | 58/127 |
| iDP3 | 21/38 | 19/30 | 19/34 | 16/37 | 75/139 |
三个信息点:
- 原版 DP3 在人形上是彻底的 0——不做任何改造,直接迁移 = 全灭。这行 0/0 是全文最有说服力的"存在性证明":不是 DP3 不好,是人形 + 人类示教这个 setting 完全超出了它的设计域;
- DP(✶R3M) 单任务最强(67.3% vs iDP3 的 53.9%),作者诚实地承认了这一点——但请看下一张表;
- "成功/尝试"的比值还隐含平滑度:抖动的策略会在目标附近徘徊、尝试次数少,这个双指标设计值得学习。
7.2 能力泛化:训练环境 vs 四种泛化设定(Table IV)
每个设定 10 次 rollout,Wipe 因所有方法都满分而未做泛化测试:
| 设定 | 任务 | DP(✶R3M) | iDP3 |
|---|---|---|---|
| 训练环境 | Pick&Place | 9/10 | 9/10 |
| Pour | 9/10 | 9/10 | |
| Wipe | 10/10 | 10/10 | |
| 新物体 | Pick&Place | 3/10 | 9/10 |
| Pour | 1/10 | 9/10 | |
| 新视角 | Pick&Place | 2/10 | 9/10 |
| Pour | 0/10 | 9/10 | |
| 新场景(厨房) | Pick&Place | 2/10 | 9/10 |
| Pour | 1/10 | 9/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)
| 方法 | 训练时间 |
|---|---|
| DP | 80 分钟 |
| iDP3 | 30 分钟 |
用的是 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) 撰写,所有实验数字均取自论文正文及表格。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)