Files
hand-motion-pipeline/docs/PIPELINE_LATEST.md
T
liyang ae28d55f81 Update to 2026-09-17 pipeline snapshot; add weights, L20 assets and recording via Git LFS
Source: RGB-D -> Dyn-HaMR -> L20 retargeting -> FoundationPose -> reference repair -> SPIDER,
documented in docs/PIPELINE_LATEST.md and docs/SETUP_AND_WEIGHTS.md. Adds FoundationPose and
nvdiffrast upstream snapshots, requirements/pipeline_venv.txt and the FoundationPose weight
manifest/downloader.

Assets (Git LFS): weights/ (WiLoR detector, HandFlow denoiser, UniDepth-L), FoundationPose
checkpoints, HaMeR checkpoint, Dyn-HaMR HMP model and BMC constraints, L20 URDF/meshes, the
20260915_171525 D405 recording and the two box CADs. MANO models are not redistributed
(third_party/hamer/_DATA/data/mano/README.txt). Environments, caches and run outputs excluded.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-17 11:43:37 +08:00

25 KiB
Raw Blame History

最新流程(2026-09-17):RGB-D 双手视频 → Dyn-HaMR → L20 重定向 → FoundationPose → 参考修复 → SPIDER 物理

本文是 docs/20260915_171525D405 头戴 RGB-D,352 帧,双手 + 红/蓝两个盒子)这条数据上实际跑通并交付的链路,按执行顺序给出每一步的脚本、输入、输出、关键参数和验证文件。旧的单手 / 瓶子链路见 INTEGRATED_PROJECT.md,此处不再重复。RL 跟踪训练线不在本文范围。

当前状态

  • 运动学参考已交付:output/final_smooth_20260915/。手-盒 / 手-桌穿透 0(含 2.5 mm 间隙、400 Hz 插值 4681 步),精确 CAD 探针侵入 0,腕位置二阶差分 0.4 mm,手指 0.35°。
  • SPIDER 物理滚动:output/final_spider_run_20260915/。4680 步全部有限、穿透 0、CAD 探针 0;但手不真正合拢(实际接触步 20/4680),红盒抬起与蓝盒翻转都未复现。这是当前主问题。
  • 所有"接触"都是几何假设(人手指尖到 CAD 表面最近点),没有触觉真值;蓝盒第 177 帧后被遮挡,位姿只是保持最后可靠值。

0. 总览

