跳转至

GRAIL–PULSE-X(GRAIL-style adaptation)

最后更新:2026-07-26。

2026-07-26 canonical action-backend 修订: A2-G 将采用 GRAIL observation/reward/PPO + frozen PULSE-X encoder/decoder + 48D latent residual。代码修改与验收标准见 GRAIL–PULSE-X Integration。 本页下方已有 PHC-X 63D+2D 合同、E0 证据与 blocker 保留为 legacy implementation history;不得视为新 A2-G 的 PULSE-X 证据。

2026-07-27 research-position correction: canonical A2-G 的正式名称是 GRAIL-style PULSE-X adaptation,不是 GRAIL 的严格原样复现。frozen semantics 只指尽量保留 GRAIL 的 observation/reward/termination/PPO intent;G1/SONIC 的 embodiment、64D FSQ interface 和 binary hand primitive 已被 SMPL-X/PULSE-X 的 48D encoder/decoder interface 必然替换。它是 teacher-selection baseline,不是论文方法。

当前 canonical condition

当前唯一条件为 GRAIL actor/critic observation、reward、termination 与 PPO + frozen PULSE-X reference encoder/decoder + 48D latent residual。PULSE decoder 的完整 153D articulated SMPL-X action直接进入 name permutation 和 ActionManager;不使用 FSQ、PHC-X PNN、2D hand primitive 或 motion hand override。

当前状态:

  • 完整代码修改计划与三层验收标准已冻结;
  • pulsex_controller.py、wrapper pulsex branch、config、acceptance runner 与 fail-closed train gate 已实现;
  • official-loader parity、full zero-residual diagnostic 与 2 env / 1 iter / 24 steps PPO smoke 已通过;
  • two-support contact sensors 已修成合法 one-to-many,runtime filter error 为 0
  • seeds 0/1/2 尚未训练。
证据 结果
Config audit ✅ 20 policy terms、22 critic terms、17 rewards、6 terminations;PULSE diff allowlist 通过
Official-loader parity ✅ normalizer、48D base latent、153D decoder action max error 均为 0
Zero residual ✅ 工程合同通过;valid prefix 109/994 frames,step 107 因 object_pos_deviation 终止
PPO smoke ✅ rollout/GAE/backward/optimizer/checkpoint exact resume 与 frozen-controller isolation 全通过
Teacher success ⬜ 未判定;只有三 seed 正式训练与 deterministic evaluation 才能判定

Canonical artifacts 位于 output/grail_pulsex_acceptance_20260726/{config_release,parity_release,rollout_release_v3,smoke_release}/

当前唯一执行合同与完成定义见 GRAIL–PULSE-X Integration

Superseded PHC-X implementation record

以下内容记录 2026-07-24 至 2026-07-26 的 PHC-X direct-residual 版本及其真实 E0/E1 证据,供复核和代码复用。其 65D meta action、binary hand 与 gate 状态均不属于当前 canonical A2-G。

历史记录,不是当前实验合同

本节以下的 GRAIL-SMPL-X、PHC-X 153D direct residual、65D meta action 与二值手 primitive,均已被 A2-G 的 PULSE-X 48D latent-residual 合同取代。 它们只用于解释旧 artifact,不能作为当前 baseline、实现方案或论文 claim。

本页记录第一篇 SMPL-X-only 工作的必要复现基座:唯一训练条件 GRAIL-Min 是否能在不改变 GRAIL 核心 observation/reward/PPO 的前提下,将 G1/SONIC embodiment 替换为 SMPL-X/PHC-X,并完成 current pick–place tracking。 它是 frozen-semantics 的 GRAIL-SMPL-X 对照实现,不是“用 GRAIL 作灵感”后 另起一套人类方法。当前状态是 fail-closed preregistration,尚无 GPU rollout 或训练结果。

当前 v16 单条件执行合同见 GRAIL-Min compact preregistration; 完整设计与历史 hash/gate 细节归档于 2026-07-24 GRAIL preregistration。 本页只维护当前决策、真实 gate 状态和下一步。

论文定位与 reviewer 可判别边界

第一篇论文可以只使用 SMPL-X;G1 不是本页的 runtime、数据或评测对象。 但只写一个新的 SMPL-X scene/interaction pipeline 而没有严格的 GRAIL-SMPL-X,无法排除 reviewer 的以下替代解释:结果只来自 PHC-X pretrained tracker、HSI reference/data 或工程实现,而不是方法差异。

