충돌 모델의 기본 개념

로봇과 환경 간의 상호작용에서 충돌 처리는 매우 중요한 부분이다. 로봇의 물리적 행동이 시뮬레이션 환경에서 어떻게 반영되는지를 이해하기 위해 충돌 모델을 정의해야 한다. Gazebo와 같은 시뮬레이션 환경에서는 각 물체가 충돌하는 순간의 물리적 특성을 반영하기 위해 충돌 모델을 설정할 수 있다.

충돌 모델은 실제로 로봇과 환경 사이의 충돌을 처리할 때 사용되는 간단한 형상이나 복잡한 형상으로 정의된다. 로봇의 각 링크는 충돌 가능성이 있으며, 그에 맞는 충돌 형상이 설정되어야 한다. 기본적으로 Gazebo에서 충돌 모델은 박스, 실린더, 구 등의 기하학적 형상을 통해 정의할 수 있다.

충돌 검출

로봇이 환경과 충돌하는지 여부를 결정하기 위해 충돌 검출 알고리즘이 사용된다. 충돌 검출은 물리 엔진에서 중요한 역할을 하며, 이 과정에서 두 물체가 일정한 거리에 접근했는지 또는 실제로 접촉했는지 여부를 계산한다. 이를 위해 물리 엔진은 물체의 경계 상자(Bounding Box)를 이용하여 초기 검출 단계를 수행한 후, 보다 정밀한 충돌 검출을 위해 기하학적 형상을 비교한다.

충돌 검출을 위해 두 물체 AB의 위치 벡터 \mathbf{p}_A, \mathbf{p}_B를 고려하여 다음과 같은 조건을 확인할 수 있다:

d(\mathbf{p}_A, \mathbf{p}_B) = \|\mathbf{p}_A - \mathbf{p}_B\| < r_A + r_B

여기서 r_Ar_B는 각각 물체 AB의 충돌 반지름이다. 이 조건을 만족하면 두 물체는 충돌 상태에 있다고 간주된다.

충돌 반응

충돌이 감지되면, 물리 엔진은 그에 따라 충돌 반응을 계산한다. 충돌 반응은 일반적으로 충격력과 회복력을 계산하여 물체의 새로운 운동 상태를 결정하는 방식으로 이루어진다. 뉴턴의 운동 법칙을 바탕으로 충돌 후 각 물체의 속도와 방향을 결정하는 충격량(Impulse)은 다음과 같이 표현된다:

\mathbf{J} = -(1 + e) \frac{\mathbf{v}_{AB} \cdot \mathbf{n}}{\frac{1}{m_A} + \frac{1}{m_B}} \mathbf{n}

여기서 \mathbf{J}는 충격량 벡터이며, e는 반발 계수(Restitution Coefficient), \mathbf{v}_{AB}는 충돌 지점에서의 상대 속도, \mathbf{n}은 충돌 표면의 법선 벡터, 그리고 m_A, m_B는 각각 물체 AB의 질량이다. 충격량 \mathbf{J}는 각 물체에 적용되어 충돌 후의 속도 변화를 일으킨다.

다음으로 충돌 후 물체 AB의 속도는 다음과 같이 계산된다:

\mathbf{v}_A' = \mathbf{v}_A + \frac{\mathbf{J}}{m_A}
\mathbf{v}_B' = \mathbf{v}_B - \frac{\mathbf{J}}{m_B}

위 식을 통해 충돌 후 물체의 새로운 속도를 계산할 수 있다.

마찰력 처리

충돌 후 물체의 운동을 현실적으로 모델링하기 위해서는 마찰력도 고려해야 한다. 특히 로봇이 지면과 접촉하는 경우, 마찰력은 로봇의 이동을 제어하는 중요한 요소이다. 마찰력은 물체와 표면 간의 상대 운동을 방해하는 힘으로, 정지 마찰력(Static Friction)과 운동 마찰력(Kinetic Friction)으로 구분된다.

정지 마찰력은 물체가 움직이기 전까지 작용하며, 그 최대값은 다음과 같이 표현된다:

\mathbf{F}_s \leq \mu_s \mathbf{N}

