G1이 가상환경에서 앞으로 걷기까지 — 실패한 학습 루프를 다시 설계한 기록

로봇이 넘어지지 않고 앞으로 움직이면, 이제 “걷기에 성공했다”고 말해도 될까요? 3주 넘게 G1 보행 정책을 학습시키며 이 질문의 기준이 계속 바뀌었습니다. 처음에는 쓰러지지 않는 것만으로도 진전이라고 생각했지만, 제자리 버티기나 발 끌기 역시 높은 보상을 받을 수 있다는 사실을 확인했습니다. 이번에는 가상 시뮬레이션 환경에서 정지 상태로 출발해 주어진 전진 속도를 따라가고, 양발을 번갈아 디디며 30초 동안 넘어지지 않는 장면까지 직접 확인했기 때문에 ‘일차적인 전진 보행 성공’으로 기록하기로 했습니다.

다만 범위는 분명히 제한합니다. 현재 체크포인트가 수행한 것은 평지의 직선 전진 보행이며, 방향 전환과 측면 이동, 외란을 받은 뒤 균형 회복, 실제 로봇 전송은 아직 검증하지 않았습니다. 저는 이번 결과를 완성된 보행기가 아니라, 이후 실험에서 되돌아올 수 있는 첫 기준점으로 보존했습니다. 성공의 범위를 좁혀 적어야 다음 실패가 나왔을 때 무엇이 퇴보했는지 비교할 수 있기 때문입니다.

이번 글의 판정 범위

Isaac Lab 가상환경 · 평지 · 정지 출발 · 0.3~1.1m/s 전진 명령 · 속도 전환 · 30초 연속 보행. 세 개의 고정 시드에서 낙상과 발 교차가 없었고, 마지막으로 사람이 재생 화면을 확인했습니다. 실제 로봇과 회전·외란 복구는 포함하지 않습니다.

이전 학습은 왜 계속 걷지 못했을까요

초기의 문제는 PPO를 오래 돌리지 않았다는 데 있지 않았습니다. PPO(Proximal Policy Optimization)는 현재 정책을 한 번에 크게 바꾸지 않도록 제한하면서 조금씩 개선하는 강화학습 알고리즘인데, 학습 목표가 잘못되면 그 잘못된 목표를 더 충실하게 수행할 뿐입니다. 실제로 평균 reward가 올라가도 로봇은 서 있기, 발을 끌기, 상체를 과하게 써서 앞으로 쏠리기 같은 편법을 배웠습니다. 그래서 “학습량이 부족하다”는 가설을 버리고, 보상과 평가가 같은 행동을 성공이라고 부르고 있는지부터 다시 확인했습니다.

두 번째 문제는 서로 다른 요구를 하나의 숫자에 계속 밀어 넣었다는 점이었습니다. 전진 속도를 높이면 허리와 고관절이 흔들렸고, 자세 벌점을 키우면 로봇이 움직임 자체를 줄였습니다. 특히 고속 구간의 속도 미달 벌점을 강하게 준 실험에서는 정책 파라미터가 바뀌었는데도 1.1m/s 구간 이동 거리가 오히려 줄었습니다. 이 결과를 보고 계수를 한 번 더 올리는 대신, “빨리 가라”는 과제와 “이 형태는 넘지 마라”는 제약을 분리해야 한다고 판단했습니다.

세 번째 문제는 학습과 판정이 분리되어 있었다는 점이었습니다. 어떤 실험은 평균 reward만 보고, 어떤 실험은 짧은 재생 화면만 보고, 또 다른 실험은 최신 체크포인트라는 이유로 다음 출발점이 되었습니다. 이렇게 하면 좋아진 지표 하나가 나빠진 지표를 가리고, 며칠 뒤 같은 실패를 다른 이름으로 반복하게 됩니다. 이후에는 동일한 속도·전환·시드 평가를 모든 후보에 적용하고, 수치 검사를 통과한 모델만 긴 재생과 사람의 시각 검토로 넘기도록 바꿨습니다.

관련 시행착오는 평균 reward가 올랐는데 왜 로봇은 망가졌을까보상 함수는 어떻게 실패하는가에 더 자세히 남겨 두었습니다. 이번 글에서는 그 실패를 다시 나열하기보다, 실패를 끊어 낸 새 루프가 무엇이었는지에 집중합니다.