因此本页冻结的 GRAIL-Min 有且只有一个职责:给出可复核的、与原始 GRAIL 语义等价的 SMPL-X 对照。它本身不能被表述为第一篇的算法新意,也不能与未来 的 SMPL-X 方法混成同一个条件。

论文问题 本页提供的证据 不能由本页声称的结论
“你是否真的实现了 GRAIL,而非仅借鉴其名字?” observation、reward、termination、PPO、object-awareness 与训练日程的冻结语义合同 GRAIL 原始 G1 benchmark 的性能复现
“SMPL-X 结果是否只是 PHC-X / reference / 数据造成?” 在同一 SMPL-X reference、PHC-X checkpoint、scene/object contract 下的 GRAIL 基线 一个尚未定义和预注册的后续方法的增益
“这是否只是工程 port?” 它确实是必要的 isomorphic baseline;其价值是消除归因歧义 单凭该 port 宣称新的学习算法贡献

若后续提出第一篇的 SMPL-X 方法,必须另行预注册一个清晰、可消融且不属于 原始 GRAIL 的 scene/contact/interaction interface;它只能在 GRAIL-Min 已被 runtime 证实后与本页 baseline 比较。本页当前不预先杜撰 该方法、奖励项或第二训练条件。

目标与假设

复现问题:冻结 PHC-X 能否提供 153D SMPL-X action prior,使保留 GRAIL manipulation semantics 的 policy 只学习 65D meta action;task role 是否可由 motion metadata 解析为 active_handactive_support,而不保留 upstream hard-coded right_hand/table

该问题的正向答案只证明 GRAIL-SMPL-X 基线成立;它不自动证明第一篇的 新方法,也不自动证明该基线能跨 motion、object 或 scene 泛化。

唯一实验条件

GRAIL-Min 保留:

  • GRAIL Isaac Lab manager runtime;
  • policy/critic observation term、顺序、future horizon 与 corruption 设置;
  • reward、termination、PPO、rollout horizon 和 motion resampling schedule;
  • two-hand primitive 与 body/hand action composition;
  • target/support object、mass 和 contact semantics。

只允许改变:

  • G1 embodiment → SMPL-X;
  • frozen SONIC controller → frozen PHC-X;
  • hard-coded entity binding → task-driven semantic role;
  • 完成上述替换所必需的 name-based permutation、reference conversion 和 action affine。

E0/E1/P0/P1/S0 只是同一个 GRAIL-Min 基线实现内部的静态检查、runtime sanity check 和 smoke check,不是额外实验组,也不各自产生训练模型。T0/T1 只是完全相同训练条件的不同 seed 重复;本复现阶段的方法表只有一行 GRAIL-Min。这不排除未来另行预注册、与该行进行公平对比的论文方法。

执行链为:

实现/静态检查 -> runtime sanity checks -> smoke -> GRAIL-Min 多 seed 正式训练

中间检查失败时只修复并重跑同一个 GRAIL-Min,不新增替代 observation、 reward、controller 或训练条件。

Gate

Gate 证据 当前状态
E0 static/config config diff allowlist、checkpoint/RMS、USD、reference hashes、app-close candidate、formal timeout exit marker 通过。 最新 e0/preflight.jsonpassed=true,且已绑定 E1 finalizer 的 critical-source hash;无需重跑已通过的 USD runtime,除非关键源码再次改变
E1 replay Isaac reference replay,frame 0 与 raw trace,加上 formal timeout clean-exit marker 未通过,且不可被视为已完成失败 gate。 replay 在环境构造期确定性触发 SONIC hand-action loader 的 UnboundLocalError;runtime progress 已记录 traceback,但 final marker 仍为无效的 lifecycle=running,无 E1 gate/raw trace
P0 tensor/PD parity processed target、robot target 与 PHC affine parity 代码合同独立复审 ACCEPT;正式 simulator 未运行
P1 zero-residual rollout closed-loop transition、22-body MPJPE、limits/collision 代码合同独立复审 ACCEPT;正式 simulator 未运行
S0 smoke 2 env / 1 iter / 24 steps 代码合同独立复审 ACCEPT;正式 simulator 未运行
GRAIL-Min train 同一配置 seeds 0/1/2 未启动;在 E1/P0/P1/S0 都通过前禁止启动

