# URDF의 기본 개념

#### URDF란?

URDF(Universal Robot Description Format)는 XML 형식의 파일로, 로봇의 물리적 구조와 속성을 정의하는 데 사용된다. URDF는 로봇의 링크(구성 요소)와 조인트(이동 가능 부위)를 정의하며, 각 링크의 위치, 관성, 질량, 그리고 시각적/충돌 요소들을 포함한다. 주로 ROS(Robot Operating System)와 연동하여 로봇 모델을 시뮬레이션하거나 실제 로봇 제어에 활용된다.

#### URDF의 주요 구성 요소

URDF 파일은 여러 가지 요소들로 구성된다. 그 중 가장 중요한 두 가지는 **링크**와 **조인트**이다. 링크는 로봇의 개별적인 구성 요소를 나타내며, 조인트는 각 링크가 연결되는 방식을 정의한다.

* **링크**: 로봇의 각 부분을 나타낸다. 예를 들어, 로봇의 팔, 다리, 본체 등이 링크로 정의된다. 링크는 일반적으로 질량, 관성, 시각적 요소(예: STL 파일), 그리고 충돌 모델로 구성된다.
* **조인트**: 로봇의 링크를 연결하며, 각 링크 간의 상대적인 이동이나 회전을 정의한다. 조인트는 회전형, 직선형, 고정형 등 여러 가지 타입이 있으며, 조인트의 한계값(예: 회전 각도 범위)을 설정할 수 있다.

#### URDF의 구조적 개요

URDF 파일의 기본 구조는 XML 형식을 따르며, `<robot>` 태그 안에 로봇에 대한 정보를 기록한다. 각 링크와 조인트는 `<link>` 및 `<joint>` 태그로 정의되며, 각 태그 내에 위치, 시각적 요소, 물리적 속성 등을 설정한다.

```xml
<robot name="my_robot">
  <link name="base_link">
    <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="1.0"/>
      <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/>
    </inertial>
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="1 1 1"/>
      </geometry>
      <material name="gray"/>
    </visual>
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="1 1 1"/>
      </geometry>
    </collision>
  </link>

  <joint name="base_to_wheel" type="continuous">
    <parent link="base_link"/>
    <child link="wheel_link"/>
    <origin xyz="0 0 -1" rpy="0 0 0"/>
    <axis xyz="0 0 1"/>
    <limit effort="10" velocity="5"/>
  </joint>
</robot>
```

#### URDF의 좌표계 및 위치 설정

URDF에서 각 링크와 조인트의 위치는 **월드 좌표계**(global frame)를 기준으로 정의되거나, 각 링크 간의 상대적 위치로 정의된다. URDF는 **rpy(roll, pitch, yaw)** 회전 방식을 사용하여 각 링크나 조인트의 회전을 표현하며, 위치는 **xyz** 좌표로 나타낸다. 수학적으로 각 링크의 위치 $\mathbf{p}$는 3차원 벡터로 나타내며, 회전은 회전 행렬 $\mathbf{R}$로 나타낼 수 있다.

* 링크의 위치: $\mathbf{p} = \begin{bmatrix} x \ y \ z \end{bmatrix}$
* 링크의 회전: $\mathbf{R} = \mathbf{R}\_x(\phi) \mathbf{R}\_y(\theta) \mathbf{R}\_z(\psi)$

여기서 $\phi$, $\theta$, $\psi$는 각각 roll, pitch, yaw에 해당하며, 각 링크의 좌표계는 부모 링크 또는 월드 좌표계와 상대적으로 정의된다.

#### URDF의 물리적 특성

URDF는 로봇의 각 링크에 대한 물리적 특성을 정의한다. 이때 주로 사용되는 속성들은 **질량**(mass), **관성 모멘트**(inertia), 그리고 **마찰**(friction)과 같은 항목들이다. 이러한 물리적 특성은 로봇 시뮬레이션 시 동역학적으로 중요한 역할을 하며, 로봇의 움직임을 현실적으로 모사하는 데 사용된다.

**질량**

