SDF(Simulation Description Format)는 Gazebo와 같은 시뮬레이터에서 로봇, 환경 및 센서의 정의를 XML 형식으로 표현하는 파일 포맷이다. SDF 파일은 로봇의 물리적 특성, 시각적 모델, 센서, 링크, 조인트, 플러그인 등 다양한 요소를 정의할 수 있으며, 각각의 요소는 XML 태그로 정의된다.

SDF는 XML 구조로 되어 있으며, 각 태그는 계층적으로 중첩될 수 있다. SDF 파일을 정의하기 위해 기본적으로 필요한 주요 요소는 다음과 같다:

1. sdf 태그

SDF 파일의 루트 태그는 <sdf>이다. 이 태그는 SDF 파일의 버전을 명시하며, 파일의 나머지 부분을 포함한다. 기본 구조는 다음과 같다:

<sdf version="1.6">
    <!-- 내용 -->
</sdf>

여기서 version 속성은 SDF 파일의 버전을 나타내며, 현재 최신 버전은 1.6이다.

2. model 태그

로봇이나 환경의 모델을 정의하는 데 사용되는 태그이다. <model> 태그는 로봇의 이름과 관련된 링크, 조인트, 센서 등의 하위 요소들을 포함할 수 있다. 기본적인 구조는 다음과 같다:

<model name="robot_name">
    <!-- 링크, 조인트, 센서 등 -->
</model>

여기서 name 속성은 모델의 이름을 지정하는 데 사용된다.

로봇의 물리적 요소(링크)를 정의하는 데 사용되는 태그이다. 링크는 로봇의 각 부위를 나타내며, 질량, 관성, 충돌 모델, 시각적 모델 등을 정의할 수 있다. 예를 들어, 다음과 같은 구조로 정의할 수 있다:

<link name="link_name">
    <!-- 물리적 특성, 시각적 요소 등 -->
</link>

이때 link는 로봇의 부분을 의미하며, name 속성은 링크의 이름을 나타낸다. 링크는 visual, collision, inertial과 같은 여러 하위 태그를 포함할 수 있다.

4. visual 태그

visual 태그는 로봇의 시각적 모델을 정의하는 태그이다. 이 태그는 로봇의 외형을 정의하는 데 사용되며, 메쉬 파일이나 기본적인 기하학적 형상을 지정할 수 있다. 예시 구조는 다음과 같다:

<visual name="visual_name">
    <!-- 시각적 모델 정의 -->
</visual>

5. collision 태그

collision 태그는 로봇의 충돌 모델을 정의한다. 충돌 모델은 물리 엔진에서 객체 간의 상호작용을 처리하는 데 사용된다. 기본적인 구조는 다음과 같다:

<collision name="collision_name">
    <!-- 충돌 모델 정의 -->
</collision>

충돌 모델과 시각적 모델은 다를 수 있으며, 물리 엔진에서의 성능을 최적화하기 위해 더 단순한 기하학적 형상을 사용할 수 있다.

6. inertial 태그

inertial 태그는 로봇 링크의 질량, 관성 모멘트를 정의한다. 이 태그는 로봇의 동역학 시뮬레이션에서 중요한 역할을 한다. 구조는 다음과 같다:

<inertial>
    <mass>1.0</mass>
    <inertia>
        <ixx>0.1</ixx>
        <iyy>0.1</iyy>
        <izz>0.1</izz>
        <ixy>0.0</ixy>
        <ixz>0.0</ixz>
        <iyz>0.0</iyz>
    </inertia>
</inertial>

여기서 mass는 링크의 질량을 나타내고, inertia는 링크의 관성 모멘트 텐서를 나타낸다. 이 텐서의 구성 요소는 각각 다음과 같이 정의된다:

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

관성 모멘트는 링크의 회전 운동을 설명하는 데 사용되며, 각 축을 기준으로 한 회전 저항을 나타낸다.

7. joint 태그

joint 태그는 로봇의 링크 간의 연결을 정의한다. 조인트는 링크를 서로 연결하고, 회전 또는 병진 운동을 허용한다. 조인트에는 다양한 유형이 있으며, 각 유형에 따라 운동의 자유도가 결정된다. 기본 구조는 다음과 같다:

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

여기서 주요 속성은 다음과 같다:

조인트의 유형에는 회전 조인트(revolute), 병진 조인트(prismatic), 고정 조인트(fixed), 범용 조인트(universal) 등이 있다.

8. sensor 태그

SDF 파일에서는 로봇에 장착된 다양한 센서를 정의할 수 있다. sensor 태그를 사용하여 카메라, LIDAR, IMU 등 다양한 센서 유형을 정의할 수 있으며, 센서의 데이터 주기와 출력 형식도 설정할 수 있다. 기본 구조는 다음과 같다:

<sensor name="sensor_name" type="camera">
    <camera>
        <horizontal_fov>1.57</horizontal_fov>
        <image>
            <width>640</width>
            <height>480</height>
        </image>
    </camera>
</sensor>

이 예시에서는 camera 센서를 정의하고 있으며, horizontal_fov는 카메라의 수평 시야각을 나타내며, image 태그는 이미지의 해상도를 나타낸다.

9. plugin 태그

SDF는 로봇의 동작을 제어하거나 환경과 상호작용하는 플러그인을 설정할 수 있다. plugin 태그는 주로 Gazebo와 같은 시뮬레이터에서 로봇 동작을 제어하기 위해 사용된다. 기본 구조는 다음과 같다:

<plugin name="plugin_name" filename="plugin_filename.so">
    <!-- 플러그인 설정 -->
</plugin>

플러그인을 사용하여 동역학 시뮬레이션, 로봇 제어, 센서 데이터 처리 등을 설정할 수 있다.

10. world 태그

SDF 파일에서 로봇이 동작할 환경을 정의하기 위해 world 태그가 사용된다. world 태그는 환경의 지형, 빌딩, 조명, 날씨 등을 정의할 수 있으며, 이 환경 내에서 로봇이 동작하게 된다. 기본 구조는 다음과 같다:

<world name="world_name">
    <!-- 환경 요소 정의 -->
</world>

여기서 world 태그는 환경을 정의하며, 다양한 요소를 포함할 수 있다. 예를 들어, 지형, 빛, 물리적 특성 등을 정의할 수 있다.