SDF(Simulation Description Format)에서 로봇의 물리적 상호작용을 시뮬레이션하기 위해서는 물리 엔진을 설정하는 것이 필수적이다. 물리 엔진은 시뮬레이션에서 객체 간의 충돌, 마찰, 중력, 관성 등 다양한 물리적 현상을 계산하여 현실적인 동작을 제공한다. SDF에서는 여러 종류의 물리 엔진을 사용할 수 있으며, 대표적으로 ODE(Open Dynamics Engine)와 Bullet이 있다.

ODE (Open Dynamics Engine)

ODE는 간단하면서도 빠른 물리 엔진으로, 주로 로봇 시뮬레이션과 같은 실시간 응용 프로그램에서 많이 사용된다. 충돌 감지와 동역학 시뮬레이션을 제공하며, 특히 복잡한 조인트를 가진 멀티 조인트 로봇의 시뮬레이션에 적합하다. ODE에서 사용하는 주요 개념과 수식을 다루자면 다음과 같다.

질량 중심 및 관성 모멘트

ODE에서는 각 물체의 질량과 관성 모멘트를 기반으로 물리적 움직임을 시뮬레이션한다. 질량 중심과 관성 모멘트는 물체의 동역학적인 특성을 정의하며, 이를 통해 시뮬레이션에서 객체의 움직임이 결정된다.

물체의 질량 행렬은 다음과 같이 정의된다:

\mathbf{M} = \begin{bmatrix} m & 0 & 0 \\ 0 & m & 0 \\ 0 & 0 & m \end{bmatrix}

여기서 m은 물체의 질량이다.

관성 모멘트 행렬 \mathbf{I}는 다음과 같이 정의된다:

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

여기서 I_{xx}, I_{yy}, I_{zz}는 주 관성 모멘트이고, I_{xy}, I_{xz}, I_{yz}는 비대칭 항이다.

이러한 질량과 관성 모멘트는 물체의 운동 방정식에 따라 계산된다. ODE는 이를 이용해 회전 및 선형 운동을 계산하며, 객체의 상태 변화를 시뮬레이션한다.

운동 방정식

ODE에서의 운동 방정식은 뉴턴-오일러 방정식을 기반으로 한다. 물체의 선형 운동은 다음과 같은 방정식으로 표현된다:

\mathbf{F} = m \mathbf{a}

여기서 \mathbf{F}는 힘, m은 질량, \mathbf{a}는 가속도이다.

회전 운동은 다음과 같은 방정식으로 표현된다:

\mathbf{\tau} = \mathbf{I} \mathbf{\alpha}

여기서 \mathbf{\tau}는 토크, \mathbf{I}는 관성 모멘트, \mathbf{\alpha}는 각 가속도이다.

ODE에서는 이러한 선형 및 회전 운동 방정식을 통해 각 객체의 움직임을 계산하며, 이를 바탕으로 시뮬레이션에서 객체의 물리적 동작을 모사한다.

Bullet

Bullet은 보다 복잡한 물리 시뮬레이션을 처리할 수 있는 강력한 물리 엔진이다. 특히 고정밀의 충돌 감지와 더불어 부드러운 물체의 시뮬레이션, 복잡한 충돌 형상 처리가 필요한 상황에서 효과적이다. Bullet의 특징 중 하나는 소프트 바디(Soft Body) 및 강체(Rigid Body) 모두를 지원한다는 점이다.

강체 시뮬레이션

Bullet의 강체 시뮬레이션은 주로 rigid body dynamics에 기반하며, 이를 통해 로봇이나 기타 물체의 움직임을 현실적으로 모사한다. 강체의 운동 방정식은 뉴턴-오일러 방정식을 따르며, 특히 복잡한 충돌 모델링과 정밀한 물리 계산에 중점을 둔다.

소프트 바디 시뮬레이션

Bullet은 소프트 바디 물리도 지원하여, 천이나 젤리와 같은 유연한 물체의 물리적 특성을 정확하게 모사할 수 있다. 이는 일반적인 로봇 시뮬레이션보다는 좀 더 복잡한 환경에서 유용할 수 있으며, 로봇과 유연한 물체 간의 상호작용을 다루는 상황에서 필요하다.

Bullet의 충돌 감지

Bullet 물리 엔진의 강점 중 하나는 매우 정밀한 충돌 감지 시스템이다. 특히, 복잡한 기하학적 형상을 가진 물체 간의 충돌을 처리하는 데 탁월하다. Bullet은 브로드페이즈(Broadphase)와 내로우페이즈(Narrowphase) 알고리즘을 결합하여 충돌을 효율적으로 감지한다.