여기서 \mathbf{F}_s는 정지 마찰력, \mu_s는 정지 마찰 계수, 그리고 \mathbf{N}은 접촉 표면에서의 법선 방향 힘(일반적으로 물체의 무게에 해당하는 힘)이다. 정지 마찰력은 물체가 움직이지 않는 한 최대값을 가지며, 이 값을 초과하면 물체는 움직이기 시작한다.

물체가 움직이기 시작하면 운동 마찰력이 작용하며, 운동 마찰력은 정지 마찰력보다 작고 다음과 같이 표현된다:

\mathbf{F}_k = \mu_k \mathbf{N}

여기서 \mu_k는 운동 마찰 계수이다. 물체가 일정한 속도로 움직일 때는 이 운동 마찰력이 계속해서 작용하게 된다. Gazebo에서는 물체의 물리적 속성과 마찰 계수를 설정하여 충돌 후의 운동을 보다 사실적으로 시뮬레이션할 수 있다.

충돌 감쇠력

충돌 처리 시, 실제 환경에서는 완전 탄성 충돌이 일어나지 않기 때문에 일부 에너지는 소모되거나 흡수된다. 이러한 에너지 손실은 충돌 감쇠력(Damping)으로 모델링할 수 있다. 충돌 감쇠력은 충돌 후 물체의 운동 에너지가 감소하는 비율을 결정하며, 이를 통해 로봇이 충돌 후에도 물리적으로 안정적인 상태를 유지할 수 있게 한다.

충돌 감쇠력은 시간에 따라 물체의 운동 속도를 줄이는 역할을 하며, 이를 수식으로 나타내면 다음과 같다:

\mathbf{F}_d = -c_d \mathbf{v}

여기서 \mathbf{F}_d는 감쇠력, c_d는 감쇠 계수, 그리고 \mathbf{v}는 물체의 속도이다. 이 식은 속도에 비례하여 감쇠력이 작용함을 나타내며, 시간이 지남에 따라 물체의 속도를 점진적으로 감소시킨다.

Gazebo에서 충돌 처리 설정

Gazebo에서는 URDF 또는 SDF 파일을 통해 각 링크에 대한 충돌 모델을 설정할 수 있으며, 충돌 형상, 마찰 계수, 반발 계수 등을 명시할 수 있다. URDF에서는 다음과 같은 형식으로 충돌 모델을 정의할 수 있다:

<collision>
  <geometry>
    <box>
      <size>1 1 1</size>
    </box>
  </geometry>
  <surface>
    <friction>
      <ode>
        <mu>0.5</mu>
        <mu2>0.5</mu2>
      </ode>
    </friction>
    <bounce>
      <restitution_coefficient>0.1</restitution_coefficient>
    </bounce>
  </surface>
</collision>

위 예시에서, box 형상은 충돌 모델을 정의하고 있으며, 마찰 계수와 반발 계수는 각각 설정되어 충돌 후 로봇의 물리적 특성을 정의한다. 또한 Gazebo에서 충돌 검출을 위한 형상은 시각적 모델과는 별개로 단순화된 형태로 설정될 수 있어, 시뮬레이션 성능을 향상시킬 수 있다.

충돌 해석의 수치적 방법

실시간 시뮬레이션에서 충돌 처리는 수치적으로 다뤄지며, 매우 작은 시간 간격 \Delta t 동안 충돌 전후의 상태 변화를 계산하게 된다. 이때 충격량 \mathbf{J}의 계산에서 매우 짧은 시간 안에 작용하는 힘을 고려해야 하므로, 실제로는 충돌이 발생하는 순간을 매우 짧은 시간 단계로 나누어 처리한다.

이러한 수치적 방법에서 충돌 후 상태는 다음과 같이 이산 시간 형태로 나타낼 수 있다:

\mathbf{v}(t + \Delta t) = \mathbf{v}(t) + \frac{\mathbf{J}}{m} \Delta t

이를 통해 충돌 후 물체의 속도와 방향을 계산하여 시뮬레이션 상에서 물리적으로 자연스러운 운동을 구현할 수 있다.