# 파라미터를 통한 로봇 모델링의 유연성

Xacro는 로봇 모델링을 더 유연하고 효율적으로 하기 위해 매크로와 파라미터화를 지원한다. 이를 통해 복잡한 URDF 파일을 더 간결하게 만들고, 다양한 로봇 모델을 손쉽게 구성할 수 있다. 파라미터화를 사용하면 여러 로봇의 다양한 속성(예: 링크의 길이, 조인트의 제한 등)을 쉽게 수정할 수 있어 로봇 모델의 재사용성과 유지보수성을 크게 향상시킬 수 있다.

#### 매개변수화의 기본 개념

Xacro에서 매개변수를 사용하면 URDF 파일에서 값을 하드코딩하지 않고, 변수 형태로 정의하여 여러 곳에서 활용할 수 있다. 이를 통해 중복을 줄이고, 다양한 파라미터를 쉽게 변경할 수 있다.

```xml
<xacro:property name="link_length" value="1.0"/>
```

이 코드에서 `link_length`라는 변수를 정의하고, 그 값을 1.0으로 설정하였다. 이 변수를 링크 길이 등의 속성에서 사용할 수 있다.

```xml
<link name="base_link">
  <inertial>
    <origin xyz="0 0 ${link_length / 2}"/>
  </inertial>
</link>
```

위 코드는 링크의 무게 중심을 변수 `link_length`를 사용하여 정의한 예시이다. 이처럼 xacro 파일 내에서 변수로 설정된 값을 수식으로 활용하여 유연하게 모델을 조정할 수 있다.

#### 수학적 파라미터화

로봇 모델링에서 기하학적, 동역학적 특성은 종종 복잡한 수학적 표현으로 나타낼 수 있다. Xacro의 매개변수화는 이러한 수학적 표현을 적용하여, 다양한 로봇 구성 요소를 간결하게 정의할 수 있다.

**링크 길이와 관성 텐서**

링크의 길이를 매개변수화할 때, 관성 텐서 역시 이를 기반으로 유도할 수 있다. 예를 들어, 링크의 길이를 $L$이라고 할 때, 관성 텐서 $\mathbf{I}$는 다음과 같이 정의된다.

$$
\mathbf{I} = \frac{1}{12} m \begin{bmatrix} 0 & 0 & 0 \ 0 & L^2 & 0 \ 0 & 0 & L^2 \end{bmatrix}
$$

여기서 $m$은 링크의 질량이다. 링크 길이 $L$이 변경되면, 관성 텐서 $\mathbf{I}$도 자동으로 변경된다. 이를 Xacro의 파라미터로 구현하면, 링크 길이만 수정해도 관성 텐서가 자동으로 업데이트된다.

```xml
<xacro:property name="link_length" value="1.0"/>
<xacro:property name="link_mass" value="2.0"/>

<inertial>
  <mass value="${link_mass}"/>
  <inertia ixx="${link_mass * (link_length^2) / 12}" 
           iyy="${link_mass * (link_length^2) / 12}" 
           izz="${link_mass * (link_length^2) / 12}"/>
</inertial>
```

위 코드는 링크의 질량과 길이를 변수로 정의한 후, 이를 바탕으로 관성 텐서를 자동으로 계산하는 예시이다.

#### 매개변수화된 링크 간의 관계

로봇은 여러 링크와 조인트로 구성되며, 링크 간의 상대적 위치와 각도는 중요한 요소이다. Xacro에서 매개변수화를 사용하여 링크 간의 관계를 더 유연하게 설정할 수 있다. 예를 들어, 두 링크 사이의 거리를 파라미터로 설정하고, 이 값이 변경되면 링크 간의 상대적인 위치가 자동으로 조정된다.

**링크 간의 거리 설정**

두 링크 $\mathbf{L}\_1$과 $\mathbf{L}\_2$가 있고, 두 링크 사이의 거리를 $d$로 정의한다고 하자. Xacro를 사용하여 이 거리를 매개변수화하면, 다양한 로봇 구조를 간단하게 수정할 수 있다.

```xml
<xacro:property name="link_distance" value="0.5"/>
```

위 코드는 링크 사이의 거리를 0.5로 정의한 것이다. 이를 두 링크 간의 관계에 적용하면 다음과 같이 표현할 수 있다.

```xml
<link name="link1">
  <origin xyz="0 0 0"/>
</link>

<link name="link2">
  <origin xyz="0 0 ${link_distance}"/>
</link>
```

이 코드에서 두 링크는 Z축을 따라 일정 거리만큼 떨어져 있으며, 이 거리는 `link_distance` 변수로 설정된다. 이처럼 Xacro의 매개변수화를 사용하면 링크 사이의 관계를 손쉽게 변경할 수 있다.

**링크의 상대적 각도 설정**

링크 간의 회전 관계도 매개변수로 설정할 수 있다. 두 링크 간의 상대적 각도를 $\theta$로 정의하고, 이 값을 조정하여 로봇의 조인트 각도를 변경할 수 있다. 각도 $\theta$는 다음과 같이 정의될 수 있다.

$$
\theta = \theta\_0 + \Delta \theta
$$

여기서 $\theta\_0$는 기본 각도이고, $\Delta \theta$는 매개변수화된 변화량이다. Xacro에서 이를 구현하면 다음과 같다.

