# 물리(Physics) 시뮬레이션 기초 설정

#### 시뮬레이션 기본 개념

시뮬레이션을 수행할 때 물리적 현상을 어떻게 모델링하고 해석하는가는 매우 중요하다. 특히 Isaac Sim에서는 다양한 물리 엔진(주로 PhysX)을 기반으로 가상 환경을 구성하고, 이 환경 위에서 로봇이 상호 작용하는 과정을 사실적으로 재현한다. 이를 위해서는 먼저 운동의 근본 법칙과 시간 이산화 방식, 충돌 및 마찰 모델 등을 정확히 이해해야 한다.

물체가 이동하고 회전하는 과정은 뉴턴 역학을 바탕으로 한다. 한 물체에 작용하는 힘과 그 물체의 가속도 사이에는 다음과 같은 관계가 성립한다.

$$
\begin{align} \mathbf{F} &= m \mathbf{a} \\
\mathbf{a} &= \frac{d^2 \mathbf{x}}{dt^2} \end{align}
$$

여기서 $\mathbf{F}$는 알짜힘, $m$은 질량, $\mathbf{a}$는 가속도, $\mathbf{x}$는 위치 벡터를 의미한다. 강체(rigid body)의 회전 운동은 토크와 각가속도의 관계로부터 해석된다. 이렇게 얻어진 물리 방정식을 수치 해석 기법으로 풀면서 시간에 따른 물체의 자세와 속도를 업데이트하는 것이 기본적인 시뮬레이션의 골자다.

#### Isaac Sim에서의 물리 엔진 개요

Isaac Sim은 물리 엔진으로 NVIDIA PhysX를 사용한다. PhysX는 범용 물리 시뮬레이션 엔진으로서, 강체(또는 연체) 거동, 충돌 감지, 접촉 반응, 마찰 모델 등을 높은 정확도와 빠른 계산 속도로 처리한다. Isaac Sim을 사용할 때는 이러한 엔진의 각종 파라미터를 설정하여 시뮬레이션의 정확성과 성능 간 균형을 맞춘다. 예를 들어, 충돌 허용 오차(contact offset), 마찰 모델 선택, 솔버 반복 횟수(solver iterations)와 같은 항목들이 시뮬레이션의 결과에 직접적인 영향을 미친다.

시뮬레이션을 구축할 때 중요한 점은 로봇이 가지는 조인트, 관성 모멘트, 충돌 지오메트리(collision geometry) 등을 가능한 실제와 근접하도록 설정해야 한다는 것이다. Isaac Sim 내부에서는 URDF나 SDF 등을 변환하여 불러들이거나, 자체 에디터에서 지오메트리를 생성해 물리 속성을 부여할 수 있다.

#### 시간 스텝(Time Step)과 서브스테핑(Substepping)

시간 스텝은 시뮬레이션에서 가장 중요한 파라미터 중 하나다. 시간을 $h$만큼씩 이산화하여, 각 타임 스텝마다 힘과 토크를 계산하고 물체의 상태값을 업데이트한다. Isaac Sim은 내부적으로 이 시간 스텝을 물리 엔진에 전달해 강체 방정식을 적분한다. 만일 시간 스텝이 너무 크면 에너지가 보존되지 않는 수치 오차가 커지거나 심각한 관통(침투)이 발생할 수 있다. 반면 시간 스텝이 지나치게 작으면 시뮬레이션의 계산량이 폭증한다.

PhysX는 경우에 따라 서브스테핑(substepping)을 활용한다. 서브스테핑은 메인 시뮬레이션 프레임 내부에서 여러 번의 물리 업데이트를 수행하는 기법이다. 예를 들어 메인 루프의 시뮬레이션 스텝이 $h$라고 할 때, 이것을 다시 $n$번 나누어 $h/n$ 간격으로 여러 차례 적분 및 충돌 검사를 수행한다. 이를 통해 강체의 고속 충돌이나 복잡한 접촉 해석을 보다 정확하게 처리할 수 있다.

시간 적분법으로는 일반적으로 explicit Euler, semi-implicit Euler, Runge-Kutta 계열 등이 활용되는데, PhysX는 안정성을 위해 특정 최적화된 방법을 사용한다. 다만 사용자는 보통 해당 세부 적분 과정을 직접 제어하기보다, 서브스테핑 설정이나 솔버 옵션을 통해 정확성과 효율성을 간접 조정한다.

#### 뉴턴-오일러 방정식과 운동학적 해석

물체의 6자유도(3자유도 병진 + 3자유도 회전) 운동을 다루는 방정식을 뉴턴-오일러 방정식이라고 한다. 질량중심에서의 병진 운동은 다음과 같이 표현된다.

$$
\begin{align} m \frac{d^2 \mathbf{r}}{dt^2} = \sum \mathbf{F} \end{align}
$$

회전 운동은 관성 행렬 $\mathbf{I}$(질량중심 기준)와 각가속도 $\boldsymbol{\omega}'$ 사이의 관계로 쓴다. 오일러 방정식 형태로 표현하면,

$$
\begin{align} \mathbf{I} \frac{d \boldsymbol{\omega}}{dt} + \boldsymbol{\omega} \times (\mathbf{I}\boldsymbol{\omega}) = \sum \mathbf{\tau} \end{align}
$$

여기서 $\boldsymbol{\omega}$는 각속도, $\mathbf{\tau}$는 알짜 토크다. 시뮬레이션 엔진은 이 두 식을 동시에 풀어 매 타임 스텝마다 물체의 위치, 자세, 속도, 각속도를 업데이트한다.

Isaac Sim에서 여러 링크(link)로 구성된 로봇이 움직일 때는 링크별 관성 행렬, 조인트 모델, 구속(constraints) 등이 종합적으로 고려된다. 이를 위해 내부적으로 해석적 방법이나 수치적 방법으로 야코비(Jacobian)을 구성하고, 힘 및 토크를 균형 있게 분배한다.

#### 충돌 감지(Collision Detection) 기초

