SDF(Simulation Description Format)는 로봇 시뮬레이션을 위한 표준 파일 포맷으로, 주로 물리 기반 시뮬레이션과 로봇 동작 시뮬레이션에서 사용된다. SDF는 XML 기반의 파일 형식을 사용하며, 로봇의 구조, 센서, 조인트, 링크 등의 물리적 속성을 정의하는 데 매우 적합한다. 특히 다양한 시뮬레이션 환경에서 사용될 수 있도록 설계되어, 복잡한 로봇 시뮬레이션을 간편하게 설정하고 관리할 수 있다.

SDF 파일의 기본 구조

SDF 파일은 XML 구조를 기반으로 하기 때문에, 각 요소들은 XML 태그로 감싸여 있으며, 태그 내에서 속성들을 정의한다. SDF 파일의 기본 구조는 다음과 같다:

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

SDF에서 링크는 로봇의 물리적 부분을 나타낸다. 링크는 각 로봇의 특정한 부분(예: 팔, 다리 등)에 해당하며, 여러 링크가 연결되어 하나의 로봇 모델을 구성한다. 링크의 주요 속성은 다음과 같다:

링크의 관성 정의

SDF에서는 링크의 물리적 속성을 정의할 때, 관성 정보가 필수적이다. 관성은 물체가 회전하거나 가속될 때 필요한 물리적 저항을 정의한다. 관성 행렬은 다음과 같이 정의된다:

\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}는 관성 텐서(Inertia Tensor)를 나타내며, 각 항목들은 링크의 회전 축에 따른 관성 모멘트를 정의한다. 예를 들어 I_{xx}는 x축을 기준으로 한 관성 모멘트이다.

SDF 파일에서 관성을 정의하는 XML 구문은 다음과 같다:

<link name="base_link">
  <inertial>
    <mass>1.0</mass>
    <inertia>
      <ixx>0.1</ixx>
      <iyy>0.1</iyy>
      <izz>0.1</izz>
    </inertia>
  </inertial>
</link>

위 코드에서는 mass를 통해 링크의 질량을 정의하고, inertia를 통해 관성 텐서의 각 성분을 지정한다.

조인트(Joint) 정의

SDF에서 조인트는 두 링크 간의 연결을 나타내며, 회전(revolute) 또는 이동(prismatic) 동작을 설정할 수 있다. 조인트의 주요 속성은 다음과 같다:

회전 조인트의 수학적 표현

회전 조인트는 두 링크 간의 상대적인 회전 운동을 정의한다. 예를 들어, 회전 조인트는 한 링크가 고정된 축을 따라 회전할 수 있도록 설정된다. 회전 각도 \theta는 다음과 같이 정의된다:

\mathbf{T}_{rotation}(\theta) = \begin{bmatrix} \cos(\theta) & -\sin(\theta) & 0 & 0 \\ \sin(\theta) & \cos(\theta) & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}

여기서 \mathbf{T}_{rotation}(\theta)는 회전 변환 행렬로, 링크가 특정 축을 따라 \theta 각도로 회전하는 것을 나타낸다.

SDF 파일에서 회전 조인트를 정의하는 XML 구문은 다음과 같다:

<joint name="joint1" type="revolute">
  <parent>base_link</parent>
  <child>link1</child>
  <axis>
    <xyz>0 0 1</xyz>
    <limit>
      <lower>-1.57</lower>
      <upper>1.57</upper>
    </limit>
  </axis>
</joint>

위 코드에서는 axis 태그를 통해 회전 축을 정의하고, limit 태그를 통해 회전 각도의 범위를 설정한다.

센서 정의

SDF 파일에서는 로봇에 장착된 센서의 속성도 정의할 수 있다. 다양한 센서 유형을 지원하며, 라이다(LiDAR), 카메라, IMU(관성 측정 장치) 등의 센서를 시뮬레이션할 수 있다. 각 센서는 특정 링크에 장착되며, 해당 링크의 움직임에 따라 센서 데이터가 생성된다.

라이다(LiDAR) 센서

라이다 센서는 레이저를 이용해 거리 데이터를 측정하는 장치로, 주로 환경의 3D 지형을 인식하는 데 사용된다. SDF에서 라이다 센서는 ray 요소로 정의된다. 라이다의 주요 속성은 다음과 같다:

