# SDF의 기본 구조

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

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

#### 1. `sdf` 태그

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

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

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

#### 2. `model` 태그

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

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

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

#### 3. `link` 태그

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

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

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

#### 4. `visual` 태그

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

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

#### 5. `collision` 태그

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

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

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

#### 6. `inertial` 태그

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

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

```xml
<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>
```

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

* `name`: 조인트의 이름을 정의한다.
* `type`: 조인트의 유형을 정의한다. 여기서 `revolute`는 회전 조인트를 의미한다.
* `parent`: 상위 링크를 정의한다.
* `child`: 하위 링크를 정의한다.
* `axis`: 조인트가 회전하거나 이동하는 축을 정의한다. 이때 `xyz` 값은 축의 방향을 나타낸다.
* `limit`: 조인트의 운동 범위를 정의한다. 예를 들어, `lower`와 `upper`는 조인트의 회전 또는 이동 한계를 나타낸다.

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

#### 8. `sensor` 태그

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

```xml
<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와 같은 시뮬레이터에서 로봇 동작을 제어하기 위해 사용된다. 기본 구조는 다음과 같다:

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

* `name`: 플러그인의 이름을 정의한다.
* `filename`: 로봇의 동작을 제어하는 플러그인 파일의 경로를 지정한다.

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

#### 10. `world` 태그

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

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

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