# 메쉬 파일 사용하기 (STL, Collada 등)

URDF에서 로봇의 시각적 요소를 정의할 때 메쉬 파일은 로봇의 외형을 보다 정확하고 복잡하게 표현할 수 있는 방법 중 하나이다. 일반적으로 STL, Collada와 같은 파일 형식을 사용하며, 이들 파일은 로봇의 외부 구조를 시각적으로 나타내는 데 유용하다. 이러한 메쉬 파일은 URDF에서 직접 참조하여 로봇의 시각적 모델을 설정할 수 있다.

#### STL 파일

STL (Stereolithography)은 3D 프린팅에서 널리 사용되는 파일 형식이며, 주로 삼각형으로 이루어진 격자를 이용하여 표면을 표현한다. STL 파일은 단순하면서도 경량으로, 시뮬레이션 속도를 저하시키지 않으면서 복잡한 형상을 표현할 수 있다.

STL 파일을 URDF에 적용하는 과정은 아래와 같다.

1. **STL 파일 준비** 먼저 로봇의 시각적 외형을 STL 파일로 준비해야 한다. 이를 위해 3D 모델링 소프트웨어(예: Blender, SolidWorks)를 사용할 수 있다.
2. **URDF에서 STL 파일 참조** URDF에서 STL 파일을 참조하기 위해서는 `<mesh>` 태그를 사용한다. 예를 들어, URDF에서 로봇의 팔을 STL 파일로 시각화하려면 아래와 같은 구문을 사용할 수 있다.

   ```xml
   <visual>
     <geometry>
       <mesh filename="package://my_robot/meshes/arm.stl"/>
     </geometry>
     <material name="silver"/>
   </visual>
   ```
3. **시각적 요소의 위치 및 크기 조정** STL 파일을 불러올 때, 크기와 위치를 조정하는 것이 중요하다. `<origin>` 태그를 사용하여 메쉬 파일의 위치와 회전값을 설정할 수 있다. 위치는 3차원 좌표 $(x, y, z)$로 나타내며, 회전은 Roll-Pitch-Yaw (RPY) 각도로 나타낸다. 수식으로 표현하면 회전 행렬은 다음과 같다.

$$
\mathbf{R}(\text{RPY}) = \begin{bmatrix} \cos(\theta\_y)\cos(\theta\_z) & \cos(\theta\_z)\sin(\theta\_x)\sin(\theta\_y) - \cos(\theta\_x)\sin(\theta\_z) & \sin(\theta\_x)\sin(\theta\_z) + \cos(\theta\_x)\cos(\theta\_z)\sin(\theta\_y) \ \cos(\theta\_y)\sin(\theta\_z) & \cos(\theta\_x)\cos(\theta\_z) + \sin(\theta\_x)\sin(\theta\_y)\sin(\theta\_z) & \cos(\theta\_x)\sin(\theta\_y)\sin(\theta\_z) - \cos(\theta\_z)\sin(\theta\_x) \ -\sin(\theta\_y) & \cos(\theta\_y)\sin(\theta\_x) & \cos(\theta\_x)\cos(\theta\_y) \end{bmatrix}
$$

여기서 $\theta\_x$, $\theta\_y$, $\theta\_z$는 각각 Roll, Pitch, Yaw 각도를 나타낸다.

4. **STL 파일의 축척** STL 파일의 기본 단위는 미터이며, 필요한 경우 축척을 변경할 수 있다. 이를 위해 `<scale>` 태그를 사용하며, 축척값을 $(sx, sy, sz)$로 지정한다. 이 값은 각 축에서의 비율을 의미하며, 값이 1보다 크면 모델이 커지고, 1보다 작으면 작아진다.

   ```xml
   <geometry>
     <mesh filename="package://my_robot/meshes/arm.stl" scale="1 1 1"/>
   </geometry>
   ```

#### Collada 파일

Collada(.dae)는 더 복잡한 시각적 요소를 지원하는 파일 형식으로, STL과 달리 색상 및 재질 정보도 포함할 수 있다. 또한 애니메이션 및 여러 모델링 기능을 지원하여 로봇의 외형을 더욱 사실적으로 표현할 수 있다.

