# URDF의 구조와 구성 요소

URDF(Unified Robot Description Format)는 XML 기반의 파일 형식으로, 로봇의 구조적 정보를 정의하는 데 사용된다. URDF 파일은 로봇의 링크(link)와 조인트(joint)를 표현하며, 이러한 요소들의 관계와 물리적 특성을 기술하여 로봇의 시각적, 물리적, 동역학적 동작을 시뮬레이션할 수 있게 한다. URDF는 로봇을 구성하는 각 부분을 명확하게 정의하고, 이들 간의 관계를 설정하여 로봇이 어떻게 동작할지를 결정한다.

### URDF의 기본 구조

URDF 파일은 XML 형식을 따르며, 주요 구성 요소로는 `<robot>` 태그 안에 링크와 조인트가 포함된다. 파일의 기본 구조는 다음과 같다:

```xml
<robot name="robot_name">
  <!-- 링크 정의 -->
  <link name="link_name">
    <!-- 시각적 요소 정의 -->
    <visual>
      <!-- 메쉬 또는 기본 형상을 사용하여 정의 -->
    </visual>
    <!-- 물리적 충돌 요소 정의 -->
    <collision>
      <!-- 충돌 모델 정의 -->
    </collision>
    <!-- 물리적 특성 정의 -->
    <inertial>
      <!-- 질량, 관성 행렬 등 -->
    </inertial>
  </link>

  <!-- 조인트 정의 -->
  <joint name="joint_name" type="joint_type">
    <!-- 부모 링크와 자식 링크 정의 -->
    <parent link="parent_link_name"/>
    <child link="child_link_name"/>
    <!-- 조인트 축과 한계값 정의 -->
    <axis xyz="1 0 0"/>
    <limit effort="100" velocity="1.0"/>
  </joint>
</robot>
```

이 기본 구조는 모든 URDF 파일이 따르는 형식이며, URDF의 핵심 구성 요소인 링크와 조인트가 어떻게 연결되고 정의되는지 보여준다.

### 링크(Link)

#### 링크의 역할

링크는 로봇의 각 구성 요소를 나타내는 기본적인 단위이다. 링크는 로봇의 각 파트를 나타내며, 각각의 링크는 시각적 요소(visual), 충돌 요소(collision), 물리적 특성(inertial)을 가진다. 각 링크는 로봇의 구성 요소가 가지는 위치와 형태, 물리적 특성을 정의한다.

#### 시각적 요소

`<visual>` 태그는 로봇의 시각적 모델을 정의한다. 이는 시뮬레이션에서 로봇의 외형을 결정하며, 기본 형상(예: 박스, 구, 실린더) 또는 메쉬 파일(예: STL, Collada)을 사용할 수 있다.

```xml
<visual>
  <geometry>
    <box size="1 1 1"/>
  </geometry>
  <material name="material_name">
    <color rgba="1 0 0 1"/>
  </material>
</visual>
```

위 예제에서는 크기 1x1x1의 박스 형상을 시각적으로 정의하며, 빨간색으로 설정된 재질을 적용한다.

#### 충돌 요소

`<collision>` 태그는 로봇의 충돌 모델을 정의한다. 이는 로봇이 환경과 상호작용할 때 발생하는 충돌을 계산하는 데 사용된다. 시각적 요소와는 별도로 정의되며, 더 단순한 형상을 사용하여 계산 성능을 최적화할 수 있다.

```xml
<collision>
  <geometry>
    <cylinder radius="0.5" length="2"/>
  </geometry>
</collision>
```

위 예제는 반지름이 0.5, 길이가 2인 실린더 형상의 충돌 모델을 정의한다.

#### 물리적 특성

`<inertial>` 태그는 링크의 질량과 관성(inertia)을 정의하는데 사용된다. 관성 행렬은 링크의 물리적 움직임을 시뮬레이션할 때 중요한 역할을 하며, URDF에서 이 값들을 직접 입력할 수 있다.

관성 행렬 $\mathbf{I}$는 다음과 같은 3x3 대칭 행렬로 표현된다:

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