docs/<seq>/{color.mp4, depth/*.png, intrinsics.json}          docs/上半.stl(红盒)  docs/下半.stl(蓝盒)
        │
 [0] RGB-D 预处理 + 静态背景相机里程计   prepare_rgbd_20260915.py      → output/<seq>/rgbd_camera.npz
        │
 [1] Dyn-HaMR 双手重建                   run_dynhamr_rgbd_20260915.py  → output/<seq>_dynhamr/optimization/
     时序修正(SO(3) 局部均值 + 高斯)    correct_dynhamr_rgbd.py       → .../corrected/prior/*_world_results.npz
     导出人手 21 关节                     export_dynhamr_bimanual_rgbd.py → .../human_joints_{left,right}.npz
        │
 [2] L20 重定向(左右手各跑一次)         retarget_l20_video.py         → .../l20_{left,right}_stable/motion.npz
        │
 [3] FoundationPose 物体 6D 逐帧跟踪      track_yesterday_boxes.py      → output/foundationpose_spider_20260915/foundationpose_objects.npz
     碰撞资产(CoACD                   decompose_yesterday_boxes.py / build_box_collision_v2.py / build_palm_collision_v2.py
        │
 [4] 手物配准 ①(世界系 + 尺度 + 深度)   register_hands_rgbd.py        → .../registered/
     SPIDER 任务初版                     prepare_yesterday_spider.py   → output/registered_spider_20260915/
     物体参考物理自洽                    smooth_object_reference.py    → output/final_spider_20260915/foundationpose_objects.npz
     手物配准 ②(指根对齐)              register_hands_rgbd.py  HF_ALIGN=mcp → .../aligned/
     SPIDER 任务(最终)                 prepare_yesterday_spider.py   → output/final_spider_20260915/
        │
 [5] 碰撞修复 + 桌面约束                 fix_yesterday_hand_collision.py → output/final_collision_fix_20260915/
     验证 / 审计 / 渲染                  verify_fix_interpolation.py · audit_collision_fix.py · render_collision_fix.py
     分开平滑 + 逐帧联合投影             smooth_project_reference.py   → output/final_smooth_20260915/   ← 最终运动学参考
        │
 [6] SPIDER 物理滚动                     configure_spider_task.py → run_yesterday_spider.py → output/final_spider_run_20260915/
     独立审计 / 重放 / 渲染 / 交互回放    audit_collision_physics.py · check_spider_dynamics_replay.py · audit_spider_dynamic_surfaces.py · render_collision_fix.py --physics · play_spider_result.py

解释器

解释器 用在哪
.venv/bin/python(执行 source scripts/foundationpose_env.sh 后就是 python FoundationPose、RGB-D 预处理、Dyn-HaMR 启动/修正/导出、配准、prepare / fix / verify / audit / smooth / render、交互回放
third_party/Dyn-HaMR/.dynhamr/bin/python Dyn-HaMR run_opt.py(由 run_dynhamr_rgbd_20260915.py 内部调用,不用手动进)
.dex/bin/python dex-retargeting 0.5.0retarget_l20_video.py
.spider/bin/python SPIDER / MuJoCo Warprun_yesterday_spider.pyaudit_collision_physics.pycheck_spider_dynamics_replay.py

离屏渲染脚本默认 MUJOCO_GL=osmesa;交互回放脚本自动切 glfw。所有脚本从项目根目录执行。环境安装见 SETUP_AND_WEIGHTS.mdFOUNDATIONPOSE_SETUP.md

输入数据

  • docs/20260915_171525/color.mp4848×480,标称 30 fps,真实硬件时间跨度 11.70 s)、depth/352 张对齐深度 PNG)、intrinsics.json(fx fy cx cy、帧数、时间戳)。RGB / 深度逐帧时间差 < 0.31 ms。
  • docs/上半.stl = 红盒,docs/下半.stl = 蓝盒。米制,18.16×16.60×4.69 cm。红盒网格不封闭(一条 T 形边),碰撞资产阶段在副本上修复,原文件不改。
  • L20 模型:third_party/l20_assets/L20/{LEFT,RIGHT}/linkerhand_g20_{left,right}.urdf 与网格。左右手各用自己的 URDF,不是镜像。

1. 各阶段

[0] RGB-D 预处理与相机里程计

source scripts/foundationpose_env.sh
python scripts/prepare_rgbd_20260915.py
  • 输出 output/20260915_171525/rgbd_camera.npzc2w [352,4,4]intrinsicstimevalidmethod;另有 rgbd_preflight.jsonobject_assets/
  • 方法:静态背景 RGB-D 里程计,屏蔽皮肤、红蓝物体和画面底部;无闭环、无外部定位真值。
  • 相机是头戴的,背景帧间移动约 17 px,里程计不能省略;后面所有"世界系"都指这个里程计世界(首帧相机系)。

[1] Dyn-HaMR 双手重建

python scripts/run_dynhamr_rgbd_20260915.py        # 内部调用 .dynhamr 解释器
python scripts/correct_dynhamr_rgbd.py
python scripts/export_dynhamr_bimanual_rgbd.py
python scripts/render_corrected_dynhamr_rgbd.py     # 可选:多视角回放视频
  • run_dynhamr_rgbd_20260915.pyrgbd_camera.npz 写成 ViPE 文件格式(rgbd_cameras/{pose,intrinsics}/),然后跑上游 run_opt.pydata=video_vipe is_static=False model.opt_scale=False run_opt=True run_prior=True run_vis=True +data.vipe_pipeline=dynhamr_camerasHugging Face / Torch 缓存离线(.hf_cache.torch_cache),EGL 渲染。原始结果在 output/20260915_171525_dynhamr/optimization/,逐帧检测在 dataset/dynhamr/track_preds/<seq>/{000,001}/
  • correct_dynhamr_rgbd.pycorrected/prior/20260915_171525_000000_world_results.npzcomparison_joints.npzvalidation.json。腕与手指旋转做合法旋转空间局部加权平均(σ 1.2 帧),平移高斯 σ 1.5 帧(用未来帧,非实时滤波)。腕位置二阶差分 RMS 左 5.38→0.65、右 6.04→0.67 mm。这一步的 RGB-D 深度门槛把所有帧都拒了(depth_accepted_frames = 0),深度修正实际在 [4] 完成。
  • export_dynhamr_bimanual_rgbd.pyhuman_joints_{left,right}.npzjoints [352,21,3](腕相对、世界朝向)、wrist_worldtimedetection_valid;并把 rgbd_camera.npzobject_assets/ 复制进 _dynhamr 目录供后续使用。
  • 诊断(只读):diagnose_dynhamr_rgbd.pydiagnosis/report.md)、diagnose_yesterday_hand_depth.py(留出像素深度残差,output/hand_depth_diagnosis_20260915/)。

[2] L20 重定向

MUJOCO_GL=osmesa .dex/bin/python scripts/retarget_l20_video.py \
  --input output/20260915_171525_dynhamr/human_joints_right.npz \
  --output-dir output/20260915_171525_dynhamr/l20_right_stable --side right
MUJOCO_GL=osmesa .dex/bin/python scripts/retarget_l20_video.py \
  --input output/20260915_171525_dynhamr/human_joints_left.npz \
  --output-dir output/20260915_171525_dynhamr/l20_left_stable --side left
  • dex-retargeting 0.5.0 PositionOptimizer,16 个独立关节,其余按原 URDF 线性 mimic 精确展开(l20_consistent_optimizer.py 修正了 0.5.0 目标函数与梯度不一致)。离线平滑 --sigma 2.5 帧。
  • 输出:motion.npz(腕位姿 + 关节角)、trajectory.csvl20_{side}.xml / l20_moving.xmlMuJoCo)、l20_dex.urdfdex_config.jsonretarget_validation.json(指尖拟合误差、最大关节步长、限位越界、mimic 误差、Pinocchio 与 MuJoCo FK 一致性)。日志 retarget_{side}.log
  • 手指重定向只用关节方向,所以 [4] 的相似变换配准不需要重跑重定向(register_hands_rgbd.py 只改写 motion.npz 里的腕位置)。

[3] FoundationPose 物体跟踪与碰撞资产

source scripts/foundationpose_env.sh
python scripts/track_yesterday_boxes.py       # → output/foundationpose_spider_20260915/foundationpose_objects.npz, foundationpose_overlay.mp4
python scripts/decompose_yesterday_boxes.py   # → output/foundationpose_spider_20260915/collision/{upper,lower}_NNN.objCoACD ≤20 块,初版,prepare 用)
python scripts/build_box_collision_v2.py      # → output/collision_fix_20260915/collision_v2/(修 T 形边后的封闭 CAD *_closed.ply + 不限块数 CoACD + manifest.jsonfix/smooth 用)
python scripts/build_palm_collision_v2.py     # → output/collision_fix_20260915/hand_collision/L20 手部网格 CoACD + manifest.json
  • 逐帧模型法 RGB-D 位姿,两个 STL 各自跟踪;T_world = c2w @ T_camc2w 来自 [0]。
  • 接受判据(非外部真值):可见颜色像素 > 500、投影覆盖 > 65%、重叠像素深度中位残差 < 20 mm。红盒 307/352 帧接受,未接受帧插值;蓝盒 177/352,第 177 帧后遮挡,保持最后可靠位姿并停止作为接触目标来源
  • 实测噪声:静止红盒逐帧 2nd-diff 5.3 mm、0.56°;遮挡时静止物体会漂 2 cm。这些在 [4] 的物体参考自洽里处理。
  • 环境验证:python scripts/verify_foundationpose_setup.py,说明见 FOUNDATIONPOSE_SETUP.md

[4] 手物配准、物体参考自洽、SPIDER 任务构建

按下面顺序,5 条命令:

source scripts/foundationpose_env.sh
# ① 配准(默认:腕对齐,原始里程计相机)→ output/20260915_171525_dynhamr/registered/
python scripts/register_hands_rgbd.py
# ② 任务初版(供物体自洽读取手 / 桌面 / 接触目标)
HF_SPIDER_OUT=$PWD/output/registered_spider_20260915 \
HF_HAND_BASE=$PWD/output/20260915_171525_dynhamr/registered \
python scripts/prepare_yesterday_spider.py
# ③ 物体参考物理自洽(输入/输出路径写死:registered_spider_20260915 + registered/ → final_spider_20260915/
python scripts/smooth_object_reference.py
# ④ 配准第二遍:指根对齐 + 平滑后的相机 → output/20260915_171525_dynhamr/aligned/
HF_REG_OUT=$PWD/output/20260915_171525_dynhamr/aligned \
HF_CAMERA_FILE=$PWD/output/final_spider_20260915/rgbd_camera_smooth.npz \
HF_ALIGN=mcp python scripts/register_hands_rgbd.py
# ⑤ 最终任务(同目录里已有 ③ 写好的自洽物体参考)
HF_SPIDER_OUT=$PWD/output/final_spider_20260915 \
HF_HAND_BASE=$PWD/output/20260915_171525_dynhamr/aligned \
python scripts/prepare_yesterday_spider.py

register_hands_rgbd.py(三项刚体/相似修正,不改手指关节;registration.json

  1. 世界系:Dyn-HaMR world 与里程计 world 差常量平移 (0.048, 0.023, 0.115) m,模 12.6 cm,逐帧标准差 < 4 mm。旧流程当同一个 world 用,手物错位 12.6 cm,这是此前腕修正量 8–10 cm 的主因。
  2. 尺度:MANO 手在错的深度上与图像轮廓重合(渲染/皮肤面积比 ≈ 1.0),说明真手比 MANO 大;绕相机中心常量缩放,右 1.105、左 1.047,轮廓不变、深度对齐。
  3. 残余深度:沿腕射线的逐帧留出像素残差,σ 2 帧平滑。留出残差右 42→9.4 mm、左 20→10 mm。 环境变量:HF_ALIGNwrist | mcp)、HF_CAMERA_FILEHF_REG_OUT

② / ⑤ prepare_yesterday_spider.py:由深度拟合桌面(z-up 是桌面法线,不是 IMU 重力);逐指尖选最近可观测物体生成可切换接触目标(进入 25 mm / 释放 35 mm);有界关节/腕平移热启动。输出 datasets/processed/current/l20/bimanual/boxes/{scene_act.xml, task_info.json, 0/trajectory_kinematic_act.npz}reference_video_rate.npzconfig.jsonmodel_{side}/l20_{side}.xmlobject_reference.npzpreparation.jsoncollision/foundationpose_objects.npz 缺省时符号链接到 foundationpose_spider_20260915。环境变量:HF_SPIDER_OUTHF_HAND_BASE

smooth_object_reference.py:物体只允许两种状态。静止段(0.5 s 窗内位移 < 6 mm、旋转 < 2°、无手接触)冻结在"深度共识"位姿,深度驱动分裂(连续 ≥ 9 帧比原观测差 3 mm 判定真动过),贴桌吸附只在深度残差不变差时接受(深度拟合的桌面只准到 ~1 cm);握持段(≥ 2 指尖进入 25 mm)在腕系 σ 4 帧平滑后随手刚性运动,比纯平滑差 > 1 mm 则退回;自由段 σ 2;里程计 c2w σ 2。红盒 2nd-diff 4.7→1.5 mm,蓝盒 8.8→2.6 mm,深度残差不劣于原始。输出 foundationpose_objects.npz(同 schema)、rgbd_camera_smooth.npzobject_segments.npzobject_smoothing.json

HF_ALIGN=mcp:L20 比缩放后的人手大 35–60%,差异几乎全在手掌(腕到指根 148 vs 90 mm)。改为 L20 指根中心对齐人手指根,腕自动后退 58–61 mm;人手指尖(接触目标)不变。L20 base 系约定已数值验证(landmark_world = wrist_R @ local + wrist_pos,误差 0)。

[5] 碰撞修复 + 桌面约束 + 平滑投影 → 最终运动学参考

source scripts/foundationpose_env.sh
export HF_FIX_OLD=$PWD/output/final_spider_20260915 \
       HF_FIX_OUT=$PWD/output/final_collision_fix_20260915 \
       HF_WRIST_WEIGHT=200 HF_MARGIN=0.0025 HF_TABLE=1 \
       SPIDER_TASK_OUT=$PWD/output/final_collision_fix_20260915
python scripts/fix_yesterday_hand_collision.py                 # 修复
python scripts/verify_fix_interpolation.py --video --buffer    # 视频率状态检查 + 投影
python scripts/verify_fix_interpolation.py --buffer            # 400 Hz 插值 4681 步检查 + 投影(物体固定)
python scripts/audit_collision_fix.py                          # 独立审计 → validation.json
python scripts/render_collision_fix.py                         # hand_collision_before_after.mp4

export HF_SMOOTH_OUT=$PWD/output/final_smooth_20260915
python scripts/smooth_project_reference.py                     # 平滑 + 联合投影
export HF_FIX_OUT=$HF_SMOOTH_OUT SPIDER_TASK_OUT=$HF_SMOOTH_OUT
python scripts/verify_fix_interpolation.py --buffer
python scripts/audit_collision_fix.py
python scripts/render_collision_fix.py
  • fix_yesterday_hand_collision.py:解析接触雅可比 + 精确 mimic,逐帧最小改动求解,目标 = 接触目标 + 腕先验(HF_WRIST_WEIGHT,默认 25,本链 200)+ 关节限位;间隙放进求解器(HF_MARGIN,默认 0.5 mm,本链 2.5 mm)而不是事后投影(事后投影曾在 201–203 帧产生 88 mm 跳变);HF_TABLE=1 把桌面变成硬约束(floor conaffinity 3)。碰撞体来自 collision_v2/ + hand_collision/
  • verify_fix_interpolation.py / audit_collision_fix.py:分别检查视频率与 400 Hz 插值状态、全连杆碰撞、限位、连续性和精确闭合 CAD 采样探针(CoACD 近似之外的独立检查)。都吃 HF_FIX_OLD / HF_FIX_OUT / HF_TABLE
  • smooth_project_reference.py:腕位置高斯 σ 2 帧、腕旋转 SO(3) 局部加权均值 σ 2、16 个独立手指关节 Savitzky–Golay(窗 11、二阶)后精确 mimic 展开、物体不动;再逐帧最小改动投影:线性化接触距离 ≥ 2.5 mm(盒 + 桌)、关节限位、相对上一帧步长上限(8 mm / 7° / 8.6°)。环境变量 HF_SMOOTH_OUT HF_SIGMA_POS HF_SIGMA_ROT HF_SG_WINDOW HF_CLEARANCE
  • 交付目录 output/final_smooth_20260915/README 在内):reference_video_rate.npzdatasets/.../0/trajectory_kinematic_act.npz400 Hz)、validation.jsonsmoothing_report.jsonhand_collision_before_after.mp4。交互回放:python scripts/play_spider_result.py --directory output/final_smooth_20260915 --mode reference(空格暂停,← → 逐帧)。
指标(右 / 左) 修复后(final_collision_fix 平滑投影后(final_smooth
腕位置二阶差分 RMS 3.05 · 3.15 mm 0.41 · 0.37 mm
手指二阶差分 RMS 1.49° · 1.33° 0.38° · 0.32°
右腕修正中位 / 118235 帧段 11 / 45 mm
接触间隙中位 7.1 · 5.7 mm 8.0 · 7.8 mm
最大穿透(盒 + 桌,含 400 Hz 插值) 0 0
精确 CAD 探针最大侵入(红 / 蓝) 0.00 / 0.00 mm

[6] SPIDER 物理滚动

export SPIDER_SRC=$PWD/output/final_smooth_20260915 \
       SPIDER_TASK_OUT=$PWD/output/final_spider_run_20260915 \
       HF_FIX_OLD=$PWD/output/final_spider_20260915
source scripts/foundationpose_env.sh
python scripts/configure_spider_task.py                       # 复制任务 + 施加物理参数 → physics_parameters.json
.spider/bin/python scripts/run_yesterday_spider.py --pilot    # 冒烟:80 步、32 样本、2 轮
.spider/bin/python scripts/run_yesterday_spider.py            # 全程:64 样本 × 3 轮,horizon 0.4 sctrl_dt 0.1 s4680 步
.spider/bin/python scripts/audit_collision_physics.py         # CPU 独立碰撞逐步检查 → physics_validation.json, physics_motion.npz
.spider/bin/python scripts/check_spider_dynamics_replay.py    # 保存控制量在全新 GPU 世界 + CPU 重放 → control_replay.json
python scripts/audit_spider_dynamic_surfaces.py               # 原始手部可视网格 vs 精确封闭 CAD 探针 → dynamic_surface_validation.json
python scripts/render_collision_fix.py --physics              # spider_collision_rollout.mp4(原视频 / 运动学参考 / 物理结果)
python scripts/play_spider_result.py --directory output/final_spider_run_20260915 --mode physics   # 交互回放
  • configure_spider_task.py:从 SPIDER_SRC 复制 scene_act.xmltask_info.jsontrajectory_kinematic_act.npzreference_video_rate.npzconfig.json(只改 dataset_dir),并写入经 GPU/CPU 短段重放选出的物理设置(仿真假设,非硬件标定):求解 80 / 线搜索 50;所有 geom solimp .9 .95 .001 .5 2solref .02 1;手/物/桌 margin 4 mm gap 2 mm(2 mm 提前激活);腕平移 kp 500 kv 30 ±20 N,腕旋转 kp 15 kv 2 ±2 Nm,手指 kp 4 kv 0.15 ±0.1 NmHF_FINGER_KP / HF_FINGER_KV / HF_FINGER_TORQUE 可改);物体执行器零增益(真实滚动无物体辅助);桌面与手碰撞。SPIDER_CONFIG_OVERRIDES='{"contact_rew_scale": 8, "num_samples": 128}' 可覆盖 SPIDER config。
  • run_yesterday_spider.py:调用上游 third_party/spider/examples/run_mjwp.pyMuJoCo Warp 采样优化),本地补丁:双手含被动关节的奖励权重划分、跨物体换握时关闭"单手固定物体"启发式、非有限状态即停。物体质量 0.12 kg、摩擦 0.8 是假设。上游 SPIDER 的其余本地修改(辅助弹簧力公式、接触奖励权重、重采样漏控制量、GPU 接触参数)随 third_party/spider 源码快照保留。
  • 结果(final_spider_run_20260915/README.md):
指标
物理步 / 全部有限 4680 / 是
最大手物穿透(CPU 独立检测)/ CAD 探针 0 / 0 mm
实际接触步数(< 1 mm 20 / 4680
红盒观测段位置误差均值 / 旋转误差 93 mm / 8.1°(0–5 s 跟得住,6 s 参考抬起后物理盒留桌上)
蓝盒观测段位置误差均值 / 旋转误差 39 mm / 123°(1–2 s 参考翻转,物理盒不翻)
保存控制量独立 GPU 重放最大状态差 0.456

结论:参考干净之后,失败模式变清楚,手不真正合拢握住物体,位置伺服跟参考就是"悬着"。参考间隙 0.5 mm + contact_rew_scale 8 + 128 样本 × 5 轮的变体(output/final_spider_run_v2_20260915/无实质变化(接触步 20→5),说明不是采样量问题,是参考/奖励只要求指尖到表面、不要求夹紧。

2. 已知问题与候选方向(运动学 / SPIDER 线)

  • 接触语义:L20 比人手大,接触目标取人手指尖最近点,右手 118–235 帧腕仍要抬 45 mm 才能不进盒。候选:用 L20 指尖自身最近点做目标、按手长比例外推、或该段降接触权重。
  • 夹紧:参考里给 on-接触帧手指多屈几度(目标进入物体一点);手指力矩上限 0.1→0.3 Nm / kp 4→8;或奖励加法向力项。这些都改变仿真假设,需要决定。
  • 右手指尖到红盒表面配准后仍约 4 cm(遮挡下 MANO 手指姿态误差),接触目标本身有此量级不确定性。
  • 蓝盒 177 帧后无观测;红蓝相对装配不是已验证事实。
  • 未验证真机;未做力/摩擦标定。

3. 换一段新视频要改什么

脚本里序列名和输入路径大多写死为 20260915_171525(或 yesterday 命名),环境变量只覆盖输出目录。新视频需要:

  1. 放到 docs/<seq>/{color.mp4, depth/, intrinsics.json},物体 CAD 放 docs/
  2. 改这些脚本里的常量:prepare_rgbd_20260915.pySRC/OUT)、run_dynhamr_rgbd_20260915.pySEQ)、correct_dynhamr_rgbd.py / export_dynhamr_bimanual_rgbd.pyBASE/SRC)、track_yesterday_boxes.pySRC/OUT、STL 名)、decompose_yesterday_boxes.pySTL 名)、smooth_object_reference.pySRC/OLD/HAND/OUT)、register_hands_rgbd.pyBASE)。
  3. prepare_yesterday_spider.py 里颜色→CAD 映射(红 = 上半/upper,蓝 = 下半/lower)和物体质量 / 摩擦假设。
  4. 之后 [4]–[6] 只靠环境变量指路径,不用改代码。

4. 脚本索引

阶段 脚本 解释器 输入 → 输出 环境变量 / 参数
0 prepare_rgbd_20260915.py .venv docs/ → output//rgbd_camera.npz
1 run_dynhamr_rgbd_20260915.py .venv(内部 .dynhamr color.mp4 + rgbd_camera → _dynhamr/optimization
1 correct_dynhamr_rgbd.py .venv optimization → corrected/prior/*_world_results.npz
1 export_dynhamr_bimanual_rgbd.py .venv corrected → human_joints_{left,right}.npz
1 render_corrected_dynhamr_rgbd.pydiagnose_dynhamr_rgbd.pydiagnose_yesterday_hand_depth.py .venv 可视化 / 诊断(只读)
2 retarget_l20_video.py .dex human_joints_{side}.npz → l20_{side}_stable/ --input --output-dir --side --sigma
3 track_yesterday_boxes.py .venv (foundationpose_env) RGB-D + STL → foundationpose_objects.npz
3 decompose_yesterday_boxes.pybuild_box_collision_v2.pybuild_palm_collision_v2.py .venv STL / L20 网格 → CoACD 凸块
4 register_hands_rgbd.py .venv human_joints + rgbd_camera → registered/ 或 aligned/ HF_ALIGN HF_CAMERA_FILE HF_REG_OUT
4 prepare_yesterday_spider.py .venv 手 + 物体 → SPIDER 任务目录 HF_SPIDER_OUT HF_HAND_BASE
4 smooth_object_reference.py .venv registered_spider + registered → final_spider(物体参考)
5 fix_yesterday_hand_collision.py .venv 任务目录 → 无穿透参考 HF_FIX_OLD HF_FIX_OUT HF_WRIST_WEIGHT HF_MARGIN HF_TABLE--pilot
5 verify_fix_interpolation.py .venv 视频率 / 400 Hz 检查投影 HF_FIX_OLD HF_FIX_OUT HF_TABLE--video --buffer
5 audit_collision_fix.py .venv 独立审计 → validation.json HF_FIX_OLD HF_FIX_OUT HF_TABLE
5 smooth_project_reference.py .venv 修复参考 → 平滑投影参考 HF_FIX_OLD HF_FIX_OUT HF_SMOOTH_OUT HF_TABLE HF_SIGMA_POS HF_SIGMA_ROT HF_SG_WINDOW HF_CLEARANCE
5/6 render_collision_fix.py .venv 三栏对比视频 SPIDER_TASK_OUT HF_FIX_OLD--physics
6 configure_spider_task.py .venv 参考目录 → SPIDER 任务 + 物理参数 SPIDER_SRC SPIDER_TASK_OUT HF_FINGER_KP/KV/TORQUE SPIDER_CONFIG_OVERRIDES
6 run_yesterday_spider.py .spider 任务目录 → trajectory_mjwp_act.npz SPIDER_TASK_OUT--pilot --steps
6 audit_collision_physics.pycheck_spider_dynamics_replay.py .spider 物理轨迹审计 / 控制量重放 SPIDER_TASK_OUT
6 audit_spider_dynamic_surfaces.py .venv 精确 CAD 探针 SPIDER_TASK_OUT
6 play_spider_result.py .venv 交互回放 --directory --mode {reference,physics} --check

5. 历史 / 对照目录(不要误用)

目录 说明
output/20260915_171525/ HandFlow 分支的双手初版(镜像左手 + ICP 物体位姿),已被 Dyn-HaMR + FoundationPose 链路取代
output/foundationpose_spider_20260915/ 首次全链路(配准前)。手物错位 12.6 cm,Spider 红盒误差 61 mm
output/collision_fix_20260915/ 配准前的碰撞修复,腕修正中位 82 / 100 mm;其 collision_v2/hand_collision/ 资产仍被后续目录符号链接
output/registered_collision_fix_*_20260915/ 配准后三个修复变体,推荐 w200m25(腕先验 200 + 内置 2.5 mm 间隙)
output/desktop_smooth_fix_20260915/ smooth_table_constrained.py 只抬腕出桌面,手盒穿透回到 24.5 mm,失败对照
output/final_smooth_c05_20260915/output/final_spider_run_v2_20260915/ 间隙 0.5 mm + 接触奖励 8 + 128 样本变体,无实质变化
output/spider_dynamics_fix_20260915/ Codex 的 SPIDER 动力学修复轮(物理参数从这里选出)