# URDF의 충돌 모델 정의

#### 충돌 모델의 개념

URDF에서 충돌 모델은 로봇이 환경 내에서 다른 객체와 상호작용할 때 물리적으로 충돌할 수 있는 부분을 정의하는 데 사용된다. 충돌 모델은 실제 로봇이 환경과 충돌할 수 있는 영역을 표현하기 위한 간소화된 형상으로 정의되며, 이는 물리 엔진이 충돌 계산을 처리하는 데 필수적이다.

충돌 모델은 주로 로봇의 물리적 형태와 유사하게 설정되지만, 복잡한 메쉬 형상보다는 계산의 효율성을 높이기 위해 간단한 기하학적 형상을 사용한다. 일반적으로 충돌 모델에서는 다음과 같은 간단한 기하학적 형상을 사용한다:

* 박스(Box)
* 실린더(Cylinder)
* 구(Sphere)

이러한 간단한 형상은 물리 엔진이 빠르게 충돌을 감지하고 계산할 수 있도록 하여 시뮬레이션 성능을 향상시킨다.

#### 충돌 모델 정의의 수학적 표현

충돌 모델을 정의할 때, 기본적으로는 링크(Link)의 위치와 방향을 기준으로 물리적 충돌을 감지해야 한다. 이를 위해 링크의 변환 행렬(Transformation Matrix)이 사용되며, 링크에 연결된 조인트(Joint)를 통해 링크의 위치 및 회전이 결정된다.

링크의 위치와 방향은 일반적으로 다음과 같은 변환 행렬로 표현된다:

$$
\mathbf{T}*{link} = \begin{bmatrix} \mathbf{R}*{link} & \mathbf{p}\_{link} \ \mathbf{0}^{T} & 1 \end{bmatrix}
$$

여기서:

* $\mathbf{R}\_{link}$는 링크의 회전 행렬(3x3)로, 링크의 방향을 나타낸다.
* $\mathbf{p}\_{link}$는 링크의 위치 벡터(3x1)로, 링크의 중심 좌표를 나타낸다.
* $\mathbf{T}\_{link}$는 링크의 위치와 방향을 동시에 나타내는 4x4 변환 행렬이다.

충돌 모델을 정의할 때, 이러한 링크의 변환을 기준으로 각 기하학적 형상(Box, Cylinder, Sphere 등)의 위치와 방향도 함께 변환된다. 예를 들어, 충돌 모델로 박스(Box)를 사용한다면, 그 박스의 중심 좌표와 각 변의 길이를 링크의 좌표계에서 정의해야 한다.

박스의 충돌 모델을 정의하는 수학적 식은 다음과 같다:

$$
\mathbf{p}*{box} = \mathbf{T}*{link} \cdot \mathbf{p}\_{local}
$$

여기서:

* $\mathbf{p}\_{box}$는 전역 좌표계에서 박스의 위치 벡터이다.
* $\mathbf{p}\_{local}$은 링크 좌표계에서 박스의 중심 위치 벡터이다.
* $\mathbf{T}\_{link}$는 링크의 변환 행렬로, 박스가 속한 링크의 위치와 방향을 나타낸다.

박스의 각 변의 길이는 다음과 같이 정의된다:

* $l\_x$, $l\_y$, $l\_z$는 각각 박스의 x축, y축, z축 방향의 길이를 나타낸다.

이러한 박스의 충돌 모델을 사용하여 물리 엔진은 박스와 환경 또는 다른 객체 간의 충돌을 감지할 수 있다. 충돌이 감지되면, 물리 엔진은 반작용 힘을 계산하여 로봇의 동작을 제어한다.

#### 충돌 감지의 기본 원리

충돌 감지에는 두 객체의 기하학적 형상이 교차하는지를 확인하는 계산이 포함된다. 충돌 모델이 단순한 기하학적 형상으로 정의되면, 충돌 여부를 보다 빠르게 계산할 수 있다. 예를 들어, 두 개의 구(Sphere)가 충돌하는지를 계산하려면 각 구의 중심 간 거리가 두 구의 반지름의 합보다 작은지를 비교하면 된다.

두 구의 충돌 여부를 계산하는 공식은 다음과 같다:

$$
d(\mathbf{p}\_1, \mathbf{p}\_2) = |\mathbf{p}\_1 - \mathbf{p}\_2|
$$

여기서:

* $d(\mathbf{p}\_1, \mathbf{p}\_2)$는 두 구의 중심 간 거리이다.
* $\mathbf{p}\_1$, $\mathbf{p}\_2$는 각각 구 1과 구 2의 중심 위치 벡터이다.

충돌 조건은 다음과 같다:

