03. PD 제어로 자세 유지 — 안정 경계는 어디에 있나

이번 단계 목표: 시즌 1의 03편과 같은 목표입니다. 정책 없이 PD 제어만으로 로봇을 세워 둡니다. 다만 이번엔 02편의 발견(“내장 게인으로는 못 선다”)을 이어받아 게인 축을 훑는 4로봇 대조 실험으로 경계와 흔들림을 실측하고, 처음으로 카메라 센서로 영상을 뽑습니다.


실험 설계

같은 G1 네 대를 1.2m 간격으로 나란히 세우고, 발목(과 다리) 게인만 다르게 줍니다. 전원이 같은 명령(기본자세 위치 타깃)을 10초간 받습니다.

로봇 발목 kp/kd 다리 kp/kd 의미
A 20 / 2 내장(150~200 / 5) 내장 게인 그대로 — RL을 전제한 순응형
B 60 / 4 내장 경계 탐색 — 발목만 조금 강화
C 200 / 5 내장 02편의 처방
D 350 / 8 350 / 8 시즌 1 스타일 — 전부 뻣뻣하게

골반을 기준으로 세 가지를 잽니다. 최종 높이(0.5m 위면 서 있음), 드리프트(시작 위치 대비 수평 이동 최대값), 흔들림(정착 후 평균 위치 대비 최대 편차). 마지막 값이 시즌 1의 “3초간 0.9cm”에 대응합니다.

python -u scripts/03_pose_hold_pd.py --headless --enable_cameras

결과 — 경계는 60과 200 사이에 있었다

PD 자세 유지 4로봇 대조

영상:

로봇 최종 높이 드리프트 흔들림(정착 후) 판정
A 내장 (발목 kp20) 0.117 m 89 cm 무너짐
B 발목 kp60 0.117 m 93 cm 무너짐
C 발목 kp200 0.713 m 5.0 cm 2.8 cm 서 있음
D 시즌1식 (다리 kp350) 0.717 m 4.0 cm 1.4 cm 서 있음

읽어낼 것 세 가지입니다.

  1. 발목 kp 60도 못 버팁니다. 내장값(20)과 02편의 처방(200) 사이의 경계는 생각보다 높은 곳에 있었어요. 무릎을 굽힌 기본자세(무릎 24°)는 발목에 꽤 큰 정적 토크를 요구하는 자세라, 발목이 이를 못 받치면 게인을 조금 올려도 소용이 없습니다.
  2. 뻣뻣할수록 흔들림은 줍니다. D(1.4cm)가 C(2.8cm)보다 두 배 안정적이고, 시즌 1에서 손튜닝으로 도달했던 “kp 350에 3초간 0.9cm”와 같은 자릿수입니다. 물리 엔진이 달라도(PhysX vs Genesis 자체 솔버) PD 기립의 스케일은 재현되는 거죠.
  3. 그럼에도 내장 설정이 발목을 20으로 두는 이유가 있습니다. RL 정책은 발목 강성 대신 매 스텝 발목 각도를 고쳐 잡아 균형을 유지합니다. 부드러운 발목은 지면 요철에 순응하는 장점이 있고, 정적 기립의 불리함은 정책이 메웁니다. 게인은 “제어 철학”의 표현이지 좋고 나쁨의 문제가 아니라는 것 — 이 시리즈에서 계속 만나게 될 관점입니다.

처음 뽑은 영상 — 카메라도 ‘센서’다

시즌 1에서는 scene.add_camera()로 카메라를 붙이고 cam.render()로 프레임을 받았습니다. Isaac Lab에서 카메라는 IMU나 접촉 센서와 같은 센서 계층의 하나입니다.

camera = Camera(CameraCfg(prim_path="/World/camera", height=720, width=1280,
                          data_types=["rgb"], spawn=sim_utils.PinholeCameraCfg(...)))
camera.set_world_poses_from_view(eye, target)   # 위치 지정
camera.update(dt)                               # 매 캡처마다
frame = camera.data.output["rgb"]               # 텐서로 도착

headless에서는 렌더링이 기본으로 꺼져 있어 --enable_cameras 플래그가 필수입니다 (안 주면 카메라 데이터가 비어 있어요). 그리고 물리는 매 스텝, 렌더는 캡처 스텝에만 (sim.step(render=False) + 캡처 때만 sim.render()) 돌리면 녹화 비용이 8분의 1로 줄어듭니다. 200Hz 물리에 25fps 녹화면 충분하니까요.

개념 박스 — 왜 카메라가 센서 계층에 있나 다음 시즌에 쓸 높이 스캐너(RayCaster), 나중에 옵션으로 다룰 카메라 관측이 전부 같은 Sensor API를 씁니다. “관측에 넣을 수 있는 것”과 “영상으로 뽑는 것”이 같은 인터페이스라는 뜻이에요. 오늘은 블로그용 녹화 도구지만, 지형 편에서는 로봇의 ‘눈’이 됩니다.


다음 단계

여기까지가 손으로 만드는 마지막 편입니다. 이제 남이 만들어 둔 학습 환경을 열어 해부합니다 → 04. 내장 보행 환경 해부