当前代码与测试证据

2026-07-24 14:44(Asia/Shanghai)在 .envs/sonic 复跑全部 GRAIL-Min 定向 suite:

PYTHONPATH=/mnt/data/PhysHSI:/mnt/data/PhysHSI/submodules/GRAIL/imports/SONIC:/mnt/data/PhysHSI/submodules/PHC \
/mnt/data/PhysHSI/.envs/sonic/bin/python -m pytest -q \
  tests/test_grail_*.py

结果为 129 passed, 5 warnings。observation/reward/termination、 runtime/action/motion 与正式 training path 三项独立 source-diff 复审均为 ACCEPT。第一轮复审发现的 critic contact-flag 语义漂移和非目标 SONIC hand-DOF bypass 均已撤回;当前 config audit 为 95/95 allowedunexpected_differences=[]。E1/P0/P1/S0 collector、 runner、fail-closed validator 和 pairwise contact collector 的实现级合同已通过, 但这不证明 Isaac runtime gate 或训练 outcome。

现有静态证据还包括:

  • PHC-X checkpoint/RMS/primitive-0 能在 CPU 完成 2×2026 → 2×153 finite output;
  • converted USD 曾实际加载为 52 bodies / 153 revolute joints;
  • name-set、uniqueness 与 permutation round-trip 曾通过;
  • 当前 reference 已从 597@30 Hz 重生为 994@50 Hz; active contact 精确为 frames 130..960(831 frames),support switch 为 frame 250,joint velocity 为 994×153
  • 当前 config/checkpoint/reference/USD 内容验证为 passed=true;2026-07-25 15:45 UTC 的 E0 formal outer runner 实际返回 0,最终 e0/runtime_clean_exit.json、USD contract 和绑定它的 e0/preflight.json 都为 passed=true。这替代了所有未绑定 command-level clean-exit 的历史 preflight。
  • 2026-07-25 13:34(Asia/Shanghai)在正式 GPU host、CUDA_VISIBLE_DEVICES=1 下重跑 E0/USD audit。usd_contract.json 被重写且内容仍为 passed=true, SHA-256 仍为 41e26d65840a56c33b7f672049ca3ca36549695a121426a80bcb6d41682a5985; 但 Isaac/Kit teardown 未在15分钟 timeout内干净退出,外层命令返回124。 因此 E0 runtime clean-exit gate失败;失败记录见 output/grail_minimal_smplx_phcx_20260724/e0/runtime_clean_exit_20260725_attempt1.json
  • 2026-07-25 22:28(Asia/Shanghai)以 teardown 修复版再次执行同一正式 timeout --signal=INT --kill-after=60s 15m 命令;USD 内容仍通过,但 child 在 14分51秒后仍存活,最终同样由 timeout 终止。失败事实记录见 output/grail_minimal_smplx_phcx_20260724/e0/runtime_clean_exit_20260725_attempt2.json。 该次发生在 clean-exit marker 引入前,不能转换为正向 gate 证据。
  • 2026-07-25 23:13(Asia/Shanghai)首次使用 outer-timeout runner 在 GPU0 发起 E0;audit 在 Isaac runtime 创建前因 AppLauncher 的局部导入遗漏退出 1。runner 正确写入 passed=false final marker,E1 未启动。失败记录见 output/grail_minimal_smplx_phcx_20260724/e0/runtime_clean_exit_20260725_attempt3.json。 已恢复惰性 _launch_app() import 并由独立复审 ACCEPT;之后的正式 E0 v2 已在 GPU0 通过。
  • E0 v2 teardown 不调用会触发 IsaacLab STOP callback 的 simulation.stop();只 在 app.close() 前清除 simulation instance/callback。audit 在实际发出 app.close() 请求时写 runtime_app_close_candidate.json,不错误要求 app.close() 正常返回(它可直接终止 Python); tools/run_grail_minimal_e0.py 在 formal timeout --signal=INT --kill-after=60s 15m 子进程返回且 exit code 为 0 后,才原子写最终 runtime_clean_exit.json。preflight/runtime loader 同时 绑定 final marker、candidate、USD audit 与 robot USD 的 SHA-256。对 USD/body/joint/limit 检查逻辑无放宽。该文件与 adaptation layer 均是 E0 critical source;在加入 E1 finalizer 后已重新签发最新 e0/preflight.json, 其 passed=true 并绑定该 source hash。
  • E1 现有同构的 finalizer:inner replay runner 先记录原子 e1_runtime_progress.json(阶段、异常、traceback、close 请求);outer tools/run_grail_minimal_e1_formal.py 只在 child exit 0、passed E1 gate 及无错误 progress 同时成立时写 e1_runtime_clean_exit.json。P1 与 smoke preflight 同时校验该 marker 对 E1 gate/progress 的 SHA-256 绑定。任一 teardown 或 app-close 失败会把候选 E1 gate 失效化,不能让下游接受。
  • E1 失败日志确认 converted USD 的 52 个 rigid bodies 位于 {ENV_REGEX_NS}/Robot/Pelvis/<body>,而不是 G1-style {ENV_REGEX_NS}/Robot/<body>。因此只在 utils/tracking_adapters/grail/runtime.py 的 adaptation layer 中重写 canonical SMPL-X body path、contact_forces broad pattern、hand/object/support contact filters 与 frame-transform targets;不修改 GRAIL/SONIC source、robot root、observation、reward、termination、action 或 object/support path。
  • 随后的正式 E1 已越过上述 body-path 解析,随即在 SONIC motion_lib_base.py 的 hand-action 汇总代码触发 UnboundLocalError: start:该函数在 worker scope 之外读取 start/endcurr_file。两名独立 reviewer 一致判定这是 upstream loader defect,而不是 SMPL-X adaptation、PHC-X、reward 或 GPU 问题。语义保持的唯一候选修复是:在 worker 内按相同 [start:end] 裁剪左右 hand-action,用既有 nearest_time_source_indices 做 source FPS 到 target FPS 的最近邻映射,写入 curr_motion;汇总处只 append 该已处理字段。该修复尚获得修改 SONIC source 的授权,故未应用;不会以关闭 hand action、事后注入或新训练条件绕过。
  • 该修复的 focused static suite 在 .envs/sonic 通过:68 passed(formal timeout exit attestation、INT/SystemExit fail-closed、marker hash binding、loader rebind、完整 PHC-X sensor path、pairwise collector、P1 trace 和 runtime-config contract)。这是代码级证据,不是 E0/E1 runtime pass。
  • 2026-07-26,E1 finalizer、marker binding、P1/smoke downstream enforcement 与 preflight 回归共 48 passed;独立 reviewer 复跑其中相关 37 项为 37 passed,完整 tests/test_grail_*.py suite 也以 exit 0 完成。该证据只 覆盖 fail-closed 工程合同,不替代 E1 runtime replay。

