Constrained Dynamics in a Nutshell

물체의 위치나 각도의 자유도를 component 별로 나타낸 것을 DOF (Degree Of Freedom) 이라고 합니다. 물체들 사이의 DOF 를 제한시키는 운동을 기술하는 것을 Constrained Dynamics 라고 하는데요. 이 운동의 핵심은 외부로부터 영향을 받는 힘들이 constraint 를 위반하지 않도록 내부적인 힘을 구해서 적용시키는 것입니다. 간단하게 작용 반작용의 법칙을 떠올리시면 됩니다. 실제 계산에 쓰이는 방정식들은 뉴튼 운동방정식인 F = ma 에서 모두 유도시킬 수 있습니다. 여기서는 힘 대신 momentum 을사용해 P = mv 를 쓰도록 하겠습니다. s 를 카테시안 좌표 벡터라고 하고, C 를 constraint 함수라고 하면,

    \[c = C(s)\]

여기서 cs 가 얼마나 violation 되었는지 나타내는 constraint position 입니다. 물체의 운동은 c0 이 되는 쪽으로 진행해야 합니다.
그럼 이제 위 식의 시간 도함수를 구해봅시다.

    \[\begin{aligned} \frac{dC}{dt} &= \frac{dC}{ds} \frac{ds}{dt}\\ &= J V \end{aligned}\]

시간 t_0 에서 c 는 이미 0 이라고 가정하고, c 가 변하지 않는 쪽으로 운동이 진행되기 위해서는 도함수인 \dot{c}0 이 되어야 합니다. 그럴려면 현재 운동하는 물체의 \dot{c} 를 빼주어야 0 이 되겠지요. 빼주기 위해서 우리는 내부적인 momentum 을 구할 겁니다. 여기서 한가지 짚고 넘어가야할 key point 는 Jacobian 행렬인 J 가 카테시안 속도 벡터 V 를 constraint 공간으로 변환한다는 사실입니다. (Jm \times n 행렬이고 여기서 m 은 제한된 DOF 개수고, n 은 구속된 물체들의 좌표 개수입니다)

JV (카테시안 속도 벡터) 를 \dot{c} (constraint 공간의 속도 벡터) 로 변환하듯이 J^T\lambda (constraint 공간의 momentum) 를 P (카테시안 momentum) 로 변환합니다.

    \[P = J^T \lambda\]

이제 처음에 설명했던 내부적인 constraint momentum P 를 구하기 위해서 \lambda 를 구할 필요가 있습니다.

    \[\lambda = M_\text{eff} \dot{c}\]

이 식은 P = M V 와 닮은 꼴입니다. 이전에 \dot{c}J V 인 것을 알고 있으므로 M_\text{eff} 만 구하면 됩니다. M_\text{eff} 은 constraint 공간의 mass 라고 보면 쉽습니다.

일반적으로 질량을 구하기 위해서는 물체에 순간적인 momentum, 즉 impulse 를 주고 속도의 변화량을 보면 됩니다. 즉,

    \[m = \frac{\Delta P}{\Delta v}\]

같은 원리로 이것을 constraint 공간에 적용해서 M_\text{eff} 을 구해 봅시다.

    \[M_\text{eff} = \frac{\Delta \lambda}{J M^{-1} J^T \Delta \lambda}\]

위의 식을 잘 살펴보면 질량을 구하기 위한 임의의 impulse \Delta\lambdaJ^T 를 곱해서 카테시안 좌표로 변환하고, 변환된 impulse 를 M 으로 나눠서 속도 벡터 V 로 만든 다음, 다시 J 를 곱해서 constraint 공간의 속도 벡터로 변환합니다. 마지막으로 \Delta\lambda 을 이것으로 나누면 M_\text{eff} 을 구할 수 있습니다. \Delta\lambda0 이 아닌 벡터이므로 더 간단히 나타내면,

    \[M_\text{eff} = (J M^{-1} J^T)^{-1}\]

\dot{c}M_\text{eff} 를 구했으니 이제 최종적으로 constraint 공간의 momentum \lambda 는,

    \[J M^{-1} J^T \lambda = -J V\]

위의 식은 Ax = b 형태의 전형적인 선형 시스템 문제입니다.

이제 \lambda 를 구했으면 우리가 최종적으로 원하던 constraint momentum P 를 구할 수 있습니다.

    \[P = J^T \lambda\]

참고:
http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?f=6&t=1037

Leave a Reply

Your email address will not be published. Required fields are marked *