Index
2026-09-07 — Engineering

RoboTwin 허브 셋업 — env·에셋·데이터·어댑터 통합

RoboTwin | upstream main(96c1fea) + XPolicyLab(c37109c)를 유일한 시뮬/에셋/데이터/평가 허브로 구성

TL;DR

50×550
task × episodes
0
HF 대비 수치 diff
3m24s
randomized 변환
2/2
어댑터 디버그 통과
0
워커 스모크 렌더/에셋 오류
97.5%
X_WAM_RoboTwin 4 task (앵커 96.3%)
100%
FlexPi 2 task (앵커 ~98.5%)

1 배경 / 목적

점검 리포트(robotwin_hub_assessment)의 결론: 11개 레포가 upstream 커밋 3종·하네스 4종·데이터 포맷 3종으로 갈라져 있고 B200 필수 패치가 미커밋 diff에만 존재. 사용자 결정에 따라 이 레포를 허브로 만든다.

2 작업 내용

단계내용선택 이유
sim envconda 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) 재발 방지
데이터 cleanscripts/download_xpolicylab_data.sh로 HF demo_clean.zip × 50공식 포맷·최신 instruction
데이터 randomizedupstream이 삭제한 변환기 복구(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_WAMupstream 어댑터 + 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.mdsbm 규칙 준수(#SBATCH 없음)

3 결과

항목결과
변환 정합(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_clean50 task × 50 ep
허브 env importsapien/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로 대체)
좌표 규약 함정: upstream 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 변경).

4 Takeaway

의미

정책 env와 sim env가 분리되어 정책 레포는 XPolicyLab editable + msgpack-numpy만 추가하면 연결된다. 로컬 3 TB 구형 데이터셋을 재다운로드 없이 새 포맷으로 이관했고 공식 파일과 바이트 단위로 일치함을 확인했다. 두 정책(X-WAM, Flex-π)이 각자의 기존 하네스 수치를 허브에서 재현했으므로, 이제부터 RoboTwin 수치는 허브 하나에서 같은 시뮬 코드·에셋·프로토콜로 비교할 수 있다. 교훈: upstream 어댑터를 그대로 믿지 말고 좌표 규약을 학습 파이프라인과 대조할 것(0% → 97.5%).

5 Next Steps

다음

① 나머지 정책 레포(FastWAM/ImageWAM/lingbot/FlowWAM) 어댑터 연결(upstream 어댑터의 좌표 규약 확인 필수) ② 클라이언트 chunk 내 관측 생략 옵션(FlexPi 4× 시간) ③ 50 task full sweep으로 리더보드 프로토콜 수치 확보(8 GPU own).

정리

에셋 읽기 전용·해시 기록, data/download_cache(15 GB) 정리 여부, upstream PR 후보(디노이저 env 패치, 변환기 복구).