SDF 파일에서 라이다 센서를 정의하는 XML 구문은 다음과 같다:

<sensor name="lidar" type="ray">
  <pose>0 0 0 0 0 0</pose>
  <ray>
    <scan>
      <horizontal>
        <samples>640</samples>
        <resolution>1</resolution>
        <min_angle>-1.57</min_angle>
        <max_angle>1.57</max_angle>
      </horizontal>
      <vertical>
        <samples>1</samples>
        <resolution>1</resolution>
        <min_angle>0</min_angle>
        <max_angle>0</max_angle>
      </vertical>
    </scan>
    <range>
      <min>0.1</min>
      <max>10.0</max>
      <resolution>0.01</resolution>
    </range>
  </ray>
</sensor>

위 코드에서 scan 요소는 라이다의 스캔 범위를 정의하며, horizontalvertical 요소는 각각 수평 및 수직 방향의 샘플 개수와 각도 범위를 설정한다. range 요소는 라이다의 측정 가능한 거리 범위를 정의한다.

카메라 센서

카메라 센서는 영상 데이터를 수집하는 데 사용되며, 2D 이미지를 생성한다. SDF에서 카메라 센서는 camera 요소로 정의된다. 카메라의 주요 속성은 다음과 같다:

SDF 파일에서 카메라 센서를 정의하는 XML 구문은 다음과 같다:

<sensor name="camera" type="camera">
  <pose>0 0 1 0 0 0</pose>
  <camera>
    <horizontal_fov>1.047</horizontal_fov>
    <image>
      <width>640</width>
      <height>480</height>
    </image>
    <clip>
      <near>0.1</near>
      <far>100</far>
    </clip>
  </camera>
</sensor>

위 코드에서 image 요소는 카메라가 생성하는 이미지의 해상도를 정의하며, horizontal_fov는 카메라의 수평 시야각을 설정한다. clip 요소는 카메라의 근거리 및 원거리 클리핑 값을 정의하여, 렌더링할 수 있는 거리를 제한한다.

링크와 조인트의 상호작용

SDF 파일에서 로봇의 동작은 링크와 조인트의 상호작용에 의해 결정된다. 링크는 로봇의 구조적 부분을 나타내고, 조인트는 이들 링크 간의 동작을 정의한다. 이러한 링크와 조인트의 상호작용을 통해 로봇의 각 부위가 어떻게 움직이는지 결정할 수 있다.

링크 간의 동작 정의

두 링크 간의 상대적 위치와 회전은 조인트를 통해 결정되며, 조인트는 각도나 위치에 대한 제한을 설정할 수 있다. 예를 들어, 회전 조인트의 경우, \theta 각도 범위를 제한할 수 있으며, 이는 다음과 같은 방정식으로 표현된다:

\theta_{\text{min}} \leq \theta \leq \theta_{\text{max}}

여기서 \theta_{\text{min}}은 최소 회전 각도를, \theta_{\text{max}}은 최대 회전 각도를 나타낸다.

SDF 파일에서는 이를 limit 태그를 통해 설정할 수 있다. 예를 들어, 다음과 같은 구문으로 조인트의 회전 범위를 정의할 수 있다:

<joint name="joint1" type="revolute">
  <axis>
    <xyz>0 0 1</xyz>
    <limit>
      <lower>-1.57</lower>
      <upper>1.57</upper>
    </limit>
  </axis>
</joint>

이와 같은 설정을 통해 두 링크가 특정 범위 내에서만 회전하거나 이동할 수 있도록 제한할 수 있다.

조인트(Joint)의 마찰 및 감쇠 설정

SDF 파일에서 조인트는 회전 또는 이동 동작을 수행할 때 마찰과 감쇠를 설정할 수 있다. 이는 실제 환경에서 발생하는 에너지 손실을 시뮬레이션하기 위한 요소로, 로봇이 더욱 현실적으로 움직이도록 만든다.

마찰(Friction)

마찰은 로봇의 조인트가 움직일 때 발생하는 저항력을 나타낸다. SDF에서 마찰은 dynamics 요소 내부에서 설정되며, friction 값을 통해 마찰 계수를 정의할 수 있다. 조인트의 마찰은 회전 또는 이동 중에 발생하는 에너지 손실을 시뮬레이션하는데 사용된다.