로봇의 각 링크는 고유의 질량을 가지며, 질량은 링크의 무게 중심에 집중되어 있다고 가정한다. 질량은 URDF의 `<inertial>` 태그 내부에서 정의되며, 단위는 킬로그램(kg)이다.

* **질량**: $m = 1.0 , \text{kg}$

```xml
<inertial>
  <mass value="1.0"/>
</inertial>
```

**관성 모멘트**

관성 모멘트는 링크가 특정 축을 기준으로 회전할 때의 저항을 나타낸다. URDF에서 관성 모멘트는 **관성 행렬**로 표현되며, 이는 링크의 중심을 기준으로 계산된다. URDF 파일에서는 **$I\_{xx}, I\_{yy}, I\_{zz}, I\_{xy}, I\_{xz}, I\_{yz}$** 요소를 사용해 관성 행렬을 정의한다. 일반적으로 이 관성 행렬은 대칭 행렬로, 다음과 같이 표현된다.

$$
\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 코드는 관성 모멘트를 정의하는 방법을 보여준다.

```xml
<inertial>
  <origin xyz="0 0 0" rpy="0 0 0"/>
  <mass value="1.0"/>
  <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/>
</inertial>
```

이 코드는 각 축에 대해 $I\_{xx} = 0.1$, $I\_{yy} = 0.1$, $I\_{zz} = 0.1$을 정의하고, 다른 항목은 0으로 설정하여 대칭적 관성 행렬을 형성한다.

**마찰과 저항**

URDF에서는 조인트에 대한 마찰과 저항을 설정하여 로봇의 움직임을 더 현실감 있게 만들 수 있다. 이는 **effort**(노력)과 **velocity**(속도) 제한을 설정하여 제어된다. 이를 통해 각 조인트가 특정 힘을 넘어서지 않도록 하거나, 최대 속도를 제한할 수 있다.

```xml
<joint name="base_to_wheel" type="continuous">
  <parent link="base_link"/>
  <child link="wheel_link"/>
  <axis xyz="0 0 1"/>
  <limit effort="10" velocity="5"/>
</joint>
```

위 코드에서 effort는 10 N·m(회전 조인트의 경우) 또는 뉴턴(직선 조인트의 경우)으로 설정되며, 속도는 최대 5 rad/s 또는 m/s로 제한된다.

#### URDF의 좌표 변환

URDF는 여러 링크와 조인트를 서로 연결하며, 각 링크와 조인트 간의 좌표 변환이 필요하다. 이 변환은 \*\*동차 좌표계(homogeneous transformation matrix)\*\*로 표현된다. 동차 좌표 변환 $\mathbf{T}$는 위치 $\mathbf{p}$와 회전 행렬 $\mathbf{R}$을 포함하며, 다음과 같이 나타낼 수 있다.

$$
\mathbf{T} = \begin{bmatrix} \mathbf{R} & \mathbf{p} \ 0 & 1 \end{bmatrix}
$$

이 행렬은 링크 간의 상대적인 위치와 회전을 나타내며, URDF에서 정의된 좌표계를 변환하는 데 사용된다. 각 링크의 위치와 회전은 부모 링크에 대해 정의되므로, 이러한 변환을 통해 로봇의 전체적인 위치와 자세를 결정할 수 있다.

#### URDF에서의 관성 원점 설정

각 링크의 관성 원점은 링크 내에서 질량이 집중된 지점, 즉 \*\*무게 중심(center of mass, CoM)\*\*을 나타낸다. URDF에서 `<origin>` 태그를 사용하여 관성 원점을 정의하며, 이는 링크 좌표계에 대해 상대적으로 정의된다. 이 관성 원점은 **좌표 벡터** $\mathbf{p}\_{inertial}$로 표현되며, 이 벡터는 링크의 고유 좌표계에서 정의된다.

$$
\mathbf{p}\_{inertial} = \begin{bmatrix} x \ y \ z \end{bmatrix}
$$

관성 원점의 좌표를 명확히 설정하지 않으면 링크의 질량 중심이 잘못 정의될 수 있으며, 이는 로봇의 동역학 시뮬레이션에 부정적인 영향을 미칠 수 있다.

