SDF (Simulation Description Format)는 로봇 시뮬레이션에서 로봇, 센서, 환경 등의 물리적 특성과 동작을 정의하는 XML 기반의 포맷이다. URDF와 달리, SDF는 더 정교한 물리 시뮬레이션을 지원하며, 다양한 물리 엔진 및 시뮬레이션 환경에 맞춰 확장될 수 있다. SDF의 주요 목적은 Gazebo와 같은 시뮬레이션 툴에서 로봇과 환경을 정확하게 모델링하고, 물리적인 상호작용을 시뮬레이션하는 데 있다.

SDF 파일의 기본 구조

SDF 파일은 XML 태그를 사용하여 정의되며, 각 태그는 시뮬레이션에서 사용되는 객체의 특성과 동작을 기술한다. SDF 파일의 기본적인 구조는 다음과 같다.

<sdf version="1.6">
  <world name="default">
    <model name="robot">
      <link name="base_link">
        <!-- 링크 속성 정의 -->
      </link>
      <joint name="joint1" type="revolute">
        <!-- 조인트 속성 정의 -->
      </joint>
    </model>
  </world>
</sdf>

위의 예시에서는 <sdf>, <world>, <model>, <link>, 그리고 <joint> 태그가 사용되었다. 각 태그는 SDF에서 중요한 요소를 나타내며, 시뮬레이션의 구성 요소를 정의한다.

World

<world> 태그는 SDF에서 시뮬레이션이 실행되는 환경을 정의하는 가장 상위 태그이다. 하나의 SDF 파일은 하나의 <world>만을 가질 수 있으며, 그 안에 여러 모델과 환경 요소를 포함할 수 있다.

<world name="default">
  <model name="robot">
    <!-- 로봇 모델 정의 -->
  </model>
  <light name="sun" type="directional">
    <!-- 빛 속성 정의 -->
  </light>
</world>

여기서 <model> 태그는 로봇을 나타내고, <light> 태그는 조명 요소를 정의한다. 각 요소는 시뮬레이션에서 상호작용하며, 물리 엔진을 통해 동작한다.

Model

<model> 태그는 시뮬레이션에서 동작하는 개별적인 객체를 나타낸다. 이는 로봇일 수도 있고, 환경에 속하는 물체일 수도 있다. <model> 태그는 여러 개의 <link><joint>로 구성되어 있으며, 이를 통해 모델의 구조와 동작을 정의한다.

<model name="robot">
  <link name="base_link">
    <!-- 링크 속성 -->
  </link>
  <joint name="joint1" type="revolute">
    <!-- 조인트 속성 -->
  </joint>
</model>

모델은 로봇의 각 부분을 나타내는 링크들과 이들 간의 연결을 정의하는 조인트들로 구성된다.

<link> 태그는 모델의 구성 요소 중 하나로, 로봇이나 환경의 개별적인 부위를 정의한다. 링크는 질량, 관성, 충돌 모델, 그리고 시각적 모델을 포함하여 물리적 특성을 정의한다.

링크의 질량과 관성 모멘트는 다음과 같은 수식을 통해 정의된다.

\mathbf{I} = \begin{bmatrix} I_{xx} & I_{xy} & I_{xz} \\ I_{yx} & I_{yy} & I_{yz} \\ I_{zx} & I_{zy} & I_{zz} \end{bmatrix}

여기서, \mathbf{I}는 관성 행렬을 나타내며, I_{xx}, I_{yy}, I_{zz}는 각 축에 대한 관성 모멘트를 나타낸다. 관성 모멘트는 물체의 질량과 형상에 따라 계산된다.

링크의 물리적 특성은 시뮬레이션에서 중요한 역할을 하며, 로봇이 상호작용하는 힘과 모멘트에 직접적인 영향을 미친다.

Joint

<joint> 태그는 두 링크를 연결하는 요소로, 링크 간의 상대적인 움직임을 정의한다. 각 조인트는 특정한 종류의 운동을 허용하며, 여러 가지 타입이 있다. 대표적인 조인트 타입으로는 revolute(회전 조인트), prismatic(직선 운동 조인트), fixed(고정 조인트) 등이 있다.

각 조인트는 연결된 두 링크 간의 상대적인 변위를 수학적으로 모델링하며, 회전 조인트의 경우 회전 축과 각도를 정의한다. 예를 들어, 회전 조인트의 경우 회전 변위를 각도로 나타낼 수 있으며, 이는 다음과 같은 수식을 따른다:

\mathbf{\theta}(t) = \mathbf{\theta}_0 + \mathbf{\omega} t

