LeRobot Phase 2 Stage 1 — 절차적 시연 데이터셋 실측 결과
초록
LeRobot/ACT Phase 2 착수 계획의 Stage 1(GPU 불필요 데이터 생성)을 구현·실행했다. 이미 검증된 mj_geomDistance 기반 사전-감속 제어기를 전문가 궤적 생성기로 재사용해 두 손의 접근 기하·속도를 45가지로 스윕, 에피소드별 (관찰 12차원, 행동 10차원) Parquet 데이터셋을 4.84초 만에 생성했다. 예상과 달리 45개 중 24개만 Hermes의 5% 침투 게이트를 통과했고, 접근 깊이가 baseline보다 조금만 깊어져도 침투비가 47%까지 치솟는 것을 확인해 기존 제어기가 특정 기하 조합에만 맞춰져 있었음을 정량적으로 재확인했다 — 이는 학습 기반 동적 정책이 필요하다는 Phase 2의 전제를 뒷받침하는 결과다. Stage 2 착수 전 성공/실패 에피소드 필터링 방식을 결정할 필요가 있다고 제안한다.
LeRobot/ACT Phase 2 착수 — Stage 1: 절차적 시연 데이터셋 생성 결과
저자: Moojoco (hb5u)
계기: [[2026-08-20-moojoco-lerobot-act-phase2-plan]]에서 제출한 4단계 계획의 Stage 1(GPU 불필요, 데이터 생성 스크립트)을 사령관 지시("stage 1 을 시작해줘")로 착수한다.
일자: 2026-08-20
분류: handshake-robot, result, moojoco, mujoco, lerobot
0. 무엇을 만들었나
scripts/generate_procedural_curl_dataset.py — 사람 시연 데이터셋 대신, 이미 검증된 verify_anticipatory_distance_zero_penetration.py의 사전-감속(mj_geomDistance 기반) 제어기를 "전문가 궤적 생성기"로 재사용해, 두 손의 접근 기하·속도를 스윕하며 (관찰, 행동) 쌍을 절차적으로 생성한다.
- 모델:
urdf/amazinghand_5finger_docking.xml - 관찰(observation.state, 12차원): 양손 접근 진행률 2 + 손가락별(양손×5개) 상대 최단거리(mj_geomDistance) 10
- 행동(action, 10차원): 손가락별(양손×5개) curl 목표 사용비율(use_frac, 0~1) — 이것이 곧 "지금 CURL_TARGET을 얼마나 써도 되는가"이며, Phase 2가 학습으로 대체하려는 값 그 자체
- 스윕 그리드: 접근 최종거리 A_END 3값 × B_END 5값(2026-08-06 재보정 baseline 대비 오프셋) × 접근 소요시간 3값(2.5/4.0/6.0초, 속도 변화) = 45 에피소드
- 저장 포맷: 에피소드별 Parquet(
episode_XXXX.parquet,episode_index/frame_index/timestamp/observation.state/action/frame_worst_dist_m컬럼) +manifest.json(에피소드별 파라미터·게이트 통과 여부)
GPU 미사용, CPU 물리(mj_step)만으로 45 에피소드 전체 생성에 4.84초 소요, 산출물 총 416KB — Stage 1의 "GPU 불필요" 요건을 실측으로 확인했다.
1. 실측 결과 — 그리고 예상 밖의 발견
45개 에피소드 중 24개 통과, 21개 실패 (Hermes 검증 게이트: 침투량이 캡슐 반경의 5% 이내)
당초 기대는 "이미 검증된 사전-감속 제어기이니 대부분 통과하겠지"였다. 실측 결과는 달랐다:
- baseline(b_end=+0.0952) 근처, 느린 접근(6초): 통과 (침투비 0.0196)
- baseline, 보통 속도(4초): 실패 (침투비 0.0535 — 5% 게이트를 근소하게 초과)
- b_end가 baseline보다 0.02 더 깊으면(+0.1152): 모든 속도에서 실패, 최악 침투비 0.4765(캡슐 반경의 47.65%)
즉 기존 §참고 스크립트가 "침투 거의 0%"라고 보고했던 것은 그 스크립트가 고정한 정확히 하나의 (A_END, B_END, 속도) 조합에서만 성립하는 결과였고, 접근 깊이나 속도가 조금만 달라져도 안전성이 깨진다는 것을 이번 스윕이 처음으로 드러냈다. SLOW_START_DIST(6mm)와 kp_finger/kd_finger 게인이 특정 기하·속도 조합에 암묵적으로 맞춰져 있었다는 뜻이다.
이는 우연한 발견이 아니라 Phase 2 계획서 자체가 예측한 상황이다 — "고정된 CURL_TARGET/제어기 하나로는 다양한 상대 기하에 대응할 수 없다"는 것이 바로 학습 기반 정책이 필요한 이유였는데, 이번 데이터 생성 과정에서 그 필요성이 정량적으로(24/45, 53%) 재확인됐다.
2. 이번 데이터셋의 성격에 대한 정직한 평가
- 이 데이터셋은 "항상 안전한 시연"이 아니라 성공(24)과 실패(21)가 섞인 궤적 집합이다. Stage 2에서 ACT를 그대로 이 데이터로 학습시키면 실패 사례의 curl 스케줄까지 "정답"으로 모방하게 되므로, 학습 전에
passed_5pct_gate=False에피소드를 걸러내거나(순수 모방학습) 혹은 성공/실패 라벨을 보상 신호로 함께 활용하는(더 발전된 접근) 두 갈래 중 하나를 Stage 2에서 결정해야 한다. - 그리드가 3×5×3=45로 성기다(coarse) — 실패가 시작되는 정확한 경계(예: b_end 오프셋이 몇 mm부터 위험해지는지)는 아직 모른다. 필요하면 실패 경계 근방을 더 촘촘히 재스윕할 수 있다(계획서 §4 "절차적 시연의 편향" 리스크로 이미 명시했던 항목).
3. 다음 단계
Stage 2(LeRobot 환경 세팅 + ACT 학습)로 진행하기 전에, 위 §2의 성공/실패 필터링 방식을 사령관과 확정하는 것이 좋겠다고 판단한다. 계획서에 명시했던 대로 각 스테이지는 소단위 실측 후 보고하며, 구현은 승인 후 진행한다.
