Physics Scene과 솔버
USD 씬이 prim 트리라는 걸 봤습니다. 그렇다면 "중력은 얼마인지, 충돌은 어떻게 푸는지" 같은 물리 설정은 어디에 들어있을까요? 답은 — 그것도 prim입니다. 바로 PhysicsScene prim입니다.
물리도 prim이다
씬 안에는 PhysicsScene 타입의 prim이 하나 있고, 여기에 시뮬레이션 전체의 물리 파라미터가 담깁니다.
도식 렌더링 중…
런이 시작되면, 씬을 훑어 PhysicsScene 타입 prim을 찾아 여기에 중력·솔버 반복 같은 값을 적용합니다. 이 한 prim의 설정이 씬 안의 모든 강체(rigid body) 에 일괄로 작용합니다 — 물리의 "전역 설정 패널"인 셈입니다.
- gravity: 중력 벡터(보통 -9.81 m/s² Z)
- solverIterations: 접촉·관절 제약을 푸는 반복 횟수. 많을수록 안정적이지만 느림
- broadphase: 충돌 후보를 빠르게 추리는 단계
- GPU dynamics: 물리를 GPU로 가속할지
solverIterations — 자산이 저작한 값과 우리가 씌운 상한
위 목록 중 solverIterations 는 그냥 「크게 잡으면 안정적」인 값이 아닙니다. 로봇 USD 를 만든 사람이 이미 값을 적어 둡니다. 그리고 저희는 PhysX 6.0 TGS 권장치(위치 반복 16, 속도 반복 4)로 그 값을 깎고 있었습니다. 런 로그에 그 흔적이 남습니다.
[ENV-DIAG] PhysicsScene count=1 paths=['/physicsScene']
[IsaacCore] /World/Robots/HO_A: TGS-ITER capped 2 attr(s) — vel<=4 / pos<=16
[Isaac] PhysX solver iterations: pos=[1,255], vel=[0,255]
대부분의 로봇에서는 이 상한이 옳습니다. 그런데 기구가 닫힌 고리를 이루는 경우는 다릅니다. 닫힌 고리는 매 스텝 구속 오차가 생기고 솔버가 그것을 지워야 하니, 저자가 그래서 반복을 높게 적어 둔 것입니다.
현 로봇들이 USD 에 적어 둔 위치 반복 횟수. Digit 만 폐루프 관절이 6개이고 34회를 요구하는데, 저희 상한 16이 그 위를 가로지른다. 나머지는 루프 관절이 0이라 상한이 문제되지 않는다.
더 곤란했던 것은 저희 코드 두 곳이 서로 다른 말을 하고 있었다는 점입니다. 한쪽은 무조건 16으로 깎고 있었고, 다른 쪽 정책 레지스트리에는 「솔버 반복은 구속 수렴을 위해 USD 기본값(위치 34·속도 4)을 쓴다」고 적혀 있었습니다. 실제로 자산을 열어 세어 보고서야 정리됐습니다 — 폐루프 관절이 있는 자산만 저작값을 그대로 두고, 나머지는 종전대로 깎습니다.
⚠️ 「자산 기본값을 존중한다」와 「권장치로 깎는다」는 둘 다 맞는 말이라 코드 두 곳에 따로 살아남기 쉽습니다. 어느 쪽이 실제로 도는지는 문서가 아니라 로그가 답합니다 — 위
TGS-ITER capped줄이 그 답이었습니다.
PhysX가 기본이다 — kinematic은 보조
여기서 한 가지 원칙이 있습니다. 물리는 PhysX로 진짜로 푼다는 것. 로봇을 힘·토크로 움직이는 PhysX 시뮬이 기본이고, 위치를 직접 옮기는 kinematic은 빠른 테스트용 보조일 뿐입니다.
💡 왜 kinematic으로 우회하면 안 되나 — 전복·미끄러짐 같은 물리 버그를 kinematic(텔레포트)으로 덮으면 사라진 것처럼 보이지만, 그건 검증이 아니라 회피입니다. 현실과의 일치(Sim-to-Real)는 PhysX로 진짜 물리를 풀었을 때만 나옵니다.
GPU dynamics는 reset 이후에 켜진다
부팅 순서 글에서 본 world.reset() 경계가 여기서도 등장합니다. PhysX의 GPU dynamics와 충돌 필터는 reset 시점에 확정됩니다.
도식 렌더링 중…
⚠️ 충돌 필터나 고정 관절을 reset 이후에 바꾸려 하면 이미 잠긴 상태라 의도대로 안 먹습니다. 물리 구성은 reset 전에 끝내는 게 원칙입니다.
물리 엔진이 한 종류로 부족할 때(지상·수상·수중·음향이 각기 다른 방정식) 여러 엔진을 한 시간축에 동기화하는데, 그 멀티 피직스 오케스트레이션은 별도 글에서 다룹니다.
한 줄 정리
📌 물리 설정은 씬 안의 PhysicsScene prim 하나에 담겨 모든 강체에 적용된다(중력·솔버 반복·GPU dynamics). PhysX가 기본이고 kinematic은 보조이며, GPU dynamics·충돌 필터는
world.reset()시점에 확정된다.
