같은 메시에도 다른 관절 계약을 붙일 수 있다
M25.01에서는 자산의 크기·질량·충돌·재질을 구분했다. 이번에는 움직이는 부품 사이의 관계를 정한다. 화면에서 바퀴 메시를 회전시키거나 서랍을 옮겼다는 사실만으로 물리 관절과 제어가 구성됐다고 볼 수 없다. 어느 강체를 무엇에 연결하고 어떤 상대운동만 허용할지 먼저 정해야 한다.
강체(rigid body)는 변형하지 않는 한 덩어리의 운동 모델이고 관절(joint)은 두 강체의 상대운동에 제약을 주는 관계다. 자유도(DOF)는 제약 뒤에 독립적으로 바꿀 수 있는 좌표의 수다. 이번 예는 chassis·wheel·drawer 세 강체를 두 관절로 연결한 트리다. 닫힌 고리·기어/mimic 결합과 바퀴-바닥 접촉 제약은 자유도 계산에 추가하지 않는다.
| 구성 | 원하는 상대운동 | 관절과 남는 상대 자유도 |
|---|---|---|
| chassis↔wheel | 축 주위 회전 | Revolute, 회전 좌표1개 |
| chassis↔drawer | 레일 방향 직선 이동 | Prismatic, 병진 좌표1개 |
| chassis↔world의 고정 변형 | 베이스 운동 없음 | Fixed, 상대 자유도0개 |
Revolute는 나머지 상대 병진/회전을 제약하고 Prismatic도 선택한 병진축 이외의 상대운동을 제약한다. OpenUSD RevoluteJoint와 PrismaticJoint는 두 형태의 축·한계 속성을 구분한다. “바퀴처럼 생겼다”는 이름이나 모양은 관절 종류를 결정하지 않는다.
축은 월드 축이 아니라 관절 프레임에서 읽는다
body0와 body1은 관절이 연결하는 두 강체다. 각 강체에 대한 관절 프레임의 로컬 위치/회전도 갖는다. 정지한 조립 상태에서 두 관절 프레임이 같은 월드 기준으로 어떻게 만나는지 확인해야 한다. 파일 트리에서 두 메시가 같은 폴더에 있는 것만으로 관절이 연결되지는 않는다.
그림 M25.02-1. 각 칸은 서로 다른 역할/근거다. 나란히 비교할 항목이며 위아래가 시간 순서를 뜻하지 않는다. 직접 제작한 개념도이며 본문의 조건과 함께 읽는다.
이번 교육용 명세에서는 wheel의 관절축을 chassis와 정렬된 관절 프레임의 localY, drawer의 축을 localX로 둔다. 양의 좌표는 오른손 회전/양의 축 병진으로 정한다. 베이스가 worldZ 주위로+90° 회전했으면 localX는 world+Y, localY는 world−X다. 따라서 “서랍은 X축 이동”이라고만 쓰면 어느 프레임인지 빠져 있다.
이는 축 방향 계산이지 서랍의 실제 위치를 관측한 결과가 아니다. 두 로컬 관절 프레임의 회전이 다르면 그 변환도 먼저 포함한다. 한쪽 anchor만 옮기거나 body를 바꿔 놓고 기존 로컬 프레임을 재사용하면 초기 조립부터 맞지 않을 수 있다. 드라이브 강성을 높이기 전에 연결 대상과 프레임을 점검한다.
degree·radian·길이 단위를 입력 경계에서 맞춘다
URDF의 회전 각도는 radian이며 USD Physics 회전 관절의 한계는 degree 단위다. 선택한 임포터/제어 API의 목표 단위도 확인한다. USD 파일의 degree 속성을 봤다는 이유로 모든 런타임 제어 API가 degree라고 가정하면 안 된다. 변환은90°=π/2rad, 약1.5708rad다.
r=0.05m인 바퀴를90° 회전시킨다고 하자. 바닥과 미끄러짐 없이 구른다는 추가 가정에서 이동 거리 크기는 s=rθ=0.05×π/2≈0.07854m다. 여기서 θ는 radian이다. 90이라는 숫자를 radian으로 대입해4.5m라고 하면 약57.3배 오류다. 축 부호와 바닥 방향도 있어야 이동 방향을 말할 수 있다. 이번 계산은 바퀴 반경/각도의 기하 예측이며 접촉·마찰·슬립을 실행한 근거가 아니다.
바퀴의 연속 회전과 제한된 힌지 회전도 구분한다. 이번90°는 비교할 회전량이지 바퀴의 기계적 상한이 아니다. 임의 ±90° 한계를 넣어 계속 굴러야 할 바퀴를 잠그지 않는다. 실제 한계 유무·부호와 소비 API의 표현은 별도 명세로 확인한다.
서랍은 m/Z-up 장면에서 양의 localX로0~0.25m를 허용한다. 목표0.25m는 이번 포함 경계 계약에 맞지만0.30m는 범위 밖이다. 소비 장면 단위가 cm라면 같은 길이를 나타내는 수치도 달라진다. 목표를 조용히 잘라 넣기 전에 거부/제한 정책을 명시해야 한다. 명령0.25m가 수용됐다고 실제 서랍이 그곳에 도달했다고 기록하지 않는다.
Articulation Root와 world 고정은 별개다
Articulation은 연결된 강체/관절을 관절계로 다루는 구조다. Articulation Root는 이를 파싱/구성하는 범위를 나타내는 표식이며 드라이브나 world 고정 자체를 생성하지 않는다. NVIDIA의 articulation 설명은 body 관계로 정해지는 연결 그래프와 장면 계층을 구분한다. root의 위치와 실제 루트 선택은 소비 런타임·버전의 규칙을 확인해야 한다.
같은 chassis-wheel-drawer 트리라도 chassis가 world에 고정된 변형은 관절 좌표2개만 남는다. 별도 부유 베이스 변형은 베이스의 병진3·회전3에 관절2개가 더해져 기구학 좌표8개다. 둘은 같은 장면에 동시에 적용하는 옵션이 아니다. 바퀴가 지면에 닿아 있다는 사실과 베이스가 world에 Fixed로 묶였다는 조건도 다르다.
이8은 현재 단순 트리의 기구학 자유도다. 접촉의 비미끄럼 제약이나 구동기 수, 원하는 말단 작업의 자유도와 같은 수로 취급하지 않는다. root 표식만 붙여 베이스가 고정됐다고 세거나 메시 자식 수를 DOF로 세면 오류다. 특정 엔진의 자동 root 선택 결과도 원본 파일명만으로 추측하지 말고 파싱된 링크/관절과 실제 가동 범위를 확인한다.
관절·드라이브·관측은 세 단계다
관절은 허용 운동을 정의하고, drive는 목표 위치/속도와 힘·토크 제한 등으로 그 운동을 유도한다. 실제로 어디까지 움직였는지는 관측으로 확인한다. 목표가 있어도 런타임이 드라이브를 소비하지 않았거나, 베이스/관절이 의도치 않게 잠겼거나, 부하·접촉/한계에 걸렸을 수 있다.
아래는 실제 실행이 아닌 제공된 합성 기록이다. 서랍 도착 기준은 목표오차≤0.005m이고 정지 속도≤0.01m/s를0.2초 유지한 관측이다. 경계 포함 여부도 이 활동의 계약이다.
| 기록 | 제공 근거 | 판정 |
|---|---|---|
| D1 | 목표0.25m만 기록, 위치/속도 없음 | 목표만 있음. 도착 미확인 |
| D2 | 목표0.30m, 허용범위0~0.25m | 입력 범위 위반. 실제 drive에 보내기 전 정책에 따라 거부 |
| D3 | 목표0.25m, 위치0.247m·속도0.004m/s가0.2초 유지 | 오차0.003m로 제공 도착 기준 충족 |
| D4 | 목표0.25m, 위치0.247m·속도0.02m/s | 위치만 맞고 정지 조건 미충족 |
D3는 합성 서랍 기록의 기준 통과다. 실제 USD 모델/충돌·작업 안전·물체 상태와 실제 장비 검증을 대신하지 않는다. 먼저 body 연결/두 로컬 프레임·축/단위·root/한계를 검사하고 그 뒤 목표와 관측을 비교하면 구조 오류를 이득 문제로 감추지 않을 수 있다.
기존 3.1 기구학 모델의 URDF→USD 점검과 함께 읽는다. 다음 M25.03 충돌 필터에서는 관절이 맞더라도 의도한 충돌 쌍이 계산되는지를 따로 확인한다.