이번 단계 목표: 로봇이 무너지지 않게 붙드는 가장 기본 제어, PD 제어를 이해하고 직접 적용해 G1을 3초 동안 안정적으로 세워 둡니다.
PD 제어가 뭔가요? — “보이지 않는 스프링”
각 관절에 보이지 않는 스프링과 완충기(댐퍼) 를 달았다고 상상하세요.
- 목표 각도를 정합니다. 예: “무릎은 10°로 있어라.”
- 관절이 목표에서 벗어나면, 스프링이 되돌리는 힘을 줍니다. 많이 벗어날수록 더 세게.
- 동시에 완충기가 출렁임을 줄여 줍니다(덜덜 떨거나 튕기지 않게).
이게 PD 제어입니다. 이름의 P와 D는 두 개의 힘을 뜻해요.
| 기호 | 이름 | 역할 | 비유 |
|---|---|---|---|
| P (kp) | 비례(Proportional) 게인 | 목표에서 벗어난 거리에 비례해 되돌림 | 스프링의 세기 |
| D (kv) | 미분(Derivative) 게인 | 움직이는 속도를 거슬러 제동 | 완충기(쇼크업소버) |
공식으로는
토크 = kp × (목표각 − 현재각) − kv × (현재 각속도). “목표에서 멀면 세게 당기고(P), 빨리 움직이면 브레이크 건다(D)”는 한 줄 요약이면 충분합니다.
코드: 핵심은 딱 3줄
scripts/02_pose_hold_pd.py의 심장부입니다.
robot.set_dofs_kp(kp, motor_dofs) # 관절마다 스프링 세기(P) 설정
robot.set_dofs_kv(kv, motor_dofs) # 관절마다 완충기 세기(D) 설정
for _ in range(n_steps): # 매 step마다
robot.control_dofs_position(target, motor_dofs) # "이 각도로 가라"
scene.step()
target은 우리가 정한 기립 목표 자세(관절별 각도 묶음)입니다. 매 step마다 같은 목표를 계속 명령하면, PD가 알아서 그 자세를 유지하는 힘을 만들어 냅니다.
실행:
python scripts/02_pose_hold_pd.py # 헤드리스
python scripts/02_pose_hold_pd.py --vis # 실시간으로 서 있는 모습 보기
결과 — 3초간 흔들림 0.9cm
| 시작 자세 | 3초 뒤에도 그대로 |
|---|---|
![]() |
![]() |
PD 제어로 3초간 자세 유지 시도
몸통 높이: 시작 0.799 m → 끝 0.790 m
높이 흔들림(최대-최소): 0.9 cm
넘어지지 않고 안정적으로 서 있습니다!
01번에서 2초 만에 0.064m로 무너지던 로봇이, PD 제어를 붙이자 3초 동안 1cm도 안 흔들리고 서 있습니다. 보이지 않는 스프링이 관절들을 제 위치에 붙들어 준 덕분이에요.
회고 — 처음엔 보기 좋게 “앉은 자세”로 했다가 넘어졌다
이 단계에서 제일 많이 헤맸습니다. 기록을 그대로 남깁니다.
1차 시도 (실패): 보기 좋으라고 무릎을 많이 굽힌 “살짝 앉은 자세”(무릎 0.42rad)에 kp=150을 줬더니 — 그대로 주저앉았습니다. 높이가 0.8m→0.12m로 무너졌어요.
왜? 두 가지였습니다. 1. 굽힌 무릎은 버티기 힘들다. 무릎을 굽힐수록 그 자세를 유지하려고 모터가 내내 큰 힘을 써야 합니다(스쿼트를 오래 하면 다리가 후들거리는 것과 같죠). kp=150으로는 체중을 못 버텼습니다. 2. 시작 높이가 안 맞았다. 굽힌 자세는 키가 작아지는데 몸통을 0.8m에 띄워 두니, 발이 공중에 떠 있다가 쿵 떨어지며 균형을 잃었습니다.
2차 시도 (성공): 두 가지를 바꿨습니다. 1. 다리를 거의 곧게 폈습니다(무릎 0.42 → 0.10rad). 곧은 다리는 기둥처럼 체중을 그대로 바닥으로 흘려보내서, 모터가 거의 힘을 안 들이고도 버팁니다. 2. 게인을 키웠습니다(다리 kp 150 → 300). 더 단단한 스프링으로 흔들림을 잡았습니다.
배운 점: “사람이 보기에 멋진 자세”와 “버티기 쉬운 자세”는 다릅니다. 제어가 쉬운 자세부터 시작해서 점점 어려운 자세로 가는 게 정석입니다. 굽힌 자세를 안정적으로 버티려면 결국 더 정교한 제어(다음 단계들, 그리고 RL)가 필요합니다.
게인은 만능이 아니다: kp를 무작정 키우면 로봇이 부르르 떨거나(발진) 폭발하듯 튑니다. kp(세기)와 kv(제동)는 짝을 맞춰 올려야 합니다. 적당한 값을 찾는 게 제어 튜닝의 핵심이에요.
다음 단계
가만히 서 있는 걸 넘어, 이제 목표 자세를 시간에 따라 바꿔 스쿼트·팔 흔들기 같은 동작을 만들어 봅니다 → 04. 모션 제어

