Published on

고급컴퓨터그래픽스 | Inverse Kinematics

Inverse Kinmatics

Forward kinematics와 달리 end effector의 위치와 방향으로 관절의 각도를 계산한다. 따라서 forward kinematics보다 까다롭다. forward kinematic처럼 정해져 있는 것이 아닌, 다양한 솔루션이 있을 수 있고 아예 없는 경우가 있다.

Inverse Kinematics(IK)는 두 가지의 계산 방법이 있는데

  • Limb IK: 해석적 방법
  • Jacobian Transpose IK: 수치적 방법

Limb IK

단일로 사용하는 건 그닥 유용하지 않은 편이나, feet 부분을 자연스럽게 땅에 닿게 하기 위해 사용되는 편이다.

먼저 line ac와 line at의 길이가 같아지도록 맞춘다.

이 때 중간의 다리 관절을 코사인 법칙을 통해서 구한다. 세 변의 길이를 모두 알기 때문에 가능.

그림에서 Joint A로 보여지는 관절을 관찰하면 이전 관절 위치에서 (모니터 기준 수직으로 향하는) 축을 기준으로 회전을 하였다. global position 기준으로 계산하였으므로 회전은 global frame 기준으로 적용되어 회전되었다(Rdiffglobal{R_{diff}}^{global}). 하지만 다리 골반 쪽에서 시작한 것으로 보여지는데, 이는 parent 관절인 Hip이 존재 가능성이 없잖아 있다.

따라서 joint a까지 이어진 orientation (Raad{R_a}^{ad}) 까지 고려해서 회전을 모두 계산해야 한다는 것이다.

  • 만약 global frame 기준으로 왼쪽에 곱한다면, RaglobalRaglobal=RdiffglobalRaglobal{R_a}^{global}{R_a}^{global} = {R_{diff}}^{global}{R_a}^{global}. Raglobal{R_a}^{global} 로부터 Raad{R_a}^{ad}를 구하면 된다.

  • 만약 local frame 기준으로 오른쪽에 곱한다면, FK로 Raglobal{R_a}^{global}를 구하고 ➡ axisa=Raglobal1axisglobal{axis}^{a} = {R_a}^{global-1} axis^{global}, axisa{axis}^{a} 기준으로 Rdiffa{R_{diff}}^{a}를 구한다. ➡ Raad=RaadRdiffa{R_a}^{ad} = {R_a}^{ad} {R_{diff}}^{a}

관절 a 계산 후 b도 마찬가지로 계산하면 된다.

후에는 아래 이미지와 같이 line ac와 at가 일치하도록 회전한다.

위와 같은 방법으로 계산하면 끝!

Jacobian Transpose IK

단일변수 스칼라 함수(그냥 흔히 보는 일반 함수라고 생각하면 된다.)에서 한 점의 기울기(slope)는 미분해서 구하면 된다. 다변수 스칼라 함수에서도 기울기를 구할 수 있는데, 다변수 벡터 함수 FF의 경우 또한 기울기를 구할 수 있다.

전미분으로 기울기를 표현하자면,

dY=FXdXdY = \frac{\partial{F}}{\partial{X}}dX

FX\frac{\partial{F}}{\partial{X}} 부분이 바로 Jacobian이다.

Jacobian을 이용해서 Kinematic에 적용이 될 수 있는데, 속도 mapping할 때 쓰임이 있다고 한다.

간단한 예제로 살펴보면 아래 end effector e로 Jacobian을 계산한 예제이다.

관절에도 여러 종류가 있는데 표로 정리해보았다

Degree of freedomJointDescription
1DOFRevolutelinear & angular velocity, "Hinged"
1DOFPrismaticlinear velocity only

joint에서 표션된 정보는 속도라고 해석하면 된다. parent axis에 관한 변화량이라고 이해하고 넘어가자.

Degree of freedomJointDescription
3DOFBall3DOF의 경우 3차원(3개의 축이 있는) 1DOF revolute 관절이라고 이해하면 쉽다. 1DOF 관절을 계산하는 것과 비슷하다.
6DOFFree더 나아가서 3개의 1DOF prismatic 관절과 하나의 ball joint로 이루어져 있다. prismatic부분의 경우 global axis를 쓴다는 특이점이 있다.

Jacobian과 관절이 대충 뭔지 알았으니, end effector도 알아겠다싶어 아래와 각도를 계산하게 될 것이다.

Y˙=J(Θ)Θ˙\dot{Y} = J(\Theta)\dot{\Theta} ΔY=YΘΔΘ\Delta{Y} = \frac{\partial{Y}}{\partial{\Theta}}\Delta{\Theta} ΔY=J(Θ)ΔΘ\Delta{Y} = J(\Theta)\Delta{\Theta} ΔΘ=J(Θ)1ΔY\Delta{\Theta} = J(\Theta)^{-1}\Delta{Y}

하지만 Jacobian 자체가 역행렬 J(Θ)1J(\Theta)^{-1} 가 되는 보장이 없고 더군다나 행과열의 길이가 같은 행렬의 경우 singularity로 인해 역행렬이 존재하지 않을 가능성이 다분하다.

하지만!! 전 시간 FK에서

Rotation Matrix의 기하학적 속성으로 Orthogonal하다고 한다. RT=R1R^{T} = R^{-1}

를 이용하면 된다.

FK는 각도에 대해 nonlinear한데, 이는 configuration space와 work space를 보면 알 수 있다. 뿐만 아니라 사인 코사인의 정보를 담고 있는 이유도 포함되어 있다.

그래서 jacobian은 goal position에 가까워질 때 까지 반복적으로 연산하게 된다.

마지막에 각도를 업데이트하는 부분 Θ=Θ+ΔΘ\Theta = \Theta + \Delta{\Theta} 의 경우

  • 1DOF의 경우 계산이 동일
  • 3DOF의 경우 Rotation matrix를 axis 별로 Ri=Riexp(aiΔΘi)R_i = R_i exp(a_i * \Delta{\Theta_i}). aia_i는 이 때 회전하는 벡터 기준 외적으로 구한 회전축이다.

이 때 exp는 rotation vector ➡ rotation matrix를, log는 그 반대로 연산이 된다.

Wrapup & Conclusions

Jacobian은 실무적으로 유용하나 사실 그에 따른 결과물은 훌륭한 편은 아니다. 오히려 limb IK가 더 유용한 편이다. 그냥 여기서 다룬 이유는 Jacobian의 개념 이해를 위함이라고 한다.

지금 다시 정리해도 매우 어려운 개념인 것 같다.. 다음 시간에는 Motion editing에 해당하는 개념들을 정리하는 시간을 가져볼 것이다.

Authors