Kinematics

2 minute read

Written by BGKim, VCANUS

Homogeneous Matrix(동차 행렬)

방향성을 가진 점을 좌표와 축을 이용해 표현한 행렬

|r11, r12, r13, x|
|r21, r22, r23, y|
|r31, r32, r33, z|
|  0,   0,   0, 1|

r11 r21 r31 : x축 벡터
r12 r22 r32 : y축 벡터
r13 r23 r33 : z축 벡터
x y z : 좌표

DH(Denavit-Hartenberg) Parameter

각각의 Axis 관계를 4개의 parameter로 표현한 방식

table

i alpha a d theta
1 ~ ~ ~ ~
~ ~ ~ ~
n ~ ~ ~ ~

alpha(Twist) : x축을 기준으로 변환 각도
a(Length) : x축을 기준으로 거리
d(Offset) : z축을 기준으로 거리
theta(Angle) : z축 기준으로 변환 각도

*x축 : arm의 기준 축
*z축 : arm의 회전 축
*기본적으로 오른손 법칙을 따른다

Forward Kinematics(정기구학)

축의 관계를 통해 마지막 점의 vector와 point를 얻는 이론

ex)
R = R_1 * R_2 * R_3 * R_4 * R_5 * R_6
// R1..R6는 각 축의 동차행렬을 의미
// R은 모든 축의 영향을 받은 동차행렬이 반환된다.

Get each axis Homogeneous Matrix

R_n = RotZ(theta) * Trans(0,0,d) * Trans(a,0,0) * RotX(alpha)

function RotZ(v){
    return Matrix[
        [cos(v), -sin(v), 0, 0]
        [sin(v), cos(v), 0, 0]
        [0, 0, 1, 0]
        [0, 0, 0, 1]
    ]
}
    
function RotX(v){
    return Matrix[
        [1, 0, 0, 0]
        [0, cos(v), -sin(v), 0]
        [0, sin(v), cos(v), 0]
        [0, 0, 0, 1]
    ]
}

Trans(x, y, z){
    return Matrix[
        [1, 0, 0, x]
        [0, 1, 0, y]
        [0, 0, 1, z]
        [0, 0, 0, 1]
    ]
}

*위 식을 보기 전 알아야 할 개념은 현재 축에서 다음 축으로 이동하기 위해서 어떻게 이동하고 어떻게 각도를 변환 할 지 아는 것이다.
*각 arm axis를 점,축 그림으로 그려 축사이의 관계를 볼 줄 알아야 한다

Inverse Kinematics(역기구학)

정기구학과 반대되는 개념으로, 끝점의 좌표와 vector를 알 때 각 축의 회전각을 구하는 이론이다.

Analytical Solution

정기구학 식(R = R_1 * .. *R_n)에서 R_1…R_n을 역행렬을 취하면서 theta_1..theta_n의 방정식을 구하는 방식이다

ex)
R[2,2] = r33
(R_1 * .. *R_n)[2,2] = -cos(theta2) 일 때

theta2 = acos(-r33)

Approximating Solution With Jacobian

근삿값을 구하는 이론으로, 각 theta의 오차를 줄여가면서 목적 좌표에 도달하게 한다
R_1 * .. *R_n의 식이 복잡하여 수식을 풀기 까다로워 질 때 사용하면 유용하다

ex)
px = R_1 * .. *R_n[0,3]
py = R_1 * .. *R_n[1,3]
pz = R_1 * .. *R_n[2,3]

*diff(식, 미분대상) : 미분 함수
JacobianMatrix = 
[
    [diff(px, theta1), diff(py, theta1), diff(pz, theta1)]
    [diff(px, theta2), diff(py, theta2), diff(pz, theta2)]
    ...
    [diff(px, thetaN), diff(py, thetaN), diff(pz, thetaN)]
]


*Jacobian 풀이
do{
    resutTheta_n+1 = resutTheta_n 
        + invJacobianMatrix(resutTheta_n) * (targetPosition - presentPosition)
}while(resutTheta_n+1 - resultTheta_n < epsilon)

Leave a comment