충돌 감지는 크게 두 단계로 나뉜다. 첫째로는 브로드페이즈(broad phase)라 불리는 단계에서, 충돌이 일어날 가능성이 있는 물체 쌍을 빠르게 필터링한다. 둘째로는 내로우페이즈(narrow phase)에서 세부 충돌 지오메트리 정보를 바탕으로 실제 충돌 면 혹은 접촉점을 찾고 접촉 깊이(contact penetration depth)와 접촉 법선(contact normal)을 계산한다.

이후 물리 엔진은 이 정보를 이용하여 접촉 제약(contact constraints)을 형성한다. 이를 통해 물체가 서로를 더 이상 관통하지 못하도록, 혹은 관통하더라도 최대한 제한되도록 힘을 계산해낸다. 실제로는 유한한 시간 스텝 때문에 완전 무침투(무관통)를 보장하기는 힘들다. 다만 적절한 충돌 반응 기법과 ERP(Error Reduction Parameter), CFM(Constraint Force Mixing)과 같은 조정값을 이용하여 관통이 최소화되도록 한다.

#### 마찰(Friction) 개념 기초

마찰은 접촉점에서 발생하는 힘으로서, 물체가 서로 미끄러지지 않도록 저항을 제공한다. 일반적으로 쿨롱 마찰 모델을 가정하면 마찰력 $\mathbf{f}$의 크기는 다음 조건을 만족한다.

$$
\begin{align} |\mathbf{f}| \le \mu |\mathbf{N}| \end{align}
$$

여기서 $\mu$는 마찰 계수(coefficient of friction), $\mathbf{N}$은 접촉면에 수직인 정상력이다. Isaac Sim이나 다른 물리 시뮬레이터에서는 마찰력 계산을 위해 접촉 제약을 추가하거나, 마찰 원뿔(friction cone)을 단순화한 모델을 사용한다. 예컨대 드라이(friction direction)를 두 축으로 설정하고, 그 축 상에서의 최대 마찰 한도를 제한하는 등의 방식을 많이 쓴다.

마찰 계수 $\mu$는 정지마찰 $\mu\_s$와 운동마찰 $\mu\_k$로 나뉘기도 하고, 상황에 따라 회전 마찰, 굴림 마찰(rolling friction) 등을 별도로 정의해야 할 때도 있다. Isaac Sim에서는 단순히 $\mu$ 값 하나로 근사할 수도 있지만, 실제 응용에서 특수 마찰이 필요한 경우 추가적인 파라미터를 구성할 수 있다.

#### 마찰 모델의 확장

Isaac Sim에서 기본적으로 적용되는 마찰은 쿨롱(Coulomb) 마찰 법칙을 기반으로 하지만, 일부 상황에서는 이를 더 세부적으로 모델링해야 한다. 예컨대 큰 무게의 로봇 바퀴가 매우 미끄러운 표면 위에서 회전할 때, 또는 바퀴가 아닌 캐스터(caster) 형태로 여러 축을 따라 회전하는 휠 메커니즘을 사용할 때는 단순화된 마찰만으로는 정확히 표현하기 힘들다. 물리 엔진에서는 접촉점에서의 법선 방향, 접선 방향, 회전 방향별로 구분된 다양한 종류의 마찰이 동시에 고려되기도 한다.

물리 엔진은 이 마찰력을 일반적으로 '마찰 원뿔(friction cone)' 혹은 '마찰 피라미드(friction pyramid)'로 근사한다. 쿨롱 마찰 이론에 따르면 접촉점에서 발생 가능한 마찰력은 법선 방향의 정상력 $\mathbf{N}$에 비례하는 크기 안에서 어떤 각도로도 형성될 수 있다. 이때 마찰 계수 $\mu$가 주어진다고 하면, 마찰력이 형성될 수 있는 벡터 영역은 반지름 $\mu|\mathbf{N}|$을 가지는 원뿔이 된다. 물리 엔진에서는 이 원뿔을 정방형 피라미드 형태(수치 계산이 용이)를 통해 근사하기도 한다.

이러한 마찰 원뿔 접근에서, 마찰 계수 $\mu$가 커지면 원뿔의 반경이 넓어진다고 볼 수 있고, 실제 시뮬레이션에서는 마찰력이 크게 발휘되어 미끄럼 현상이 잘 발생하지 않는다. 반대로 $\mu$가 작으면 원뿔이 좁아져 물체가 쉽게 미끄러지거나 바퀴가 공회전할 수 있다. Isaac Sim에서 마찰 계수를 설정할 때는, 시나리오에 맞춰 정적 마찰 계수와 동적 마찰 계수를 함께 고려해야 한다. 상황에 따라 두 값을 동일하게 두거나 다르게 설정할 수 있으며, 대부분의 로봇 시뮬레이션에서는 $\mu\_s$와 $\mu\_k$를 크게 차이나지 않게끔 두어 연속적인 마찰 전이를 유도하기도 한다.

#### 마찰력과 접촉 제약

물리 엔진은 접촉점에서의 충돌 제약 조건만으로도 '물체가 서로 관통하지 않는다'는 조건을 만족시킬 수 있지만, 마찰력은 접선 방향(sliding)이 추가로 발생하는 현상이다. 이를 해결하기 위해 엔진 내부에서 접촉 조건과 함께 마찰 조건을 연립하여 풀어야 한다. 이때 발생하는 대표적인 접근법이 LCP(Linear Complementarity Problem) 형태의 제약 해석이다.

PhysX는 접촉점에서 $|\mathbf{f}*\mathrm{tangential}| \le \mu |\mathbf{N}|$라는 마찰 한계 조건을 만족하도록 마찰력 $\mathbf{f}*\mathrm{tangential}$을 구한다. 이를 풀 때 엔진은 Gauss-Seidel 또는 더 진보된 반복(Iterative) 방식을 활용하여 각 접촉점마다 제약을 순차적으로 업데이트한다. Isaac Sim에서 이러한 반복 계산의 횟수(접촉 제약 해석을 위한 solver iteration 수)를 조정하면, 접촉 및 마찰이 좀 더 정확하게 시뮬레이션될 수 있다. 다만 반복 횟수가 늘면 계산 부하가 증가하므로, 상황에 따라 적절히 타협점을 찾아야 한다.

