로봇 시뮬레이션에서 로봇의 정확한 동작과 상호작용을 구현하기 위해서는 로봇의 구조를 정밀하게 모델링하는 것이 필수적이다. URDF(Unified Robot Description Format)는 로봇의 물리적 특성과 구조를 정의하는 XML 기반의 파일 포맷으로, ROS(Robot Operating System)와 함께 널리 사용된다. 이 절에서는 URDF 파일을 이용한 로봇 모델링의 기본 개념과 구성 요소, 작성 방법에 대해 자세히 살펴본다.

URDF의 기본 개념

URDF는 로봇의 각 구성 요소인 링크(link)와 조인트(joint)를 정의하여 로봇의 전체 구조를 기술한다. 링크는 로봇의 각 부분을 나타내며, 조인트는 링크 간의 연결과 운동 방식을 정의한다. URDF 파일은 이러한 링크와 조인트의 계층적 구조를 통해 로봇의 전체적인 동작을 시뮬레이션할 수 있도록 한다.

URDF 파일의 구조

URDF 파일은 XML 형식으로 작성되며, 기본적으로 <robot> 태그로 시작하여 로봇의 이름을 지정한다. 그 내부에 여러 개의 <link><joint> 태그가 포함되어 로봇의 각 구성 요소와 그 관계를 정의한다.

<robot name="my_robot">
  <!-- 링크 정의 -->
  <link name="base_link">
    <!-- 링크의 물리적 속성 -->
  </link>

  <!-- 조인트 정의 -->
  <joint name="base_to_link1" type="revolute">
    <!-- 조인트의 속성 -->
  </joint>

  <!-- 추가적인 링크와 조인트 -->
</robot>

링크는 로봇의 고정된 부분 또는 움직이는 부분을 나타낸다. 각 링크는 고유한 이름을 가지며, 질량, 관성, 시각적 모델, 충돌 모델 등의 물리적 속성을 포함할 수 있다.

링크의 주요 요소

<link name="base_link">
  <inertial>
    <mass value="5.0"/>
    <inertia ixx="0.1" ixy="0.0" ixz="0.0"
             iyy="0.1" iyz="0.0"
             izz="0.1"/>
  </inertial>
  <visual>
    <geometry>
      <box size="1 1 0.5"/>
    </geometry>
    <material name="blue">
      <color rgba="0 0 1 1"/>
    </material>
  </visual>
  <collision>
    <geometry>
      <box size="1 1 0.5"/>
    </geometry>
  </collision>
</link>

조인트(Joint) 정의

조인트는 두 링크 사이의 연결과 그 연결을 통해 가능한 움직임을 정의한다. 조인트는 고정(fixed), 회전(revolute), 선형(prismatic) 등 다양한 타입이 있으며, 각 타입에 따라 로봇의 움직임 방식이 결정된다.

조인트의 주요 요소

<joint name="base_to_link1" type="revolute">
  <parent link="base_link"/>
  <child link="link1"/>
  <origin xyz="0 0 0.5" rpy="0 0 0"/>
  <axis xyz="0 0 1"/>
  <limit lower="-1.57" upper="1.57" effort="10" velocity="1.0"/>
</joint>

URDF 작성 시 고려사항

URDF 파일을 작성할 때는 로봇의 물리적 특성과 동작 방식을 정확하게 반영하는 것이 중요하다. 다음은 URDF 작성 시 고려해야 할 주요 사항들이다.

URDF 예제: 간단한 로봇 팔

아래는 두 개의 링크와 하나의 회전 조인트로 구성된 간단한 로봇 팔의 URDF 예제이다.

<robot name="simple_arm">
  <link name="base_link">
    <inertial>
      <mass value="2.0"/>
      <inertia ixx="0.1" ixy="0.0" ixz="0.0"
               iyy="0.1" iyz="0.0"
               izz="0.1"/>
    </inertial>
    <visual>
      <geometry>
        <cylinder radius="0.5" length="0.2"/>
      </geometry>
      <material name="green">
        <color rgba="0 1 0 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <cylinder radius="0.5" length="0.2"/>
      </geometry>
    </collision>
  </link>

  <link name="link1">
    <inertial>
      <mass value="1.0"/>
      <inertia ixx="0.05" ixy="0.0" ixz="0.0"
               iyy="0.05" iyz="0.0"
               izz="0.05"/>
    </inertial>
    <visual>
      <geometry>
        <box size="1 0.2 0.2"/>
      </geometry>
      <material name="red">
        <color rgba="1 0 0 1"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <box size="1 0.2 0.2"/>
      </geometry>
    </collision>
  </link>

  <joint name="base_to_link1" type="revolute">
    <parent link="base_link"/>
    <child link="link1"/>
    <origin xyz="0 0 0.1" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit lower="-1.57" upper="1.57" effort="5" velocity="1.0"/>
  </joint>
</robot>

이 예제에서는 base_linklink1이라는 두 개의 링크가 정의되어 있으며, base_to_link1이라는 회전 조인트로 연결되어 있다. base_link는 원통형으로 시각화되며, link1은 상자 형태로 시각화된다. 조인트는 Z축을 중심으로 회전할 수 있으며, 회전 범위는 -90도에서 90도로 설정되어 있다.

URDF의 고급 기능