$$
d(\mathbf{p}\_1, \mathbf{p}\_2) < r\_1 + r\_2
$$

여기서 $r\_1$, $r\_2$는 각각 구 1과 구 2의 반지름이다.

이 공식을 사용하면 두 구가 충돌하는지 여부를 빠르게 판단할 수 있다. 박스, 실린더와 같은 다른 형상에 대해서도 유사한 충돌 감지 알고리즘이 적용된다.

#### 충돌 모델의 기하학적 형상 정의

충돌 모델에서 사용하는 기본적인 기하학적 형상은 물리 엔진에서 충돌 감지를 효율적으로 수행할 수 있도록 설계된다. 로봇의 복잡한 메쉬(mesh) 모델을 그대로 사용하는 대신, 간소화된 기하학적 모델을 사용하여 충돌 계산을 수행한다. 여기서는 URDF에서 자주 사용되는 기하학적 형상인 박스(Box), 실린더(Cylinder), 구(Sphere)의 정의와 충돌 감지 방식을 설명한다.

**박스(Box) 충돌 모델 정의**

박스는 3개의 축 방향으로 길이를 가지는 직육면체로 정의된다. 박스의 충돌 모델은 다음과 같은 매개변수로 설정된다:

* $l\_x$: 박스의 x축 방향 길이
* $l\_y$: 박스의 y축 방향 길이
* $l\_z$: 박스의 z축 방향 길이

박스의 충돌 모델에서, 박스의 중심 좌표를 기준으로 한 충돌 영역은 다음과 같이 정의된다:

$$
\mathbf{p}\_{box} = \left( \frac{l\_x}{2}, \frac{l\_y}{2}, \frac{l\_z}{2} \right)
$$

여기서 박스는 중심 좌표를 기준으로 $l\_x$, $l\_y$, $l\_z$의 절반씩 확장된 범위를 가지며, 각 축 방향에서 충돌 감지가 이루어진다.

**실린더(Cylinder) 충돌 모델 정의**

실린더는 원형 단면을 가지며 특정 축 방향으로 높이를 가지는 기하학적 형상이다. 실린더 충돌 모델은 다음과 같은 매개변수로 정의된다:

* $r$: 실린더의 반지름
* $h$: 실린더의 높이

실린더의 충돌 영역은 해당 축을 따라 반지름 $r$과 높이 $h$로 정의된다. 실린더의 축 방향을 기준으로 충돌 모델을 정의하면, 실린더의 상단과 하단 그리고 원형 단면의 경계에서 충돌 감지가 발생한다.

실린더의 충돌 영역은 다음과 같은 수학적 관계로 표현될 수 있다:

$$
\mathbf{p}\_{cyl} = \left( r \cos{\theta}, r \sin{\theta}, \frac{h}{2} \right)
$$

여기서 $\theta$는 원형 단면에서의 각도를 나타낸다.

**구(Sphere) 충돌 모델 정의**

구는 가장 단순한 기하학적 형상으로, 중심을 기준으로 일정한 반지름을 가지는 3차원 구형이다. 구의 충돌 모델은 다음과 같은 매개변수로 정의된다:

* $r$: 구의 반지름

구의 충돌 영역은 단순히 중심에서 반지름 $r$만큼의 거리를 기준으로 계산되며, 충돌 감지 계산이 매우 간단하다. 구의 충돌 영역은 다음과 같이 정의된다:

$$
|\mathbf{p}\_{sphere}| \leq r
$$

여기서 $\mathbf{p}\_{sphere}$는 구의 중심에서 특정 지점까지의 거리 벡터이다.

**복잡한 충돌 모델에서 메쉬 사용**

간단한 기하학적 형상으로 충돌 모델을 정의하는 것이 불가능한 경우, 복잡한 메쉬 파일을 사용할 수 있다. 복잡한 메쉬 충돌 모델은 STL 또는 Collada와 같은 형식의 파일을 사용하여 로봇의 실제 물리적 형상을 충돌 모델로 정의한다.

메쉬 기반 충돌 모델의 충돌 감지는 각 삼각형 면에서의 충돌을 계산하며, 이는 복잡한 객체의 충돌 감지를 정밀하게 처리할 수 있다. 하지만, 메쉬 파일을 사용하는 경우 계산 복잡도가 증가하여 시뮬레이션 성능에 영향을 줄 수 있다.

복잡한 충돌 모델을 사용할 때는 메쉬 파일을 적절히 단순화하거나, 충돌 감지 영역에서 중요한 부분만을 메쉬로 정의하는 것이 권장된다.

#### 충돌 모델의 물리적 특성