보상 튜닝 루프에서 검증 루프로

기존에는 실패 장면을 보면 가장 눈에 띄는 reward 계수를 바꾸고, 짧게 학습한 뒤 최신 결과를 다시 보는 식으로 움직였습니다. 이 방식은 빠르지만, 무엇이 원인이었는지와 무엇이 우연히 함께 변했는지를 분리하기 어려웠습니다. 새 루프에서는 먼저 속도 구간별로 따라야 할 전신 동작 목표를 만들고, 학습을 시작하기 전에 그 목표 자체가 전체 평가 구간을 통과하는지 검사했습니다. 목표가 나쁘면 PPO가 구해 줄 것이라고 기대하지 않기 위해서였습니다.

이전: 계수 수정 루프

① 실패 장면 하나를 본다
② 눈에 띄는 reward 계수를 바꾼다
③ 짧게 PPO를 돌린다
④ 평균 reward 또는 최신 화면만 본다
원인 분리 없이 ②로 되돌아감

현재: 증거 기반 학습 루프

① 실패 원인과 재발 이력 확인
② 속도 조건부 목표를 학습 전에 검증
③ Distillation → 제약형 PPO
④ 속도·전환 × 3개 시드 평가
⑤ 30초 trace와 사람의 시각 검토
통과한 체크포인트만 동결
그림 1. 계수 하나를 바꾸는 반복에서, 목표·학습·평가·사람의 판정을 연결한 루프로 바뀌었습니다.

여기서 distillation은 여러 정책이나 규칙이 만드는 행동을 하나의 정책이 모방하도록 압축하는 과정입니다. 낮은 속도에서는 자연스러운 전신 움직임을 보존하고, 0.9~1.1m/s 구간에서는 양쪽 다리의 앞뒤 움직임을 만드는 여섯 관절만 더 빠른 기준 동작 쪽으로 점진적으로 섞었습니다. 모든 관절을 한꺼번에 빠른 정책으로 바꾸면 저속 안정성과 팔·상체의 자연스러움까지 잃을 수 있어, 속도 문제와 직접 관련된 축만 혼합했습니다. 이 목표가 학습 전 평가를 통과한 뒤에야 하나의 29관절 정책으로 옮기고 PPO를 시작했습니다.

workspace도 이 순서를 강제하도록 바뀌었습니다. 학습 프로그램 파일이 현재 목표와 성공 조건을 정본으로 갖고, 실행기는 학습이 끝날 때마다 동일한 평가 묶음을 자동으로 호출합니다. 평가 결과, 궤적, 사람이 내린 판정은 모델 레지스트리와 다음 실행 노트로 연결되며, 세 번 연속 핵심 지표가 나아지지 않으면 새 학습을 중단합니다. 자세한 배경은 보상을 다시 고치기 전에 학습 루프를 다시 짠 이유에서 확인할 수 있습니다.

PPO에는 무엇을 reward로 주었나요

이번 학습에서 reward는 단순히 “앞으로 많이 가면 큰 점수”가 아니었습니다. 속도만 보면 넘어지기 직전까지 몸을 던지는 움직임도 좋은 답이 될 수 있고, 자세만 보면 꼼짝하지 않는 것이 가장 안전한 답이 됩니다. 그래서 과제 reward는 명령을 수행하는 정도를, 별도의 cost는 허용하지 않을 형태를 담당하게 했습니다. 아래 표는 수십 개의 세부 항을 기능별로 묶은 것으로, 계수 목록보다 각 항이 어떤 편법을 막는지 보여 주기 위한 정리입니다.

