개요

URDF(Universal Robot Description Format)와 SDF(Simulation Description Format)는 둘 다 로봇의 구조, 물리적 특성, 시각적 요소 등을 정의하는 파일 포맷이다. 이 둘은 서로 다른 목적과 기능을 가지고 있어 특정 상황에서 적합한 형식을 선택하는 것이 중요하다. URDF는 주로 로봇의 기본 구조를 정의하는 데 사용되며, 주로 ROS(Robot Operating System)와 연동된다. 반면, SDF는 더 복잡한 시뮬레이션을 위해 설계되었으며, Gazebo와 같은 시뮬레이션 환경에서 주로 사용된다.

1. 파일 포맷의 구조

URDF는 XML 기반의 구조로서, 비교적 간단하고 직관적인 파일 구조를 가지고 있다. 하지만 그 단순성 때문에 복잡한 시뮬레이션 기능을 지원하는 데 한계가 있다. 반면 SDF는 URDF와 마찬가지로 XML을 사용하지만, 보다 복잡한 요소들을 정의할 수 있도록 다양한 태그와 속성들이 추가되어 있다. 예를 들어, 물리 엔진 설정, 센서 통합, 환경 모델링 등이 SDF에서 더 쉽게 설정될 수 있다.

URDF는 기본적으로 다음과 같은 구조를 갖는다:

<robot name="my_robot">
  <link name="base_link">
    <inertial>...</inertial>
    <visual>...</visual>
    <collision>...</collision>
  </link>
  <joint name="joint1" type="revolute">
    <parent link="base_link"/>
    <child link="link1"/>
    <axis xyz="0 0 1"/>
  </joint>
</robot>

반면 SDF의 구조는 URDF보다 복잡하며, 다음과 같은 추가 요소들을 포함할 수 있다:

<model name="my_robot">
  <link name="base_link">
    <inertial>...</inertial>
    <visual>...</visual>
    <collision>...</collision>
  </link>
  <joint name="joint1">
    <parent>base_link</parent>
    <child>link1</child>
    <axis>...</axis>
  </joint>
  <sensor type="camera" name="camera1">
    <camera>...</camera>
  </sensor>
</model>

SDF는 URDF에 비해 더 많은 세부 사항을 포함할 수 있으며, 복잡한 시뮬레이션 요구 사항을 충족하는 데 유리한다.

2. 물리 엔진 설정

URDF는 기본적으로 물리 엔진 설정에 대한 세부적인 조정이 불가능한다. 물리 엔진과 관련된 특성은 주로 기본적인 질량, 관성 모멘트, 마찰 계수 등의 간단한 물리적 속성으로 제한된다.

반면 SDF는 다양한 물리 엔진을 설정할 수 있으며, 이를 통해 로봇의 동작이 실제 물리 환경에서 어떻게 이루어지는지를 더 정밀하게 시뮬레이션할 수 있다. SDF는 물리 엔진을 제어하기 위해 다음과 같은 태그들을 사용한다:

<physics name="default_physics" type="ode">
  <gravity>0 0 -9.81</gravity>
  <max_step_size>0.001</max_step_size>
  <real_time_factor>1</real_time_factor>
</physics>

이를 통해 중력, 마찰력, 충돌 처리 등의 다양한 물리적 특성을 설정할 수 있으며, Gazebo와 같은 시뮬레이션 환경에서 실제 로봇과 유사한 환경을 구성하는 데 유리한다.

3. 시각적 요소와 충돌 모델

URDF에서 시각적 요소와 충돌 모델은 일반적으로 동일한 방식으로 정의되지만, 시뮬레이션의 목적에 따라 이를 분리하여 정의할 수 있다. URDF는 로봇의 외형(시각적 요소)을 단순히 정의하는 데 중점을 두고 있으며, 이를 위해 STL, Collada와 같은 메쉬 파일을 사용한다. 그러나 시각적 요소와 물리적 요소의 차별화는 다소 제한적이다.

<link name="link1">
  <visual>
    <geometry>
      <mesh filename="meshes/link1.stl"/>
    </geometry>
  </visual>
  <collision>
    <geometry>
      <box size="1 1 1"/>
    </geometry>
  </collision>
</link>

URDF는 시각적 모델과 충돌 모델을 동일한 메쉬로 사용할 수도 있지만, 충돌 모델을 간단한 기하학적 형태로 정의하는 것이 일반적이다. 충돌 모델이 복잡하면 시뮬레이션 성능에 영향을 미칠 수 있기 때문이다.

