05. 보행 도전 — 손으로 짠 걷기는 왜 어려운가

이번 단계 목표: 지금까지 배운 것(PD 제어 + 시간에 따라 목표 바꾸기)만으로 ‘걷기’를 직접 짜봅니다. 그리고 보기 좋게 실패합니다. 왜 실패하는지가 이 단계의 진짜 수확입니다.


어떻게 걷게 하려 했나 — 사인파 걸음(CPG)

사람이 걷는 모습을 단순화하면 “양다리를 반 박자 어긋나게 번갈아 앞뒤로 흔드는 것”입니다. 이걸 그대로 사인파로 옮겼습니다. 이런 방식을 CPG(Central Pattern Generator, 중앙 패턴 생성기) 라고 부릅니다 — 정해진 리듬을 반복 생성하는 방식이죠.

# 한 다리의 목표: 위상(phase)에 따라 고관절을 앞뒤로, 무릎을 들었다 놓기
hip  = -0.05 + 0.35 * sin(phase)
knee =  0.30 + 0.45 * max(0, sin(phase))   # 다리 들 때만 무릎 굽혀 발 끌림 방지

# 왼다리와 오른다리는 반 박자(π) 어긋나게
left  = leg_targets(w)
right = leg_targets(w + π)

리듬(주파수), 다리 흔드는 크기, 무릎 드는 높이 — 이런 값들을 손으로 정해 줬습니다.

실행:

python scripts/04_walk_scripted.py          # 헤드리스 + mp4
python scripts/04_walk_scripted.py --vis     # 실시간 (대개 휘청대다 넘어짐)

결과 — 0.65m 비틀거리다 2.2초 만에 꽈당

비틀거리며 넘어지는 모습

전체 영상:

손으로 짠(사인파) 보행 시도 결과
앞으로 이동: x +0.65 m,  옆으로: y +0.29 m  (총 0.71 m)
최종 몸통 높이: 0.104 m
2.2초 만에 넘어졌습니다 (몸통이 0.4m 아래로).

다리는 분명 걷는 시늉을 하며 앞으로 0.65m 나아갔지만, 곧 옆으로(+0.29m) 쏠리며 넘어졌습니다. 게인을 바꾸고 리듬을 바꿔도 결과는 비슷했습니다. 휘청 → 꽈당의 반복.


회고 — 왜 안 될까? (이게 이 글의 핵심)

손으로 짠 보행이 실패하는 이유는 04번에서 얻은 직관과 정확히 같습니다.

1) 걷기는 “계속 넘어지면서 발로 받치는” 일이다

서 있을 땐 두 발이 땅에 붙어 지지면이 넓습니다. 그런데 걸으려면 한 발을 떼야 합니다. 그 순간 지지면은 한 발 크기로 확 줄고, 몸은 사실상 넘어지는 중이 됩니다. 보행이란 “넘어지는 몸을 다음 발이 받아내는” 동작의 연속이에요. 타이밍이 조금만 어긋나면 그대로 넘어집니다.

2) 우리 로봇은 ‘지금 상태’를 보지 않는다

결정적 문제입니다. 우리 사인파는 시계만 보고 정해진 동작을 재생할 뿐, 로봇이 지금 얼마나 기울었는지·어디로 쏠리는지를 전혀 보지 않습니다. 몸이 왼쪽으로 넘어가는데도 시계가 시키는 대로 오른발을 들어버리니, 회복은커녕 넘어지는 걸 부추깁니다.

열린 루프 vs 닫힌 루프. 지금처럼 현재 상태를 안 보고 정해진 명령만 내보내는 걸 ‘열린 루프(open-loop)’ 제어라고 합니다. 균형 같은 문제는 현재 상태를 보고 명령을 고치는 ‘닫힌 루프(closed-loop, 피드백)’ 제어가 꼭 필요합니다. 우리에겐 그 피드백이 없었던 거죠.

3) 그럼 피드백 규칙을 손으로 짜면 되지 않나?

가능은 합니다(전통적인 로봇공학이 수십 년 해온 일입니다: ZMP, 모델 예측 제어 등). 하지만 29개 관절이 매 순간 서로 영향을 주고받는 걸 손으로 다 규칙화하는 건 엄청나게 어렵고, 지면·외란이 바뀌면 또 깨집니다. “수십 개 레버를 동시에 절묘하게” 조절해야 하니까요(02번의 그 직관!).

그래서 — 학습(RL)으로 간다

사람이 일일이 규칙을 적는 대신, 로봇이 시뮬레이션 안에서 수천·수만 번 넘어져 보며 스스로 걷는 법을 터득하게 하면 어떨까요? 그게 강화학습(Reinforcement Learning) 입니다. Genesis가 빠른(00번에서 본 수천 FPS!) 이유도 바로 이 “수만 번 반복 학습”을 위해서예요.


다음 단계

이제 진짜 본론입니다. 강화학습으로 G1에게 걷는 법을 가르칩니다 → 06. RL 보행 학습

댓글 남기기

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