ae28d55f81
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>
274 lines
25 KiB
Markdown
274 lines
25 KiB
Markdown
# 最新流程(2026-09-17):RGB-D 双手视频 → Dyn-HaMR → L20 重定向 → FoundationPose → 参考修复 → SPIDER 物理
|
||
|
||
本文是 `docs/20260915_171525`(D405 头戴 RGB-D,352 帧,双手 + 红/蓝两个盒子)这条数据上**实际跑通并交付**的链路,按执行顺序给出每一步的脚本、输入、输出、关键参数和验证文件。旧的单手 / 瓶子链路见 [INTEGRATED_PROJECT.md](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. 总览
|
||
|
||
```text
|
||
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.0:`retarget_l20_video.py` |
|
||
| `.spider/bin/python` | SPIDER / MuJoCo Warp:`run_yesterday_spider.py`、`audit_collision_physics.py`、`check_spider_dynamics_replay.py` |
|
||
|
||
离屏渲染脚本默认 `MUJOCO_GL=osmesa`;交互回放脚本自动切 `glfw`。所有脚本从项目根目录执行。环境安装见 [SETUP_AND_WEIGHTS.md](SETUP_AND_WEIGHTS.md)、[FOUNDATIONPOSE_SETUP.md](FOUNDATIONPOSE_SETUP.md)。
|
||
|
||
### 输入数据
|
||
|
||
- `docs/20260915_171525/color.mp4`(848×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 预处理与相机里程计
|
||
|
||
```bash
|
||
source scripts/foundationpose_env.sh
|
||
python scripts/prepare_rgbd_20260915.py
|
||
```
|
||
|
||
- 输出 `output/20260915_171525/rgbd_camera.npz`:`c2w [352,4,4]`、`intrinsics`、`time`、`valid`、`method`;另有 `rgbd_preflight.json`、`object_assets/`。
|
||
- 方法:静态背景 RGB-D 里程计,屏蔽皮肤、红蓝物体和画面底部;无闭环、无外部定位真值。
|
||
- **相机是头戴的**,背景帧间移动约 17 px,里程计不能省略;后面所有"世界系"都指这个里程计世界(首帧相机系)。
|
||
|
||
### [1] Dyn-HaMR 双手重建
|
||
|
||
```bash
|
||
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.py` 把 `rgbd_camera.npz` 写成 ViPE 文件格式(`rgbd_cameras/{pose,intrinsics}/`),然后跑上游 `run_opt.py`:`data=video_vipe is_static=False model.opt_scale=False run_opt=True run_prior=True run_vis=True +data.vipe_pipeline=dynhamr_cameras`,Hugging Face / Torch 缓存离线(`.hf_cache`、`.torch_cache`),EGL 渲染。原始结果在 `output/20260915_171525_dynhamr/optimization/`,逐帧检测在 `dataset/dynhamr/track_preds/<seq>/{000,001}/`。
|
||
- `correct_dynhamr_rgbd.py` → `corrected/prior/20260915_171525_000000_world_results.npz`、`comparison_joints.npz`、`validation.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.py` → `human_joints_{left,right}.npz`:`joints [352,21,3]`(腕相对、世界朝向)、`wrist_world`、`time`、`detection_valid`;并把 `rgbd_camera.npz`、`object_assets/` 复制进 `_dynhamr` 目录供后续使用。
|
||
- 诊断(只读):`diagnose_dynhamr_rgbd.py`(`diagnosis/report.md`)、`diagnose_yesterday_hand_depth.py`(留出像素深度残差,`output/hand_depth_diagnosis_20260915/`)。
|
||
|
||
### [2] L20 重定向
|
||
|
||
```bash
|
||
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.csv`、`l20_{side}.xml` / `l20_moving.xml`(MuJoCo)、`l20_dex.urdf`、`dex_config.json`、`retarget_validation.json`(指尖拟合误差、最大关节步长、限位越界、mimic 误差、Pinocchio 与 MuJoCo FK 一致性)。日志 `retarget_{side}.log`。
|
||
- 手指重定向只用关节**方向**,所以 [4] 的相似变换配准不需要重跑重定向(`register_hands_rgbd.py` 只改写 `motion.npz` 里的腕位置)。
|
||
|
||
### [3] FoundationPose 物体跟踪与碰撞资产
|
||
|
||
```bash
|
||
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.obj(CoACD ≤20 块,初版,prepare 用)
|
||
python scripts/build_box_collision_v2.py # → output/collision_fix_20260915/collision_v2/(修 T 形边后的封闭 CAD *_closed.ply + 不限块数 CoACD + manifest.json,fix/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_cam`,c2w 来自 [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](FOUNDATIONPOSE_SETUP.md)。
|
||
|
||
### [4] 手物配准、物体参考自洽、SPIDER 任务构建
|
||
|
||
按下面顺序,5 条命令:
|
||
|
||
```bash
|
||
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_ALIGN`(`wrist` | `mcp`)、`HF_CAMERA_FILE`、`HF_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.npz`、`config.json`、`model_{side}/l20_{side}.xml`、`object_reference.npz`、`preparation.json`。`collision/`、`foundationpose_objects.npz` 缺省时符号链接到 `foundationpose_spider_20260915`。环境变量:`HF_SPIDER_OUT`、`HF_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.npz`、`object_segments.npz`、`object_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] 碰撞修复 + 桌面约束 + 平滑投影 → 最终运动学参考
|
||
|
||
```bash
|
||
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.npz`、`datasets/.../0/trajectory_kinematic_act.npz`(400 Hz)、`validation.json`、`smoothing_report.json`、`hand_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° |
|
||
| 右腕修正中位 / 118–235 帧段 | 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 物理滚动
|
||
|
||
```bash
|
||
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 s,ctrl_dt 0.1 s,4680 步
|
||
.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.xml`、`task_info.json`、`trajectory_kinematic_act.npz`、`reference_video_rate.npz`、`config.json`(只改 `dataset_dir`),并写入经 GPU/CPU 短段重放选出的物理设置(仿真假设,非硬件标定):求解 80 / 线搜索 50;所有 geom `solimp .9 .95 .001 .5 2`、`solref .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 Nm(`HF_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.py`(MuJoCo 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.py`(`SRC/OUT`)、`run_dynhamr_rgbd_20260915.py`(`SEQ`)、`correct_dynhamr_rgbd.py` / `export_dynhamr_bimanual_rgbd.py`(`BASE/SRC`)、`track_yesterday_boxes.py`(`SRC/OUT`、STL 名)、`decompose_yesterday_boxes.py`(STL 名)、`smooth_object_reference.py`(`SRC/OLD/HAND/OUT`)、`register_hands_rgbd.py`(`BASE`)。
|
||
3. `prepare_yesterday_spider.py` 里颜色→CAD 映射(红 = `上半`/upper,蓝 = `下半`/lower)和物体质量 / 摩擦假设。
|
||
4. 之后 [4]–[6] 只靠环境变量指路径,不用改代码。
|
||
|
||
## 4. 脚本索引
|
||
|
||
| 阶段 | 脚本 | 解释器 | 输入 → 输出 | 环境变量 / 参数 |
|
||
|---|---|---|---|---|
|
||
| 0 | `prepare_rgbd_20260915.py` | .venv | docs/<seq> → output/<seq>/rgbd_camera.npz | — |
|
||
| 1 | `run_dynhamr_rgbd_20260915.py` | .venv(内部 .dynhamr) | color.mp4 + rgbd_camera → <seq>_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.py`、`diagnose_dynhamr_rgbd.py`、`diagnose_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.py`、`build_box_collision_v2.py`、`build_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.py`、`check_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 动力学修复轮(物理参数从这里选出) |
|