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)$$

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

$$\frac{dC}{dt} = \frac{dC}{ds} \frac{ds}{dt}$$
$$= J V$$

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

J 가 V (카테시안 속도 벡터) 를 c' (constraint 공간의 속도 벡터) 로 변환하듯이 JT 는 λ (constraint 공간의 momentum) 를 P (카테시안 momentum) 로 변환합니다.

$$P = J^T \lambda$$

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

$$\lambda = M_{eff} \dot{c}$$

이 식은 P = M * V 와 닮은 꼴입니다. 이전에 c' 는 J * V 인 것을 알고 있으므로 M_eff 만 구하면 됩니다. M_eff 은 constraint 공간의 mass 라고 보면 쉽습니다. 

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

$$m = \frac{\Delta P}{\Delta v}$$

같은 원리로 이것을 constraint 공간에 적용해서 M_eff 을 구해 봅시다.

$$M_{eff} = \frac{\Delta \lambda}{J M^{-1} J^T \Delta \lambda}$$

위의 식을 잘 살펴보면 질량을 구하기 위한 임의의 impulse Δλ 에 JT 를 곱해서 카테시안 좌표로 변환하고, 변환된 impulse 를 M 으로 나눠서 속도 벡터 V 로 만든 다음, 다시 J 를 곱해서 constraint 공간의 속도 벡터로 변환합니다. 마지막으로 Δλ 을 이것으로 나누면 M_eff 을 구할 수 있습니다. Δλ 는 0 이 아닌 벡터이므로 더 간단히 나타내면,

$$M_{eff} = (J M^{-1} J^T)^{-1}$$

c' 와 M_eff 를 구했으니 이제 최종적으로 constraint 공간의 momentum λ 는,

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

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

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

$$P = J^T \lambda$$

참고:

덧글

  • 2013/05/09 15:52 # 삭제 답글 비공개

    비공개 덧글입니다.
  • juhlnet 2013/05/16 10:34 #

    맞습니다! (감사!) 제가 운동량(momentum)을 충격량(impulse)으로 잘못 쓴거 같네요. (수정했습니다 _ _)

    마지막 질문에 쓰신 수식은 아마 lambda 가 서로 다른 단위라서 이렇게도 쓰고, 저렇게도 쓴걸 거 같네요.

    정확히는 두번째 식을 시간에 대해 미분한 것이 첫번째 식이겠네요.
  • 렌버우 2013/05/13 16:31 # 삭제 답글

    답변 감사합니다~!
댓글 입력 영역