로봇의 설명 파일과 로봇의 실행을 구분한다
URDF(Unified Robot Description Format)는 로봇의 링크와 관절, 형상과 물리 정보를 XML로 기술하는 형식이다. link는 강체로 모델링할 부분과 그 기준 프레임을 나타내고 joint는 부모 링크와 자식 링크의 연결 및 허용 운동을 정한다. 기본 기구학 구조는 트리이며 폐루프의 모든 연결을 일반적인 부모/자식 관계로 중복 연결하는 방식과는 다르다. 모델을 읽고 프레임을 계산하는 일과 모터에 명령을 보내는 일도 별개다.
그림 M08.01-1. 각 칸은 서로 다른 역할/근거다. 나란히 비교할 항목이며 위아래가 시간 순서를 뜻하지 않는다. 직접 제작한 개념도이며 본문의 조건과 함께 읽는다.
링크 프레임의 원점이 항상 외형 중앙이나 질량중심일 필요는 없다. 관절 축과 조립 기준에 맞춰 놓을 수 있다. joint의 origin은 부모 링크에서 관절 기준을 배치하는 변환이고, axis는 그 관절 프레임에서의 회전/이동 축이다. q=0의 배치와 움직인 뒤의 링크 자세를 구분한다. 단위는 일반적으로 길이 m, 각도 rad, 질량 kg를 사용한다. 표현 프레임과 단위를 확인하지 않으면 모양이 맞아 보여도 기구학이 다를 수 있다.
각 링크 안의 visual은 화면에 그릴 형상과 재질을, collision은 충돌 계산에 쓸 형상을, inertial은 질량·질량중심·회전 관성을 기술한다. 세 요소는 같은 링크 프레임에 붙지만 목적과 원점이 따로다. visual을 복잡한 메시로 만들고 collision을 간단한 상자로 근사할 수 있다. 이 근사는 계산 비용과 빈 공간/접촉 오차의 절충이며 시각적으로 비슷하다는 이유로 충돌 품질을 보장하지 않는다. inertial의 값도 화면의 색이나 메시에서 항상 자동 추정되는 것이 아니다.
한 링크의 세 원점을 읽는다
가상 arm 링크는 x길이 0.2 m, y와 z길이 각각 0.1 m인 균질 상자다. 링크 원점은 상자의 왼쪽 끝 중앙이고, 상자 중심은 링크에서 (0.1,0,0) m다. visual/collision의 box는 각각 자기 원점 중심에 놓이므로 두 origin을 모두 이 위치로 둔다. 균질 질량 1 kg의 질량중심도 같은 곳이라고 가정하여 inertial origin에도 (0.1,0,0)을 적는다. 각 요소의 rpy는 0으로 두어 축이 링크와 같다고 명시한다.
균질 상자의 질량중심 축 관성은 각 축에 수직인 두 길이 제곱의 합에 m/12를 곱한다. a, b, c는 각각 x/y/z 길이이며 여기의 m은 질량 기호다.
이번 값은 Ixx≈0.00166667, Iyy=Izz≈0.00416667 kg·m²다. 질량중심에 놓은 상자의 대칭 축과 정렬되어 ixy, ixz, iyz는 0이다. 일반 관성 텐서는 대칭 3×3이므로 대각 3개와 비대각 3개를 저장한다. inertial의 관성은 그 원점인 질량중심과 그 축 방향을 기준으로 읽는다. 링크 원점이 끝에 있다고 관성을 끝점 기준으로 바꾸어 그대로 넣지 않는다. 기준점 이동과 회전 변환은 M08.04에서 더 다룬다.
다음은 읽기 위한 완전한 교육용 URDF다. base는 기하 계산의 고정 기준으로 취급하며 전체 시뮬레이션의 고정/물리 설정을 제공하는 예는 아니다. 어떤 장치에도 적용하지 않는다.
<robot name="paper_arm">
<link name="base"/>
<link name="arm">
<visual>
<origin xyz="0.1 0 0" rpy="0 0 0"/>
<geometry><box size="0.2 0.1 0.1"/></geometry>
</visual>
<collision>
<origin xyz="0.1 0 0" rpy="0 0 0"/>
<geometry><box size="0.2 0.1 0.1"/></geometry>
</collision>
<inertial>
<origin xyz="0.1 0 0" rpy="0 0 0"/>
<mass value="1"/>
<inertia ixx="0.0016666667" ixy="0" ixz="0"
iyy="0.0041666667" iyz="0" izz="0.0041666667"/>
</inertial>
</link>
<joint name="hinge" type="revolute">
<parent link="base"/><child link="arm"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit lower="-1" upper="1" effort="1" velocity="2"/>
</joint>
</robot>
hinge는 +z 회전이며 q=0에서 두 링크 프레임이 일치한다. 위치 범위는 [−1,1] rad, 기록된 effort는 회전 토크 N·m, velocity는 rad/s다. 이 선언이 실제 제어기와 물리 엔진에서 자동으로 모든 한계를 집행한다는 뜻은 아니다. 적용하는 도구와 구동 계층의 동작을 확인한다. q=0.5 rad라면 상자 중심의 base 좌표는 (0.1 cos0.5,0.1 sin0.5,0)≈(0.087758,0.047943,0) m다. visual 중심과 질량중심이 같은 이유는 이번 균질 가정이지 모든 모델의 기본 규칙이 아니다.
그림 M08.01-2. 회색 표시 형상과 파란 충돌 근사 상자, 주황 질량중심은 역할이 다르다. link 원점을 형상의 중앙/COM과 자동으로 같다고 놓지 않는다. 축척이나 실제 관성값이 없는 개념도다. 직접 제작.
무엇을 통과했는지 구체적으로 남긴다
XML이 잘 닫혔다는 문법 확인, URDF의 링크 이름과 트리·관절 조건 확인, 시각 표시, 충돌 근사와 물리 파라미터 확인, 제어/하드웨어 인터페이스 확인은 다른 단계다. 표준 XML 파서가 성공해도 URDF 의미나 시뮬레이터의 물리 요구를 전부 검증한 것은 아니다. RViz에서 visual이 보였다는 사실도 collision과 inertial의 적합성을 입증하지 않는다. 공식 물리/충돌 튜토리얼을 이 역할 분리로 읽는다.
메시 크기를 바꾸거나 도구를 추가하면 질량·질량중심·관성을 다시 검토한다. 시각 요소만 변경한 파일이 물리 요소까지 바꿨다고 가정하지 않는다. 관절의 허용 범위와 model의 effort 숫자도 실제 제품의 연속/peak 정격과 별도 출처를 갖는다. 가상 값을 그럴듯하게 채워 파싱 성공으로 통과시키지 않고 어떤 근거로 정했는지 남긴다. 기존 3.1의 기구학 사슬과 2.7의 관성은 이 기본 모델을 더 큰 구조로 확장하는 상세 자료다.