충돌 모델을 정의할 때 중요한 요소는 물리적 특성을 포함하여 로봇의 움직임과 환경과의 상호작용을 결정하는 것이다. 이러한 물리적 특성에는 질량, 관성, 마찰 계수 등이 포함되며, 충돌 시 로봇이 어떻게 반응할지를 결정하는 중요한 요소들이다.

**질량과 관성**

질량($m$)은 로봇의 각 링크의 무게를 나타내며, 로봇의 충돌 시 힘과 가속도에 직접적인 영향을 미친다. URDF에서 각 링크의 질량을 정의할 때는 해당 링크의 중심에서 질량 중심이 어떻게 배분되는지를 명시해야 한다.

질량 중심을 나타내는 수학적 표현은 다음과 같다:

$$
\mathbf{p}*{cm} = \left( x*{cm}, y\_{cm}, z\_{cm} \right)
$$

여기서 $\mathbf{p}\_{cm}$은 질량 중심 좌표이다.

관성 모멘트($\mathbf{I}$)는 로봇의 각 링크가 회전할 때 그 링크가 저항하는 정도를 나타낸다. 관성 모멘트는 충돌 후 링크가 어떻게 회전할지에 영향을 미치는 중요한 물리적 특성이다. URDF에서는 각 링크의 관성 텐서(inertia tensor)를 정의하여 이를 나타낸다.

관성 모멘트는 다음과 같은 $3 \times 3$ 행렬로 정의된다:

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

여기서 $I\_{xx}, I\_{yy}, I\_{zz}$는 각 축에 대한 관성 모멘트를 나타내며, $I\_{xy}, I\_{xz}, I\_{yz}$는 교차 관성 모멘트로 각 축 사이의 상호작용을 나타낸다.

질량과 관성은 충돌 후 로봇이 어떻게 이동하고 회전할지 결정하는 중요한 물리적 특성이다. 물리 엔진은 이러한 물리적 특성을 기반으로 충돌 시 로봇의 동작을 계산한다.

**마찰**

마찰은 충돌 후 로봇과 표면 간의 상호작용을 결정하는 또 다른 중요한 요소이다. URDF에서는 마찰 계수($\mu$)를 정의하여, 로봇이 표면에서 얼마나 쉽게 미끄러질 수 있는지를 설정할 수 있다.

마찰 계수는 정지 마찰과 동적 마찰로 나뉜다:

* 정지 마찰($\mu\_s$)은 로봇이 멈춰 있을 때 표면에서 미끄러지기 시작하는 데 필요한 최소한의 힘을 나타낸다.
* 동적 마찰($\mu\_k$)은 로봇이 움직이고 있을 때 표면에서 미끄러질 때의 저항을 나타낸다.

마찰 계수는 로봇의 충돌 후 정지 및 이동을 결정하는 중요한 변수로, 시뮬레이션에서 로봇의 현실적인 동작을 구현하는 데 필수적이다.

마찰 계수를 사용하는 충돌 모델에서의 힘 계산은 다음과 같은 식으로 정의된다:

$$
F\_f = \mu \cdot F\_n
$$

여기서:

* $F\_f$는 마찰력이다.
* $\mu$는 마찰 계수로, 정지 마찰 또는 동적 마찰 중 하나이다.
* $F\_n$은 로봇과 표면 사이의 수직 접촉력(일반적으로 중력에 의해 결정됨)이다.

마찰 계수를 정확히 설정함으로써, 로봇이 환경과 상호작용할 때 더 현실적인 물리적 반응을 얻을 수 있다.

**충격과 반발 계수**

로봇이 충돌할 때, 충돌에 의해 발생하는 힘과 그 충격을 제어하기 위해 반발 계수($e$)를 정의할 수 있다. 반발 계수는 두 객체가 충돌 후 얼마나 반발하는지를 나타내는 값으로, 0에서 1 사이의 값을 가진다. 반발 계수가 1에 가까울수록, 충돌 후 객체는 더 많이 반발하며, 0에 가까울수록 충돌 후 거의 반발하지 않고 에너지가 소멸된다.

반발 계수를 사용하는 충돌 모델에서의 속도 변화는 다음과 같이 표현된다:

$$
v\_{\text{final}} = e \cdot v\_{\text{initial}}
$$

여기서:

* $v\_{\text{final}}$은 충돌 후의 속도이다.
* $v\_{\text{initial}}$은 충돌 전의 속도이다.
* $e$는 반발 계수이다.

반발 계수를 적절히 설정함으로써, 충돌 후 로봇의 에너지가 얼마나 소실되는지 또는 얼마나 유지되는지를 제어할 수 있다.
