이번 단계 목표: 지금까지의 모든 보행은 완벽한 평지 위였습니다. 마지막 남은 과제 — 무작위 요철 지형 위에서 걷기. 13번(sym2)의 채점표에 지형만 바꿔 넣어, 8cm 발 들림이 요철에서 제값을 하는지 봅니다.
구성: Genesis의 지형 생성기
Genesis에는 지형 생성기(gs.morphs.Terrain)가 내장돼 있습니다. 평평한 바닥(Plane) 대신 24×24m의 무작위 요철 지형(random_uniform_terrain)을 깔았습니다.
gs.morphs.Terrain(
n_subterrains=(1, 1), subterrain_size=(24.0, 24.0),
horizontal_scale=0.25, vertical_scale=0.005,
subterrain_types="random_uniform_terrain",
pos=(-12.0, -12.0, 0.0), # 로봇 시작점(0,0)이 지형 중앙
)
채점표 변경은 하나뿐입니다: 몸통 높이 채점(base_height)이 ‘절대 높이’ 기준이라 요철 높이만큼 억울한 벌점이 생기므로 비중을 절반(−10→−5)으로 완화했습니다. 나머지(박자·발 들림· 대칭·토크·밀치기)는 13번 그대로 — 13번까지 쌓은 채점표가 지형 위에서도 통하는지가 이번 실험의 질문입니다.
cd scripts/train
# 평지 정책(sym2)에서 이어 학습 — 아래 '2차 시도' 참고
python g1_train.py --task terrain --max_iterations 3000 --resume_from logs/g1-sym2/model_2999.pt
python g1_eval.py --task terrain --ckpt 5998 --record # 이어 학습이라 번호가 2999+2999로 이어짐
1차 시도: 참패 — 산악 지형이었다
처음 돌린 학습은 완전히 실패했습니다. 보상 3.0(평지에선 26), 에피소드 4.7초, 평가에선 아예 걷기를 포기하고 무릎을 잠근 채 제자리에서 버티는 정책이 나왔습니다. “걸으면 넘어지니 안 걷는다”를 배운 거죠.
원인은 지형 측정으로 드러났습니다. random_uniform_terrain의 기본 파라미터(±10cm)에 보간 과장이 겹쳐 실제 요철이 −25~+22cm — 보폭 30cm, 발 들림 8cm짜리 로봇에게는 지형이 아니라 산맥이었습니다. 셔플 때와 같은 교훈의 다른 얼굴입니다: 실패했을 때도 정책을 탓하기 전에 환경(명세)을 측정하라.
2차 시도: 요철 완화 + 이어 학습
처방 두 가지:
- 요철을 ±3cm(실측 −5~+6cm)로 완화 —
subterrain_parameters로 직접 지정. 8cm 발 들림으로 넘을 수 있는, ‘거칠지만 걸을 수 있는’ 땅. - 밑바닥부터가 아니라 13번(sym2) 정책에서 이어 학습(
--resume_from) — 평지 보행을 이미 아는 정책이 ‘요철 적응’만 추가로 배우게. 커리큘럼 학습의 가장 단순한 형태입니다.
결과
39분 학습 후 보상 25.4, 에피소드 길이 최대 — 평지(26.3)와 거의 같은 수준까지 올라왔습니다.
| 지표 | 평지 (13 sym2) | 요철 지형 (15) |
|---|---|---|
| 조종 시나리오(16초) | 완주 | 완주 (넘어짐 0) |
| 걸음 빈도 / 보폭 | 1.25Hz / 29cm | 1.25Hz / 32cm |
| 발 들림 | 7.9~8.1cm | 7.5~9.6cm (요철에선 더 들어올림) |
| 무릎 대칭 | −6~52° / −6~53° | 5~57° / 6~56° |
| 회전 추종(좌/우) | +102° / −99° | +97° / −104° |
| 몸통 높이 출렁임 | ±0.4cm | ±1.3cm (요철 추종) |
발 들림 최대치가 9.6cm까지 올라간 게 눈에 띕니다 — 요철 앞에서는 발을 더 드는 적응이 생겼습니다. 몸통 출렁임 ±1.3cm는 불안정이 아니라 지형을 따라가는 움직임입니다.


전체 영상:
회고
- 실패도 측정하면 원인이 나온다. “지형에서 학습이 안 된다”는 현상만 보면 보상 튜닝의 늪에 빠졌을 겁니다. 지형 높이를 직접 재 보니 10분 만에 원인(±25cm)이 나왔고, 처방은 파라미터 두 줄이었습니다.
- 이어 학습(warm start)은 공짜 커리큘럼. 평지 정책에서 시작하니 ‘걷기’를 다시 배울 필요 없이 ‘요철 적응’만 배웠습니다. 관측·행동 차원만 같으면 체크포인트 하나로 되는, 가성비 최고의 기법입니다. (부작용 하나: iteration 번호가 이어져서 체크포인트가
model_5998.pt처럼 저장됩니다.)
시리즈를 마치며 — 여섯 번의 “다시 보기”가 만든 로봇
00~07이 “빈 폴더에서 걷는 휴머노이드까지”였다면, 08~15는 “걷는다는 말을 의심하고 다시 만들기”였습니다.
08 방향 전환 → 명령을 학습 분포에 넣으면 조종이 된다
09 외란 회복 → 밀쳐 버릇하면 버티는 법을 배운다
10 걸음 진단 → 그 걸음은 8Hz 셔플이었다 (영상은 검증이 아니다)
11 걸음+강건함 → 품질을 고치니 강건함이 무너졌다 → 같이 요구해 같이 얻다
12 절뚝임 → 대칭·토크를 채점표에 (139Nm 페달 금지)
13 명세 검산 → 발 들림 4cm는 우리 산수 실수였다
14 팔 스윙 → 물리가 대신 채점하는 것은 공짜로 나온다
15 거친 지형 → 실패의 원인도 측정으로, 커리큘럼은 이어 학습으로
최종 정책은 울퉁불퉁한 땅 위를, 사람 위상의 걸음으로, 조종에 따라, 밀쳐도 회복하며, 실물 토크 예산 안에서 걷습니다. 그리고 그 과정 전체를 관통한 한 문장:
측정하지 않은 성공은 성공이 아니고, 채점하지 않은 자유도는 반드시 엉뚱한 곳으로 샌다. (연구 노트 R01)
남은 숙제: 더 빠른 보행과 큰 팔 스윙, 모방학습으로 스타일 입히기, 계단·경사, 그리고 실물 로봇으로 옮기기(sim-to-real). 다음 시즌의 이야기입니다.
이 시리즈의 전체 글 목록 → 시리즈 목차