#### 마찰 방향의 다중화

실제 마찰력은 접촉면의 모든 접선 방향으로 걸릴 수 있지만, 시뮬레이션에서는 계산 편의를 위해 방향을 일정 개수의 축으로 분리한다. 예컨대 $\mathbf{t}\_1, \mathbf{t}\_2$라는 두 개의 직교 축을 잡아 각각의 축에서 마찰력을 제한하는 식으로 모델링하기도 한다. 이를 'friction direction(마찰 방향) 2축 모델'이라고 부르며, 물체가 얼마나 쉽게 미끄러지는지를 제어할 수 있다.

접촉점에서의 총 마찰력은

$$
\begin{align} \mathbf{f}\_\mathrm{fric} = f\_1 \mathbf{t}\_1 + f\_2 \mathbf{t}\_2 \end{align}
$$

와 같이 표현되며, 여기서 $f\_1$과 $f\_2$의 크기는 각각 $\mu |\mathbf{N}|$을 넘지 못하도록 제한된다. 이런 접근법은 계산 효율이 좋아서 실시간 시뮬레이션에 적합하지만, 탱크 트랙이나 수레바퀴 같은 복잡한 마찰 방향이 요구되는 시스템에서는 방향 축을 늘리거나 특수한 마찰 함수를 정의해야 한다.

#### 탄성, 반발계수(Restitution)와의 관계

물체가 충돌할 때의 반발 정도(얼마나 탄성 충돌에 가까운지)를 결정하는 파라미터로 '반발계수(restitution coefficient)'가 사용된다. 이 값이 0에 가까우면 완전 비탄성 충돌(충돌 후 상대속도가 거의 0), 1에 가까우면 완전 탄성 충돌(충돌 후 상대속도 보존)에 가까운 거동을 나타낸다. Isaac Sim이나 PhysX에서는 일반적으로 충돌 시 물체가 튕겨 나가는 정도에 반발계수를 곱하여 속도를 재조정한다.

반발계수와 마찰은 서로 독립적인 파라미터로 취급되지만, 실제 접촉역학에서는 속도 변화와 접선 방향 마찰력 간에 상호작용이 발생한다. 그래서 수치 해석 시에는 충돌 응답(반발) 계산 후 마찰 계산을 다시 수행하거나, 혹은 충돌 계산과 마찰 계산을 동시 제약 문제로 풀어 반영하기도 한다. Isaac Sim 내부의 접촉 솔버는 이 과정을 내부적으로 반복 계산하면서 일관된 결과를 얻는다.

#### 접촉/마찰 해석 시 고려해야 할 추가 파라미터

시뮬레이션의 안정성과 정확도를 높이기 위해 몇 가지 추가 파라미터를 조정해야 한다. Isaac Sim에서 노출되는 주요 항목으로는 접촉 오프셋(contact offset), 수직 보정 비율(ERP: Error Reduction Parameter), 마찰 열(iteration) 등이 있다. 접촉 오프셋은 물체 간 충돌이 감지되는 범위를 넉넉하게 잡아, 너무 깊이 관통된 뒤에야 충돌이 인지되는 문제를 막기 위한 여유 거리로 쓰인다. ERP는 링크나 조인트가 제약 조건을 만족하지 못할 때 어떻게 위치나 회전 오차를 보정하는지 결정한다. 이처럼 여러 항목이 복합적으로 작동하며, 각 항목은 정확도와 계산 시간에 상호 영향을 끼친다.

하나의 접촉 지점에 대해, 마찰 제약과 충돌 제약(반발 계산) 그리고 다른 조인트 제약이나 중력 등의 외력 제약이 한꺼번에 고려된다. 이런 복잡한 연립 제약 조건을 빠르게 풀기 위해서 PhysX는 반복적 솔버(Iterative Solver)를 사용한다. 솔버가 충분히 많은 반복을 수행하면 실제 물리 거동에 더 가까워지지만, 시뮬레이션 성능이 저하될 수 있으니 최적의 설정이 필요하다.

#### Isaac Sim에서의 마찰 파라미터 설정 예시

Isaac Sim의 UI나 스크립트를 통해 환경 혹은 물체별로 마찰 계수를 설정할 수 있다. 예컨대 지면(Plane)에 마찰 계수를 1.0으로, 로봇 바퀴에는 0.9 정도로 지정하면, 로봇이 지면에 대해 비교적 높은 마찰 접촉을 유지한다. 로봇 팔의 그리퍼와 물체 사이에 미세한 마찰을 부여해 집기 동작을 더욱 안정화할 수도 있다. 만일 마찰 계수가 너무 낮으면 로봇이 빈번하게 미끄러지거나 정밀한 조작이 어려워질 것이고, 너무 높으면 비현실적으로 잘 붙어버리는 현상이 나타날 수 있다.

마찰이 설정된 이후에도 시뮬레이션 중 관통이 일어나거나 예상치 못한 튐 현상이 발생한다면, 물리 스텝 크기, 서브스테핑, 솔버 반복 횟수, 충돌 오프셋 등을 함께 튜닝해야 한다. Isaac Sim 내에서 직접 여러 값을 조정해본 뒤, 실제 로봇 동작과 비교 분석하여 가장 유사한 결과가 나오는 지점을 찾는 작업이 필요하다.

#### 굴림 마찰(Rolling Friction)과 추가 모델

일반적인 쿨롱 마찰은 물체가 접촉면을 미끄러지는(sliding) 상태를 주로 다룬다. 그러나 실제 바퀴나 구 형태의 물체는 굴러가면서 발생하는 굴림 마찰이 존재한다. Isaac Sim에서 굴림 마찰(rolling friction)을 모델링하려면, 접촉점에서의 회전 마찰 토크가 고려되어야 한다. 물리적으로는 다음과 비슷한 형태의 관계가 자주 쓰인다.

$$
\begin{align} \tau\_\mathrm{rolling} \le \mu\_r |\mathbf{N}| R \end{align}
$$

