17. 계단 오르기 — “저거 계단 맞아?”가 구한 실험

이번 단계 목표: 요철(15번)을 넘어 계단입니다. 4cm 단차의 피라미드 계단을 지형 관측 없이(높이맵·카메라 없이) 오르게 합니다. 그리고 이 글은 틀린 성공 보고를 한 번 했다가 잡아낸 기록이기도 합니다.


1차 시도: “+56cm 등반, 낙상 0회” — 라는 착각

첫 학습·평가에서 근사한 숫자가 나왔습니다: 15초에 몸통 높이 +0.56m, 낙상 0회. “14단을 올랐다”고 보고할 뻔했죠. 그런데 영상을 본 눈이 물었습니다 — “저거 계단 맞아?”

의심되면 재야 합니다(이 시리즈에서 몇 번째인지 모를 규칙). 카메라를 지면까지 낮춰 다시 찍고, 로봇 발밑의 지면 높이를 매 초 기록해 봤습니다. 확인해 보니 문제가 세 겹으로 겹쳐 있었습니다:

  1. “등반”의 정체는 물리 엔진의 튕김. 피라미드의 꼭대기(+0.6m)가 하필 로봇 스폰 지점이었고, 로봇은 지형에 0.6m 파묻힌 채 시작됐습니다. 솔버가 0.1초 만에 로봇을 뱉어 올렸고(몸통 0.80→1.26m), 그 순간이 “+0.56m 등반”으로 측정된 겁니다.
  2. 그 후 로봇은 내리막을 걸었습니다. 발밑 지면 로그: 0.60m → 0.40m. 오르기는커녕 꼭대기에서 바깥으로 완만히 내려가고 있었습니다.
  3. 애초에 계단이 아니었습니다. 0.25m 격자 높이맵에서 4cm 수직 단은 25cm 폭의 경사로 뭉개집니다. 지면에서 보면 줄무늬 진 완만한 비탈 — 계단이 아니라 테라스 논두렁이었습니다. (그 증거 영상:

— 1차 지형을 지면 높이에서 찍은 것. 수직 단이 어디에도 없습니다.)

원인: 측정 도구의 좌표계 착각

왜 지형이 뒤집혀 있었을까요? 지형을 설계할 때 저는 “중앙이 바닥, 밖으로 오르막”이라 검증했다고 믿었습니다. 그런데 그 검증 스크립트가 지형 정점(verts)의 로컬 좌표(0~24m)를 월드 좌표(−12~+12m)로 착각하고 있었습니다. “중앙”이라 믿고 잰 곳이 실제로는 지형 모서리였고, 결론이 정반대로 뒤집힌 채 통과된 겁니다.

R01의 교훈이 부메랑이 된 순간입니다. “영상은 검증이 아니다, 수치로 재라”고 해놓고 — 그 수치를 재는 도구 자체를 검증하지 않았습니다. 그리고 몸통 높이라는 대리 지표 하나만 보고 ‘등반’이라 판정했죠. 진짜 지표(발밑 지면 높이)와 눈(낮은 앵글 영상)을 함께 봤어야 했습니다.

2차: 세 가지 교정

"step_height": -0.04,              # 음수 = 중앙이 구덩이 → 밖으로 걸으면 '진짜 오르막'
env_cfg["terrain_z_offset"] = 0.68  # 구덩이 바닥을 지면 0으로 (스폰·종료 조건과 아귀가 맞도록)
env_cfg["terrain_horizontal_scale"] = 0.1   # 격자 0.25→0.1m: 단차 경사가 10cm 폭으로 (계단답게)

그리고 이번엔 학습 전에 스폰 검증(파묻힘·튕김 없음, 발이 지면 0 위)을 통과시키고 시작했습니다. 학습은 15번(요철) 정책에서 이어서.

cd scripts/train
python g1_train.py --task stairs --max_iterations 3000 --resume_from logs/g1-terrain/model_5998.pt
python g1_eval.py  --task stairs --ckpt 8997 --record   # 이어 학습 누적 번호

결과

교정된 계단에서 요철(15번) 정책을 이어 학습해 보상 26.9 수렴, 에피소드 길이 최대. 이번 판정은 발밑 지면 높이(직접 지표)로 합니다:

t= 3초  중심거리 0.98m   발밑 지면 +0.07m
t= 6초  중심거리 2.00m   발밑 지면 +0.12m
t= 9초  중심거리 3.00m   발밑 지면 +0.17m
t=12초  중심거리 3.99m   발밑 지면 +0.24m
t=15초  중심거리 5.00m   발밑 지면 +0.29m     낙상 0회

발밑 지면이 단조 상승하고, 상승률(5m 이동에 +0.29m)이 계단 기하(0.6m마다 4cm)와 정확히 일치합니다. 15초에 4cm 단 7개를 오른, 진짜 등반입니다. 카메라도 높이맵도 없이 — 관측은 여전히 몸통 기울기·관절각·속도뿐이고, 8cm 발 들림(13번)이 단차를 넘는 열쇠입니다.

솔직히 덧붙이면: 흰 단색 렌더링에서 4cm 단은 영상만으로는 여전히 흐릿합니다. 발 높이 근접 영상(

)에서 단의 띠와

앞뒤 발이 다른 단을 딛는 모습이 보이지만, 판정의 근거는 위의 지면 로그입니다. 영상은 끝까지 보조 증거였습니다.

교정된 계단 위의 G1

계단을 오르는 G1 (낮은 앵글)

전체 영상:


회고

  • 측정 도구도 검증 대상이다. “수치로 재라”는 규칙을 지켰는데도 틀렸습니다 — 재는 스크립트의 좌표계가 틀렸으니까요. 이제 규칙이 하나 늘었습니다: 새 측정을 믿기 전에, 아는 답이 있는 곳(예: 평지)에서 그 측정을 먼저 돌려봐라.
  • 대리 지표 하나로 판정하지 마라. ‘몸통 높이 상승 = 등반’이라는 추론에는 튕김·경사 같은 다른 경로가 있었습니다. 이번 판정은 발밑 지면(직접 지표) + 기하 예측과의 대조 + 영상, 세 겹으로 했습니다.
  • 의심하는 눈이 파이프라인의 일부다. 이 오진은 자동 검사가 아니라 “저거 계단 맞아?”라는 사람의 질문이 잡았습니다. 수치 파이프라인이 아무리 좋아져도, 결과를 의심하는 눈은 대체되지 않습니다.
  • 스폰 검증은 학습 전 체크리스트로. 지형이 있는 태스크는 “리셋 직후 파묻힘·튕김 없음”을 학습 전에 확인하는 절차를 이번에 추가했습니다. 1차 시도는 매 에피소드가 대포 발사로 시작됐던 셈인데, 그런 학습이 그럴듯한 보상 곡선을 만들 수 있다는 게 무섭습니다.

다음 단계

4cm를 올랐으니 물어야죠 — 몇 cm까지 갈 수 있을까? → 18. 계단의 한계

이 시리즈의 전체 글 목록 → 시리즈 목차