axis를 어느 좌표계로 읽을 것인가
URDF joint의 parent와 child는 링크 이름을 연결한다. origin은 부모 링크에서 관절 기준 프레임까지의 배치이고 axis는 그 관절 프레임의 운동 축이다. child 프레임은 관절 운동을 반영하여 배치된다. 따라서 axis xyz가 (1,0,0)이라고 언제나 세계나 부모의 +x축이라는 뜻은 아니다. origin의 회전을 먼저 읽어야 한다. 관절의 q=0 위치와 양의 q에 따른 움직임을 나누어 확인한다.
다음은 부모/자식 링크가 따로 정의되어 있다고 가정한 관절 부분 발췌다. 완전한 URDF 파일은 아니다. origin의 rpy는 고정축 roll/pitch/yaw의 rad 단위이며 여기서는 yaw만 π/2다. xyz의 길이 단위는 m다.
<joint name="tilt" type="revolute">
<parent link="base"/><child link="arm"/>
<origin xyz="0 0 0" rpy="0 0 1.57079632679"/>
<axis xyz="1 0 0"/>
<limit lower="-0.5" upper="0.5" effort="1" velocity="2"/>
</joint>
q=0의 관절 프레임은 부모에 대해 z축 +90도로 돌아 있으므로 로컬 +x축은 부모 +y축이다. 양의 q는 그 축에 대한 오른손 회전이다. child의 점 (0,0,1) m를 관절 로컬 x축으로 q만큼 돌리면 (0,−sin q, cos q)이고, 원점의 Rz90을 적용하면 부모에서 (sin q,0, cos q)다. q=0.1 rad면 약 (0.099833,0,0.995004) m다. axis를 부모의 +x로 잘못 읽으면 다른 평면으로 움직이는 모델이 된다. 이 계산은 종이 좌표 점검이며 실제 구동으로 확인하라는 명령이 아니다.
revolute의 lower/upper는 rad, velocity는 rad/s, effort는 N·m다. prismatic은 각각 m, m/s, N이다. fixed는 운동 변수가 없고 continuous는 모델에서 연속 회전을 나타내지만 실제 케이블이나 장치 제한이 사라진다는 뜻은 아니다. 위치 범위를 넣었다고 모든 소비자와 하드웨어가 자동으로 집행하는 것은 아니므로 제어/물리 계층의 제한 적용도 확인한다. Jazzy 관절 설명을 프레임·단위와 함께 읽는다.
mimic은 위치 관계이며 별도 모터 명령이 아니다
mimic은 한 관절값을 다른 관절값의 배율과 오프셋으로 표현하는 관계다. 기준 관절값 q_L, 따르는 값 q_R, 배율 a, 오프셋 b를 쓰면 다음과 같다. 같은 종류/단위의 가상 두 직선 관절을 예로 든다. a는 무차원, b와 q는 m다.
가상 두 손가락의 q_R=−q_L+0.02 m라고 하자. q_L=0.015 m이면 q_R=0.005 m다. origin과 축이 정한 좌표이므로 음의 배율을 ‘언제나 물리적으로 닫힘’이라고 읽지 않는다. 손가락의 축 배치에 따라 의미가 달라진다. 예를 들어 아래 요소는 right_joint 정의 안에 들어가는 관계 발췌다.
<mimic joint="left_joint" multiplier="-1" offset="0.02"/>
left의 범위가 [0,0.04] m이고 right가 [−0.03,0.01] m라면 left 자체의 범위만 검사해서는 안 된다. right 조건을 대입하면 −0.03≤−q_L+0.02≤0.01이므로 0.01≤q_L≤0.05 m다. 원래 left 범위와의 교집합은 [0.01,0.04] m다. q_L=0은 left만 보면 허용되지만 right가 0.02로 상한을 넘는다. 두 제한과 관계를 함께 봐야 한다.
이 관계가 robot_state_publisher에서 프레임 계산에 사용된다는 사실은 실제 손가락 두 개를 기계적으로 결합하거나 두 번째 모터에 명령을 보낸다는 뜻이 아니다. 시뮬레이터나 제어 인터페이스가 mimic을 어떻게 지원하는지 별도로 확인한다. 관계식에서 기준 관절이 존재하는지, 자기 자신을 참조하거나 서로 순환하는지, 배율/오프셋의 단위와 적용 모델이 맞는지도 검사한다. 정상 범위의 숫자 하나만으로 의존 구조를 승인하지 않는다.
링크 연결과 값의 의존성을 다른 그림으로 그린다
URDF의 기본 링크 구조는 이름이 유일한 링크들을 parent→child 관절로 잇는 트리다. 루트 링크는 부모 관절이 없고, 나머지 각 링크에는 부모 관절이 하나다. 모든 링크가 루트에서 도달 가능하며 순환이 없어야 한다. 링크가 n개인 연결 트리의 관절 edge는 n−1개지만 개수만 맞는 것은 충분하지 않다. 분리된 순환과 다른 루트가 섞인 잘못된 그래프도 있으므로 참조 존재·부모 수·도달성·순환을 함께 확인한다.
그림 M08.03-1. 각 칸은 서로 다른 역할/근거다. 나란히 비교할 항목이며 위아래가 시간 순서를 뜻하지 않는다. 직접 제작한 개념도이며 본문의 조건과 함께 읽는다.
가상 링크 base, arm, left, right에서 base→arm, arm→left, arm→right는 base를 루트로 하는 트리다. 여기에 base→right를 추가하면 right에 부모가 두 개 생긴다. 별도 변형으로 right→base를 추가하면 base→arm→right→base 순환이 생긴다. 단순 이름 오타로 child가 ghost를 가리키면 존재하지 않는 링크 참조다. 이 실패들은 서로 다른 검수 항목이며 XML 문법만으로 모두 발견할 수 없다.
mimic의 left_joint→right_joint 의존 관계는 링크 트리의 추가 기계 연결 edge가 아니다. mimic을 표시하려고 left 링크를 right의 부모로 무조건 바꾸면 원래 기구의 프레임 배치를 바꿀 수 있다. 기하 연결 그래프와 값의 의존 그래프를 따로 그린 뒤 함께 검토한다. 델타 같은 실제 폐루프를 표현할 때도 일반 트리에 중복 부모를 넣는 것만으로 완성되지 않으며 사용 도구의 제약 표현이 추가로 필요하다.
검수는 확장된 최종 URDF를 대상으로 한다. Xacro 원본의 매크로 이름이 달라도 확장 링크/관절 이름이 중복될 수 있다. 파서의 트리 검사를 통과한 다음에도 축 방향·영점·범위·mimic 관계와 실제 구조의 일치를 확인한다. 화면에서 움직여 보였다는 사실만으로 물리적 결합이나 안전이 검증된 것은 아니다. 기존 3.1 모델 사슬의 부모·축·영점과 이 검사 항목을 연결한다.