```xml
<xacro:property name="joint_angle" value="1.57"/> <!-- 라디안 단위로 정의 -->
```

```xml
<joint name="joint1" type="revolute">
  <origin xyz="0 0 0" rpy="0 0 ${joint_angle}"/>
  <parent link="link1"/>
  <child link="link2"/>
</joint>
```

위 코드에서는 조인트의 회전 각도를 `joint_angle`로 매개변수화하였으며, 이 값을 변경하면 링크의 상대적 회전도 자동으로 변경된다.

#### 매개변수와 조건문 활용

Xacro는 매개변수와 더불어 조건문을 사용할 수 있어 로봇 모델링의 유연성을 더욱 향상시킨다. 특정 조건에 따라 로봇 모델의 구조를 다르게 정의할 수 있으며, 다양한 로봇 구조를 한 파일 내에서 관리할 수 있다. 조건문을 활용하면 로봇의 특정 부품을 옵션으로 포함하거나 제외할 수 있다.

예를 들어, 로봇의 특정 부품이 포함될지 여부를 조건문으로 제어할 수 있다.

```xml
<xacro:if value="${include_part}">
  <link name="optional_link">
    <!-- 링크 속성 정의 -->
  </link>
</xacro:if>
```

`include_part`라는 변수가 참일 때만 `optional_link`가 포함되도록 조건문을 설정하였다. 이를 통해 다양한 옵션을 가진 로봇을 하나의 Xacro 파일에서 관리할 수 있다.

#### 매개변수로 인한 유연한 로봇 설계의 예시

매개변수를 사용하면 하나의 Xacro 파일에서 여러 로봇 모델을 쉽게 설계하고 조정할 수 있다. 예를 들어, 로봇 팔의 길이와 조인트 각도를 매개변수로 설정하면, 다양한 로봇 팔 모델을 손쉽게 만들 수 있다. 이를 통해 동일한 로봇의 다양한 버전을 간편하게 구성할 수 있으며, 파라미터 값을 변경하는 것만으로 모델을 즉시 수정할 수 있다.

**로봇 팔 모델의 매개변수화**

로봇 팔의 각 조인트의 길이와 조인트 각도는 로봇의 동작과 성능에 큰 영향을 미친다. Xacro 파일을 사용하여 각 조인트의 길이를 매개변수로 정의하고, 이를 기반으로 모델을 유연하게 변경할 수 있다.

```xml
<xacro:property name="arm_length_1" value="0.5"/>
<xacro:property name="arm_length_2" value="0.7"/>
<xacro:property name="joint_angle_1" value="0.78"/>
<xacro:property name="joint_angle_2" value="1.57"/>
```

위 코드에서 두 링크의 길이와 두 조인트의 각도를 매개변수화하였다. 이를 바탕으로 각 조인트와 링크의 관계를 정의할 수 있다.

```xml
<link name="link1">
  <origin xyz="0 0 0"/>
</link>

<joint name="joint1" type="revolute">
  <origin xyz="0 0 0" rpy="0 0 ${joint_angle_1}"/>
  <parent link="base_link"/>
  <child link="link1"/>
</joint>

<link name="link2">
  <origin xyz="0 0 ${arm_length_1}"/>
</link>

<joint name="joint2" type="revolute">
  <origin xyz="0 0 0" rpy="0 0 ${joint_angle_2}"/>
  <parent link="link1"/>
  <child link="link2"/>
</joint>
```

이 코드를 통해 두 개의 링크와 조인트로 구성된 로봇 팔을 매개변수화할 수 있으며, 각 링크의 길이와 조인트의 각도를 변경하여 다양한 로봇 팔 모델을 생성할 수 있다.

#### 매개변수를 통한 최적화

Xacro에서 매개변수를 사용하면 로봇 모델을 더욱 효율적으로 관리할 수 있다. 복잡한 URDF 파일을 작성할 때 반복적인 부분을 간소화하고, 공통적인 값을 매개변수로 정의함으로써 중복 코드를 줄일 수 있다. 이는 코드의 가독성을 높이고, 유지 보수를 쉽게 하며, 다양한 모델을 하나의 파일로 관리할 수 있게 한다.

**반복되는 코드의 간소화**

예를 들어, 로봇의 여러 링크가 동일한 속성을 가진다면, 이를 매개변수로 정의하고, 반복적으로 사용할 수 있다. 여러 링크에서 동일한 질량이나 재질을 사용하는 경우, 이를 매개변수로 정의하여 코드의 중복을 줄일 수 있다.

```xml
<xacro:property name="common_mass" value="1.0"/>
<xacro:property name="common_material" value="silver"/>

<link name="link1">
  <inertial>
    <mass value="${common_mass}"/>
  </inertial>
  <visual>
    <material name="${common_material}"/>
  </visual>
</link>

<link name="link2">
  <inertial>
    <mass value="${common_mass}"/>
  </inertial>
  <visual>
    <material name="${common_material}"/>
  </visual>
</link>
```

위 코드에서 두 링크가 동일한 질량과 재질을 공유하도록 매개변수를 정의하였다. 이를 통해 코드의 반복을 줄이고, 필요한 경우 매개변수 값만 수정하면 전체 모델에 반영될 수 있다.
