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>
39 lines
2.6 KiB
Python
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)
|