OmniGrasp Cup Transfer
最后更新:2026-07-24。
本页保存 2026-07-17 pretrained OmniGrasp cup-transfer 的历史 diagnostic。两阶段 object-control rollout 当时通过,但输入是旧 163-frame clip,后续 body-shape/reference contract 审计证明它不能参加当前 597-frame teacher architecture 排名;当前 strict run 的失败结果统一记录在 Physics Teacher Selection。
结论摘要
本实验用完整的官方 pretrained OmniGrasp checkpoint,在项目自己的杯子 mesh、质量、VHACD、床头柜支撑和场景碰撞中进行了两阶段 deterministic 单环境测试。
在该历史协议内部,两个阶段都在零 fine-tuning 的情况下直接通过。
| 阶段 | 目标 | completion | object position RMSE | rotation mean | contact filter |
|---|---|---|---|---|---|
| Stage 1 | 保持后垂直抬升 10 cm | 100% | 3.15 cm | 8.67° | 100% |
| Stage 2 | 真实 [56,219) object trajectory |
100% | 2.91 cm | 65.62° | 100% |
这组结果阶段性支持:
- 项目杯子的几何、质量、碰撞体和支撑面本身是可抓取的;
- 原版 OmniGrasp observation、prior、48D latent residual 和 PULSE-X decoder 可以直接形成稳定抓取;
- 原版 checkpoint 也能直接跟随真实轨迹中约 41 cm 的最大垂直抬升和约 91 cm 的端点位移;
- 当前成功只证明旧协议内的 object manipulation / position tracking,不证明左手 HOI fidelity,也不证明 dense human motion tracking;
- Stage 2 的 rotation tracking 很差,当前结果只支持“弱 rotation、重 contact/lift/position”的目标定义。
由于 seed checkpoint 已经通过两阶段 gate,本次没有继续 PPO fine-tuning,避免破坏已经成功的预训练策略。
协议边界
该实验使用 20260711_hsi_generation_world_pose_fix/left/motion.npz 和 [56,219) clip;它没有满足当前 canonical 597-frame motion 与统一 body-shape contract。保留它是为了证明 object-control signal 和定位 rotation/human-fidelity 边界,不用于声明 OmniGrasp 胜过其它 teacher。
1. 实验目标与因果拆分
本实验不再使用 fresh 48D actor,也不是 PHC-X residual 或 B1-HSI reference-encoder 实验,而是严格恢复完整 pretrained OmniGrasp:
- 加载原始 actor、critic、GRU、normalizer、BPS reader 和网络结构;
- 保持
prior_mu(self_obs); - 保持 object future observation;
- 保持 BPS/object code;
- 保持双手 fingertip-object relative vectors 和 finger contact force;
- 保持 pregrasp、contact/lift-gated reward;
- 仅替换成项目杯子、质量、VHACD、床头柜支撑及对应场景碰撞。
实验分为两个严格解耦的阶段:
Stage 1:Cup graspability transfer
- source frame 56 初始化人和杯子;
- 固定 frame-0 reset,不使用 random start;
- object future 使用“保持—垂直抬升 10 cm—保持”的简单目标;
- 只回答原版 OmniGrasp 能否适应项目杯子并形成稳定抓取。
Stage 2:真实轨迹 tracking
- 使用 Stage 1 通过的同一 checkpoint;
- object future 切换为真实
[56,219)object trajectory; - position tracking 为主要几何目标;
- rotation 仅保留弱权重;
- 回答稳定抓取后能否跟随真实 carry trajectory。
2. 环境和资产
| 项目 | 配置 |
|---|---|
| canonical motion | output/auto_experiments/20260711_hsi_generation_world_pose_fix/left/motion.npz |
| layout | data/selected_SAGE10k/e2e_test_scenes/2cdc81db/layout_2cdc81db.json |
| dynamic object | room_e8121c03_cupnightstanda_5578c869 |
| support object | room_e8121c03_nightstand_022f8481 |
| cup mass | 0.15 kg |
| support mode | keep |
| physics actors | cup + nightstand |
| visual scene | full SAGE layout |
| evaluation | GPU 1,1 env,deterministic |
杯子使用真实 SAGE mesh 和对应 VHACD/collision;场景中的其他物体仅用于完整场景可视化,不参与本实验的物理交互。
使用的完整任务 checkpoint:
- checkpoint epoch:28000;
- 包含原始 actor/critic/GRU、BPS reader、optimizer 和 policy normalizer;
- policy running normalizer 连续输入维数:1207。
PULSE-X checkpoint:
3. 为什么 clip 改为 [56,219)
原先 [68,219) 从已经发生 mesh penetration 的状态开始,不适合作为 pre-grasp reset。对 SMPL-X MANO 左手和杯子闭合 mesh 的逐帧几何审计如下:
| source frame | hand-object surface min | penetration |
|---|---|---|
| 60 | 16.68 cm | 无 |
| 61 | 12.78 cm | 无 |
| 62 | 9.29 cm | 无 |
| 63 | 6.09 cm | 无 |
| 64 | 3.35 cm | 无 |
| 65 | 1.07 cm | 无,但安全余量很小 |
| 66 | — | 首次穿透;11/778 vertices,max depth 0.167 cm |
| 67 | — | 32/778 vertices,max depth 0.197 cm |
| 68 | — | 26/778 vertices,max depth 0.217 cm |
物体在 source frame 68 出现很小的运动,frame 69 后单帧位移超过 0.1 mm。最终选择 frame 56 而不是“最晚无穿透帧”,是为了在首次 mesh contact(frame 66)前提供:
- 10 个 reference frames;
- 约 0.333 s 的策略反应时间;
- 干净、无穿插的 approach 状态。
转换后的 OmniGrasp reference 中,contact/lift reward marker 分别位于:
- contact:source frame 98,local frame 42;
- lift:source frame 116,local frame 60。
这里的 contact marker 表示 reward 调度所使用的 reference 手部闭合/稳定接触时刻,不等同于“mesh 第一次几何相交”的 frame 66。
4. Pretrained actor 的 observation 与执行链路
本次 inference 没有输入 human reference,也没有显式的 active-hand label。
4.1 Runtime observation:1208D
| block | 维数 | 内容 |
|---|---|---|
| self observation | 778 | root height;52 个 SMPL-X body 的 heading-local position、6D rotation、linear/angular velocity |
| object future | 300 | K=20 × 15D:reference-vs-current object position 3、rotation 6、linear velocity 3、angular velocity 3 |
| current object pose | 9 | root-heading frame 下 position 3 + rotation 6 |
| fingertip-object vectors | 30 | 双手 10 个 fingertips × 3D |
| finger contact forces | 90 | 双手 30 个 finger sensor bodies × 3D |
| env/object index | 1 | 用于选择 object BPS code |
| 总计 | 1208 | 778 + 429 + 1 |
其中 self observation 的维数为:
前 1207 个连续维度由 task checkpoint 的 running mean/variance 归一化。最后 1D index 选择 512D BPS object code,再经 z_reader_mlp 编码为 256D。因此 actor MLP 的有效输入为:
4.2 Latent residual 与 action
执行链路保持原版 OmniGrasp:
self_obs ──> frozen PULSE-X prior ──> prior_mu [48]
OmniGrasp actor(self/object obs, BPS) ──> delta_z [48]
z_exec = prior_mu + delta_z
frozen PULSE-X decoder(self_obs, z_exec) ──> action [153]
这里存在两个不同的 normalizer:
- 任务 checkpoint 的 1207D policy normalizer;
- PULSE-X prior/decoder 使用的 self-observation normalizer。
关键配置为:
has_im_obs = False
include_human_ref_in_actor = False
use_reference_encoder_base = False
use_hand_flag = False
因此它不是 human trajectory tracker。Human reference hand pose 只用于 pregrasp reward,不是 actor 的 observation。
5. Stage 1:简单抬升结果
简单目标保留 source frame 56 的初始杯子姿态,随后在 Z-up 方向用 30 帧垂直抬升 10 cm,再保持不动。Human initialization、hand target、object code 和 observation contract 均保持不变。
Stage 1 使用原版 reward 权重:
完整 pretrained checkpoint 在 fine-tuning 前的 deterministic seed eval 已通过:
| 指标 | 结果 |
|---|---|
| episode frames / valid frames | 163 / 162 |
| completion | 100% |
| reference max lift | 10.00 cm |
| actual max lift | 13.72 cm |
| actual final lift mean | 12.94 cm |
| airborne contact ratio | 83.33% |
| object position mean | 2.78 cm |
| object position RMSE | 3.15 cm |
| object position P95 | 5.45 cm |
| object rotation mean | 8.67° |
| object rotation P95 | 15.69° |
| official contact filter ratio | 100% |
| reward mean / sum | 0.7771 / 125.88 |
参考端点位移为 10.00 cm,实际端点位移为 14.81 cm,最终端点误差为 6.49 cm。
这一步直接证明项目杯子是可被原版 OmniGrasp 稳定抓取并抬起的。由于 seed eval 已成功,没有执行 Stage 1 PPO fine-tuning。
6. Stage 2:真实 [56,219) 轨迹结果
Stage 2 使用同一个官方 checkpoint,直接切换为真实 object future trajectory。Seed eval 使用的 reward 权重为:
由于 checkpoint 在 deterministic eval 中被冻结,reward 权重不会改变该次 rollout action;它们只表达后续如需 fine-tuning 时的目标优先级。
| 指标 | 结果 |
|---|---|
| episode frames / valid frames | 163 / 162 |
| completion | 100% |
| object position mean | 2.65 cm |
| object position RMSE | 2.91 cm |
| object position P95 | 4.48 cm |
| final endpoint error | 2.23 cm |
| reference endpoint displacement | 90.78 cm |
| actual endpoint displacement | 89.90 cm |
| reference max lift | 40.94 cm |
| actual max lift | 43.74 cm |
| actual final lift mean | 35.63 cm |
| airborne contact ratio | 82.72% |
| official contact filter ratio | 100% |
| object rotation mean | 65.62° |
| object rotation P95 | 176.37° |
| reward mean / sum | 0.3797 / 61.51 |
原计划是在 Stage 2 中把 position weight 按 0.20 → 0.35 → 0.50 逐步增强,并保持 rotation weight 为 0.05。由于官方 checkpoint 的 seed eval 已经满足 completion、contact 和 position gates,该 curriculum 没有执行。
Stage 2 的结论是:原版 OmniGrasp 已能直接完成真实 object translation/carry,但不能据此声称 object orientation 已被正确跟踪。Rotation 改进应作为独立 ablation,而不是继续修改这次成功的 position/contact baseline。
7. 为什么 rollout 变成了双手抓取
原版 OmniGrasp 不限制左右手:
- observation 同时输入双手 10 个 fingertip-object relative vectors;
- observation 同时输入双手 30 个 finger contact-force vectors;
use_hand_flag=False,没有 left/right active-hand 条件;- grasp 后的 contact filter 接受任一只手靠近并接触物体;
- 没有“非目标右手接触惩罚”。
Reference 在 contact local frame 42 的几何关系是:
| 手 | 20 cm 内 hand bodies | 最近距离 |
|---|---|---|
| left | 16 | 1.61 cm |
| right | 0 | 48.38 cm |
但实际 rollout 中:
- left-hand contact force active:147 frames;
- right-hand contact force active:139 frames;
- 双手到物体中心的最小距离分别约 5.78 cm 和 5.81 cm。
因此策略选择了它在当前 observation/reward 下认为更稳健的双手操作,即使 reference 是左手交互。这不是 checkpoint 加载错误,而是原版 task definition 本身没有约束 active hand。
同时,Stage 1/2 的 human body mean error 分别为 39.96 cm 和 26.01 cm(P95 分别为 90.63 cm 和 60.24 cm)。这些指标进一步说明本实验不是 human motion imitation:
- 本次成功证明 object graspability 和 object position tracking;
- 不证明左手单手抓取 fidelity;
- 不证明项目 human trajectory 被准确执行。
如果后续目标是严格 left-only,应单独建立 right-hand contact penalty/mask 的 fine-tuning 对照。增加 2D hand flag 会改变 observation contract,不能再声称 checkpoint 原结构零修改加载。
8. 代码、数据与可视化产物
8.1 实现
| 内容 | 路径 |
|---|---|
| cup-transfer runner | tools/run_omnigrasp_cup_transfer.py |
| simple-lift reference | utils/tracking_adapters/omnigrasp/reference.py |
| reference tests | tests/test_omnigrasp_reference.py |
验证结果:
8.2 Reference artifacts
output/auto_experiments/20260717_omnigrasp_cup_transfer_56_219/references/full.pkl
output/auto_experiments/20260717_omnigrasp_cup_transfer_56_219/references/real_56_219.pkl
output/auto_experiments/20260717_omnigrasp_cup_transfer_56_219/references/simple_lift_56_219.pkl
real_56_219.pkl 和 simple_lift_56_219.pkl 均为 163 帧;前者保留真实 object trajectory,后者将 object trajectory 替换为保持、Z-up 抬升 10 cm、再保持。
8.3 Evaluation artifacts
Stage 1:
output/auto_experiments/20260717_omnigrasp_cup_transfer_56_219/stage1_cup_graspability/eval_pretrained/metrics.json
output/auto_experiments/20260717_omnigrasp_cup_transfer_56_219/stage1_cup_graspability/eval_pretrained/rollout_trace.npz
Stage 2:
output/auto_experiments/20260717_omnigrasp_cup_transfer_56_219/stage2_real_trajectory/eval_seed/metrics.json
output/auto_experiments/20260717_omnigrasp_cup_transfer_56_219/stage2_real_trajectory/eval_seed/rollout_trace.npz
output/auto_experiments/20260717_omnigrasp_cup_transfer_56_219/stage2_real_trajectory/history.json
Stage 2 Isaac Sim trace replay:
output/auto_experiments/20260717_omnigrasp_cup_transfer_56_219/stage2_real_trajectory/visualization/tracked_front.mp4
output/auto_experiments/20260717_omnigrasp_cup_transfer_56_219/stage2_real_trajectory/visualization/carry_frame_front.png
output/auto_experiments/20260717_omnigrasp_cup_transfer_56_219/stage2_real_trajectory/visualization/carry_frame_right.png
视频为 640×640、30 FPS、163 frames、约 5.43 s。图中的蓝色杯子是 rollout 的实际物理对象,不是 reference ghost;renderer 使用完整 SAGE visual scene,物理对象仅为 cup 和 support。
8.4 复现命令
/home/user/anaconda3/envs/isaac-gym/bin/python tools/run_omnigrasp_cup_transfer.py \
--mode all \
--motion output/auto_experiments/20260711_hsi_generation_world_pose_fix/left/motion.npz \
--layout-json data/selected_SAGE10k/e2e_test_scenes/2cdc81db/layout_2cdc81db.json \
--out-dir output/auto_experiments/20260717_omnigrasp_cup_transfer_56_219 \
--gpu 1
Runner 默认使用 [56,219)、10 cm simple lift 和 30 lift frames。由于当前两阶段 seed eval 已通过,runner 会在成功 gate 后直接结束,不会无意义地启动 PPO fine-tuning。
9. 对后续实验的影响
本实验已经排除了以下解释:
- 杯子 mesh/VHACD 天生不可抓;
- 0.15 kg 质量或床头柜支撑使任务不可解;
- 必须先训练一个 fresh actor 才能适配项目 object trajectory;
- 原版 OmniGrasp 无法处理该杯子的真实大范围平移轨迹。
下一步不应继续把“能否抓起”与“是否复现目标 human motion”混为同一问题。合理的实验顺序是:
- 将本结果固定为 OmniGrasp object-control upper baseline;
- 独立评估 left-only/right-hand suppression,确认手别约束的代价;
- 将 PHC-X human tracking 与 OmniGrasp object manipulation 的切换或联合控制作为新的实验变量;
- object rotation refinement 单独做 ablation,避免破坏已验证的 contact/position 能力。