Files
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

39 lines
2.6 KiB
Python

"""Actual upstream SPIDER, with L20 passive-joint reward indexing corrected locally."""
import os,sys,json,importlib.util,argparse
from pathlib import Path
ROOT=Path(__file__).resolve().parents[1];OUT=Path(os.environ.get('SPIDER_TASK_OUT',str(ROOT/'output/foundationpose_spider_20260915')))
os.environ['WARP_CACHE_PATH']=str(ROOT/'.spider_cache/warp');os.environ['TORCHINDUCTOR_CACHE_DIR']=str(ROOT/'.spider_cache/torchinductor');os.environ.setdefault('MUJOCO_GL','osmesa');os.environ['OMP_NUM_THREADS']='4'
sys.path.insert(0,str(ROOT/'third_party/spider'))
import torch
torch.set_num_threads(4)
from spider.config import Config
import spider.simulators.mjwp as sim
original=sim._weight_diff_qpos
def weights(config):
if config.embodiment_type!='bimanual':return original(config)
# 27 state DOFs per L20 (6 wrist+21 finger), versus 22 actuator channels.
half=(config.nv-12)//2;w=torch.full((config.nv,),config.joint_rew_scale,device=config.device)
for start in [0,half]:w[start:start+3]=config.base_pos_rew_scale;w[start+3:start+6]=config.base_rot_rew_scale
for start in [config.nv-12,config.nv-6]:w[start:start+3]=config.pos_rew_scale;w[start+3:start+6]=config.rot_rew_scale
return w
sim._weight_diff_qpos=weights
spec=importlib.util.spec_from_file_location('spider_original_runner',ROOT/'third_party/spider/examples/run_mjwp.py');module=importlib.util.module_from_spec(spec);sys.modules[spec.name]=module;spec.loader.exec_module(module)
# Cross-object regrasp invalidates upstream one-object-per-hand delta heuristic.
# Retain reference object assistance schedule and per-finger contact reward.
module.compute_contact_point_delta=lambda *args,**kwargs: None
get_qpos_original=module.get_qpos
def checked_qpos(config,env):
q=get_qpos_original(config,env)
if not torch.isfinite(q[0]).all():raise RuntimeError('Nonfinite executed state: stop instead of saving invalid trajectory')
return q
module.get_qpos=checked_qpos
p=argparse.ArgumentParser();p.add_argument('--pilot',action='store_true');p.add_argument('--steps',type=int);args=p.parse_args();c=json.loads((OUT/'config.json').read_text())
if args.pilot:c.update(max_sim_steps=80,num_samples=32,max_num_iterations=2)
if args.steps:c['max_sim_steps']=args.steps
if (OUT/'physics_parameters.json').exists():
settings=json.loads((OUT/'physics_parameters.json').read_text());setup_original=sim.setup_mj_model
def configured_model(config):
m=setup_original(config);m.opt.iterations=settings['solver_iterations'];m.opt.ls_iterations=settings['ls_iterations'];return m
sim.setup_mj_model=configured_model;module.setup_mj_model=configured_model
module.main(Config(**c));print('SPIDER_RUN_COMPLETE',flush=True)