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>
This commit is contained in:
liyang
2026-09-17 11:27:46 +08:00
parent 7e4ef6f98b
commit ae28d55f81
761 changed files with 55598 additions and 59 deletions
+7 -3
View File
@@ -23,11 +23,13 @@ def main():
p.add_argument('--input', type=Path, required=True)
p.add_argument('--output-dir', type=Path, required=True)
p.add_argument('--sigma', type=float, default=2.5)
p.add_argument('--side', choices=['right','left'], default='right')
a = p.parse_args()
torch.set_num_threads(4)
out = a.output_dir.resolve()
fixed, urdf = build_assets(out)
original = ET.parse(ASSET / 'linkerhand_g20_right.urdf').getroot()
fixed, urdf = build_assets(out, a.side)
asset = ASSET.parent/a.side.upper()
original = ET.parse(asset / f'linkerhand_g20_{a.side}.urdf').getroot()
joints = [j for j in original.findall('joint') if j.get('type') != 'fixed']
active = [j.get('name') for j in joints if j.find('mimic') is None]
limits = {j.get('name'):np.array([float(j.find('limit').get(k)) for k in ['lower','upper']]) for j in joints}
@@ -109,7 +111,9 @@ def main():
quat = gaussian_filter1d(quat, a.sigma, axis=0)
quat /= np.linalg.norm(quat, axis=1, keepdims=True)
quat = quat[:, [3, 0, 1, 2]]
times = np.arange(count) / fps
times = np.asarray(human['time'], dtype=np.float64) if 'time' in human else np.arange(count) / fps
assert times.shape == (count,) and np.isfinite(times).all() and np.all(np.diff(times) > 0)
times = times - times[0]
np.savez_compressed(out / 'motion.npz', qpos=qpos, qpos_raw=qraw, joint_names=robot.dof_joint_names,
active_qpos=active_q, active_joint_names=active, targets=targets, actual=actual,
wrist_pos=wrist, wrist_pos_unsmoothed=wrist_raw, wrist_quat_wxyz=quat,