묶음학습 신호필요한 이유실제 판정 지표
명령 추종전진 속도 추종, 진행량, 방향 정렬서 있기·후진·과속으로 reward를 우회하지 못하게 함이동 거리, 평균 속도 오차
발걸음 형성발 공중 시간, 발 높이, 한발 지지, 좌우 교대발을 끌거나 두 발을 계속 붙인 채 이동하는 편법을 막음한발/두발 지지 비율, gait score
균형 유지몸통 수직, 기준 높이, 횡방향 속도·기울기앞으로 몸을 던져 얻는 짧은 진행량을 걸러 냄낙상, 높이·기울기 trace
동작 절제에너지, 토크, 가속도, action 변화량관절이 떨리거나 과도한 힘으로만 버티는 정책을 억제action rate, torque trace
목표 동작 유지속도 조건부 전신 목표와의 차이, 정책 급변 제한저속에서 얻은 자연스러운 동작을 고속 학습 중 잃지 않게 함목표 action 오차, 정책 변화량
형태 제약발 간격, 허리 roll/pitch, 고관절 roll/yaw, 팔 action rate다리 교차와 상체 비틀림을 점수 하나와 맞바꾸지 못하게 함foot lane, 허리·고관절·팔 지표

과제 reward

속도 추종 · 전진 진행 · 발걸음 · 균형 · 에너지

질문: 명령한 일을 얼마나 잘 했는가?

형태 cost 4개

발 간격 · 허리 자세 · 고관절 비틀림 · 팔 변화율

질문: 허용 경계를 넘었는가?

PID-Lagrangian PPO

각 cost critic이 위반을 예측하고 제약 강도를 따로 조절

결과: 전진 성능과 자세를 한 점수로 거래하지 않음

과제 성능을 높이되 → 형태 경계는 별도로 지킨다
그림 2. 이번 PPO에서 reward와 형태 제약이 맡은 역할. 형태 cost는 단순 벌점 합산이 아니라 각각의 critic과 제약 강도를 가집니다.

마지막 형태 제약 네 가지는 일반 reward에 음수로 더한 것이 아닙니다. 각각의 위반을 예측하는 cost critic을 따로 두고, 제한을 넘으면 PID 제어기처럼 제약의 강도를 올리는 PID-Lagrangian PPO를 사용했습니다. 수도꼭지에서 물이 목표 수위보다 높아질수록 밸브를 더 잠그는 것처럼, 발 간격이나 허리 사용이 기준을 넘을 때 해당 비용의 영향이 커집니다. 덕분에 전진 성능과 형태를 한 숫자 안에서 서로 거래하지 않고, “전진하되 이 경계는 넘지 말라”는 문제로 바꿀 수 있었습니다.

현재 체크포인트는 전진 명령을 얼마나 따라갔나요

학습 reward 합계만으로 체크포인트를 선택하면 이전 실패를 반복합니다. 그래서 15초 동안 주어진 속도로 계속 걸었을 때의 실제 이동 거리와 평균 속도 오차를 먼저 비교했습니다. 이상적인 거리는 명령 속도 × 15초로 계산했으며, 아래 수치는 고정된 한 평가 시드의 결과입니다. 모든 구간에서 낙상과 발 교차는 0회였고, 같은 평가를 다른 두 시드에서도 반복해 동일한 통과 판정을 얻었습니다.

전진 명령15초 이상적 거리실제 이동거리 추종률평균 속도 오차낙상 / 발 교차
0.3m/s4.50m4.12m91.6%0.057m/s0 / 0
0.5m/s7.50m7.05m94.0%0.071m/s0 / 0
0.75m/s11.25m10.70m95.1%0.090m/s0 / 0
1.0m/s15.00m13.92m92.8%0.119m/s0 / 0
1.1m/s16.50m15.21m92.2%0.134m/s0 / 0

15초 전진 명령 대비 실제 이동 거리

0.3m/s91.6%
실제 4.12m이상 4.50m
0.5m/s94.0%
실제 7.05m이상 7.50m
0.75m/s95.1%
실제 10.70m이상 11.25m
1.0m/s92.8%
실제 13.92m이상 15.00m
1.1m/s92.2%
실제 15.21m이상 16.50m
그림 3. 회색 막대 전체가 명령대로 이동했을 때의 거리이며, 파란 막대가 실제 이동 비율입니다. 모든 구간에서 낙상과 발 교차는 0회였습니다.

