feat(tracking): v0.1.2 双手轨迹回放与 GUI 预览

支持 L20 右手模型身份与严格浮动控制覆盖层,新增完整轨迹受限回放、时间拉伸及可选 GUI 显示。

验证:88 项 CPU/USD 回归、Ruff、格式与独立暂存审查通过。历史 80 倍降速回放完成 2x32000 步;整合后 GUI E2E 和完整 pre-commit 未执行,相关边界见 L20_TRACKING.md。

右手 USD、示教数据、媒体和日志未纳入提交;资产存储及许可仍待确认。保留原控制与安全阈值。
This commit is contained in:
2026-09-14 13:57:57 +08:00
parent 057f4c2cf6
commit 8e7ab5fc76
20 changed files with 2218 additions and 62 deletions
+101 -1
View File
@@ -1,5 +1,11 @@
# L20 左手轨迹跟踪:数据交付与准备入口
本页保留左手验证历史。新增右手入口、实际转换/回放证据与发布限制见
[`右手资产说明`](assets/robots/dex_hand/linkerhand_g20_right/README.md);左右共用校验器与控制入口,显式绑定hand_side。
HDF5右手差异见独立契约第10节(右thumb联动1.03,不能套用左1.02)。
本轮准备门禁新增 `NewtonArticulationRootAPI` 注册上下文;**旧prepared覆盖层需重新生成**。
左手源资产未改,本轮额外左small两轮480步回归PASS,指标与历史baseline一致。
## 本次可用范围与验证状态
提供 **CPU 数据接口、资产清单、浮动控制覆盖层和实验性动力学跟踪入口**,不是完成的 RL 环境。
@@ -254,7 +260,8 @@ PYTHONPATH=source/dex_workbench timeout 300s ~/isaacsim/python.sh \
### 控制与验收边界
- 单环境、seed42、240Hz;默认两次各480步,单次允许100–1200步,外部 timeout 300秒。
- 单环境、seed42、240Hz;默认两次各480步,普通模式单次允许100–1200步,外部 timeout 300秒。
显式完整文件模式的有限步数/预算例外见第5节;不会自动扩大默认范围。
只创建手,无物体、桌面、任务注册或训练。不逐步 teleport;仅 reset 写 root/joint 初值并清零速度、
wrench 与目标缓冲、轨迹时间,之后只发 master q_target 和 root COM wrench。
- 世界系 PD 跟踪 link 原点;输出作用在 root COM,补上 `(p_link-p_rootCOM)×F_PD`。
@@ -346,3 +353,96 @@ HDF5用例 RMS 依次为 `0.000646705 m`、`0.006378398 rad`、`0.007675343 rad`
仍有TGS外力迭代、16/21 actuator(5个被动关节)、protobuf重复注册、visualizer/MaterialX与usdrt警告;
未关闭日志或放宽检查。更大范围、负向/多轴腕部运动、接触、真实专家文件、多环境、训练与硬件均未验证。
完整 pre-commit 仍因未安装工具而 NOT_RUN;本次独立审查仍由父会话执行。
## 5. 显式扩范围与完整专家参考回放
默认工作半径仍为起点周围 **0.1m**,普通模式步数上限仍为 **1200**(默认480)。
`--workspace-radius 0.8` 仅覆盖工作半径,不改变增益、力/力矩、参考速度、实测安全界限或误差阈值。
`--full-episode` 必须同时提供 HDF5,允许每轮最多 **32000** 步,并要求所选 episode 的完整末时刻
与 `steps/240` 一致;拒绝截尾、超时长外推或离网格的完整回放请求。始终两轮、单环境、seed42。
CPU `stretch-time` 仅将原始时间戳乘以有限且>=1的系数;保留全部样本、位姿/关节几何路径、有效掩码、
关节顺序、已应用的坐标变换和来源类别。在说明中追加系数与输入文件 SHA256,不将专家标成合成数据。
输入仍须严格匹配清单;**没有通用强制替换哈希的选项**。源包身份算法不同的交付必须先独立核对
原始 URDF 全部 link/joint、仿真依赖和交付说明,并保留原文件及绑定依据,再生成仅本地使用的派生文件。
```bash
# BOUND 是已经独立审查并严格绑定右手清单的本地派生文件,不是未经核验的原始交付。
# EVIDENCE 是仓库外持久目录;输出必须尚不存在。
MANIFEST=assets/robots/dex_hand/linkerhand_g20_right/tracking_manifest.json
~/isaacsim/python.sh -m dex_workbench_tracking.cli stretch-time "$BOUND" \
--manifest "$MANIFEST" --factor 80 --output "$EVIDENCE/slow80.hdf5"
~/isaacsim/python.sh -m dex_workbench_tracking.cli validate "$EVIDENCE/slow80.hdf5" --manifest "$MANIFEST"
# 下面是需单独授权600秒资源预算、且确认无其他Kit/GPU任务时的完整实验命令;不是自动重试授权。
timeout --kill-after=15s 600s ~/isaacsim/python.sh scripts/tracking/track_l20.py \
assets/robots/dex_hand/linkerhand_g20_right/tracking.usda --manifest "$MANIFEST" \
--hdf5 "$EVIDENCE/slow80.hdf5" --steps 32000 --full-episode --workspace-radius 0.8 \
--execute-experimental --headless
```
本次指定51帧专家参考原长1.666667秒,统一80倍慢放后完整133.333333秒/轮;不再次应用
`world_from_source`,不裁剪、重居中或改变关节轨迹。入口只创建手,没有地面/物体,世界Z为负不需要增添场景。
成功必须同时具备退出0、明确PASS、两轮完整32000步、全部原有动态/重置/位姿与速度重复性门禁;
失败输出记录阶段、已执行步数及可用的最后误差/速度。超时或缺少最终PASS不是成功,不为通过而继续调参。
慢放结果仅适用于该派生参考,不证明专家原速、接触任务、训练质量或Sim2Real有效。
### 恢复后的单次授权完整回放:PASS(2026-09-14)
此前中断运行只恢复出启动记录,没有结束/退出/PASS证据,结果保持未知;未将其算作通过。
用户另行允许的一次600秒预算运行完成上述命令:384秒退出0,明确PASS,完整两轮各32000步。
Isaac Sim `6.0.1-rc.7`、PhysX `110.1.13`、RTX5080,所有原有运行时与重复性断言通过。
两轮各自的 max/RMS 汇总相同(不宣称跨运行GPU确定性):
| 误差 | 最大值 | RMS |
| --- | ---: | ---: |
| 腕位置 | 0.004234530 m | 0.001592088 m |
| 腕姿态 | 0.013369173 rad | 0.006896696 rad |
| 各帧最大关节误差 | 0.011143208 rad | 0.007029774 rad |
| 各帧最大mimic残差 | 0.000231490 rad | 0.000100007 rad |
- 原文件SHA256 `bd9321096803fbb64f590b4fdeb9056edc11ac446a7e16458c509beedc8b9552`;
本地80倍派生文件SHA256 `8f584c7409698394429737d509924013b8b90700117f8af2fb22465223dc1815`。
- 原始22个link/21个joint逐元素核对、右USD依赖包、51个原样本及Data/左右资产文件字节保留通过。
准备层包SHA `3e2071a60496b23bed252f4e2fc6e1d4540eecc8098578506419b5eb594f7da0`。
- 持久制品目录标识 `expert-replay-recovery-20260914/recovered-20260914T033624Z`:
`expert.log`、`expert-metrics.json`、`expert-result.txt`、`exact-command.txt`、绑定脚本/原始诊断/哈希清单。
完整存储路径见本次交付报告;未提交数据/日志。原始日志SHA256
`c6557269ffe3583ed113b3a1dcf3be6f4f3791bcff36a67798fbb4dcf1f48446`。
- 新鲜81项CPU回归无跳过、Ruff/格式/diff检查通过。额外的原时间网格与慢放网格数值相等审计
**NOT MET**:8个关节插值值差1个float32 ULP,另2个近零消差值差约2.3e-18/2.6e-18rad。
保留失败证据,不为其加入索引特例或放宽运行门禁;51原始样本仍逐值完全相同。
- 启动前后无Kit/compute进程;没有再次启动、调增益或改轨迹。仍有TGS外力迭代、16/21 actuator
(5个被动关节)、visualizer/MaterialX/usdrt警告。未做原速、多环境、任务/训练或硬件验收。
- 上述恢复回放阶段未暂存、提交、推送或升级版本;后续v0.1.2本地提交准备不代表完整发布门禁通过。
## 6. 可选GUI展示(v0.1.2)
同一入口新增 `--gui`,复用生产轨迹采样、控制、reset、两轮重复性及所有身份/安全门禁。
默认仍headless、不渲染;`--gui` 与显式 `--headless` 或 `--viz none` 冲突时启动前报错。
GUI使用Kit visualizer,物理步长仍为1/240秒,仅每8步渲染(另在reset后初始渲染一次),不改时间戳或慢放系数。
不要同时启动第二个Kit/GPU会话;只有旧会话退出且另获600秒预算授权后才运行:
```bash
export PYTHONPATH="$PWD/source/dex_workbench${PYTHONPATH:+:$PYTHONPATH}"
# SLOW80_HDF5 由调用方提供:已独立绑定同版右清单、按第5节80倍慢放的文件;不是自动绑定原始交付。
RIGHT=assets/robots/dex_hand/linkerhand_g20_right
timeout --kill-after=15s 600s ~/isaacsim/python.sh scripts/tracking/track_l20.py \
"$RIGHT/tracking.usda" --manifest "$RIGHT/tracking_manifest.json" \
--hdf5 "$SLOW80_HDF5" --steps 32000 --full-episode --workspace-radius 0.8 \
--execute-experimental --gui
```
显示设置独立于物理,位于 `dex_workbench_tracking/preview.py`:
- 白色Dome强度700,key/fill分别800/300、角度12/20度、XYZ旋转(-35,25,25)/(50,-40,-120)度。
- 全episode腕路径为青色(0.1,0.8,1.0)线性曲线,恒定宽度0.002m;不改参考点。
- 固定相机target为完整路径包围盒中心,eye偏移(1.15,-1.35,0.95)m;不逐帧跟随或重居中轨迹。
- 面向相机的10m方形暗背景位于target背后2m,仅自己的非反射emissive材质(0.055,0.065,0.08)。
无RigidBody/Collision API,不修改手的任何材质,不增加任务物体/桌面/碰撞或改变控制。
用户已确认仓库外展示克隆中的明亮手掌/手指与暗背景可见。
本次将其纯展示代码整合为可复用选项并加CPU/USD不变量检查;**整合后的CLI GUI E2E为NOT_RUN**,
没有为提交准备再次启动Kit/GPU,也未打断用户现有GUI。克隆截图不能替代最终源码运行验收。
生成的右USD、原始URDF/标定/网格、专家HDF5、视频/日志均不随代码提交;仅右README和两个JSON元数据纳入。
干净克隆仍需经授权取得同哈希右资产并重建prepared层;右资产测试/回放在缺依赖时BLOCKED,不计skip为PASS。
完整pre-commit因工具缺失NOT_RUN;本地版本提交不是存储、许可、硬件或完整Release就绪声明。