여기서 $\mu\_r$은 굴림 마찰 계수, $R$은 바퀴(또는 구)의 반지름, $\mathbf{N}$은 법선방향 접촉력이다. 단순화된 시뮬레이션에서는 굴림 마찰을 무시하거나 운동 마찰과 같은 모델로 대체하기도 한다. 그러나 정확한 주행 시뮬레이션, 예컨대 자율주행 로봇의 주행 거동이나 타이어 시뮬레이션을 구현하려면 굴림 마찰까지 고려해야 한다.

PhysX 내부적으로 굴림 마찰을 지원하기 위해서는 별도의 파라미터나 플러그인 방식이 필요할 수 있다. Isaac Sim 버전에 따라 굴림 마찰 옵션이 노출되어 있거나, 외부 플러그인으로 지원될 수 있다. 이를 활용하면 실제 환경에서 바퀴가 회전하는 동안 발생하는 회전 저항과 에너지 손실을 좀 더 사실적으로 재현할 수 있다.

#### 조인트 마찰(Joint Friction)과 감속기 모델

로봇 시스템에서 마찰은 외부 접촉에 의해서만 나타나는 것이 아니라, 조인트(Joint) 내부에서도 발생한다. 조인트를 구성하는 베어링이나 기어 등은 운동 중 열과 마모를 동반하면서 일정한 마찰 토크를 생성한다. Isaac Sim에서 조인트 마찰은 조인트마다 독립적으로 설정 가능하며, 다음과 같은 단순 모델을 적용할 수 있다.

$$
\begin{align} \tau\_\mathrm{joint} = b \dot{\theta} + \tau\_0 \end{align}
$$

$b$는 점성(viscous) 마찰 계수, $\dot{\theta}$는 조인트 각속도, $\tau\_0$는 쿨롱(Coulomb) 마찰 항이다. Isaac Sim에서 제공되는 articulations나 joint 속성 메뉴에서 이러한 마찰 계수를 지정해주면, 물리 엔진은 각 타임 스텝마다 조인트에 마찰 토크를 계산하여 작동한다. 이를 통해 로봇 팔 조인트가 구동되지 않을 때 서서히 멈추거나, 기어박스(gearbox)와 유사한 동작을 모사할 수 있다.

더 나아가 감속기가 달린 조인트 모델을 구현하려면, 단순 비율로 모터 축과 조인트 축을 연결하는 것 외에, 감속기의 효율과 backlash(백래시) 등을 시뮬레이션해야 한다. 일부 물리 엔진은 이러한 효과를 근사하거나, 모터 드라이브의 전기적 특성과 합쳐서 더욱 사실적인 모델을 구현한다. Isaac Sim에서도 모터 드라이브와 조인트를 물리적으로 연결할 때 스크립트나 커스텀 플러그인을 통해 고급 제어기를 작성할 수 있다.

#### 강체와 연체의 충돌

Isaac Sim에서 로봇과 주변 환경은 대부분 강체(rigid body)로 취급되지만, 때로는 연체(soft body)나 탄성 구조가 포함될 수 있다. 예컨대 쿠션이나 스폰지, 또는 로봇 팔 끝단의 패드 등이 변형을 일으키며 충돌할 수 있다. PhysX에는 GPU 가속 기반의 FEM(Finite Element Method) 또는 position-based dynamics 등을 통해 연체 시뮬레이션을 지원하는 기능이 존재하며, Isaac Sim에서도 이를 일부 활용 가능하다.

연체가 접촉 시 물리 엔진은 내부적으로 변형 및 충돌 지오메트리를 갱신해야 하므로, 강체와 비교해 계산 비용이 크게 증가한다. 또한 마찰 계산 시 변형된 표면의 접촉 면적이나 형태까지 고려해야 하므로, 단순한 충돌 모델로는 정확한 해석이 어렵다. Isaac Sim에서 연체 모델을 다룰 때는 해상도(resolution), 탄성 계수, 마찰 계수를 충분히 시험해보아야 하며, 충돌 안정화를 위해 서브스텝 횟수나 솔버 반복 횟수를 늘려야 할 수도 있다.

#### 계속 충돌(Continuous Collision Detection, CCD)

시뮬레이션 타임 스텝이 상대적으로 길 경우, 빠르게 움직이는 물체가 다른 물체를 통과해버리는 'tunneling' 현상이 발생할 수 있다. 이를 막기 위해서는 CCD(Continuous Collision Detection) 기법을 사용한다. CCD는 각 타임 스텝에서 물체가 이동하는 궤적(swept volume)을 분석하여 충돌 순간을 찾아낸다. 이를 통해 물체가 서로 완전히 관통해버리기 전에 접촉을 정확히 해석한다.

Isaac Sim에서 CCD 옵션을 켜면, 추가적인 계산이 발생하지만, 고속 충돌에 대한 처리 정확도가 훨씬 향상된다. 로봇이 고속으로 움직이는 부품을 가진다거나, 드론이나 물체가 빠르게 날아다니는 장면에서는 CCD가 필수적일 수 있다. 단, 모든 오브젝트에 대해 CCD를 적용하면 연산량이 크게 늘기 때문에, 필요한 오브젝트에만 선별적으로 적용하는 것이 일반적이다.

#### 시간 적분 기법과 안정화

물리 엔진이 사용하는 시간 적분 기법은 시뮬레이션 안정성에 직접적인 영향을 끼친다. Isaac Sim이 내부적으로 채택하고 있는 방식은 semi-implicit Euler에 기반한 기법으로 알려져 있다. 이 방식은 명시적(explicit) 오일러 방법보다 안정적이며, 큰 힘이나 충돌이 발생해도 비교적 수치 폭발(numerical blow-up)이 덜하다. 그럼에도 불구하고, 물리적인 고차 방정식을 단순히 1차 근사하는 것이므로 높은 정확도를 위해서는 작은 스텝(또는 서브스텝)이 유리하다.

