도중에 만난 것들 — 계획에 없던 발견·사고·선물 일지

로드맵(예정된 과제)과 별개로, 하려던 일을 하다가 튀어나온 것들만 모은 일지입니다. 이 시리즈의 진짜 배움은 대부분 여기서 나왔습니다. 유형별로 묶고, 각 사건에 발견 경위 → 원인 → 처방 → 남긴 것 순으로 적었습니다.


① 가짜 성공 — 잘된 줄 알았는데 아니었던 것들

셔플 보행 (06~09편의 모든 결과가 올라탄 기반) → 10편

  • 경위: “저 움직임이 맞는 걸까?”라는 사람의 의심 → 걸음 지표 측정
  • 실체: 발당 8.25Hz 잔발, 발 들림 1cm, 보폭 6cm, 발 간격 55cm — 걷기가 아니라 미끄러지기
  • 원인: 채점표에 걸음 ‘형태’ 항목이 없었고, 안정성 벌점이 오히려 진짜 걸음을 벌줌
  • 남긴 것: “영상은 검증이 아니다” + 걸음 측정 도구(g1_gait_metrics.py) + R01

무릎 토크 97% 포화 — ‘최대 힘 페달’ (11편 재검증)

  • 경위: 03 모션을 재검증하는 김에 보행 정책의 토크도 재봄 (계획에 없던 곁가지 측정)
  • 실체: gaitpush 정책이 PD 목표를 일부러 멀리 던져 토크 클램프(139Nm)를 상시 밟음. 06번 셔플도 발목 토크 31% 포화 — 오래된 버릇이었음
  • 원인: 채점표에 토크가 없어서 힘이 공짜였음
  • 남긴 것: 토크 벌점(−1e-5) 하나로 139→32Nm — “필요해서가 아니라 공짜라서 썼다”의 증명

가짜 계단 등반 (17편 1차)

  • 경위: “저거 계단 맞아?”라는 질문 → 낮은 앵글 영상 + 발밑 지면 로그
  • 실체: 사고가 세 겹 — 로봇이 지형 꼭대기에 파묻혀 스폰 → 솔버 튕김이 ‘+0.56m 등반’으로 측정 → 실제로는 내리막 테라스 걷기. 게다가 0.25m 격자 탓에 계단이 아니라 완만한 비탈
  • 원인: 지형 검증 스크립트가 로컬 좌표(0~24m)를 월드로 착각 — ‘중앙’이라 잰 곳이 모서리
  • 남긴 것: “측정 도구도 검증 대상” + 학습 전 스폰 검증 절차 + 지면 로그 판정 도구(g1_stairs_check.py)

② 명세의 실수 — 정책이 아니라 우리가 틀렸던 것들

발 들림 4cm의 진범 (13편)

  • 경위: 두 단계(10·12편) 동안 “정책이 목표 8cm에 못 미친다”고 여김 → 서 있는 발목 링크 높이를 재봄
  • 실체: 스윙 목표가 링크 ‘절대 높이’ 기준인데 서 있어도 이미 0.039m → 실제 목표는 4.1cm. 정책은 우리가 준 목표를 1mm 오차로 정확히 달성 중이었음
  • 처방: 목표 0.08→0.12 (한 줄) → 실측 7.9~8.1cm
  • 남긴 것: “보상이 이상하게 달성되면 정책보다 명세의 산수부터 검산하라”

계단에서 조용히 깨지는 절대 높이 채점 (17편)

  • 경위: 위 사건 덕분에 계단 설계 때 좌표 기준을 먼저 점검 → 두 채점이 깨질 것을 사전 발견
  • 실체: base_height(키 0.78 유지)는 계단을 오르는 것 자체를 벌주고, feet_swing_height는 세 단만 올라도 목표가 땅속이 됨
  • 처방: base_height 제거, 스윙 높이를 몸통 기준으로 전환
  • 남긴 것: 같은 함정을 두 번 안 밟음 — 겪은 실수가 체크리스트가 된 사례

문서 속 체크포인트 번호 전멸 (내용 재검토에서)

  • 경위: 발행 전 전수 재검토의 자동 검사
  • 실체: rsl_rl이 마지막 체크포인트를 max_iterations−1로 저장(3000→model_2999) — 문서의 --ckpt 3000류 명령이 전부 존재하지 않는 파일을 가리킴. 이어 학습은 번호가 누적됨(model_5998 등)
  • 남긴 것: 실행 명령은 자동 검사(존재하는 파일인지)로 지키는 습관

