659.94 URDF를 이용한 프레임 정의

1. 개요

URDF(Unified Robot Description Format)는 로봇의 물리적 구조를 XML 형식으로 기술하는 ROS 표준 포맷이다. URDF는 로봇을 링크(link)와 관절(joint)의 트리 구조로 표현하며, 각 링크에 좌표 프레임이 할당된다. URDF에서 정의된 로봇 모델은 robot_state_publisher에 의하여 TF2 변환 트리로 자동 발행되므로, URDF의 프레임 정의는 TF2 좌표 변환의 근간이 된다.

2. URDF의 기본 구조

2.1 핵심 요소

URDF는 다음의 핵심 XML 요소로 구성된다.

요소역할TF2와의 관계
<robot>로봇 모델의 최상위 요소TF2 트리의 범위를 정의
<link>강체(rigid body) 부품 정의TF2 프레임에 대응
<joint>두 링크 간의 연결 정의TF2 변환에 대응

2.2 최소 URDF 구조

<?xml version="1.0" encoding="UTF-8"?>
<robot name="my_robot">

  <!-- 첫 번째 링크 (base_link) -->
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.5 0.3 0.15"/>
      </geometry>
    </visual>
  </link>

  <!-- 두 번째 링크 -->
  <link name="sensor_link">
    <visual>
      <geometry>
        <cylinder radius="0.03" length="0.05"/>
      </geometry>
    </visual>
  </link>

  <!-- 관절: base_link → sensor_link -->
  <joint name="sensor_joint" type="fixed">
    <parent link="base_link"/>
    <child link="sensor_link"/>
    <origin xyz="0.3 0.0 0.15" rpy="0 0 0"/>
  </joint>

</robot>

3. 링크(Link) 요소

3.1 링크의 하위 요소

<link name="link_name">
  <!-- 시각적 표현 (RViz2 시각화) -->
  <visual>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
      <box size="0.5 0.3 0.15"/>     <!-- 상자 -->
      <!-- <cylinder radius="0.05" length="0.1"/> -->
      <!-- <sphere radius="0.05"/> -->
      <!-- <mesh filename="package://pkg/meshes/part.dae"/> -->
    </geometry>
    <material name="grey">
      <color rgba="0.5 0.5 0.5 1.0"/>
    </material>
  </visual>

  <!-- 충돌 검사용 형상 (Gazebo 물리 시뮬레이션) -->
  <collision>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <geometry>
      <box size="0.5 0.3 0.15"/>
    </geometry>
  </collision>

  <!-- 관성 특성 (Gazebo 동역학 시뮬레이션) -->
  <inertial>
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <mass value="10.0"/>
    <inertia ixx="0.1" ixy="0" ixz="0"
             iyy="0.15" iyz="0" izz="0.2"/>
  </inertial>
</link>

3.2 프레임과의 관계

각 링크에는 자동으로 좌표 프레임이 할당되며, 이 프레임의 원점과 방향은 관절(joint)의 <origin> 요소에 의하여 결정된다. 링크 내부의 <visual>, <collision>, <inertial> 요소의 <origin>은 링크 프레임에 대한 상대적 위치를 나타낸다.

4. 관절(Joint) 요소

4.1 관절 유형

유형설명자유도TF2 변환 유형
fixed고정 관절 (이동 불가)0정적 변환
revolute회전 관절 (각도 제한 있음)1동적 변환
continuous연속 회전 관절 (각도 제한 없음)1동적 변환
prismatic직선 관절 (병진 운동)1동적 변환
floating6자유도 자유 관절6동적 변환
planar2D 평면 운동 관절3동적 변환

4.2 관절의 하위 요소

<joint name="joint_name" type="revolute">
  <!-- 부모-자식 관계 -->
  <parent link="parent_link"/>
  <child link="child_link"/>

  <!-- 변환: 부모 프레임에서 자식 프레임으로의 변환 -->
  <origin xyz="0.0 0.0 0.1" rpy="0 0 0"/>

  <!-- 회전/병진 축 (revolute, continuous, prismatic) -->
  <axis xyz="0 0 1"/>

  <!-- 관절 제한 (revolute, prismatic) -->
  <limit lower="-1.57" upper="1.57"
         velocity="1.0" effort="100.0"/>

  <!-- 동역학 특성 -->
  <dynamics damping="0.1" friction="0.05"/>
</joint>

4.3 origin 요소의 의미

<origin xyz="x y z" rpy="roll pitch yaw"/>는 부모 링크의 프레임에서 자식 링크의 프레임으로의 정적 오프셋을 정의한다. 이 오프셋은 관절이 초기 위치(0)에 있을 때의 두 프레임 사이의 관계이다.