```xml
<inertial>
  <origin xyz="0 0 0" rpy="0 0 0"/>
  <mass value="1.0"/>
  <inertia ixx="0.1" ixy="0.0" ixz="0.0" iyy="0.1" iyz="0.0" izz="0.1"/>
</inertial>
```

위 코드에서 `<origin>` 태그는 질량 중심이 링크의 좌표계 원점에 위치하며, 회전이 없는 상태($rpy = 0, 0, 0$)임을 나타낸다.

#### 링크의 시각적 요소 정의

URDF는 로봇의 시각적 모델을 정의할 수 있는 기능을 제공한다. 로봇의 각 링크는 **시각적 모델**(visual)과 **충돌 모델**(collision)로 나누어 정의되며, 시각적 모델은 주로 로봇을 시뮬레이션 소프트웨어 내에서 렌더링하기 위한 요소로 사용된다.

시각적 모델은 주로 메쉬 파일(예: **STL**, **Collada**)로 표현되며, 간단한 형상(예: 박스, 실린더, 구)으로도 정의할 수 있다. 시각적 모델과 충돌 모델의 차이점은, 시각적 모델은 렌더링에만 사용되며 물리 엔진에는 영향을 미치지 않는다는 점이다.

```xml
<visual>
  <origin xyz="0 0 0" rpy="0 0 0"/>
  <geometry>
    <box size="1 1 1"/>
  </geometry>
  <material name="gray"/>
</visual>
```

위 코드는 1m 크기의 박스를 시각적 모델로 정의하고, **회색 재질**을 사용하여 이를 렌더링하도록 설정한다.

#### 링크와 조인트 간의 관계

URDF에서 각 링크는 반드시 **조인트**를 통해 연결된다. 각 조인트는 부모 링크와 자식 링크를 연결하며, 두 링크 간의 상대적인 이동(translation) 또는 회전(rotation)을 정의한다. 이를 수학적으로 표현하면, 부모 링크의 좌표 $\mathbf{p}*{parent}$와 자식 링크의 좌표 $\mathbf{p}*{child}$ 사이의 관계는 조인트 변환 $\mathbf{T}\_{joint}$를 통해 다음과 같이 나타낼 수 있다.

$$
\mathbf{p}*{child} = \mathbf{T}*{joint} \mathbf{p}\_{parent}
$$

여기서 $\mathbf{T}\_{joint}$는 조인트의 위치와 회전을 포함하는 동차 변환 행렬이다. 조인트의 각도 또는 이동 거리는 URDF 파일 내에서 정의되며, 이 값들은 시뮬레이션에서 로봇의 동작을 결정짓는 중요한 요소가 된다.

```xml
<joint name="base_to_arm" type="revolute">
  <parent link="base_link"/>
  <child link="arm_link"/>
  <origin xyz="0 0 0" rpy="0 0 0"/>
  <axis xyz="0 0 1"/>
  <limit lower="-1.57" upper="1.57" effort="100" velocity="1.0"/>
</joint>
```

위 예시에서, 회전 조인트(revolute joint)를 사용하여 **base\_link**와 **arm\_link**를 연결하고 있으며, 이 조인트는 $z$ 축을 기준으로 회전하고, 회전 범위는 $-1.57$에서 $1.57$ 라디안으로 제한된다.

#### URDF와 시뮬레이션의 관계

URDF 파일은 로봇의 기계적 구조를 정의하는 데 사용되며, 이 구조는 다양한 시뮬레이션 환경(예: Gazebo, Rviz 등)에서 사용된다. 특히 URDF는 로봇의 **운동학적 모델링**과 **동역학적 모델링**을 위한 기초 정보를 제공하며, 각 링크와 조인트의 물리적 특성을 고려하여 로봇의 실제 움직임을 시뮬레이션할 수 있다.

이 시뮬레이션 과정에서 URDF는 로봇이 환경과 어떻게 상호작용하는지, 센서가 어떻게 데이터를 수집하는지 등을 결정짓는 중요한 역할을 한다.