이외에 물리 엔진들은 시뮬레이션 안정화를 위해 Baumgarte stabilization, post-stabilization, warm starting 등 다양한 기법을 사용한다. 예컨대 Baumgarte stabilization은 제약식 위배 정도를 위치/회전 오차로 보고, 이를 시간적분 과정에 반영해 점차 오차를 줄여나가는 알고리즘이다. Isaac Sim에서는 이러한 세부 알고리즘을 직접 제어하기보다는, ERP나 damping factor, iteration count 등을 조정해 간접적으로 영향력을 행사하게 된다.

#### 동적 시뮬레이션 튜닝 요령

Isaac Sim에서 동적 시뮬레이션을 튜닝할 때는 다음과 같은 접근을 자주 한다. 우선 충돌 모델(collision geometry)과 질량/관성 파라미터를 가능한 정확하게 지정한다. 그 다음으로 타임 스텝, 서브스텝 수, 솔버 반복 횟수를 적절한 범위 안에서 조절한다. 이후 마찰 계수, 반발계수, 충돌 오프셋 등을 세밀하게 조정하여 관통이나 튀어오름 현상을 최소화한다.

계산 성능과 정확도 간 트레이드오프는 항상 존재하므로, 시뮬레이션 목적에 따라 튜닝 방향이 달라진다. 예컨대 산업용 로봇 시뮬레이션은 각 조인트 움직임의 정밀도가 중요하므로 솔버의 정확도를 높여야 하고, 대규모 다중 물체 시뮬레이션은 실시간성을 중시하므로 간소화된 물리 모델을 선택하기도 한다.

#### 고급 접촉 해석

Isaac Sim에서 접촉 해석을 더욱 정밀하게 진행하기 위해서는, 충돌 탐지와 제약 해석이 어떤 식으로 수행되는지를 이해해야 한다. 물리 엔진 내부적으로는 각 접촉점에 대해 접촉 법선(normal)과 접촉 깊이(penetration depth)를 산출한 뒤, 접선 방향 마찰력을 포함하는 제약식을 만든다. 이후 반복적(Iterative) 솔버가 여러 차례 순환하며 이 제약식을 풀어, 각 접촉점에서 발생해야 할 반발력, 마찰력을 계산한다.

접촉점이 여러 개인 복잡한 장면에서는 제약이 다차원적이고 상호 연관되므로, 솔버가 한 점의 마찰력을 조정하면 다른 점의 반발력이 바뀌는 식으로 문제가 복합적으로 얽힌다. PhysX나 Isaac Sim은 이런 연립 문제를 효율적으로 다루기 위해 지오메트리 축소, 클리핑, 정렬 같은 최적화 기법을 내장하고 있다. 사용자는 솔버 반복 횟수와 서브스텝 등을 조정함으로써 결과 정확도와 계산 비용 사이의 균형을 맞출 수 있다.

#### 접촉 솔버(Contact Solver)의 내부 동작 예시

아래 다이어그램은 단순화된 Iterative Contact Solver의 흐름을 시각화한 것이다.