반면, SDF는 시각적 요소와 충돌 모델을 분리하고, 더 다양한 설정을 통해 시뮬레이션 성능을 최적화할 수 있다. SDF에서는 시각적 요소와 충돌 요소를 더욱 구체적으로 정의할 수 있으며, 특히 복잡한 충돌 모델을 효율적으로 처리할 수 있다.

<link name="link1">
  <visual name="visual1">
    <geometry>
      <mesh uri="meshes/link1.dae"/>
    </geometry>
    <material>
      <script>
        <name>Gazebo/Red</name>
      </script>
    </material>
  </visual>
  <collision name="collision1">
    <geometry>
      <box>
        <size>1 1 1</size>
      </box>
    </geometry>
  </collision>
</link>

이처럼 SDF는 시각적 모델과 물리적 충돌 모델을 분리하여 처리할 수 있으며, 복잡한 메쉬 파일을 사용하는 경우에도 효율적인 시뮬레이션을 보장한다.

4. 센서 통합

URDF는 센서 통합 기능이 제한적이다. 기본적으로 센서를 URDF 파일 내에서 정의하는 것은 불가능하며, 센서 플러그인을 사용하여 이를 보완해야 한다. 즉, URDF 자체는 센서 모델을 정의하기에 적합하지 않으며, 센서 데이터를 처리하기 위한 별도의 설정이 필요하다.

<!-- URDF 내에서는 센서를 직접 정의하지 않음 -->

반면, SDF는 다양한 센서의 정의와 통합을 지원한다. 카메라, LIDAR, IMU 등과 같은 센서를 SDF 파일 내에서 직접 정의할 수 있으며, 이를 통해 Gazebo와 같은 시뮬레이션 환경에서 더욱 정교한 센서 데이터를 생성하고 처리할 수 있다.

<sensor name="camera1" type="camera">
  <camera>
    <horizontal_fov>1.047</horizontal_fov>
    <image>
      <width>800</width>
      <height>600</height>
    </image>
  </camera>
</sensor>

SDF에서 센서를 정의하면, 시뮬레이션 환경에서 실시간으로 센서 데이터를 생성하고 이를 처리하는 것이 가능한다. 이는 복잡한 로봇 시스템에서 다양한 센서를 통합하여 사용할 때 매우 유용하다.

5. 동적 환경 모델링

URDF는 동적 환경을 모델링하는 데 한계가 있다. URDF는 로봇 자체의 구조와 물리적 특성에 초점을 맞추고 있기 때문에, 시뮬레이션 환경을 정의하는 데 적합하지 않는다. 환경 요소를 추가하거나, 지형, 빌딩과 같은 동적 요소를 정의하는 기능이 부족한다. 이는 URDF가 기본적으로 로봇의 모양과 구성 요소만을 다루는 파일 포맷이기 때문이다.

<!-- URDF 내에서 환경을 정의할 수 없음 -->

SDF는 동적 환경을 모델링할 수 있는 다양한 기능을 제공한다. 예를 들어, 지형, 물체, 빌딩과 같은 환경 요소를 정의하고, 이를 물리 엔진과 연동하여 시뮬레이션할 수 있다. 또한, 동적 환경 요소와 로봇 간의 상호작용을 설정할 수 있어, 로봇의 실제 환경에서의 동작을 보다 현실적으로 시뮬레이션할 수 있다.

<world name="default">
  <include>
    <uri>model://ground_plane</uri>
  </include>
  <include>
    <uri>model://sun</uri>
  </include>
  <model name="building">
    <static>true</static>
    <link name="link">
      <visual name="visual">
        <geometry>
          <mesh uri="meshes/building.dae"/>
        </geometry>
      </visual>
    </link>
  </model>
</world>

위와 같이 SDF를 사용하면 로봇 외에도 다양한 환경 요소를 시뮬레이션에 추가할 수 있으며, 이러한 요소들은 로봇과의 물리적 상호작용을 고려해 시뮬레이션 성능을 조정할 수 있다. 이는 특히 다수의 로봇이 상호작용하거나, 복잡한 환경에서 로봇이 작업을 수행하는 경우에 유용하다.

6. 확장성 및 고급 기능

URDF는 상대적으로 단순한 구조로 인해 확장성에 한계가 있다. 복잡한 물리적 특성이나, 고급 시뮬레이션 기능을 구현하기 위해서는 추가적인 플러그인이나 도구를 사용해야 한다. 이는 로봇의 물리적 특성을 더 세밀하게 조정하거나, 동적 환경에서의 상호작용을 시뮬레이션하는 데 불편함을 초래할 수 있다.

