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 +
48Dlatent residual。代码修改与验收标准见 GRAIL–PULSE-X Integration。 本页下方已有 PHC-X63D+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、wrapperpulsexbranch、config、acceptance runner 与 fail-closed train gate 已实现; - official-loader parity、full zero-residual diagnostic 与
2 env / 1 iter / 24 stepsPPO 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_hand 与 active_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。这不排除未来另行预注册、与该行进行公平对比的论文方法。
执行链为:
中间检查失败时只修复并重跑同一个 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.json 为 passed=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 allowed、unexpected_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×153finite 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=falsefinal 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在 formaltimeout --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 请求);outertools/run_grail_minimal_e1_formal.py只在 child exit0、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_forcesbroad 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/end与curr_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_*.pysuite 也以 exit0完成。该证据只 覆盖 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 写成第一篇的算法贡献。
待补证据
- 对 SONIC hand-action loader 的上述 upstream defect 作明确 go/no-go 决策。 若授权该语义保持修复,先新增其 30→50 Hz、crop、缺失 stream 与串接长度的 定向测试;若不授权,则本基线停在 E1 前,不能以 project-side workaround 继续。
- 若关键 SONIC 源码改变,重签 E0 preflight(不重跑已通过的 E0 USD
runtime),随后仅使用
tools/run_grail_minimal_e1_formal.py重跑 E1,并要求 final marker 进入完整终态。 - E1 通过后依次运行 P0、P1,每个 gate 保存独立 raw trace;然后运行 S0。
- 全部 gate 通过后才按预注册预算启动唯一条件
GRAIL-Min的 seeds 0/1/2。 - 只有基线获得上述 runtime 证据后,才单独设计和预注册第一篇的 SMPL-X 方法/ablation;不得将它追溯性混入此 frozen baseline。