이번 단계 목표: 시즌 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 사이에 있었다

영상:
| 로봇 | 최종 높이 | 드리프트 | 흔들림(정착 후) | 판정 |
|---|---|---|---|---|
| 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 | 서 있음 |
읽어낼 것 세 가지입니다.
- 발목 kp 60도 못 버팁니다. 내장값(20)과 02편의 처방(200) 사이의 경계는 생각보다 높은 곳에 있었어요. 무릎을 굽힌 기본자세(무릎 24°)는 발목에 꽤 큰 정적 토크를 요구하는 자세라, 발목이 이를 못 받치면 게인을 조금 올려도 소용이 없습니다.
- 뻣뻣할수록 흔들림은 줍니다. D(1.4cm)가 C(2.8cm)보다 두 배 안정적이고, 시즌 1에서 손튜닝으로 도달했던 “kp 350에 3초간 0.9cm”와 같은 자릿수입니다. 물리 엔진이 달라도(PhysX vs Genesis 자체 솔버) PD 기립의 스케일은 재현되는 거죠.
- 그럼에도 내장 설정이 발목을 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. 내장 보행 환경 해부