SDF는 Gazebo와 같은 고급 시뮬레이션 환경과 직접 연동되며, 다양한 물리 엔진과의 호환성을 지원한다. 또한 SDF는 복잡한 로봇 시스템과 환경을 다룰 수 있는 확장성을 제공하며, 로봇의 동작을 더 정밀하게 시뮬레이션할 수 있다. 예를 들어, SDF는 URDF에서 다루지 못하는 복잡한 구동 시스템, 멀티 조인트 로봇, 복합 센서 시스템 등을 처리할 수 있다.

<plugin name="skid_steer_controller" filename="libgazebo_ros_skid_steer_drive.so">
  <ros>
    <namespace>/robot</namespace>
  </ros>
  <command_topic>cmd_vel</command_topic>
  <odometry_topic>odom</odometry_topic>
</plugin>

위와 같은 플러그인을 통해 SDF는 고급 제어 알고리즘, 센서 데이터 처리, 로봇의 자율 주행 시뮬레이션 등을 효과적으로 지원할 수 있다. SDF는 복잡한 로봇 시스템을 위한 확장 가능성을 제공하여, URDF에서 처리할 수 없는 고급 기능을 활용할 수 있도록 돕는다.

7. 시간 및 실시간 요소 처리

URDF는 시간과 관련된 처리에 대해 제한된 기능만을 제공한다. 로봇의 기본적인 구조와 물리적 특성을 정의하는 데 중점을 두기 때문에, 시뮬레이션 내에서 시간이 흐르거나 실시간 요소가 반영되는 동작을 효과적으로 처리하는 데 한계가 있다. 이를 보완하기 위해 URDF는 ROS와 같은 시스템과 연동되어 ROS 노드를 통해 실시간 제어와 상태 피드백을 처리하지만, 자체적으로는 시간 요소를 고려한 복잡한 동작 시뮬레이션을 제공하지 않는다.

<!-- URDF 내에서는 시간 관련 요소를 처리할 수 없음 -->

SDF는 시간과 실시간 요소를 처리하는 기능을 제공한다. 시뮬레이션 중 시간이 경과함에 따라 로봇의 동작이나 환경의 변화를 시뮬레이션할 수 있으며, 이를 통해 실제 환경과 유사한 조건에서 로봇을 테스트할 수 있다. 예를 들어, SDF는 시뮬레이션에서 물리 엔진의 시간을 제어하거나, 특정 시점에 로봇이 특정 작업을 수행하도록 설정할 수 있다.

<world name="default">
  <physics type="ode">
    <max_step_size>0.001</max_step_size>
    <real_time_factor>1.0</real_time_factor>
  </physics>
</world>

위 코드에서 max_step_sizereal_time_factor와 같은 속성을 통해 시뮬레이션의 시간을 제어할 수 있다. real_time_factor는 시뮬레이션이 실제 시간과 얼마나 일치하게 동작하는지를 결정하며, 1.0으로 설정하면 시뮬레이션이 실시간으로 실행된다. 또한, 특정 시간에 로봇이 동작하거나 환경이 변화하도록 설정할 수 있어, 복잡한 시간 기반 작업을 처리하는 데 유용하다.

8. 물리 엔진과의 연동

URDF는 기본적으로 Gazebo와 같은 물리 엔진과 연동하여 사용할 수 있지만, 그 자체로는 물리 엔진에 대한 세밀한 제어를 제공하지 않는다. URDF는 물리적 특성(질량, 관성 등)을 정의할 수 있지만, 이를 바탕으로 물리 엔진에서 시뮬레이션할 때 추가적인 조정이 필요하다. 물리 엔진과의 연동을 위해서는 Gazebo와 같은 시뮬레이션 도구를 사용하는 것이 필수적이며, 이를 통해 로봇의 실제 물리적 동작을 시뮬레이션할 수 있다.

SDF는 물리 엔진과 더 긴밀하게 통합되어 있으며, 다양한 물리 엔진의 세밀한 제어를 제공한다. 예를 들어, Gazebo에서는 ODE(Open Dynamics Engine), Bullet, DART, Simbody 등의 다양한 물리 엔진을 지원하며, SDF 파일 내에서 이를 선택하고 설정할 수 있다.

<physics name="default_physics" type="ode">
  <gravity>0 0 -9.81</gravity>
  <max_step_size>0.001</max_step_size>
  <real_time_update_rate>1000</real_time_update_rate>
</physics>

위와 같이 SDF에서 물리 엔진을 선택하고 중력, 시간 스텝, 실시간 업데이트 속도 등을 설정할 수 있다. 이를 통해 로봇이 환경 내에서 어떻게 상호작용하는지에 대한 보다 현실적인 시뮬레이션이 가능한다. URDF는 이러한 물리 엔진 설정이 부족하므로, 복잡한 물리적 상호작용이 필요한 시뮬레이션에서는 SDF가 더 적합한다.