T_{\text{parent} \leftarrow \text{child}} = T_{\text{translation}}(x, y, z) \cdot T_{\text{rotation}}(\phi, \theta, \psi)

여기서 \phi, \theta, \psi는 각각 Roll, Pitch, Yaw이며, 고정 축(fixed-axis) XYZ 순서로 회전이 적용된다.

5. TF2 프레임 트리와의 대응

5.1 URDF에서 TF2로의 변환 규칙

  1. <link> 요소는 하나의 TF2 프레임에 대응한다.
  2. <joint> 요소는 부모 프레임에서 자식 프레임으로의 TransformStamped에 대응한다.
  3. fixed 관절은 /tf_static으로 발행된다.
  4. 가동 관절(revolute, continuous, prismatic)은 /tf로 발행된다.

5.2 트리 구조의 제약

URDF는 트리(tree) 구조만을 허용하며, 순환(cycle)이나 다중 부모를 허용하지 않는다. 이는 TF2의 단일 트리 제약과 일치한다. 폐쇄 체인 기구(closed-chain mechanism)는 URDF로 직접 표현할 수 없으며, 추가적인 가상 관절이나 플러그인이 필요하다.

6. 프레임 정의 예시

6.1 이동 로봇

<robot name="mobile_robot">
  <!-- 본체 -->
  <link name="base_link">
    <visual>
      <geometry><box size="0.5 0.3 0.15"/></geometry>
    </visual>
    <collision>
      <geometry><box size="0.5 0.3 0.15"/></geometry>
    </collision>
    <inertial>
      <mass value="10.0"/>
      <inertia ixx="0.1" ixy="0" ixz="0"
               iyy="0.15" iyz="0" izz="0.2"/>
    </inertial>
  </link>

  <!-- 좌측 바퀴 -->
  <link name="wheel_left_link">
    <visual>
      <geometry><cylinder radius="0.05" length="0.02"/></geometry>
    </visual>
  </link>
  <joint name="wheel_left_joint" type="continuous">
    <parent link="base_link"/>
    <child link="wheel_left_link"/>
    <origin xyz="0.0 0.17 -0.05" rpy="-1.5708 0 0"/>
    <axis xyz="0 0 1"/>
  </joint>

  <!-- 우측 바퀴 -->
  <link name="wheel_right_link">
    <visual>
      <geometry><cylinder radius="0.05" length="0.02"/></geometry>
    </visual>
  </link>
  <joint name="wheel_right_joint" type="continuous">
    <parent link="base_link"/>
    <child link="wheel_right_link"/>
    <origin xyz="0.0 -0.17 -0.05" rpy="-1.5708 0 0"/>
    <axis xyz="0 0 1"/>
  </joint>

  <!-- 전방 LiDAR -->
  <link name="laser_link">
    <visual>
      <geometry><cylinder radius="0.03" length="0.04"/></geometry>
    </visual>
  </link>
  <joint name="laser_joint" type="fixed">
    <parent link="base_link"/>
    <child link="laser_link"/>
    <origin xyz="0.25 0.0 0.12" rpy="0 0 0"/>
  </joint>
</robot>

7. URDF 유효성 검증

7.1 check_urdf 도구

# URDF 파일의 구문 및 구조 검증
check_urdf robot.urdf

이 도구는 URDF 파일의 XML 구문, 링크-관절 연결의 유효성, 트리 구조의 단일 루트 조건 등을 검증한다.

7.2 urdf_to_graphviz 도구

# URDF 구조를 그래프로 시각화
urdf_to_graphviz robot.urdf

이 도구는 URDF의 링크-관절 구조를 Graphviz DOT 형식으로 출력하며, 이를 통하여 프레임 트리의 구조를 시각적으로 확인할 수 있다.

8. 요약

URDF는 로봇의 물리적 구조를 링크와 관절의 트리로 기술하며, 각 링크는 TF2 프레임에, 각 관절은 TF2 변환에 대응한다. 관절의 <origin> 요소가 두 프레임 사이의 정적 오프셋을 정의하며, 고정 관절은 정적 변환으로, 가동 관절은 동적 변환으로 발행된다. URDF의 정확한 작성은 TF2 변환 트리의 정확성을 보장하는 근간이다.


참고 문헌 및 출처

  • ROS2 공식 문서, “URDF Tutorials”, https://docs.ros.org/en/humble/Tutorials/Intermediate/URDF/ (ROS2 Humble Hawksbill)
  • URDF XML Specification, http://wiki.ros.org/urdf/XML
  • urdf 패키지 API 문서, https://docs.ros2.org/latest/api/urdf/ (ROS2 Humble Hawksbill)