기본적인 링크와 조인트 정의 외에도 URDF는 로봇의 동작을 보다 정밀하게 모델링하기 위해 다양한 고급 기능을 제공한다. 이 절에서는 URDF의 고급 기능인 Transmission, Sensor, 그리고 Plugin 등을 다루며, 이를 통해 로봇 시뮬레이션의 현실감을 높이는 방법을 설명한다.

Transmission 정의

Transmission은 로봇의 조인트가 실제로 어떻게 구동되는지를 정의하는 요소이다. 주로 로봇의 구동 메커니즘을 시뮬레이션할 때 사용되며, 모터와 조인트 간의 연결 방식을 설정한다. Transmission 요소는 주로 ROS와의 통합에서 중요한 역할을 한다.

Transmission의 주요 요소
<transmission name="trans1">
  <type>transmission_interface/SimpleTransmission</type>
  <joint name="base_to_link1"/>
  <actuator name="motor1">
    <mechanicalReduction>1</mechanicalReduction>
  </actuator>
</transmission>
Transmission 예제

다음은 간단한 회전 조인트에 Transmission을 추가한 예제이다.

<transmission name="base_to_link1_trans">
  <type>transmission_interface/SimpleTransmission</type>
  <joint name="base_to_link1"/>
  <actuator name="motor1">
    <mechanicalReduction>2</mechanicalReduction>
  </actuator>
</transmission>

이 예제에서는 base_to_link1 조인트에 motor1이라는 액추에이터가 연결되어 있으며, 기계적 감속비가 2로 설정되어 있다. 이는 모터의 회전이 조인트에 전달될 때 두 배로 감속됨을 의미한다.

센서 정의

URDF는 로봇에 부착된 다양한 센서를 정의할 수 있는 기능을 제공한다. 센서 정의는 주로 시뮬레이션에서 로봇의 환경 인식을 구현할 때 사용된다. URDF 자체에는 센서에 대한 직접적인 지원이 제한적이지만, Gazebo와 같은 시뮬레이터와의 통합을 통해 센서를 정의할 수 있다.

센서의 주요 요소
카메라 센서 예제

다음은 로봇에 카메라 센서를 추가하는 URDF 예제이다.

<link name="camera_link">
  <visual>
    <geometry>
      <box size="0.1 0.1 0.1"/>
    </geometry>
    <material name="black">
      <color rgba="0 0 0 1"/>
    </material>
  </visual>
  <collision>
    <geometry>
      <box size="0.1 0.1 0.1"/>
    </geometry>
  </collision>
</link>

<joint name="camera_joint" type="fixed">
  <parent link="link1"/>
  <child link="camera_link"/>
  <origin xyz="0 0 0.5" rpy="0 0 0"/>
</joint>

<!-- Gazebo 전용 센서 정의 -->
<gazebo reference="camera_link">
  <sensor type="camera" name="front_camera">
    <pose>0 0 0 0 0 0</pose>
    <camera>
      <horizontal_fov>1.047</horizontal_fov>
      <image>
        <width>640</width>
        <height>480</height>
        <format>R8G8B8</format>
      </image>
      <clip>
        <near>0.1</near>
        <far>100</far>
      </clip>
    </camera>
    <always_on>true</always_on>
    <update_rate>30.0</update_rate>
  </sensor>
</gazebo>

이 예제에서는 camera_link라는 새로운 링크를 추가하고, 이를 기존의 link1에 고정 조인트로 연결한다. 이후 Gazebo 전용 태그를 사용하여 카메라 센서를 정의한다. 카메라의 시야각, 해상도, 클리핑 범위 등을 설정할 수 있다.

URDF에서의 Mesh 사용

로봇의 시각적 및 충돌 메쉬를 정의할 때, URDF는 외부 메쉬 파일을 참조할 수 있는 기능을 제공한다. 메쉬 파일은 로봇의 복잡한 형상을 보다 정밀하게 표현할 수 있도록 도와준다.

Mesh 정의의 주요 요소
<visual>
  <geometry>
    <mesh filename="package://my_robot/meshes/base.dae" scale="1 1 1"/>
  </geometry>
  <material name="grey">
    <color rgba="0.5 0.5 0.5 1"/>
  </material>
</visual>
Mesh 사용 시 고려사항

URDF의 제한 사항 및 확장

URDF는 로봇 모델링에 있어 강력한 도구이지만, 몇 가지 제한 사항이 존재한다. 이러한 제한을 극복하기 위해 URDF의 확장 형식이나 대체 포맷인 SDF(Simulation Description Format)를 사용할 수 있다.

URDF의 제한 사항
URDF 확장

URDF의 기능을 확장하기 위해 Gazebo URDF Extensions와 같은 확장 태그를 사용할 수 있다. 이는 Gazebo 시뮬레이터와의 통합을 강화하며, 센서나 물리적 속성을 보다 정밀하게 설정할 수 있게 해준다.

<gazebo>
  <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
    <robotNamespace>/my_robot</robotNamespace>
  </plugin>
</gazebo>
SDF와의 비교

SDF는 URDF의 한계를 보완하기 위해 설계된 포맷으로, 보다 풍부한 기능과 유연성을 제공한다. SDF는 로봇뿐만 아니라 환경, 센서, 플러그인 등 다양한 요소를 포괄적으로 정의할 수 있다. 그러나 URDF는 ROS와의 호환성 측면에서 여전히 널리 사용된다.