③ 개선의 부작용 — 하나를 고치면 하나가 무너졌던 것들

사건 고친 것 → 무너진 것 해소
걸음 교정 → 밀치기 전패 걸음 품질 ↑ → 강건함 0/4 (셔플의 넓은 스탠스가 사실 방어 자세였음) 결합 학습(gaitpush) 11
결합 학습 → 절뚝임 걸음+강건함 → 좌우 대칭 붕괴(왼 무릎 뻗정다리) 위상 대칭 보상 11→12
대칭 보상 → 회전 둔화 절뚝임 해소 → 회전(본질적 비대칭)까지 벌줌, 20% 덜 돎 명령 조건부 게이트(부분 해소, 12%) 12→13
  • 패턴: 요구가 늘 때마다 채점표 밖의 무언가가 희생됐고, 매번 손해는 작아짐 (걸음 전체 → 한쪽 무릎 → 회전 12%). “개선 → 전체 재검증”이 필수인 이유.

④ 뜻밖의 선물 — 계획 없이 공짜로 나온 것들

  • 08번 정책의 밀치기 3/4 생존 (9편): 밀치기를 한 번도 안 겪었는데 피드백 제어의 일반화만으로 버팀. ‘뒤로 밀림'(분포에서 가장 먼 상황)에서만 무너짐 → 일반화의 힘과 경계를 동시에 보여줌
  • 사람 위상의 팔 스윙 (14편): “팔을 흔들어라”는 채점이 없는데 각운동량 물리가 유도 (왼어깨↔오른엉덩이 +0.92). 시리즈에서 유일하게 채점 없이 옳은 행동이 나온 사례 — “물리가 대신 채점하는 것은 채점표에 쓸 필요가 없다”
  • 속도를 올리자 팔이 커짐 (16편): 14편에 남겨둔 예측이 실험으로 적중(±2.6°→±5.9°, 상관 +0.95). 가설→예측→검증 사이클이 닫힌 순간
  • 커리큘럼의 한계 돌파 (18편): blind 계단 한계를 8~10cm로 예상했는데 이어 학습 사다리로 12cm까지 전부 성공. 대신 보상 추세(26.9→18.0)가 한계 접근을 예고 — “전부 성공한 실험에서도 한계 위치를 추정할 수 있다”

⑤ 도구와 환경의 함정 — Genesis/rsl_rl 실전 지뢰 목록

  • 지형 verts는 로컬 좌표(0~24) — 월드로 착각하면 지형이 뒤집혀 보임 (17편 사고의 뿌리)
  • vertical_scale은 진폭이 아니라 양자화 단위 — 요철 크기는 subterrain_parameters로 지정 (15편 1차: 기본값이 ±10cm+보간 과장 = 실측 ±25cm 산악)
  • 높이맵 격자(horizontal_scale)가 계단 riser를 경사로 뭉갬 — 0.25m 격자에서 4cm 단은 비탈이 됨. 계단답게 하려면 0.1m
  • Genesis는 URDF effort로 토크 자동 클램프 — 그래서 정책이 클램프를 페달로 쓸 수 있음 (토크 벌점 없으면). 계측: get_dofs_control_force()
  • rsl_rl 체크포인트 번호 = 종료 iteration−1, 이어 학습 시 누적 — 위 ②의 문서 사고
  • 부드러운 PD(공식 게인)와 뻣뻣한 PD(kp350)는 다른 답을 낳음 — kp350은 8Hz 잔발의 물리적 토대였음. 단계마다 맞는 게인이 다름 (03편 자세 유지 vs 10편 보행)
  • 스폰 검증 없이 지형 학습 금지 — 파묻힌 스폰이 매 에피소드를 ‘대포 발사’로 시작되게 만들고도 그럴듯한 보상 곡선을 만들 수 있음 (17편)

한 줄 요약

계획된 결과물(정책 9개, 튜토리얼 19편)보다, 계획에 없던 이 사건들이 시리즈의 진짜 알맹이였습니다. 전부를 관통하는 문장은 R01에 쓴 문장과 같습니다:

측정하지 않은 성공은 성공이 아니고, 채점하지 않은 자유도는 반드시 엉뚱한 곳으로 샌다. — 그리고 그 측정 도구조차, 검증 대상이다.

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

댓글 남기기

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.