Index
2026-10-06 — Progress

RoboDojo용 Zero-WAM 정책 어댑터 + 배선 스모크

Zero-WAM | XPolicyLab/policy/Zero_WAM

TL;DR

800/800
스텝 완주
13m20s
job 175596
15.2s
청크 평균(26청크)
0/1
success(예상)

1 배경 / 목적

RoboDojo에서 Zero-WAM을 평가하려면 XPolicyLab 정책 형식의 어댑터가 필요하다. ARX-X5용 ZW 체크포인트가 아직 없어 공개 RoboTwin 체크포인트(zero-wam-posttrain-robotwin)로 obs → backend → action 경로, action shape, 에피소드 완주만 검증했다(성공률은 대상 아님).

2 작업 내용

Zero-WAM wan_va 코드는 수정하지 않았다. 새 파일은 RoboDojo/XPolicyLab/policy/Zero_WAM/(서브모듈 내 로컬).

파일내용
deploy.ymlbackend 설정(zero_wam_root, server_env=lingbot-b200, config_name=robotwin, model_path), 모드(use_icl, guidance scale, icl_video_map...), action_type: ee, eval_batch: false
model.pybackend(wan_va_server)에 붙는 얇은 websocket 클라이언트. RoboTwin 클라이언트 프로토콜 그대로, lazy 연결(Isaac Sim 부팅 중 backend 로드)
deploy.py첫 obs → get_action, 이후 keyframe 주기(4스텝)마다 obs 전송
setup_eval_policy_server.sh(1) torch.distributed.run --standalone -m wan_va.wan_va_server --config-name robotwin backend 기동 (2) XPolicyLab forward server 기동. 한쪽이 죽으면 전체 종료
install.shforward server용 경량 uv venv(py3.11, torch 없음). lingbot-b200에 msgpack_numpy 없고 RoboDojo env는 websockets가 구버전이라 두 env는 건드리지 않음
_smoke/smoke_zerowam.shlanguage-only, --action-type ee, 1 에피소드(#SBATCH 헤더 없음)

robodojo.sh eval은 정책의 eval.sh를 쓰지 않고 setup_eval_policy_server.sh를 직접 실행(forward 포트 600 s 대기)하므로, LingBot_VA 방식(eval.sh에서 backend 기동)은 이 경로에서 backend가 뜨지 않는다 → backend 기동을 server 스크립트로 이동.

obs / action 매핑

항목RoboDojo (ARX-X5)ZW robotwin
카메라cam_head / cam_left_wrist / cam_right_wrist 640×480 (JPEG 왕복)cam_high / left / right wrist, 서버가 224×288 리사이즈
actionleft/right_ee_pose [x,y,z,qw,qx,qy,qz](link6, world) + ee_joint_state[0..1] → IK(16, F=2, H=16): 팔당 [Δxyz, quat4, gripper], 에피소드 첫 EE pose 기준 상대값
청크첫 청크 16 스텝(frame0 skip), 이후 32KV cache keyframe 4 → 8개

내부 30-dim 중 사용 채널 16개(0-6, 28, 7-13, 29). 작업 지시의 "14-dim joint" 가정과 다르다.

3 결과

오프라인 CPU 테스트(가짜 backend): reset payload, 3캠 dict, kv keyframe 수 [4, 8, 8], 청크당 스텝 16→32, action dict 키/차원(7/1) 확인 스모크 job 175596 (1×B200, --qos=extra, isaac-lab:2.2.0): COMPLETED, 13분 20초, 1회 시도 - 첫 청크 50.4 s(JIT/워밍업), 이후 평균 약 14 s (26청크 평균 15.2 s) - action shape (16, 2, 16), 800/800 스텝 완주, 결과 fail (success 0/1, score 0) — 예상대로 - IK 오류·예외 없음. head 영상(프레임 0/100/200)에서 두 팔이 그릇 쪽으로 이동·그리퍼 닫힘 → EE→IK 경로 동작 - backend 로그 끝 SignalException: signal 15는 정상 teardown

스모크 후 수정(재제출 안 함)

알려진 불일치 (행동이 무의미한 이유)

#항목내용
1EE 프레임RoboTwin endpose는 TCP 기준(gripper_bias), RoboDojo ee_pose는 link6 원 pose. 상대 회전이 EE local에서 합성돼 축 정의 차이가 그대로 회전 오차. ARX-X5 베이스 y=-0.45, 90° 회전도 다름
2quat 산술wxyz 배열을 scipy(xyzw)로 읽는 관례를 그대로 복제. 학습 변환 스크립트도 같은 관례 필수
3제어 주기RoboDojo 25 Hz(step_lim 800 = 32 s). RoboTwin 학습 action 주기와 같은지 미확인. action_per_frame=16, stride 4 고정
4그리퍼/stats양쪽 0..1이나 robotwin_icl.json q01/q99는 RoboTwin 작업공간 기준
5이미지640×480(4:3) → 224×288(0.78) 종횡비 왜곡, JPEG 압축, FOV·위치 상이
6기타녹화는 get_obs 시점에만 프레임이 쌓여 4스텝 간격(201프레임, 25 FPS 라벨은 4배속). IK 실패 시 해당 팔 명령을 조용히 생략, 횟수 로그 없음

4 Takeaway

RoboDojo에서 Zero-WAM 평가 파이프라인(lang/ICL 두 모드)이 end-to-end로 동작(1 GPU, 1 에피소드 약 13분). ARX-X5 체크포인트가 생기면 deploy.yml의 model_path(또는 --ckpt)와 필요 시 config_name만 바꿔 평가 가능.
현 RoboTwin ckpt의 행동은 프레임·stats 불일치로 의미가 없다 — 성공률 수치는 해석 대상이 아님.

5 Next Steps

cd ~/repos/Robotics/RoboDojo && conda activate RoboDojo sbm "bash _smoke/smoke_zerowam.sh [task]" --gres=gpu:1 -c 8 --mem 200GB --qos=extra --time 1:00:00 -J rd_zw_smoke --container=nvcr.io/nvidia/isaac-lab:2.2.0