02. G1 불러오기 — 같은 로봇인데 관절이 8개 더 있습니다

이번 단계 목표: Isaac Lab 내장 에셋으로 Unitree G1을 스폰하고, 관절 구조를 덤프해서 시즌 1(Genesis)의 G1과 나란히 놓고 비교합니다. 이 대조표가 이후 모든 편의 기준 자료가 됩니다. 그리고 내장 설정으로는 로봇이 서 있지도 못한다는 걸 발견합니다.


실행

python scripts/02_load_g1.py --headless

스크립트가 하는 일은 셋입니다.

  1. isaaclab_assetsG1_CFG로 G1을 스폰 (에셋은 NVIDIA 클라우드에서 USD로 받아옵니다 — 첫 실행만 다운로드)
  2. 관절 이름·기본자세·가동범위·PD 게인을 표로 덤프 → outputs/02_g1_joints.txt
  3. 로봇 두 대를 나란히 세워 기본자세를 위치 타깃으로 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 제어로 자세 유지