브로드페이즈 알고리즘

브로드페이즈는 물체 간의 충돌 가능성을 빠르게 탐지하기 위한 알고리즘이다. 주로 공간 분할(Space Partitioning) 기법을 사용하여 잠재적으로 충돌할 수 있는 물체 쌍을 식별한다. 이 단계에서는 실제 충돌 여부를 확인하지 않고, 충돌 가능성이 있는 물체들을 좁은 범위로 줄이는 역할을 한다.

브로드페이즈 알고리즘으로 사용되는 대표적인 방식은 AABB(Axis-Aligned Bounding Box) 방식이다. 각 물체를 좌표축에 정렬된 경계 상자로 감싸서, 두 상자가 겹치는지를 검사하는 방식이다.

내로우페이즈 알고리즘

내로우페이즈는 브로드페이즈에서 추려진 물체 쌍에 대해 실제 충돌 여부를 정밀하게 계산한다. 이 단계에서는 물체의 정확한 기하학적 형상을 고려하여 충돌 여부와 충돌 지점을 계산한다.

내로우페이즈에서는 물체의 복잡한 형상을 다루기 위해 다양한 기법을 사용한다. 대표적인 방식으로는 GJK(Gilbert-Johnson-Keerthi) 알고리즘이 있으며, 두 물체 간의 최소 거리 또는 충돌 여부를 계산하는 데 사용된다.

충돌 반응

Bullet은 충돌 감지만 처리하는 것이 아니라, 충돌 후의 반응까지도 시뮬레이션한다. 충돌 반응은 주로 물체의 탄성 계수 및 마찰 계수에 따라 달라지며, 물체가 충돌 후 어떻게 움직이는지를 결정한다.

충돌 후 반응은 다음과 같은 공식을 따른다:

\mathbf{v}_{\text{final}} = \mathbf{v}_{\text{initial}} - (1 + e) \frac{(\mathbf{v}_{\text{initial}} \cdot \mathbf{n})}{m_{\text{total}}} \mathbf{n}

여기서 \mathbf{v}_{\text{final}}은 충돌 후 속도, \mathbf{v}_{\text{initial}}은 충돌 전 속도, e는 탄성 계수, \mathbf{n}은 충돌 면의 법선 벡터, m_{\text{total}}은 두 물체의 총 질량이다.

마찰 모델

Bullet은 또한 마찰력도 시뮬레이션하여 물체 간의 마찰 상호작용을 모사한다. 마찰력은 정지 마찰과 운동 마찰로 나뉘며, 두 물체가 서로 미끄러지거나 정지할 때의 마찰력을 계산한다. 마찰 모델은 Coulomb 마찰 모델을 기반으로 하며, 그 식은 다음과 같다:

f_{\text{friction}} = \mu \cdot f_{\text{normal}}

여기서 f_{\text{friction}}은 마찰력, \mu는 마찰 계수, f_{\text{normal}}은 물체가 표면에 가하는 수직 힘(정상력)이다.

Simbody

Simbody는 정확하고 세밀한 동역학 시뮬레이션을 목적으로 개발된 물리 엔진으로, 로봇 공학, 생체 역학, 그리고 천체 역학 시뮬레이션 등에 주로 사용된다. 특히, 멀티 조인트 로봇이나 인체와 같은 복잡한 운동학적 구조를 정밀하게 다루는 데 적합하다.

멀티 조인트 시스템의 운동 방정식

Simbody는 멀티 조인트 시스템의 동역학 방정식을 해결하기 위해 특별히 최적화된 알고리즘을 사용한다. 멀티 조인트 시스템의 운동 방정식은 다음과 같은 일반화된 좌표 시스템으로 표현된다:

\mathbf{M(q)} \ddot{\mathbf{q}} + \mathbf{C(q, \dot{q})} + \mathbf{G(q)} = \mathbf{\tau}

여기서 \mathbf{M(q)}는 질량 행렬, \mathbf{C(q, \dot{q})}는 코리올리 힘과 원심력 행렬, \mathbf{G(q)}는 중력 벡터, \mathbf{q}는 일반화된 좌표, \mathbf{\tau}는 토크이다. 이 방정식은 로봇이나 인체와 같은 멀티 조인트 시스템의 움직임을 계산하는 데 사용된다.

Simbody는 멀티 조인트 시스템의 운동 방정식을 효율적으로 해결하기 위해 고급 수치 해법을 사용하며, 이를 통해 정확한 동역학 시뮬레이션을 제공한다.