07. 조종 시나리오 — 16초 완주와 Phase B 결산

이번 단계 목표: 시즌 1의 08편 시나리오를 그대로 가져옵니다. 전진 → 좌회전 → 전진 → 우회전, 16초 조종. 구간별 추종 오차를 실측하고 보행 재현 단계의 합격 판정을 내립니다.


실행

python -u scripts/07_steer_scenario.py --headless --record

명령 재샘플을 봉인(resampling_time_range=(1000,1000))하고 매 스텝 명령 텐서를 직접 써 넣는 방식입니다. 4초 단위 4구간, 추적 카메라 녹화 포함이에요.


결과 — 16초 완주, 회전 오차는 시즌 1과 동급

구간 (각 4초) 명령 실측 회전각 (목표) 오차
전진 vx 0.5, ωz 0.0 vx 0.38 (−0.12) +9° (0°) +9°
좌회전 vx 0.3, ωz +0.5 ωz +0.55 (+0.05) +124° (+115°) +10°
전진 vx 0.5, ωz 0.0 vx 0.39 (−0.11) +6° (0°) +6°
우회전 vx 0.3, ωz −0.5 ωz −0.54 (−0.04) −124° (−115°) −10°

16초 시나리오 완주, 넘어짐 없음.

영상:

판정 축 시즌 1 시즌 2 (이번) 판정
시나리오 완주 16초 완주 16초 완주 통과
회전각 오차 3~9° 9~10° 동급
회전 속도 추종 ±0.05 rad/s 통과
전진 속도 −2% −22% 미달

숨은 발견 — 오차들이 서로 아귀가 맞습니다. 전진 구간에서 로봇이 왼쪽으로 +9°, +6° 흘러갑니다. 06편에서 잰 비대칭(왼발 들림 10.6 대 오른발 7.7cm)과 방향이 일치해요. 왼발을 더 크게 젓는 로봇이 조금씩 왼쪽으로 도는 겁니다. 지표 두 개가 독립적으로 같은 절뚝임을 가리키면, 그건 측정 노이즈가 아니라 정책의 성질입니다.


Phase B 결산 — 체크포인트 판정

기획서의 기준은 이랬습니다. “Isaac Lab에서 시즌 1 수준의 보행·조종 재현이 달성되어야 다음 단계로.”

판정은 조건부 통과입니다.

  • 재현된 것: 넘어지지 않는 보행(에피소드 991/1000), 조종 가능(회전 오차 동급), 학습 파이프라인 전체(학습 → 평가 → 지표 → 영상)가 우리 도구로 돕니다.
  • 미달인 것: 전진 속도 −22%, 잰걸음(2.85Hz·보폭 13.5cm), 좌우 비대칭. 단 이것들은 내장 환경의 기본 튜닝을 그대로 쓴 결과이고, 원인(위상 클록·대칭 보상 부재)과 처방(시즌 1의 10~13편)을 이미 알고 있습니다.

여기서 선택지가 둘이었습니다. (a) 시즌 1의 걸음 교정을 이식해 평지를 완성하고 가기, (b) 걸음 품질은 아는 빚으로 기록해 두고 지형·높이맵으로 먼저 가기.

원래 계획은 (b)였습니다. 그런데 06편의 잰걸음을 보다가 질문이 하나 생겼어요. “로봇 만든 회사는 이 보상을 어떻게 짜 놨을까?” Unitree가 공개한 공식 학습 설정을 열어 보니, 우리가 없다고 적어 둔 항목들이 전부 거기 있었습니다.

그래서 (a)도 (b)도 아닌 길로 샜습니다. 그 샛길이 이 시리즈에서 가장 긴 이야기가 됩니다.

개념 박스 — 명령 주입으로 정책 시험하기 학습 때 명령은 CommandManager가 뿌리지만, 평가 때는 command_manager.get_command("base_velocity")가 돌려주는 내부 텐서를 직접 덮어쓰면 임의의 시나리오를 만들 수 있습니다(재샘플 주기만 봉인하면 돼요). 시즌 1에서 env.commands[:] = ...로 하던 것과 같은 수법입니다. 프레임워크가 바뀌어도 “평가는 명령을 내 손으로”라는 원칙은 그대로예요.


다음 단계

두 채점표의 차이를 코드 수준으로 해부한 연구 노트가 먼저입니다 → 연구 노트 R01. 범용 보상과 제조사 보상 사이

바로 실험부터 보고 싶으시면 → 08. 보상 절제 사다리