충돌 모델은 로봇 시뮬레이션에서 물리적 상호작용을 처리하기 위해 반드시 필요한 요소이다. 로봇의 링크(link)가 서로 혹은 환경과 충돌할 때 발생하는 물리적인 상호작용을 정의하기 위해 충돌 모델을 설계해야 한다. 이러한 충돌 모델은 실제 물리적 특성과 유사하게 동작해야 하므로, 단순한 형상(예: 박스, 실린더, 구)으로 정의하는 경우가 많다.

충돌 모델의 역할

충돌 모델은 주로 물리 엔진(ODE, Bullet 등)에서 사용되어 물체 간의 상호작용을 시뮬레이션한다. 시뮬레이션에서 충돌이 발생할 경우, 물체는 물리적으로 반응하여 운동 상태가 변한다. 이러한 충돌 계산은 시뮬레이션 성능에 중요한 영향을 미치기 때문에 충돌 모델의 형상과 정의가 효율적으로 설계되어야 한다.

기본 충돌 형상

충돌 모델은 시뮬레이션 성능을 고려해 간단한 형상으로 정의된다. 일반적으로 박스, 실린더, 구와 같은 기본 형상이 사용된다. 이들 형상은 수학적으로 간단하게 정의되며, 충돌 계산을 쉽게 할 수 있다.

박스(Box) 충돌 모델

박스 충돌 모델은 축에 정렬된 직육면체로 정의된다. 박스는 다음과 같은 수학적 표현으로 정의할 수 있다.

박스의 길이, 너비, 높이를 각각 l_x, l_y, l_z라 할 때, 박스의 충돌 모델은 다음과 같이 정의된다.

\mathbf{C}_{\text{box}} = \left\{ \mathbf{r} \in \mathbb{R}^3 \, \middle| \, -\frac{l_x}{2} \leq x \leq \frac{l_x}{2}, \, -\frac{l_y}{2} \leq y \leq \frac{l_y}{2}, \, -\frac{l_z}{2} \leq z \leq \frac{l_z}{2} \right\}

여기서 \mathbf{C}_{\text{box}}는 박스의 충돌 모델을 정의하는 집합이고, \mathbf{r} = [x, y, z]^T는 공간 내 점을 나타내는 벡터이다. 이 정의에 따라, 박스 내부에 속하는 점들은 모두 충돌 모델로 간주된다.

실린더(Cylinder) 충돌 모델

실린더 충돌 모델은 중심 축에 대해 대칭인 원통형 모양을 갖는다. 실린더의 반지름과 높이를 각각 r, h라 할 때, 실린더의 충돌 모델은 다음과 같이 정의된다.

\mathbf{C}_{\text{cylinder}} = \left\{ \mathbf{r} \in \mathbb{R}^3 \, \middle| \, x^2 + y^2 \leq r^2, \, -\frac{h}{2} \leq z \leq \frac{h}{2} \right\}

이 경우, 실린더의 충돌 모델은 반지름 r 내에서, 그리고 높이 h의 범위 내에 있는 점들로 구성된다. 충돌 계산은 주로 실린더의 중심 축을 기준으로 이루어지며, 실린더의 상하단 모서리 부분에서도 충돌이 발생할 수 있다.

구(Sphere) 충돌 모델

구 충돌 모델은 가장 단순한 충돌 모델 중 하나로, 반지름 r을 가지는 구형으로 정의된다. 구의 충돌 모델은 다음과 같은 수학적 식으로 나타낼 수 있다.

\mathbf{C}_{\text{sphere}} = \left\{ \mathbf{r} \in \mathbb{R}^3 \, \middle| \, x^2 + y^2 + z^2 \leq r^2 \right\}

여기서 \mathbf{C}_{\text{sphere}}는 구의 충돌 모델을 정의하는 집합이고, r은 구의 반지름이다. 구 충돌 모델은 모든 방향에서 동일한 반경을 가지므로 계산이 간단하며, 많은 로봇 시뮬레이션에서 기본 충돌 모델로 사용된다.

충돌 모델의 사용 예

간단한 충돌 형상을 정의한 후, 이를 URDF 파일에 포함시켜야 한다. URDF에서 충돌 모델은 <collision> 태그를 통해 정의되며, 각 링크에 대해 설정할 수 있다. 이때 충돌 모델은 로봇의 실제 물리적 특성과 가까운 간단한 기하학적 형태를 사용하여 시뮬레이션 성능을 최적화할 수 있다.

예를 들어, 로봇의 링크가 직육면체(박스) 형태라면 다음과 같이 URDF에서 충돌 모델을 정의할 수 있다.

<collision>
  <geometry>
    <box size="1 0.5 0.2"/>
  </geometry>
</collision>

여기서 size 속성은 박스의 길이, 너비, 높이를 나타내며, 각각 l_x, l_y, l_z에 해당한다.

실린더 충돌 모델 예

실린더 충돌 모델은 다음과 같이 URDF에서 정의할 수 있다.

<collision>
  <geometry>
    <cylinder radius="0.2" length="1.0"/>
  </geometry>
</collision>

여기서 radius는 실린더의 반지름 r을 나타내고, length는 실린더의 높이 h를 나타낸다.

구 충돌 모델 예

구 충돌 모델은 가장 간단하게 정의될 수 있으며, URDF에서 다음과 같이 설정된다.

<collision>
  <geometry>
    <sphere radius="0.5"/>
  </geometry>
</collision>

이 구 충돌 모델은 반지름 r = 0.5인 구체를 정의한다.

복합 충돌 모델

복합 충돌 모델은 여러 개의 간단한 충돌 모델을 조합하여 로봇의 복잡한 형상을 표현하는 방법이다. 예를 들어, 로봇의 한 링크가 상단은 실린더, 하단은 박스로 구성된 경우, URDF에서 두 개의 충돌 모델을 결합하여 정의할 수 있다. 이때 각각의 충돌 모델을 별도의 <collision> 태그 안에 넣고, 서로 다른 형상을 사용하여 정의한다.

<collision>
  <geometry>
    <cylinder radius="0.2" length="0.5"/>
  </geometry>
  <origin xyz="0 0 0.25"/>
</collision>
<collision>
  <geometry>
    <box size="0.4 0.4 0.2"/>
  </geometry>
  <origin xyz="0 0 -0.1"/>
</collision>

이 예시에서는 실린더와 박스를 결합하여 하나의 링크에 대해 두 가지 충돌 모델을 정의하고 있다. 각각의 충돌 모델은 로봇 링크의 서로 다른 부분을 나타낸다.

충돌 모델의 계산 효율성

충돌 모델의 복잡성은 시뮬레이션 성능에 큰 영향을 미친다. 특히 복잡한 로봇 구조일수록 충돌 모델이 복잡해지면 시뮬레이션 속도가 크게 저하될 수 있다. 이를 방지하기 위해 간단한 기하학적 형상(박스, 실린더, 구)으로 충돌 모델을 정의하는 것이 일반적이다.

기본 충돌 형상을 사용하면 충돌 감지 및 계산이 매우 효율적이며, 물리 엔진에서 빠르게 처리할 수 있다. 반면에 복잡한 메쉬 파일을 충돌 모델로 사용하는 경우, 충돌 감지 과정에서 많은 연산을 필요로 하게 되어 시뮬레이션 성능이 떨어질 수 있다.