이번 단계 목표: 지금까지 최고 속도는 0.6m/s(느긋한 산책)였습니다. 전진 명령 상한을 1.2m/s로 올려 빠르게 걷게 하고, 14번에서 남긴 예측 — “빨리 걸으면 각운동량 상쇄 필요량이 늘어 팔 스윙이 커질 것” — 을 검증합니다.
구성: 명령 범위 한 줄
14번(arms, 18관절) 설정에서 바꾼 것은 명령 범위 한 줄입니다:
command_cfg["lin_vel_x_range"] = [0.0, 1.2] # 0.6 → 1.2 m/s
08번의 교훈 그대로 — 빠른 속도를 명령 분포에 넣으면 정책이 빠르게 걷는 법을 배웁니다. 학습은 arms 정책에서 이어 학습(--resume_from)으로 시작해, ‘걷기’가 아니라 ‘빨리 걷기’만 추가로 배우게 했습니다(15번에서 익힌 기법).
cd scripts/train
python g1_train.py --task fast --max_iterations 3000 --resume_from logs/g1-arms/model_2999.pt
python g1_eval.py --task fast --ckpt 5998 --record # 1.0 m/s 직진 (이어 학습 번호)
python g1_gait_metrics.py -e g1-fast --ckpt 5998 --vx 1.0
결과
학습 후(보상 20.9 수렴, 에피소드 최대), 1.0m/s 명령으로 10초에 9.49m를 직진했습니다 (추종 오차 1%). 걸음이 어떻게 달라졌는지:
| 지표 | 0.4 m/s (14번) | 1.0 m/s (16번) | 해석 |
|---|---|---|---|
| 걸음 빈도 | 1.25 Hz | 1.25 Hz | 박자 유지 (위상 클록 그대로) |
| 보폭 | 30cm | 78.6cm | 성큼성큼 — 속도를 보폭으로 낸다 |
| 양발 동시 접지 | 22% | 11% | 사람도 빨리 걸으면 줄어드는 값 |
| 무릎 가동범위 | ~55° | ~62° | 더 크게 굽힘 |
| 발 들림 | 7~8cm | 8.3~8.9cm | 유지 |
그리고 14번의 예측이 적중했습니다. 같은 정책에게 두 속도를 시켜 팔을 재 보면:
| 전진 속도 | 어깨 스윙 진폭 | 왼어깨↔오른엉덩이 위상 상관 |
|---|---|---|
| 0.4 m/s | ±2.6° | +0.66 |
| 1.0 m/s | ±5.9° | +0.95 |
속도 2.5배에 팔 스윙 진폭 2.3배, 위상 결합은 +0.95로 거의 완벽해집니다. 다리가 만드는 각운동량이 커질수록 팔이 더 크게, 더 정확한 박자로 상쇄에 나서는 — 사람 보행 역학 그대로의 관계가, 여전히 “팔을 흔들어라”는 채점 없이 나왔습니다. 물리는 정직합니다.

전체 영상:
회고
- 속도는 보폭에서 나온다. 박자(1.25Hz)가 클록으로 고정돼 있으니, 정책은 속도를 걸음 빈도가 아니라 보폭(30→79cm)으로 냈습니다. 사람은 속도에 따라 빈도도 올리므로, 다음 개선이 있다면 ‘속도에 따라 변하는 클록’입니다 — 고정 클록의 한계(문헌에서도 지적되는 지점)를 직접 확인한 셈입니다.
- 가설 → 예측 → 검증의 한 사이클. 14번에서 “빠르면 팔이 커질 것”이라 예측을 남겼고, 16번에서 실험으로 확인했습니다. 채점표 튜닝의 연속처럼 보였던 이 시리즈가 결국 하나의 실험 과학 사이클로 완성되는 순간입니다.
다음: 17. 계단 오르기
이 시리즈의 전체 글 목록 → 시리즈 목차