숫자는 저속부터 고속까지 명령의 약 92~95%에 해당하는 거리를 이동했음을 보여 줍니다. 아직 완벽한 속도 추종은 아니며, 속도가 높아질수록 평균 오차가 커지는 경향도 남아 있습니다. 그럼에도 0.3m/s에서만 걷는 정책이 아니라 1.1m/s까지 한 정책으로 대응했고, 0.3→1.1m/s와 1.1→0.3m/s 전환에서도 낙상과 발 교차가 없었습니다. 1.1m/s 명령을 30초 동안 유지한 별도 검사에서는 30.67m를 이동해 이상 거리 33m의 92.9%를 따라갔습니다.

각 reward가 의도한 행동도 별도로 확인했습니다. 속도 추종 항은 이동 거리와 속도 오차로, 발걸음 항은 좌우 한발 지지와 발 교차로, 형태 제약은 발 간격·허리·고관절·팔 움직임으로 읽었습니다. 1000번의 PPO 업데이트 동안 1.1m/s 이동 거리는 학습 전 약 14.88m에서 마지막 약 15.21m로 늘었고, gait score는 약 0.92 수준을 유지했으며 낙상과 발 교차는 생기지 않았습니다. 즉 이번 체크포인트는 형태를 무너뜨려 속도만 번 것이 아니라, 안전 경계를 유지한 채 고속 추종을 조금 더 끌어올린 후보였습니다.

PPO 업데이트에 따른 1.1m/s 구간 이동 거리

초기
14.88m
100
14.46m
299
14.53m
600
14.83m
800
15.16m
최종
15.21m
gait score
약 0.92 유지
낙상
0회
발 교차
0회
그림 4. 초반에는 고속 이동이 잠시 줄었지만 후반에 기준을 넘어섰습니다. 거리만 늘어난 것이 아니라 gait score와 안전 지표가 함께 유지된 최종 후보를 골랐습니다.

30초 trace에서는 양발 사이 최소 여유가 약 0.23m였고, 좌우 어깨 움직임의 크기 균형은 약 0.94였습니다. 팔과 반대쪽 다리의 상관도도 약 0.88~0.90으로 나타나, 팔을 고정해 안정성을 얻는 정책이 아님을 확인했습니다. 하지만 이 값들은 자연스러운 보행을 완전히 정의하지 않으며, 마지막 판정은 실제 재생 화면에서 발 디딤과 상체 움직임을 함께 보고 내렸습니다. 수치와 화면이 같은 결론을 가리킨 것이 이번 체크포인트를 보존한 이유입니다.

화면에서 무엇이 달라졌나요

표의 추종률이 높아졌다고 해서 곧바로 사람다운 보행이 되었다고 말할 수는 없습니다. 비교 대상으로 고른 과거 정책은 같은 0.5m/s 명령에서 약 1.2초 만에 자세가 무너졌습니다. 지지발을 바꾸기 전에 진행 방향이 약 55도 돌아가고, 발 간격이 음수가 된 구간이 전체의 약 30%를 차지했습니다. 짧은 이동량만 보았다면 전진한 정책처럼 보이지만, 다음 발을 안정적으로 내딛는 보행이라고 보기는 어려웠습니다.

그래서 과거 실패 정책과 현재 보존한 정책에 같은 평지 환경과 0.5m/s 직진 명령을 적용했습니다. 카메라는 발과 지면 접촉이 보이도록 낮추되, 넘어지는 순간에도 전신이 프레임 안에 남도록 거리를 벌렸습니다. 과거 화면에서는 몸이 뒤틀리며 한쪽 발 위로 주저앉았지만, 현재 화면에서는 발바닥이 지면을 번갈아 누르며 상체 높이를 유지했습니다. 정지 화면은 자세를, 영상은 그 자세로 들어가는 시간 순서를 확인하는 용도로 나누었습니다.

이전 정책: 지지 전환이 무너진 순간

과거 G1 정책이 직진 명령 중 균형을 잃어 한쪽 발 위로 넘어지는 Isaac Sim 장면

발과 지면을 함께 보면, 다음 지지 영역을 만들지 못한 채 몸이 한쪽으로 회전하며 무너집니다.

현재 정책: 지지 전환을 유지한 순간

현재 G1 정책이 발을 지면에 붙여 지지하며 한 발을 앞으로 내딛는 Isaac Sim 장면

발바닥 접촉이 보이는 각도에서도 한쪽 다리로 지지하고 반대쪽 발을 앞으로 보냅니다.

