이번 단계 목표: Isaac Lab 내장 에셋으로 Unitree G1을 스폰하고, 관절 구조를 덤프해서 시즌 1(Genesis)의 G1과 나란히 놓고 비교합니다. 이 대조표가 이후 모든 편의 기준 자료가 됩니다. 그리고 내장 설정으로는 로봇이 서 있지도 못한다는 걸 발견합니다.
실행
python scripts/02_load_g1.py --headless
스크립트가 하는 일은 셋입니다.
isaaclab_assets의G1_CFG로 G1을 스폰 (에셋은 NVIDIA 클라우드에서 USD로 받아옵니다 — 첫 실행만 다운로드)- 관절 이름·기본자세·가동범위·PD 게인을 표로 덤프 →
outputs/02_g1_joints.txt - 로봇 두 대를 나란히 세워 기본자세를 위치 타깃으로 3초 유지 — A는 내장 게인 그대로, B는 발목만 시즌 1처럼 뻣뻣하게
결과 ① — 관절 37개, 링크 44개
| idx | 관절 이름 | 기본자세 | 하한 | 상한 | kp | kd |
|---|---|---|---|---|---|---|
| 0 | left_hip_pitch_joint |
−11.5° | −134.6° | 174.8° | 200 | 5 |
| 1 | right_hip_pitch_joint |
−11.5° | −134.6° | 174.8° | 200 | 5 |
| 2 | torso_joint |
0.0° | −150.0° | 150.0° | 200 | 5 |
| 3 | left_hip_roll_joint |
0.0° | −14.9° | 145.0° | 150 | 5 |
(37줄 중 앞 네 줄입니다. 전체는 outputs/02_g1_joints.txt에 있습니다.)
주의 — 관절 순서가 시즌 1과 다릅니다 Genesis(URDF)는 왼다리 6개 → 오른다리 6개처럼 트리 깊이 순서였는데, Isaac Lab은 너비 우선이라 hip_pitch 좌/우 → torso → hip_roll 좌/우 → shoulder… 처럼 좌우가 교대로 섞여 나옵니다. 인덱스를 하드코딩하면 반드시 사고가 나니, Isaac Lab 문화대로 이름 정규식(
".*_ankle_.*")으로 관절을 지정해야 합니다.
결과 ② — 내장 게인으로는 서 있지 못한다
[1.0s] 골반 높이 — A(기본): 0.544 m / B(발목 강화): 0.714 m
[2.0s] 골반 높이 — A(기본): 0.118 m / B(발목 강화): 0.711 m
[3.0s] 골반 높이 — A(기본): 0.118 m / B(발목 강화): 0.711 m
판정 — A(내장 게인, 발목 kp 20): 무너짐 0.118 m
판정 — B(발목 kp 200): 서 있음 0.711 m
A는 1초를 못 버티고 주저앉았고, 발목 게인만 20→200으로 올린 B는 3초간 0.711m에서 미동도 없습니다. 같은 로봇, 같은 명령, 발목 강성 하나 차이입니다.
이건 버그가 아니라 설계 철학이에요. 내장 G1_CFG는 “정책이 매 스텝 균형을 잡는” RL 학습용이라 발목을 일부러 부드럽게(순응성) 둔 것이고, 시즌 1의 kp 350은 “정책 없이 자세만으로 버티는” 정적 기립용이었던 겁니다.
막힌 점 — “무너짐”을 버그로 착각할 뻔 처음 한 대만 스폰해서 기본자세를 줬을 때 로봇이 무너지길래 “타깃이 안 먹나?”부터 의심했습니다. 진단은 대조 실험으로 했어요. 발목 게인만 올린 두 번째 로봇을 옆에 세워 그쪽이 서면 파이프라인은 정상이고 게인이 원인인 겁니다. 시즌 1의 교훈 (“측정 도구를 먼저 의심하라”)이 여기서도 그대로 통했습니다.
같은 G1인데 관절이 다르다 — 37 vs 29
시즌 1에서 우리는 Unitree가 배포하는 g1_29dof.urdf를 썼습니다. Isaac Lab의 g1.usd를 열어 보면 관절 수부터 다릅니다. 로봇은 같은 G1인데 모델링 변형(variant)이 다른 거죠.
| 부위 | Genesis (g1_29dof.urdf) | Isaac Lab (g1.usd) | 메모 |
|---|---|---|---|
| 다리 | 12 (hip×3·knee·ankle×2 ×양쪽) | 12 (동일 이름) | 완전 일치 — 비교의 기반 |
| 허리 | 3 (waist yaw/roll/pitch) | 1 (torso_joint) | Isaac 판은 허리가 1자유도 |
| 팔 | 7×2 (shoulder×3, elbow, wrist×3) | 5×2 (shoulder×3, elbow pitch/roll) | Isaac 판은 손목 대신 elbow_roll |
| 손 | 없음 (palm 고정) | 7×2 (손가락) | Isaac 판에는 세손가락 핸드가 달림 |
| 합계 | 29 | 37 |
뒤 단계에 주는 영향이 큽니다.
- 다리 12관절이 이름까지 같으므로, 보행 정책의 관절 단위 비교(대칭·토크·게인)는 시즌 1과 직접 비교가 가능합니다.
- 시즌 1의 팔 스윙은 어깨 pitch/roll + 팔꿈치의 6관절이었는데, Isaac 판도 같은 관절이 있어 재현 가능합니다.
- 허리(1 vs 3자유도)와 손가락(0 vs 14)은 다르므로, 전신 관절 수를 전제로 한 비교 (관측 차원, 액션 차원 등)는 다리·팔로 한정해야 공정합니다.
이 37 vs 29의 차이는 나중에 시리즈의 판을 뒤집습니다. 10편에서 우리는 같은 보상 항목이 두 모델에서 정반대로 작동하는 장면을 보게 됩니다.
PD 게인도 철학이 다르다
시즌 1에서는 다리 12관절에 kp 350 / kd 8을 일괄로 줬습니다. Isaac Lab의 G1_CFG는 부위별로 게인을 다르게 선언해 둡니다.
| 관절 그룹 | Isaac Lab kp / kd | 시즌 1 kp / kd |
|---|---|---|
| 엉덩이 yaw/roll | 150 / 5 | 350 / 8 |
| 엉덩이 pitch·무릎·허리 | 200 / 5 | 350 / 8 |
| 발목 | 20 / 2 | 350 / 8 |
| 팔 | 40 / 10 | (고정 유지 150 / 4) |
눈에 띄는 건 발목입니다. 시즌 1은 발목도 뻣뻣하게 잡았지만, Isaac 설정은 일부러 부드럽게 둡니다 — 지면 순응(compliance)을 게인 설계로 미리 넣어 둔 것이죠.
개념 박스 — 액추에이터 그룹
G1_CFG는 관절을legs/feet/arms세 액추에이터 그룹으로 묶고, 그룹마다ImplicitActuatorCfg(stiffness, damping, effort_limit, armature)를 선언합니다. 시즌 1에서set_dofs_kp()로 런타임에 게인을 꽂던 것이, 여기서는 로봇 설정의 일부로 고정되는 겁니다.armature(모터 관성 근사)처럼 시즌 1에 없던 항목도 있는데, 이런 것들이 sim-to-real 준비물에 해당합니다.
다음 단계
발목 kp 20과 200 사이 어디에 안정 경계가 있을까요? 게인 축을 훑는 대조 실험으로 실측하고, 처음으로 영상도 뽑습니다 → 03. PD 제어로 자세 유지