여기서, \mathbf{\theta}(t)는 시간 t에서의 회전 각도, \mathbf{\theta}_0는 초기 각도, \mathbf{\omega}는 각속도를 나타낸다. 이 수식을 통해 로봇의 조인트 움직임을 시뮬레이션할 수 있다.

조인트에는 물리적 특성, 예를 들어 운동 범위, 감쇠(damping), 마찰 등의 요소도 포함될 수 있다. 이러한 요소들은 SDF에서 직접 정의할 수 있으며, 시뮬레이션의 정확도를 높이기 위해 필수적이다.

Visual

<visual> 태그는 모델의 시각적 표현을 정의하는 요소이다. 이는 시뮬레이션에서 사용자가 볼 수 있는 그래픽적 요소를 나타내며, 물리적 특성과는 독립적으로 존재한다. 각 링크에는 시각적 모델이 추가될 수 있으며, 이를 통해 로봇의 외관을 보다 실제적으로 나타낼 수 있다.

<visual name="visual">
  <geometry>
    <mesh>
      <uri>model://robot/meshes/base_link.stl</uri>
    </mesh>
  </geometry>
  <material>
    <script>
      <uri>file://media/materials/scripts/base.material</uri>
      <name>base_material</name>
    </script>
  </material>
</visual>

위의 예시에서, <mesh> 태그는 STL 파일을 사용하여 로봇의 외형을 나타내고, <material> 태그는 재질과 색상을 정의한다. 시각적 모델은 물리적 특성과는 별도로 존재하기 때문에, 충돌 계산 등에 영향을 미치지 않는다.

Collision

<collision> 태그는 모델의 충돌 모델을 정의하는 요소로, 시뮬레이션에서 물리적 상호작용이 일어나는 표면을 나타낸다. 시각적 모델과는 달리, 충돌 모델은 물리 엔진에서 실제로 충돌 검사를 할 때 사용된다. 충돌 모델은 단순한 기하학적 형상이나 복잡한 메쉬로 정의될 수 있다.

<collision name="collision">
  <geometry>
    <box>
      <size>1 1 1</size>
    </box>
  </geometry>
  <surface>
    <friction>
      <ode>
        <mu>0.5</mu>
        <mu2>0.5</mu2>
      </ode>
    </friction>
  </surface>
</collision>

위의 예시에서는 box 기하학을 사용하여 충돌 모델을 정의하였으며, 마찰 계수 \mu를 지정하였다. 마찰 계수는 물체 간의 상호작용을 물리적으로 모델링하는 데 중요한 역할을 하며, 물체가 지면 위에서 미끄러지지 않도록 제어하는 요소이다.

Inertial

<inertial> 태그는 링크의 관성 정보를 정의하는 데 사용된다. 관성은 링크의 질량과 관성 모멘트를 포함하며, 링크의 움직임에 영향을 미친다. SDF에서 관성은 다음과 같이 정의된다.

<inertial>
  <mass>1.0</mass>
  <inertia>
    <ixx>0.1</ixx>
    <iyy>0.1</iyy>
    <izz>0.1</izz>
  </inertia>
</inertial>

위의 예시에서, 링크의 질량은 1.0이고, 각 축에 대한 관성 모멘트는 I_{xx}, I_{yy}, I_{zz}로 정의된다. 이는 다음과 같은 관성 모멘트 행렬로 나타낼 수 있다.

\mathbf{I} = \begin{bmatrix} I_{xx} & 0 & 0 \\ 0 & I_{yy} & 0 \\ 0 & 0 & I_{zz} \end{bmatrix}

이 관성 행렬은 링크가 움직이거나 회전할 때 물리적으로 어떻게 반응할지를 결정하는 중요한 요소이다.

Sensor

<sensor> 태그는 로봇의 센서를 정의하는 데 사용된다. SDF에서 다양한 종류의 센서를 정의할 수 있으며, 대표적인 예로 카메라, LIDAR, IMU 등이 있다. 센서는 시뮬레이션에서 로봇이 환경을 인식하고 상호작용할 수 있게 해주는 중요한 구성 요소이다.

<sensor type="camera" name="camera_sensor">
  <camera>
    <horizontal_fov>1.047</horizontal_fov>
    <image>
      <width>640</width>
      <height>480</height>
    </image>
  </camera>
</sensor>

위의 예시에서는 카메라 센서를 정의하고, 카메라의 시야각과 해상도를 지정하였다. 각 센서는 고유한 특성을 가지며, 이를 통해 다양한 방식으로 로봇의 센서 데이터를 시뮬레이션할 수 있다.