그림 5. 같은 0.5m/s 직진 명령에서 발과 지면 접촉이 보이도록 다시 촬영한 비교 화면.

과거 정책: 약 1.2초 안에 넘어짐

현재 정책: 같은 명령에서 보행 유지

영상 1. 같은 명령·같은 시드·같은 카메라에서 기록한 실패와 현재 보행. 두 영상의 길이가 다른 이유는 과거 정책의 에피소드가 낙상으로 일찍 끝났기 때문입니다.

같은 명령을 수치로 비교하면

화면 비교만으로는 현재 정책이 속도를 제대로 따라가는지, 단지 넘어지지 않는지만 알기 어렵습니다. 그래서 두 체크포인트에서 명령 좌표계의 전방 속도, 진행 방향, 측면 이동을 시간축으로 꺼냈습니다. 과거 정책은 속도가 0.5m/s에 접근하기 전에 크게 출렁였고, 1.2초 시점의 평균 절대 속도 오차는 약 0.44m/s였습니다. 현재 정책은 초기 가속 뒤 평균 오차가 약 0.023m/s로 줄었고 15초 동안 보행을 이어 갔습니다.

과거 실패 정책과 현재 승인 정책의 속도 추종, 진행 방향, 측면 이동 비교 그래프
그림 6. 0.5m/s 직진 명령의 속도 추종과 경로 편차. 과거 정책은 낙상으로 1.2초에서 trace가 끝납니다.

직진성은 yaw 하나로 단정하지 않았습니다. 현재 정책의 15초 최종 방향 편차는 약 6.4도였고 측면 이동은 약 0.52m였습니다. 과거 정책의 약 55도 회전과 0.59m 측면 이탈보다 작지만, 현재 정책도 완벽한 직선을 그렸다고 할 수는 없습니다. 이번 체크포인트를 ‘직진 명령을 따라 걷는 첫 기준선’이라고 부르되, 방향 유지 보상과 회전 명령을 다음 평가 항목으로 남긴 이유입니다.

관절별로 reward를 잘 따랐다는 말의 의미

여기에는 한 가지 구분이 필요했습니다. reward 함수가 29개 관절 각각에 정답 각도를 주는 것은 아닙니다. 속도 reward는 몸의 이동을 보고, 발 교차 cost는 두 발의 상대 위치를 보며, 형태 cost는 허리·고관절·팔 같은 관절군이 경계를 넘는지를 봅니다. 따라서 관절 비교에서는 ‘reward 점수’를 관절마다 억지로 배분하지 않고, 좌우 관절에 실제 적용된 명령 차이를 관절군별로 계산했습니다.

과거 실패 정책과 현재 승인 정책의 고관절, 무릎, 발목 좌우 명령 비대칭 비교
그림 7. 하체 관절군별 좌우 명령 차이. 직진 명령에서는 큰 비대칭이 방향 회전과 발 교차의 원인이 될 수 있지만, 값이 작다는 사실만으로 좋은 보행을 증명하지는 않습니다.

과거 정책은 고관절 pitch와 yaw, 무릎, 발목에서 좌우 명령 차이가 크게 나타났고 실제로 발 교차와 방향 이탈로 이어졌습니다. 현재 정책은 대부분의 관절군에서 차이가 줄었지만 hip roll에서는 과거보다 조금 컸습니다. 이 값을 무조건 나쁜 것으로 보지 않은 이유는 보행에는 좌우 지지 전환을 위한 roll 동작이 필요하기 때문입니다. 그래서 관절 그래프는 속도 추종, 발 교차 0회, 영상의 지지 전환과 함께 읽었으며, 다음 단계에서는 관절 목표와 실제 관절각 사이 오차까지 기록해 제어기 추종 성능을 따로 평가할 예정입니다.

왜 이번 체크포인트에서 멈추었나요