URDF에서는 관성 행렬의 성분을 직접 정의하며, 이는 각 축에 대한 회전 관성(moment of inertia)을 나타낸다. 관성 행렬과 질량 $m$은 링크의 움직임을 정확하게 시뮬레이션하는 데 필수적이다.

```xml
<inertial>
  <mass value="5.0"/>
  <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/>
</inertial>
```

위 예제는 질량이 5kg이고, 관성 행렬 $\mathbf{I}$가 대각선 성분을 가지는 링크를 정의한 것이다.

### 조인트(Joint)

#### 조인트의 역할

조인트는 로봇의 링크 사이의 연결을 나타내며, 로봇의 각 부분이 어떻게 서로 연결되고 움직이는지를 정의한다. URDF에서 조인트는 부모 링크와 자식 링크 간의 상호작용을 설명하며, 다양한 유형의 조인트를 통해 회전, 직선 이동 등을 표현할 수 있다.

#### 조인트의 유형

조인트는 다양한 타입을 가지며, URDF에서 지원하는 주요 조인트 타입은 다음과 같다:

* **Revolute**: 회전 조인트. 한 축을 기준으로 회전하는 움직임을 제공한다.
* **Prismatic**: 직선 조인트. 특정 축을 따라 직선으로 이동하는 움직임을 제공한다.
* **Fixed**: 고정 조인트. 두 링크 사이의 상대적인 움직임이 없도록 고정한다.
* **Continuous**: 제한 없는 회전 조인트. 360도 회전이 가능한 조인트이다.
* **Floating**: 6 자유도를 가지며, 회전과 직선 이동을 모두 허용한다.
* **Planar**: 특정 평면에서의 움직임을 허용한다.

#### 부모와 자식 링크의 관계

조인트는 두 링크 간의 부모-자식 관계를 정의한다. 조인트는 반드시 부모 링크와 자식 링크 사이에 존재하며, 부모 링크는 상대적으로 고정되거나 주된 위치를 가지는 링크로 정의되고, 자식 링크는 부모 링크에 대해 움직일 수 있는 링크로 설정된다.

```xml
<joint name="joint1" type="revolute">
  <parent link="link1"/>
  <child link="link2"/>
</joint>
```

위 예제에서 조인트는 `link1`을 부모로 하고 `link2`를 자식으로 하며, `revolute` 타입으로 설정되어 회전 조인트를 형성한다.

#### 조인트의 축과 한계값

각 조인트는 축(axis)을 가지며, 조인트의 타입에 따라 특정 축을 따라 움직이거나 회전할 수 있다. 예를 들어, 회전 조인트는 하나의 회전 축을 설정하고, 그 축을 기준으로 회전이 발생한다.

조인트의 축은 3D 벡터 $\mathbf{a} = (x, y, z)$로 정의되며, 이는 조인트가 회전하거나 이동할 축을 나타낸다. 또한 조인트에는 힘(토크)이나 속도에 대한 한계를 정의할 수 있다.

```xml
<axis xyz="0 0 1"/>
<limit effort="100" velocity="1.0" lower="-1.57" upper="1.57"/>
```

위 예제에서는 조인트의 축을 $z$-축으로 설정하며, 이는 조인트가 $z$-축을 기준으로 회전함을 의미한다. 또한, 회전 범위를 $-1.57 \leq \theta \leq 1.57$로 제한하며, 토크 한계를 100, 속도를 1.0으로 설정한다.

### 물리적 특성의 정의

URDF에서 조인트는 움직임의 물리적 특성을 정의할 수 있다. 주로 다음과 같은 물리적 요소들이 사용된다:

* **Damping**: 조인트의 감쇠 계수를 나타내며, 조인트가 회전하거나 이동할 때 저항력을 제공한다.
* **Friction**: 마찰 계수를 나타내며, 조인트의 움직임에 대한 저항을 추가한다.
* **Effort**: 조인트에 적용할 수 있는 최대 힘 또는 토크를 정의한다.

```xml
<dynamics damping="0.1" friction="0.2"/>
```

위 예제는 조인트의 감쇠 계수와 마찰 계수를 정의한 것으로, 움직임이 더욱 안정적으로 이루어지도록 제어한다.