{% @mermaid/diagram content="flowchart TB
A(충돌 탐지<br>Broad phase, Narrow phase) --> B(접촉점 정보 확보<br>접촉 법선, 깊이, 마찰 계수)
B --> C(초기 반발력, 마찰력 추정)
C --> D\[제약 해석<br>충돌/마찰 제약]
D --> E{반복}
E --> F\[제약 위배 확인<br>오차 계산]
F --> G\[반발력, 마찰력 업데이트]
G --> E
E --> H(오차 수렴 혹은<br>최대 반복 도달)
H --> I(접촉 해결 완료)" %}

이러한 과정이 매 타임 스텝 또는 서브스텝마다 수행된다. 접촉 점이 많거나 강체 사이의 계층 구조가 복잡할수록 반복 과정에서의 계산량이 크게 증가한다.

#### 커스텀 마찰 모델 구현

쿨롱 마찰로 표현하기 어려운 물리 현상을 Isaac Sim에서 모사하려면, 스크립트를 통해 커스텀 마찰 로직을 적용할 수도 있다. 예컨대 특수 소재나 로봇 엔드이펙터(End Effector)에 점착(adhesion) 효과가 포함되어야 할 때, Isaac Sim의 확장 기능을 사용하여 접촉 이벤트마다 별도의 힘을 추가하는 방식이 있다. 이를 위해서는 접촉 알림 콜백(contact notification callback)을 등록하고, 접촉점 정보를 받아서 사용자가 원하는 방식의 마찰 혹은 접착력을 계산한 뒤, PhysX API로 적용해야 한다.

로봇 팔이 특정 소재를 집을 때 마찰력이 단순 쿨롱 모델보다 훨씬 크게 측정되는 경우가 있는데, 이럴 때는 접촉점에서 추가적인 흡착(adhesion) 항을 더해 시뮬레이션을 현실에 가깝게 만들 수 있다. 다만 이런 식으로 물리 엔진을 직접 건드리면 수치 불안정 혹은 충돌 제약 위배가 발생할 위험도 있으므로, 매우 작은 스텝 사이즈나 높은 솔버 반복 횟수를 지정해야 할 때가 많다.

#### 다중 접촉 지점 처리

한 물체가 복수의 접촉점을 통해 다른 물체나 지면에 닿아 있을 때, Isaac Sim은 각 접촉점마다 독립된 제약을 할당한다. 이는 선형 보간이나 클리핑 기법 등을 통해 접촉면 전체를 근사한다. 예컨대 로봇 발바닥(foot)이 지면에 넓은 면적으로 닿을 경우, 물리 엔진은 여러 접촉점을 배치하여 분산된 힘을 해석한다. 결과적으로 발이 지면에 안정적으로 놓이는 효과를 낸다.

접촉점의 개수가 너무 적으면 발이 정확히 지면을 따라 밀착하지 못해 들뜸 현상이 생길 수 있다. PhysX나 다른 물리 엔진은 내부적으로 적당한 숫자의 접촉점을 생성하도록 알고리즘을 설계하지만, 메시(mesh) 밀도, 충돌 오프셋, 면 분할 등에 따라 접촉점이 달라지기도 한다. 따라서 지면이나 로봇 발 모양을 단순화했더니 접촉점이 극단적으로 줄어들어 불안정한 거동이 나타날 수도 있으므로, 메시에 따른 충돌 지오메트리를 적절히 구성해야 한다.

#### 고속 충돌과 시간축 적분 방식

로봇 매니퓰레이터나 자율주행 차량 등에서 빠른 동작이 일어날 때는 관통 문제와 함께 반발 계산이 과도하게 크게 산출되는 현상이 자주 발생한다. 이를 방지하려면 시간 스텝을 줄이거나(고주파 시뮬레이션), CCD(Continuous Collision Detection)를 활용해야 한다. Isaac Sim에서 CCD를 활성화하면, 각 물체가 이동하는 경로상의 충돌을 연속적으로 검사하여, 한 타임 스텝 안에서도 충돌 시점을 좀 더 정확히 찾는다.

고속 충돌을 정확하게 처리하면 튐(bounce) 현상이 과도해지지 않고, 마찰력 역시 순간적으로 지나치게 커지거나 0이 되는 일이 줄어든다. 다만 CCD 계산량은 일반 충돌보다 훨씬 크므로, 실시간 시뮬레이션 요구사항이 있는 상황에서는 CCD를 제한적으로 적용하거나 타임 스텝을 줄이는 방법을 택하기도 한다.

#### 축차적 구속 방식(Sequential Impulses)

물리 엔진이 접촉 문제를 풀 때, 크고 복잡한 연립 방정식을 한 번에 해석하기보다, 순차적으로(축차적) 충돌과 마찰 구속을 해결하는 접근을 사용하기도 한다. 이를 Sequential Impulses 기법이라 부르며, Box2D, Bullet, PhysX 등에서 자주 활용한다. 이 방식은 접촉점마다 임펄스(반발량, 마찰량)를 할당하고, 각 접촉점에 대해 임펄스를 적용한 뒤 속도를 업데이트한 후, 다른 접촉점으로 넘어가서 반복해 전체를 최적화한다.

축차적 구속 방식은 특정 상황에서는 정확도가 떨어질 수 있지만, 실시간 시뮬레이션에서는 상당히 유리하다. Isaac Sim은 이러한 방식에 대한 튜닝 파라미터로 솔버 반복 횟수와 warm starting, 또는 contact offset 설정 등을 제공한다. warm starting은 이전 스텝에서 계산된 임펄스 값을 초기값으로 사용하여, 솔버가 빠르게 수렴하도록 돕는 기법이다.

#### 자이로스코픽 항과 각속도 안정화

물체가 빠른 회전을 할 때, 오일러 방정식에서 자이로스코픽 항 $\boldsymbol{\omega} \times (\mathbf{I}\boldsymbol{\omega})$가 중요해진다. Isaac Sim에서 이 항을 제대로 계산하지 않으면, 회전 중 에너지가 비정상적으로 증가하거나 감소할 수 있다. 물리 엔진은 내부적으로 자이로 항 처리 옵션을 두어, 더 안정적인 회전 거동을 모사할 수 있게 한다.

급격한 회전이 발생하는 드론 프로펠러나 휠 등의 시뮬레이션에서는, 자이로 항 처리와 함께 회전 마찰(air drag, rotational damping)을 적절히 설정해야 한다. Isaac Sim의 물리 머티리얼(material)이나 rigid body 속성에서 회전 감쇠(rotational damping) 값을 높여주면, 회전 운동이 자연스럽게 줄어드는 효과를 낼 수 있다.

#### 파라미터 조정 사례

로봇 매니퓰레이터가 지면에서 잡아 올린 물체를 빠르게 테이블 위에 올려놓는 상황을 예로 들 수 있다. 만일 시간 스텝이 커서 물체가 지면과 한 번에 깊게 관통해버리면, 다음 스텝에서 엄청난 반발력을 받아 물체가 공중으로 튀어오를 것이다. 이런 문제를 줄이기 위해 서브스텝을 2\~4회 정도로 늘리거나, CCD를 적용하면 관통량이 줄어들어 물체가 부드럽게 자리 잡을 수 있다.

마찰이 너무 작으면 물체가 미끄러질 것이고, 마찰이 너무 크면 실제 상황보다 물체가 과도하게 고정되는 느낌이 날 수도 있다. 테이블과 물체 사이의 마찰 계수를 0.6\~0.8 사이로 조정한 뒤, 반발계수를 0.2 정도로 낮춰주면 실제 손으로 올려놓는 느낌과 유사해진다. 이후에도 관통 문제나 미끄럼이 심하면 솔버 반복 횟수(예: 10→20)나 접촉 오프셋을 보정해볼 수 있다.

#### 간단한 시뮬레이션 스크립트 예시 (Python)

Isaac Sim에서 스크립트(Python)를 통해 충돌 및 마찰 파라미터를 설정하는 간단한 예시를 보일 수 있다.

```python
stage = omni.usd.get_context().get_stage()

# 대상 프림 찾기
prim_path = "/World/MyObject" prim = stage.GetPrimAtPath(prim_path)

# PhysicsMaterial 설정
material_path = "/World/PhysicsMaterial"
material_prim = stage.DefinePrim(material_path, "Material")
material_api = UsdPhysics.MaterialAPI.Apply(material_prim) material_api.CreateFrictionAttr().Set(0.7)      # 마찰 계수
material_api.CreateRestitutionAttr().Set(0.1)   # 반발 계수

# 대상에 콜라이더 속성 부여
coll_api = UsdPhysics.CollisionAPI.Apply(prim) coll_api.CreateMaterialRel().AddTarget(material_prim.GetPath())
```

이 스크립트는 특정 Prims(오브젝트)에 Material(마찰, 반발 등)을 연결하여 물리 파라미터를 직접 설정한다. Isaac Sim의 버전에 따라 API 이름이나 경로가 약간씩 다를 수 있으므로, 본인의 환경에 맞게 수정해야 한다.

이후 시뮬레이션을 실행하면, 해당 마찰, 반발계수가 반영되어 접촉 거동이 변화한다. 만약 마찰력을 좀 더 세분화하고 싶다면, Scripting이나 Extension에서 접촉점별로 후처리하는 방법도 시도해볼 수 있다.

#### 동적 바디와 운동학적 바디

Isaac Sim에서 오브젝트는 일반적으로 동적(Dynamic) 바디로 설정되어 충돌과 마찰을 계산한다. 동적 바디는 질량, 관성, 마찰, 반발계수 등 물리 속성을 모두 적용받고, 외력(중력, 접촉력 등)에 의해 자유롭게 움직인다. 반면 운동학적(Kinematic) 바디는 외력에 반응하지 않고, 사용자가 지정하는 위치나 속도에 맞추어 움직이기만 한다. 운동학적 바디는 다른 동적 바디와 충돌할 때 충돌 계산은 되지만, 운동학적 바디 자신은 그 충돌에 의해 상태가 변하지 않는다.

로봇 모델을 구성할 때, 베이스(base)를 운동학적으로 고정하고, 일부 링크나 부품을 동적으로 시뮬레이션하는 경우가 있다. 이때 운동학적 바디가 동적 바디를 밀어내거나 충돌에 영향을 줄 수 있지만, 반대로 동적 바디가 운동학적 바디를 움직이게 하지는 못한다. 운동학적 모델은 제어나 경로 계획 측면에서 편리한 면이 있지만, 실제 동력학적 거동을 모사하려면 동적 바디로 설정해 마찰과 충돌을 실감 나게 처리해야 한다.

#### 트리거(Trigger)와 센서(Sensor)

물리 시뮬레이션에서 충돌을 완전히 계산하지 않고, 물체가 특정 범위 안에 들어왔는지를 감지하기만 하는 '트리거(Trigger)' 혹은 '센서(Sensor)' 형태도 많이 사용한다. Isaac Sim의 물리 엔진에서도 콜라이더(Collider)를 센서 모드로 설정하면, 접촉력 계산은 무시하고 겹침 여부(overlap)만 체크한다. 예컨대 로봇이 특정 구역에 진입했는지, 물체가 그리퍼 안으로 들어왔는지 등을 센서로 확인할 수 있다.

센서는 충돌 처리를 통한 반발력이나 마찰력을 생성하지 않으므로, 실제 접촉 역학에는 영향을 주지 않는다. 대신 이벤트 콜백이나 ROS2 토픽 등을 통해 센서의 활성화 상태를 알 수 있어, 자동 제어 로직에서 활용할 수 있다. Isaac Sim에서는 센서 콜라이더의 형상을 단순화하면 연산이 절약된다. 예컨대 원통형 센서나 구형 센서를 만들어, 로봇 주변에 안전 거리 영역을 두고 접근 여부를 모니터링하는 방식이 가능하다.

#### 충돌 필터링(Collision Filtering)과 레이어

시뮬레이션 규모가 커지면, 모든 오브젝트 쌍에 대해 충돌을 검사하는 것은 비효율적이다. 이를 효율화하기 위해 충돌 필터링(Collision Filtering)이나 레이어(Layer) 개념을 사용한다. Isaac Sim에서는 오브젝트를 서로 다른 레이어나 그룹에 할당하고, 레이어 간 충돌 여부를 켜거나 끌 수 있다. 예를 들어 로봇의 내부 링크들끼리는 충돌 검사를 하지 않도록 하여, 계산량을 크게 줄일 수 있다.

충돌 필터링을 잘 구성하면 물리 엔진이 해야 할 브로드페이즈(broad phase) 탐색 횟수가 감소한다. 하지만 필터링을 잘못 설정하면 원래 충돌이 발생해야 할 오브젝트 쌍이 무시되거나, 불필요한 충돌 검사가 계속될 수 있으므로 주의해야 한다. Isaac Sim의 UI나 스크립트에서 간편하게 레이어를 지정할 수 있으며, 로봇 내부 충돌 무시(Ignore Self Collisions) 기능으로 자동화도 가능하다.

#### 콜라이더 지오메트리 최적화

로봇 링크나 주변 환경의 실제 형상을 매우 세밀한 메시(mesh)로 구성하면 시각적으로는 정교해 보이지만, 물리 충돌 계산이 과도하게 복잡해진다. 물리 엔진은 메시에서 인접 삼각형을 기반으로 내로우 페이즈(narrow phase) 검사를 수행해야 하므로, 삼각형 개수가 많을수록 연산량이 기하급수적으로 증가한다. 이를 방지하려면 시뮬레이션용 충돌 지오메트리는 시각 메시에 비해 단순화된 기본 형상(박스, 구, 캡슐 등) 여러 개로 대체하는 방법을 쓴다.

예컨대 로봇 팔의 어퍼암(upper arm)과 로어암(lower arm)을 각각 하나의 캡슐(capsule)이나 여러 박스 상자로 근사해도, 시뮬레이션 정확도에 큰 문제가 생기지 않으면서 충돌 검사가 매우 빨라진다. Isaac Sim 에디터에서는 시각 메시는 그대로 두고, 추가로 콜라이더용 기하를 따로 설정할 수 있다. 이를 통해 실제 로봇 모양과 유사한 충돌 형태를 구성하면서도, 메시의 세부 삼각형을 일일이 검사하지 않아도 된다.

#### GJK, EPA, SAT 등 충돌 알고리즘 개요

물리 엔진이 두 오브젝트가 충돌하는지, 그리고 어느 정도로 겹쳤는지 판단하기 위해서는 수학적 충돌 알고리즘이 동원된다. 대표적인 방식으로 GJK(Gilbert–Johnson–Keerthi) 알고리즘이 있으며, 볼록(Convex) 형상의 최근접점 거리를 반복적으로 좁히는 방식으로 충돌 여부와 침투 깊이를 계산한다. GJK로는 침투 깊이를 직접 구하기는 다소 어렵기 때문에, EPA(Expanding Polytope Algorithm)를 추가로 사용해 실제 관통 깊이와 접촉 법선 등을 결정한다.

SAT(Separating Axis Theorem)는 두 볼록 다각형(혹은 다면체)에 대해 분리축이 존재하는지를 검사해 충돌 여부를 판별하는 알고리즘이다. 2D에서 회전된 박스끼리의 충돌이나, 3D 볼록체 충돌 등에 활용 가능하다. Isaac Sim의 PhysX 엔진 내부적으로는 상황에 따라 GJK/EPA, SAT, 하이브리드 방법 등을 적용해 최적의 충돌 해석을 수행한다. 사용자는 보통 이 과정을 세부적으로 제어하지 않고, 콜라이더 형상과 필터링, 시간 스텝 등 상위 레벨 파라미터만 조정한다.

#### 병렬화, GPU 가속

시뮬레이션 규모가 커지면 한 프레임 안에 수많은 접촉점을 처리해야 하므로, CPU 부하가 크게 늘어난다. PhysX는 일부 단계(브로드페이즈, 콜라이더 업데이트 등)를 병렬화하고, 특히 Isaac Sim은 GPU를 활용한 시뮬레이션 가속 기능을 제공할 수 있다. GPU를 이용하면 대량의 입자 물리나 복잡한 충돌 장면을 빠르게 처리할 수 있다.

GPU 가속 모드에서 충돌 계산과 접촉 솔버를 동시에 GPU 상에서 처리하면, 대규모 군집 로봇 시뮬레이션이나 물체 쌓기 스택 시뮬레이션 등을 훨씬 빠른 속도로 진행할 수 있다. 단, GPU 가속은 특정 하드웨어와 드라이버 환경에서만 지원될 수 있으므로, Isaac Sim 버전과 시스템 요구사항을 사전에 확인해야 한다.

#### 물리 머티리얼(Material)과 속성 계승

Isaac Sim에서 마찰 계수, 반발 계수 등을 지정할 때 물리 머티리얼(Physics Material)을 사용한다. 물리 머티리얼을 설정해두면, 여러 오브젝트가 이를 공유할 수 있으며, 재질별로 쉽게 관리할 수 있다. 예컨대 "고무(Rubber)" 머티리얼에는 마찰 계수를 1.2 정도, 반발 계수를 0.5 정도로 부여하고, "금속(Metal)"에는 마찰 계수를 0.4 정도, 반발 계수를 0.1로 설정할 수 있다.

두 물체가 서로 다른 머티리얼일 때, 실제로는 마찰 계수나 반발 계수가 양쪽 재질 특성에 의해 결정된다. PhysX는 보통 간단히 $\mu = \max(\mu\_1, \mu\_2)$ 혹은 $\mu = \min(\mu\_1, \mu\_2)$ 등 선택 규칙으로 처리하거나, 평균값을 사용하는 정책을 제공한다. Isaac Sim에서는 이를 세부 설정하거나, 엔진에서 제공하는 기본 정책(보통 평균 혹은 최소)을 사용한다. 이러한 재질 혼합 정책은 충돌 반응을 좀 더 현실적으로 모사하려는 목적으로 존재한다.

#### 공기 저항, 유체 저항 등 추가 항

실내 로봇 시뮬레이션에서는 공기 저항을 무시해도 큰 문제가 없지만, 드론이나 높은 속도로 움직이는 물체를 시뮬레이션할 때는 공기 저항(air drag)을 고려해야 할 수도 있다. Isaac Sim에서 공기 저항이나 유체 저항을 모델링하려면, 오브젝트 속성에서 선형 감쇠(Linear Damping)와 회전 감쇠(Angular Damping)를 지정하거나, 더욱 정교한 유체 시뮬레이션 기능(Flow, Flex 등)과 연동하는 방식을 검토해야 한다.

단순 감쇠로만 표현하면, 물체 속도가 빨라질수록 감쇠력이 비례 혹은 제곱 비례 형태로 증가하도록 스크립트로 작성해줄 수도 있다.

$$
\begin{align} \mathbf{F}\_\mathrm{drag} = - \tfrac{1}{2} \rho C\_d A |\mathbf{v}| \mathbf{v} \end{align}
$$

이런 드래그 방정식을 Isaac Sim의 확장 기능이나 물리 단계 콜백에서 매 스텝 적용해주면, 속도에 따라 저항력이 증가하는 효과를 낼 수 있다.

#### 로봇과 환경의 동적 상호작용 시나리오

로봇이 가반하중이 큰 물체를 번쩍 들어올려서 특정 위치에 놓는 시나리오를 예로 들어 보면, 충돌 및 마찰, 관성, 조인트 토크 모두가 중요한 역할을 한다. 로봇이 실제로 무게중심을 잘 지탱하지 못하면 전도(넘어짐)하거나 조인트 토크가 부족해 원하는 궤적을 그리기 힘들다. 시뮬레이션에서도 이 문제가 동일하게 나타나도록 하려면, 각 링크의 질량중심, 관성 텐서, 마찰, 충돌 지오메트리를 면밀히 설정해야 한다.

만일 중량물을 번쩍 들어올릴 때 수직으로 미끄러져 빠지거나, 반대로 물체가 로봇에 달라붙어 떨어지지 않는다면 마찰 계수나 충돌 제약 설정이 과도하거나 부족하다는 의미다. 이러한 현상을 실제 로봇 실험 결과와 비교하면서 수정해 나가면, Isaac Sim 시뮬레이션이 실제 환경을 잘 반영하게 된다.

#### 정리

지금까지 Isaac Sim에서 물리 시뮬레이션 기초 설정을 다루면서, 충돌 탐지와 마찰 계산의 전반적인 동작 과정을 알아보았다. 충돌 및 마찰 매개변수를 제대로 이해하고 튜닝해야, 실제와 유사한 로봇 거동을 얻을 수 있다. 환경과 로봇의 다양한 부품에서 발생하는 물리 상호작용을 유연하게 설정하고, 성능과 정확도 사이에서 최적 해법을 찾는 과정이야말로 로봇 시뮬레이션에서 매우 중요한 부분이다.
