robotwin-hub: 검증된 robotwin env clone(torch 2.8+cu129, sapien 3.0.0b1) + XPolicyLab/websockets + ffmpeg. curobo는 허브 envs/curobo로 재지정(X-WAM 트리 의존 제거).data/demo_clean 50 task × 50 ep(HF 공식), data/demo_randomized 50 task × 500 ep(로컬 구형 HDF5 변환, CPU job 3 min 24 s). 변환본은 HF 파일과 수치 diff 0, 이미지 바이트 동일.robotwin_sft ckpt) + 신규 policy/FlexPi(flex-pi 정책 래핑) — 둘 다 XPolicyLab 디버그 모드 배선 통과(exit 0).X_WAM 어댑터는 lift_pot 0/9(RoboDojo 좌표 규약) → X-WAM RoboTwin 셔임 규약(BASE_COORD_XFORM/EEF_AXES_XFORM)을 옮긴 policy/X_WAM_RoboTwin으로 lift_pot 100 / blocks_ranking_rgb 100 / open_laptop 100 / move_pillbottle_pad 90 (tau ZMQ 앵커 100/100/95/90). 허브가 기존 하네스와 동일 수치.점검 리포트(robotwin_hub_assessment)의 결론: 11개 레포가 upstream 커밋 3종·하네스 4종·데이터 포맷 3종으로 갈라져 있고 B200 필수 패치가 미커밋 diff에만 존재. 사용자 결정에 따라 이 레포를 허브로 만든다.
| 단계 | 내용 | 선택 이유 |
|---|---|---|
| sim env | conda create --clone robotwin → robotwin-hub. curobo editable .pth → 허브 envs/curobo(X-WAM 빌드 트리 복사). XPolicyLab editable, msgpack-numpy, websockets 16, rich, pillow, ffmpeg(imageio-ffmpeg 7.0.2) | upstream torch 2.4.1 pin은 B200 불가. 원본 robotwin env는 tau/flex-pi 사용 중이라 불변 |
| 디노이저 | envs/_base_task.py에 ROBOTWIN_RT_DENOISER env 패치 | OIDN 2.0.1 sm_100 미지원 → optix |
| 에셋 | scripts/hub/download_assets.sh: HF objects+embodiments+background_texture(21 min) → unzip → 경로 재기입 | 공유 심링크 사고(9/2) 재발 방지 |
| 데이터 clean | scripts/download_xpolicylab_data.sh로 HF demo_clean.zip × 50 | 공식 포맷·최신 instruction |
| 데이터 randomized | upstream이 삭제한 변환기 복구(git show 96c1fea^:scripts/process_data_xpolicylab.py) + --dataset-name, HF 키 정합(extrinsics_matrix, pointclouds, instruction/). scripts/hub/convert_legacy_worker.sh CPU sbatch(job 112267) | HF 새 포맷에 randomized 없음 |
| 어댑터 X_WAM | upstream 어댑터 + scripts/hub/policy_env/X_WAM.sh(exp_path, wan22_5b, ee). xwam env: XPolicyLab, msgpack-numpy, opencv → headless | 사용자 X-WAM 레포엔 어댑터가 쓰는 deploy_policy.py 없음 → vendored 사용 |
| 어댑터 FlexPi | 신규 policy/FlexPi: flex-pi WorldActionRobotWinPolicy를 importlib로 래핑, XPolicyLab obs → RoboTwin raw obs → 32-step joint chunk. regime/ckpt 해석/dummy 모드. demo_*_depth.yml 추가 | 코드 복사 없이 flex-pi 갱신 자동 반영 |
| 워커 스크립트 | scripts/hub/{env_worker,smoke_sim_worker,eval_multitask_worker}.sh, policy_env/ 훅, README.md | sbm 규칙 준수(#SBATCH 없음) |
| 항목 | 결과 |
|---|---|
| 변환 정합(adjust_bottle ep0) | 키 집합 동일, state/action/intrinsic maxabs diff 0, 이미지 바이트 동일. 차이는 instructions 리스트(98 vs 97)뿐 |
| demo_randomized 변환 | 50 task × 500 ep, job 112267 COMPLETED 3 min 24 s, 실패 0 |
| demo_clean | 50 task × 50 ep |
| 허브 env import | sapien/mplib/curobo(허브 경로)/XPolicyLab/ws/torch 2.8 OK. open3d·opencv는 로그인에 libGL 없어 실패(컨테이너 정상) |
| 디버그 배선 | FlexPi exit 0 / X_WAM exit 0 (ws 서버 기동, 클라이언트 연결, 20 step 완주) |
| X_WAM (upstream 어댑터) 1차 | job 112379 lift_pot 0/9, place_shoe 0/8 — 파이프라인 정상(GPU 70~80%), 좌표 규약 불일치 → 취소 |
| X_WAM_RoboTwin (허브 어댑터) | job 112436, demo_randomized/unseen × 10 ep: lift_pot 10/10, blocks_ranking_rgb 10/10, open_laptop 10/10, move_pillbottle_pad 9/10 = 97.5% (tau 앵커 20 ep: 100/100/95/90 = 96.3%). 셔임 수식 대조 max diff 2.4e-7, Traceback 0 |
| FlexPi (허브 어댑터) | job 112482, demo_randomized_depth/unseen × 10 ep: lift_pot 10/10, place_shoe 10/10 (flex-pi 하네스 100/100, 97/99). 15 min 32 s, Traceback 0, 추론 277~334 ms/call |
| 워커 sim 스모크 | job 112368 COMPLETED — HoldPose lift_pot 2 ep × 400 step 완주(0/2, 예상), OIDN/OptiX 오류 0, 에셋 오류 0, mp4·_result.txt 저장, 332 s. (1차 112357은 upstream demo_policy가 RoboDojo 전용 env_cfg sim 키를 읽어 실패 → 허브 policy/HoldPose로 대체) |
XPolicyLab/policy/X_WAM은 RoboDojo용 — EE 회전에만 _REFRAME_P를 우측 곱하고 xyz는 무변환. X-WAM의 RoboTwin 셔임(X-WAM/evaluation/X-WAM/deploy_policy.py)은 xyz'=B·xyz, R'=B·R·E(B=z축 90° 베이스 회전, E=eef 축 재정의), 델타를 primed 프레임에서 적분 후 역변환, gripper clip 없음. RoboTwin 학습 ckpt엔 후자가 정답.XPolicyLab/utils/setup_env_client.sh가 conda activate 전에 bare python을 호출 → 허브 env를 PATH 앞에 두어 해결. xwam env의 opencv-python은 libGL 없이 import 불가 → headless로 교체(사용자 env 변경).정책 env와 sim env가 분리되어 정책 레포는 XPolicyLab editable + msgpack-numpy만 추가하면 연결된다. 로컬 3 TB 구형 데이터셋을 재다운로드 없이 새 포맷으로 이관했고 공식 파일과 바이트 단위로 일치함을 확인했다. 두 정책(X-WAM, Flex-π)이 각자의 기존 하네스 수치를 허브에서 재현했으므로, 이제부터 RoboTwin 수치는 허브 하나에서 같은 시뮬 코드·에셋·프로토콜로 비교할 수 있다. 교훈: upstream 어댑터를 그대로 믿지 말고 좌표 규약을 학습 파이프라인과 대조할 것(0% → 97.5%).
① 나머지 정책 레포(FastWAM/ImageWAM/lingbot/FlowWAM) 어댑터 연결(upstream 어댑터의 좌표 규약 확인 필수) ② 클라이언트 chunk 내 관측 생략 옵션(FlexPi 4× 시간) ③ 50 task full sweep으로 리더보드 프로토콜 수치 확보(8 GPU own).
에셋 읽기 전용·해시 기록, data/download_cache(15 GB) 정리 여부, upstream PR 후보(디노이저 env 패치, 변환기 복구).