Index
2026-09-14 — Progress

MuJoCo 로봇 control 파운데이션 + replay 렌더링 파이프라인

R2S | G003: Implement MuJoCo robot and action environment

TL;DR

1.14e-13mm
hand-eye 잔차
19
FK 샘플 행
3s
robot smoke 소요
1
렌더 프레임(row 9)

1 배경 / 목적

G003 단계는 DROID 로봇(Franka+Robotiq)을 실제 CAD/kinematics로 재생할 수 있는 MuJoCo 환경이 필요하다. Stock Franka hand는 실제 수집 당시 장착 형태가 아니므로 사용할 수 없고, mount/TCP가 검증되지 않은 상태에서도 최소한 kinematic 재생이 동작해야 이후 단계(geometry 통합, physics fitting)를 진행할 수 있다.

기존 한계: 이전에는 이 작업 디렉터리에 구현 코드나 Git 저장소 자체가 없었다(.omx 상태 파일만 존재). 로봇 좌표계와 카메라 좌표계의 변환 convention(RxRyRz vs RzRyRx)도 확정되지 않은 상태였다.

2 작업 내용

google-deepmind/mujoco_menagerie(commit 8161bba264d7fa7c99ca301e91e7fb44737676ad) sparse checkout으로 Franka Panda(no-hand, Apache-2.0)와 Robotiq 2F-85(BSD-2-Clause, ROS-Industrial)를 결합했다. MountTransform을 조립 필수 조건으로 만들고 tcp_unverified 사이트를 명시적으로 라벨링했다. 재생은 세 가지 모드로 분리했다:

StatePlayback — 기록된 7-joint position만 반영(kinematic), Robotiq 두 driver joint는 recorded_state×0.8로 정적 설정 JointTargetReplay — gripper_command_scale을 명시적으로 받기 전까지 Robotiq 0..255 액추에이터 미출력 CartesianTargetReplay — frame/rotation convention 라벨이 있어야만 6-value Cartesian record 보존, IK는 후속 solver에 위임 R2SEnv.step — object pose는 reset(initial_state)에서만 주입, step 중 강제 주입 없음

FK/hand-eye 일관성은 19개 샘플 raw row에서 검증했다. .venv-sim(mujoco==3.3.7) 기반 20-step CPU smoke를 scripts/smoke_robot.sbatch(own QOS, 8 CPU, 16GiB, 5분)로 구현하고, job 123487로 실행했다. 렌더링은 configs/replay_initial.json(raw row 9 단일 프레임 state-preview)으로 시작했으며, 최초 시도(job 123768)는 .venv-sim의 OpenGL EGL 바인딩이 워커에 없어 실패했고, --container=docker.io/nvidia/opengl@sha256:9b56a8e7... + MUJOCO_GL=egl로 재구성한 job 123801에서 성공했다.

3 결과 (수치 필수)

검증 항목RzRyRxRxRyRz판정
attachment ↔ cartesian_position2.658e-5mm 이내 일치—위치는 두 convention 모두 일치(참고용)
orientation 잔차(19 샘플)상수 Rz(-135°), 최대 drift 5.4e-6°최대 58.85°(상수 아님)RzRyRx 채택
wrist hand-eye 잔차1.14e-13mm / 1.21e-6°~75mm / ~179°RzRyRx만 성립
Job상태소요결과
123487 (robot smoke)COMPLETED 0:03s"robot smoke passed; mount/TCP remains UNVERIFIED_MOUNT_AND_TCP"
123768 (replay, 최초)FAILED4sOpenGL.raw.EGL 바인딩이 None → eglQueryString AttributeError
123801 (replay, 수정)COMPLETED4snvidia/opengl 컨테이너로 frame 9 단일 프레임 렌더 성공
핵심 발견: RzRyRx convention이 로봇 FK 경로에서도 독립적으로 확정됐다 — 데이터 감사 카드의 calibration_audit(카메라 외부 회전 비교)과 완전히 다른 경로에서 같은 결론에 도달했다.
미구현: Robotiq 2F-85의 4-bar linkage는 재구성되지 않아 UNIMPLEMENTED_CLOSED_FOUR_BAR_NOT_RECONSTRUCTED로 라벨링됨 — driver joint 값을 직접 쓰는 것만으로는 실제 그리퍼 폐쇄 형상을 재현하지 못한다.

4 Takeaway

의미

서로 무관한 두 검증 경로(카메라 외부 캘리브레이션 대 로봇 FK/hand-eye)가 동일하게 RzRyRx를 지지한 것은 이 convention이 우연이 아니라 실제 DROID 수집 규약임을 강하게 뒷받침한다. 렌더링이 워커에서 동작하기 시작했다는 것도 중요한 진전이지만, 현재는 "1개 고정 프레임의 kinematic state-preview" 수준이며 그리퍼 시각화는 근사치(4-bar linkage 미재현)라는 한계가 명확히 라벨링돼 있다.

5 Next Steps

미해결 한계

configs/replay_sequence.json(가장 최근 생성, PROVISIONAL_SEQUENCE_NOT_VALIDATED)은 아직 실행되지 않았다 — outputs/compare/ 디렉토리가 존재하지 않아 다중 프레임 시퀀스 replay는 미착수 상태다. JointTargetReplay의 gripper_command_scale도 현재 nominal 255.0(Menagerie ctrl range 기준)일 뿐 2023년 실제 controller 식별값이 아니다.

다음 작업

r2s.replay_sequence로 row 9~101 전체 computed-action 시퀀스를 렌더해 state playback과 대조한다. Robotiq 4-bar linkage 역기구학을 재구성하고, geometry 카드의 결과가 확정되면 replay_sequence.json의 calibration_path/geometry_path를 실측값으로 교체한다.