물리 엔진의 개요

로봇 시뮬레이션에서 물리 엔진은 로봇과 환경 간의 상호작용을 계산하고, 중력, 마찰, 충돌 등의 물리적 현상을 시뮬레이션하는 역할을 한다. Gazebo와 같은 시뮬레이터는 주로 ODE (Open Dynamics Engine), Bullet, DART, Simbody와 같은 여러 물리 엔진을 지원하며, 이 중 어떤 엔진을 선택할지에 따라 시뮬레이션의 성능과 정확도가 달라진다.

물리 엔진의 선택

SDF 파일에서 <physics> 태그를 사용하여 시뮬레이션에 사용할 물리 엔진을 정의한다. 일반적으로 물리 엔진은 시뮬레이션 환경의 성능 요구 사항에 따라 선택되며, ODE는 상대적으로 가볍고 빠른 반면, Bullet은 더 정교한 충돌 감지와 역학 계산을 제공한다.

SDF에서 물리 엔진을 설정하는 예시는 다음과 같다.

<physics name="default_physics" type="ode">
  <gravity>0 0 -9.81</gravity>
  <max_step_size>0.001</max_step_size>
  <real_time_update_rate>1000</real_time_update_rate>
</physics>

여기에서 gravity는 중력의 크기를 나타내며, max_step_size는 시뮬레이션의 시간 단계의 크기, real_time_update_rate는 시뮬레이션 속도를 결정한다.

중력 적용

물리 엔진에서 중력은 시뮬레이션 환경의 중요한 요소 중 하나다. 중력은 벡터 형태로 정의되며, 일반적으로 지구의 표준 중력인 \mathbf{g} = [0, 0, -9.81] \, \text{m/s}^2를 사용한다. 중력은 로봇의 모든 링크와 조인트에 동일하게 적용되며, 이는 로봇의 질량 중심에 대한 영향을 계산하는 데 사용된다.

마찰과 댐핑 설정

마찰과 댐핑은 로봇이 환경과 상호작용할 때 매우 중요한 물리적 속성이다. 마찰은 접촉 표면 간의 저항을 나타내며, 댐핑은 시스템에서 발생하는 에너지를 소모하는 역할을 한다. 물리 엔진에서 마찰과 댐핑은 각각 다음과 같은 방식으로 정의된다.

SDF에서 마찰을 설정하는 예시는 다음과 같다.

<surface>
  <friction>
    <ode>
      <mu>1.0</mu>
      <mu2>1.0</mu2>
    </ode>
  </friction>
  <bounce>
    <restitution_coefficient>0.0</restitution_coefficient>
  </bounce>
</surface>

여기서 mu는 마찰 계수를 나타내며, 두 접촉 표면 간의 저항을 결정한다. restitution_coefficient는 반발 계수를 나타내어 충돌 후 에너지가 얼마나 보존되는지를 정의한다.

댐핑은 로봇의 링크 및 조인트에 적용될 수 있으며, 이는 로봇의 운동에서 발생하는 진동을 줄이는 데 사용된다.

충돌 감지 설정

환경에서 로봇과 객체들이 상호작용할 때, 충돌 감지는 매우 중요한 역할을 한다. 물리 엔진은 객체 간의 충돌을 계산하고, 해당 충돌에 따른 물리적인 반응을 시뮬레이션한다. SDF에서는 각 링크마다 충돌 모델을 설정할 수 있으며, 이를 통해 충돌 감지를 구현한다.

SDF에서 충돌 모델을 설정하는 방법은 다음과 같다.

<collision name="collision">
  <geometry>
    <box>
      <size>1 1 1</size>
    </box>
  </geometry>
  <surface>
    <contact>
      <ode>
        <kp>1e+12</kp>
        <kd>1.0</kd>
      </ode>
    </contact>
  </surface>
</collision>

여기서 kp는 충돌 시 발생하는 힘에 대한 스프링 상수를 나타내며, kd는 댐핑 상수로 충돌 시 에너지를 흡수하는 역할을 한다. 충돌이 발생했을 때 물체가 어떻게 반응할지를 결정하는 데 중요한 매개변수들이다.

물체의 질량과 관성 설정

SDF에서 물리적인 상호작용을 보다 정확하게 시뮬레이션하기 위해 각 링크의 질량과 관성을 정의해야 한다. 질량은 물체의 질량 중심에 대한 효과를 결정하며, 관성 텐서는 물체의 회전에 따른 저항을 계산하는 데 사용된다.

질량과 관성을 정의하는 SDF 예시는 다음과 같다.

<inertial>
  <mass>10.0</mass>
  <inertia>
    <ixx>0.1</ixx>
    <iyy>0.1</iyy>
    <izz>0.1</izz>
    <ixy>0.0</ixy>
    <ixz>0.0</ixz>
    <iyz>0.0</iyz>
  </inertia>
</inertial>

여기서 \mathbf{I}는 관성 텐서를 나타내며, 다음과 같은 행렬로 표현된다.

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

이 관성 행렬은 물체가 각 축을 기준으로 회전할 때 발생하는 저항을 나타내며, 물체의 운동 방정식에서 중요한 역할을 한다.

충돌 후 반발과 에너지 보존

물리 엔진에서 물체 간의 충돌이 발생할 때, 충돌 후 에너지의 보존 여부를 설정할 수 있다. 이는 반발 계수(복원 계수)로 정의되며, 값이 0이면 충돌 후 에너지가 전부 소모되고, 1이면 에너지가 전부 보존된다.

<bounce>
  <restitution_coefficient>0.5</restitution_coefficient>
</bounce>

이 설정은 충돌이 발생했을 때 두 물체가 얼마나 반발할지를 결정하며, 이를 통해 시뮬레이션에서 더 현실적인 물리적 반응을 구현할 수 있다.

마찰력의 수학적 모델

마찰력은 두 물체 간의 접촉 표면에서 발생하는 저항력으로, 이는 물리 엔진에서 다음과 같은 수식으로 표현된다.

\mathbf{F}_{\text{friction}} = \mu \mathbf{N}

여기서 \mu는 마찰 계수, \mathbf{N}은 접촉 면에서 발생하는 수직 힘이다. 이 식은 물체가 움직이거나 정지해 있을 때 발생하는 마찰력을 설명하며, 시뮬레이션 환경에서 중요한 역할을 한다.