강화학습은 더 오래 돌리면 언제나 좋아질 것처럼 보이지만, 이번 프로젝트에서는 그 믿음이 반복적인 퇴보를 만들었습니다. 마지막 체크포인트는 세 시드의 고정 경로 24개 행과 30초 연속 검사를 통과했고, 학습 전 기준보다 고속 이동이 좋아졌으며 시각 검토도 통과했습니다. 따라서 reward를 또 고치거나 PPO를 더 이어 가기보다 현재 모델과 설정을 동결했습니다. 새 결함이 발견되기 전에는 보행 정책을 흔들지 않는 것이, 다음 기능을 붙였을 때 원인을 분리하기 쉬운 선택입니다.

이 동결은 곧바로 실제 로봇이나 통합 라우터에 연결한다는 뜻은 아닙니다. 현재 정책의 관측 480차원과 관절 명령 29차원을 외부 실행 계층이 같은 순서와 단위로 해석하도록 export 계약을 만들어야 합니다. 이 연결 검사가 끝나지 않았기 때문에 체크포인트는 보존 상태이지만 배포 준비 상태는 아닙니다. “학습 성공”과 “실행 준비 완료”를 분리해 두는 것도 새 루프의 일부입니다.

다음 단계: 더 잘 걷고, 걸으면서 일하기

첫 번째 다음 과제는 직진 보행의 범위를 넓히는 일입니다. 지금의 0.3~1.1m/s 전진 명령에 회전과 측면 이동을 더하고, 밀림이나 지면 변화가 들어왔을 때 넘어지지 않고 복구하는지를 평가해야 합니다. 이 단계에서는 기존 체크포인트를 기준선으로 고정하고, 새 기능이 직진 성능을 깎지 않는지 같은 평가 행렬로 비교할 예정입니다. 단순히 새 장면이 재생된다는 이유로 성공 범위를 넓히지는 않을 것입니다.

두 번째는 WBC와 RL의 결합입니다. WBC(Whole-Body Control)는 로봇 전신의 균형과 접촉 조건을 수학적으로 계산해 관절 명령을 만드는 제어 방식이고, RL은 그 모델로 표현하기 어려운 보정과 적응을 데이터에서 배울 수 있습니다. 둘 중 하나를 버리는 대신 WBC가 접촉·균형의 기준을 제공하고 RL이 잔차 동작이나 상황 적응을 맡는 구조를 검토하려 합니다. 현재 성공한 RL 체크포인트는 이 조합을 비교할 수 있는 첫 기준선이 됩니다.

세 번째는 보행과 manipulation task의 연결입니다. manipulation은 물체를 집거나 옮기는 조작 작업을 뜻하며, 걸으면서 팔을 쓰면 상체 운동이 균형에 다시 영향을 줍니다. 우선 정지 상태의 조작을 검증하고, 상위 명령이 이동과 조작을 나누어 호출하는 계층을 만든 뒤, 마지막에 이동 중 조작으로 범위를 넓히는 편이 원인을 분리하기 쉽습니다. 이번 전진 보행 성공은 목적지가 아니라, 로봇이 다음 작업 장소까지 스스로 이동하게 만드는 첫 하위 기능입니다.

현재 기준선
평지 직선 전진
0.3~1.1m/s
보행 확장
회전 · 측면 이동
외란 복구
WBC + RL
접촉·균형 기준
학습 기반 보정
조작 연결
정지 조작 → 이동
loco-manipulation
그림 6. 보존한 체크포인트를 기준선으로 두고, 보행 범위 확장과 WBC 결합을 거쳐 조작 작업으로 연결하는 순서.

마무리

이번에 배운 한 줄은 이것입니다. 걷지 못한 이유는 PPO를 덜 돌려서가 아니라, 속도·형태·판정을 하나의 숫자와 한 번의 화면에 맡긴 학습 루프에 있었습니다. 속도 조건부 목표, 과제 reward와 형태 cost의 분리, 고정 평가, 사람의 시각 검토를 한 흐름으로 묶고 나서야 가상환경의 직선 전진 보행을 첫 기준점으로 남길 수 있었습니다. 다음 글에서는 이 체크포인트를 동결한 채 회전·외란 복구와 WBC+RL 결합 중 무엇부터 검증할지 기록하려 합니다.


이 글은 시뮬레이션 환경에서 확인한 연구·개발 기록입니다. 제시한 수치는 고정된 평가 조건의 결과이며 실제 로봇에서의 성능을 의미하지 않습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