结果

当前没有可报告的 rollout、reward、completion、human/object tracking 或 contact metric;这些项全部为 Unavailable

结论

  • 已验证: GRAIL-Min 的 frozen-semantics 配置、部分 reference/config/action 静态合同,以及 E0 USD 内容合同和命令级 clean-exit 均在正式 GPU host 上通过。
  • 待验证: 最小基线能否实际完成 E1 replay、closed-loop PHC-X parity、 smoke 和训练;因此尚不能称 GRAIL-SMPL-X 基线成立。
  • 不能支持: 当前不得报告任何 rollout、收敛或训练结果,不得把 GRAIL-Min 写成可用 teacher,也不得把该跨 checkpoint/interface 的 semantic adaptation 写成第一篇的算法贡献。

待补证据

  1. 对 SONIC hand-action loader 的上述 upstream defect 作明确 go/no-go 决策。 若授权该语义保持修复,先新增其 30→50 Hz、crop、缺失 stream 与串接长度的 定向测试;若不授权,则本基线停在 E1 前,不能以 project-side workaround 继续。
  2. 若关键 SONIC 源码改变,重签 E0 preflight(不重跑已通过的 E0 USD runtime),随后仅使用 tools/run_grail_minimal_e1_formal.py 重跑 E1,并要求 final marker 进入完整终态。
  3. E1 通过后依次运行 P0、P1,每个 gate 保存独立 raw trace;然后运行 S0。
  4. 全部 gate 通过后才按预注册预算启动唯一条件 GRAIL-Min 的 seeds 0/1/2。
  5. 只有基线获得上述 runtime 证据后,才单独设计和预注册第一篇的 SMPL-X 方法/ablation;不得将它追溯性混入此 frozen baseline。