1. **Collada 파일 준비** Collada 파일은 STL 파일과 마찬가지로 3D 모델링 소프트웨어(Blender, Maya 등)를 사용하여 준비할 수 있다. 모델을 제작한 후, Collada 파일 형식으로 내보내기(export)하여 URDF에서 사용할 수 있다.
2. **URDF에서 Collada 파일 참조** Collada 파일은 STL 파일과 유사하게 `<mesh>` 태그를 통해 URDF에 참조된다. Collada 파일은 재질(material)과 색상 정보도 포함할 수 있으므로, 재질 관련 태그를 추가로 정의할 필요가 없다. 예를 들어, 로봇의 몸체를 Collada 파일로 시각화하려면 아래와 같은 구문을 사용할 수 있다.

   ```xml
   <visual>
     <geometry>
       <mesh filename="package://my_robot/meshes/body.dae"/>
     </geometry>
   </visual>
   ```
3. **시각적 요소의 위치 및 회전 설정** STL 파일과 동일하게 `<origin>` 태그를 통해 위치와 회전을 설정할 수 있다. 여기서 위치는 $(x, y, z)$로 나타내고, 회전은 Roll-Pitch-Yaw 각도로 정의된다. 앞서 제시한 회전 행렬 $\mathbf{R}(\text{RPY})$을 동일하게 적용할 수 있다.
4. **Collada 파일의 축척** Collada 파일도 STL 파일처럼 기본 단위가 미터로 설정되며, 필요한 경우 축척을 변경할 수 있다. `<scale>` 태그를 사용하여 각 축에 대한 크기를 조정할 수 있다. 예를 들어, 아래 구문은 Collada 파일을 사용한 로봇 모델의 크기를 변경하는 방법을 보여준다.

   ```xml
   <geometry>
     <mesh filename="package://my_robot/meshes/body.dae" scale="1.2 1.2 1.2"/>
   </geometry>
   ```
5. **Collada 파일의 재질 및 색상** Collada 파일에는 자체적으로 재질 및 색상 정보가 포함될 수 있다. 따라서 STL 파일처럼 URDF에서 추가적으로 재질을 설정할 필요가 없다. 그러나 필요에 따라 URDF에서 재질을 덮어쓸 수도 있으며, 이를 위해 `<material>` 태그를 사용한다. 재질 설정의 기본 예시는 아래와 같다.

   ```xml
   <material name="blue">
     <color rgba="0 0 1 1"/>
   </material>
   ```
6. **Collada 파일의 애니메이션** Collada 파일의 장점 중 하나는 애니메이션 기능을 지원한다는 점이다. 로봇의 특정 부분을 움직이거나 동작 시퀀스를 표현할 수 있다. 이때 URDF 파일 내에서 애니메이션 기능을 정의하는 것은 직접적으로 이루어지지 않지만, Gazebo와 같은 시뮬레이션 환경에서 이를 활용할 수 있다. Collada 파일 내에 정의된 애니메이션 시퀀스는 시뮬레이션에서 로봇의 동작을 구현하는 데 사용될 수 있다.

#### 메쉬 파일의 적용 시 고려사항

1. **메쉬 파일의 복잡성** STL 또는 Collada 파일의 복잡도가 높을수록 시뮬레이션의 성능이 저하될 수 있다. 특히 Collada 파일은 STL보다 더 많은 정보(재질, 색상, 애니메이션 등)를 포함하므로, 시뮬레이션에서 로봇이 많거나 복잡한 환경에서는 성능 저하가 발생할 수 있다. 이러한 경우, 메쉬 파일의 다각형 수(polygons)를 줄이는 것이 필요할 수 있다.
2. **충돌 모델과의 차이** 시각적 요소로 사용되는 메쉬 파일은 충돌 모델로도 사용할 수 있다. 그러나 시각적으로 복잡한 메쉬 파일은 충돌 처리에서 과도한 계산을 요구할 수 있으므로, 충돌 모델은 보통 간단한 형상으로 정의하는 것이 일반적이다. 충돌 모델에 대한 간단한 형상 정의는 이후 충돌 모델 섹션에서 다룰 예정이다.