마찰을 정의하는 방정식은 다음과 같다:

\tau_{\text{friction}} = -\mu \cdot \dot{\theta}

여기서: - \tau_{\text{friction}}은 마찰에 의한 토크 - \mu는 마찰 계수 - \dot{\theta}는 각속도

SDF 파일에서 마찰 설정을 정의하는 구문은 다음과 같다:

<joint name="joint1" type="revolute">
  <axis>
    <dynamics>
      <friction>0.5</friction>
    </dynamics>
  </axis>
</joint>

이 코드는 friction 태그를 통해 조인트의 마찰 계수를 0.5로 설정한다. 이는 로봇이 조인트를 회전할 때 저항을 받는 정도를 의미한다.

감쇠(Damping)

감쇠는 로봇의 조인트가 움직일 때 에너지를 흡수하는 성질을 나타낸다. 감쇠 계수는 조인트의 움직임을 점차적으로 줄이는 역할을 하며, 이는 실제 로봇 시스템에서 매우 중요한 역할을 한다. 감쇠는 damping 값으로 설정되며, 감쇠 방정식은 다음과 같다:

\tau_{\text{damping}} = -c \cdot \dot{\theta}

여기서: - \tau_{\text{damping}}은 감쇠에 의한 토크 - c는 감쇠 계수 - \dot{\theta}는 각속도

SDF 파일에서 감쇠 설정을 정의하는 구문은 다음과 같다:

<joint name="joint1" type="revolute">
  <axis>
    <dynamics>
      <damping>0.1</damping>
    </dynamics>
  </axis>
</joint>

이 코드는 damping 태그를 통해 조인트의 감쇠 계수를 0.1로 설정한다. 이는 로봇이 움직이는 동안 에너지를 점차적으로 소모하게 하여, 과도한 진동을 줄이는데 도움이 된다.

SDF 파일의 URDF와의 차이점

SDF와 URDF(Universal Robot Description Format)는 둘 다 로봇의 물리적 구조를 정의하는데 사용되지만, 그 구조와 기능에서 몇 가지 차이점이 있다.

XML 구조

URDF와 SDF는 모두 XML 기반이지만, SDF는 보다 복잡한 시뮬레이션을 지원하는데 적합한 구조를 가지고 있다. 예를 들어, SDF는 다중 링크, 복잡한 물리 속성, 센서 정의, 그리고 조인트의 동적 요소(마찰, 감쇠 등)를 더 잘 지원한다. 반면 URDF는 비교적 단순한 로봇 구조와 동작을 정의하는 데 적합한다.

물리 엔진 지원

SDF는 Gazebo와 같은 물리 기반 시뮬레이션 환경을 위해 설계되었기 때문에, 물리 엔진과의 통합이 더 원활한다. 반면, URDF는 주로 로봇의 기하학적 정의에 초점을 맞추고 있으며, 물리적 속성에 대한 지원은 상대적으로 제한적이다. 따라서 물리 기반 시뮬레이션에서 더 복잡한 설정이 필요한 경우 SDF가 URDF보다 더 적합할 수 있다.

확장성

SDF는 로봇의 모델뿐만 아니라 환경, 센서, 액추에이터 등의 요소를 정의할 수 있는 확장성을 제공한다. 이러한 이유로 로봇 시뮬레이션뿐만 아니라 전체 시뮬레이션 환경을 정의하는 데 사용될 수 있다. 반면, URDF는 주로 로봇의 구조와 기하학적 속성에 중점을 두고 있기 때문에, 전체 시뮬레이션 환경을 정의하는 데는 한계가 있다.

SDF에서 센서의 상세 정의

SDF 파일은 로봇에 장착된 센서의 특성을 매우 구체적으로 정의할 수 있다. SDF에서 지원하는 다양한 센서들은 실제 센서의 동작을 시뮬레이션할 수 있으며, 환경의 상태를 모니터링하거나 데이터를 생성하는 데 사용된다. 라이다(LiDAR), 카메라, IMU 등의 센서뿐만 아니라 다양한 다른 센서도 설정 가능한다.

