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:
@@ -0,0 +1,23 @@
|
||||
"""Source video versus old and collision-corrected reference; no physics claim."""
|
||||
import os
|
||||
os.environ.setdefault('MUJOCO_GL','osmesa');os.environ['LP_NUM_THREADS']='4'
|
||||
import sys
|
||||
from pathlib import Path
|
||||
import numpy as np,mujoco,cv2,imageio.v2 as imageio
|
||||
from scipy.spatial.transform import Rotation as R
|
||||
ROOT=Path(__file__).resolve().parents[1];O=Path(os.environ.get('SPIDER_TASK_OUT',str(ROOT/'output/collision_fix_20260915')));OLD=Path(os.environ.get('HF_FIX_OLD',str(ROOT/'output/foundationpose_spider_20260915')));ref=np.load(O/'reference_video_rate.npz');old=np.load(OLD/'reference_video_rate.npz');m=mujoco.MjModel.from_xml_path(str(O/'datasets/processed/current/l20/bimanual/boxes/scene_act.xml'));d=mujoco.MjData(m);m.vis.quality.offsamples=1;m.vis.headlight.ambient[:]=.7
|
||||
physics='--physics' in sys.argv
|
||||
if physics:
|
||||
actual=np.load(O/'physics_motion.npz');ref={k:ref[k][ref['time']<=actual['time'][-1]+1e-6] for k in ref.files};ix=np.argmin(abs(actual['time'][:,None]-ref['time'][None,:]),axis=0);old=ref;ref=dict(ref);ref['qpos']=actual['qpos'][ix]
|
||||
renderer=mujoco.Renderer(m,height=270,width=480);opt=mujoco.MjvOption();opt.sitegroup[:]=0;opt.geomgroup[3:]=0;opt.flags[mujoco.mjtVisFlag.mjVIS_TRANSPARENT]=False;cid=m.camera('source_camera').id
|
||||
cap=cv2.VideoCapture(str(ROOT/'docs/20260915_171525/color.mp4'));writer=imageio.get_writer(O/('spider_collision_rollout.mp4' if physics else 'hand_collision_before_after.mp4'),fps=30,codec='libx264',quality=8,macro_block_size=1)
|
||||
for f in range(len(ref['qpos'])):
|
||||
ok,img=cap.read();assert ok;panels=[cv2.cvtColor(cv2.resize(img,(480,270)),cv2.COLOR_BGR2RGB)];cam=ref['camera_world_from_cv'][f];m.cam_pos[cid]=cam[:3,3];quat=R.from_matrix(cam[:3,:3]@np.diag([1,-1,-1])).as_quat();m.cam_quat[cid]=quat[[3,0,1,2]]
|
||||
for rows in [old['qpos'],ref['qpos']]:
|
||||
d.qpos[:]=rows[f];mujoco.mj_kinematics(m,d);mujoco.mj_camlight(m,d);renderer.update_scene(d,camera='source_camera',scene_option=opt);renderer.scene.flags[mujoco.mjtRndFlag.mjRND_SHADOW]=False;panels.append(renderer.render().copy())
|
||||
panel=np.concatenate(panels,axis=1);cv2.rectangle(panel,(0,0),(1440,39),(20,25,30),-1)
|
||||
for j,label in enumerate((['Recorded RGB-D: red + blue','Collision-corrected reference','SPIDER: free-object physical rollout'] if physics else ['Recorded RGB-D: red + blue','Before: old contact reference','After: collision-corrected reference'])):cv2.putText(panel,label,(j*480+8,16),cv2.FONT_HERSHEY_SIMPLEX,.44,(255,255,255),1)
|
||||
cv2.putText(panel,f'frame {f}/{len(ref["qpos"])-1} | '+('SPIDER physical result - zero object assistance' if physics else 'KINEMATIC COMPARISON - not a free-object grasp rollout'),(8,33),cv2.FONT_HERSHEY_SIMPLEX,.42,(255,255,255),1);writer.append_data(panel)
|
||||
if f in [0,46,160,240,351]:cv2.imwrite(str(O/(('physics' if physics else 'collision')+f'_comparison_{f:04d}.jpg')),cv2.cvtColor(panel,cv2.COLOR_RGB2BGR))
|
||||
if f%80==0:print('render',f,flush=True)
|
||||
writer.close();cap.release();renderer.close();print('RENDER_COMPLETE',flush=True)
|
||||
Reference in New Issue
Block a user