IMU 센서

IMU(관성 측정 장치)는 로봇의 가속도와 각속도를 측정하는 데 사용되는 센서이다. IMU는 로봇의 움직임을 인식하는 데 필수적인 역할을 하며, 특히 자율 주행 및 로봇 제어 시스템에서 매우 중요한 데이터를 제공한다. SDF에서는 IMU 센서를 imu 요소를 통해 정의할 수 있다.

IMU의 주요 속성은 다음과 같다:

SDF 파일에서 IMU 센서를 정의하는 예시는 다음과 같다:

<sensor name="imu" type="imu">
  <pose>0 0 1 0 0 0</pose>
  <imu>
    <linear_acceleration>
      <x>1</x>
      <y>1</y>
      <z>1</z>
    </linear_acceleration>
    <angular_velocity>
      <x>1</x>
      <y>1</y>
      <z>1</z>
    </angular_velocity>
  </imu>
</sensor>

위 코드에서 linear_acceleration 태그와 angular_velocity 태그는 IMU 센서가 측정하는 가속도와 각속도를 정의한다. 이를 통해 로봇의 동작에 대한 데이터를 수집할 수 있다.

플러그인(Plugin) 사용

SDF 파일은 기본적인 물리적 속성 및 센서 설정 외에도 플러그인을 사용하여 시뮬레이션의 동작을 확장할 수 있다. 플러그인은 시뮬레이션 동안 특정 동작을 실행하는 스크립트로, 로봇의 제어, 시뮬레이션 환경 제어, 데이터 로깅 등을 구현할 수 있다.

플러그인의 구조

SDF에서 플러그인은 plugin 요소를 통해 추가되며, 로봇의 동작을 제어하거나 시뮬레이션 환경에서 특정 동작을 실행할 수 있다. 플러그인의 주요 속성은 다음과 같다:

플러그인을 정의하는 SDF 파일의 예시는 다음과 같다:

<plugin name="my_robot_plugin" filename="libmy_robot_plugin.so">
  <ros_topic>/robot/data</ros_topic>
  <update_rate>100</update_rate>
</plugin>

위 코드는 my_robot_plugin이라는 이름의 플러그인을 로드하며, ROS 토픽 /robot/data를 구독하고, 100Hz의 업데이트 주기를 설정한다.

물리 기반 시뮬레이션 설정

SDF 파일은 물리 엔진을 이용하여 로봇 시뮬레이션을 수행하며, 이를 위해 중력, 충돌 처리, 관성 모멘트 등의 물리적 속성을 정의할 수 있다. SDF는 시뮬레이션의 사실성을 높이기 위해 다양한 물리적 요소를 설정할 수 있다.

중력 설정

중력은 로봇 시뮬레이션에서 중요한 요소로, 로봇이 현실적인 환경에서 동작하도록 만드는 데 필수적이다. SDF 파일에서는 gravity 요소를 사용하여 시뮬레이션 환경의 중력을 설정할 수 있다. 중력의 값은 3차원 벡터로 정의되며, 일반적으로 지구의 중력 가속도 \mathbf{g} = \langle 0, 0, -9.81 \rangle로 설정된다.

중력 설정의 예시는 다음과 같다:

<world name="default">
  <gravity>0 0 -9.81</gravity>
</world>

위 코드에서는 중력 벡터가 지구의 표준 중력인 \mathbf{g} = \langle 0, 0, -9.81 \rangle로 설정되어 있다. 이는 시뮬레이션 내의 모든 객체가 지구의 중력 영향을 받도록 한다.

충돌 처리

SDF는 로봇이 환경과 상호작용할 때 발생하는 충돌을 처리하기 위해 collision 요소를 제공한다. 충돌 처리 설정은 로봇의 각 링크에 대해 정의되며, 충돌 감지를 위한 기하학적 모양과 물리적 속성을 설정할 수 있다.

충돌 처리의 주요 속성은 다음과 같다:

SDF 파일에서 충돌 처리를 정의하는 예시는 다음과 같다:

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

위 코드에서 geometry 요소는 충돌의 기하학적 모양을 정의하며, surface 요소는 충돌 시 마찰 계수를 설정한다.