2015년 1월 21일 수요일

10줄로 끝내는 Robot Kinematics (로봇 기구학)

안녕하세요 오랜만의 T-Robotics 글입니다! 그동안엔 기사로만 찾아뵈었었는데 이론에 대한 갈증을 느끼시는 분들도 계실 것 같아 이 글을 마련했습니다. 바로 "20줄로 끝내는 Kinematics (기구학)"입니다!

(Rotation matrix (회전행렬) / Transformation matrix (변환행렬) 를 모르시는 분은 지난 글들을 먼저 읽어주세요)


7자유도 open chain (serial manipulator)의 모습 (사진 출처)

벌써 10줄 가까이 썼네요..; 사실 글 10줄로 끝낸다는게 아니라요, 코드 20줄로 끝낸다는 얘기였습니다ㅎㅎ 낚시야 뭐 자주 있는 일이실테니 너그러이 이해하시리라 믿을게요ㅋ

가장 널리 쓰이는 방법은 위의 글에서 소개한 것처럼 DH Parameter를 정하고 이에 따라 각 관절 각도에 따라 변하는 변환행렬들을 만든 후 이를 곱해주는 일입니다. 로봇을 사면 (혹은 만들면) 이 로봇의 자세를 정하기 위한 DH parameter 들이 정해져 있는데 (예를 들면 첫번째 관절과 두번째 관절은 1m 떨어진 채 90도의 각도를 이루고 있다든지...) 이를 보고 변환행렬을 만들고 이들을 곱해주는 것이지요.

예를 들면 이렇게.... 아이고 번거로워라...

하지만 이것은 각 관절마다 축을 적절히 정해야하는 번거로움이 있고, 그리고 수학적으로 아름답지 못하죠ㅎㅎ 이를 위해 고안된 방법이 있으니 바로 Screw Theory 입니다! 모든 강체의 움직임(병진, 회전, 또는 복합)은 하나의 나선 움직임으로 표현할 수 있다는 것이죠! 그리고 이러한 회전+병진은 exponential matrix(지수행렬)을 이용해 표현할 수 있답니다!

모든 움직임은 나사를 따라 도는 움직임의 일종으로 볼 수 있다. (사진 출처

지수함수에 대해 아시죠? 자연상수 2.718... 을 밑으로 하는 함수이자, 미분을 해도 그것 그대로가 나오는 신기함 함수 말이죠. 이처럼 지수행렬도 마찬가지의 정의로 나타낼 수 있다고 생각하시면 됩니다. 편리한건 이 지수함수에 대한 간편계산법(closed-solution)을 이미 알고 있다는 것이지요. 모든 회전 움직임은 회전 축을 지수로 하는 지수행렬로 표현할 수 있습니다!

먼저 회전축 (wx, wy, wz)를 skew-symmetric matrix로 나타냅니다. 이 행렬은 세제곱을 했을 때 -[w]가 나온다는 편리한 성질이 있지요. 이를 이용하면 회전을 지수행렬로 나타낼 수 있다는 것을 증명할 수 있습니다. 


예를 들어 볼까요? z축으로 회전한 행렬은 다음과 같이 나타낼 수 있습니다. 


신기하죠? 그렇다면 순수 회전이 아닌 회전+병렬의 경우는 어떨까요? 위의 [w] 행렬만 4*4 행렬로 살짝 바꿔주면 된답니다. 


이쯤 되면 많이들 못 쫓아 오시리라 믿고(;;;) 서둘러 글을 마치도록 하겠습니다ㅎㅎ 결과적으로 우리가 kinematics 계산을 위해 알아야 하는 것은 (= 특정 관절각도에서의 말단부의 위치/자세를 계산하기 위해 알하야 할 것은) 
1. fixed frame에서 바라본 각 의 벡터값(e.g. (0,0,1)
2. 그 축 상의 한 점 q를 이용해 구한 v 값들 (순수 회전관절은 h=0)
3. 그리고 초기자세에서 원점과 tool tip의 관계 M (4 by 4) 입니다.

이 예제를 통해 주어진 값들이 어떻게 나온 것인지 잘 생각해보자 (출처: Frank Park 교수님 책)

이제 Matlab code를 한번 보죠! 코드를 보시면 이 알고리즘이 얼마나 간단하고 아름다운지 아실 수 있으실 것입니다!


어떤가요? 그냥 w, v, M을 정의해주고 곱하기만 하면 끝입니다! 이젠 머리 아파가며 DH parameter를 위한 축을 임의로 정하고, 이에 따라 서로의 관계를 정의하고 이러지 않아도 됩니다. 충분히 배울 가치가 있지 않나요 이 방법? 더욱 자세한 내용을 원하시면 서울대학교 박종우 교수님의 강좌가 공개되어 있으니 이를 참고하세요!

[Link] Frank Park, "Robot Mechanics and Control"


* T-Robotics의 글은 facebook과 rss reader로도 받아보실 수 있습니다.

댓글 5개:

  1. 감사합니다 좋은 글 잘 봤습니다,

    inverse kinematic 함수를 구현할 수 있을까요?

    TCP (x y z rx ry rz):
    0.102398 0.519883 0.150742 4.95303e-05 -0.000118301 2.66048e-05

    Joints (base, shoulder, elbow, wrist1, wrist2, wrist3):
    1.59098 -2.25095 -1.36637 -2.68725 -1.57399 -3.16017

    [DH]
    a = [0.00000, -0.24365, -0.21325, 0.00000, 0.00000, 0.0000]
    d = [0.1519, 0.00000, 0.00000, 0.11235, 0.08535, 0.0819]
    alpha = [ 1.570796327, 0, 0, 1.570796327, -1.570796327, 0 ]
    q_home_offset = [0, -1.570796327, 0, -1.570796327, 0, 0]
    joint_direction = [1, 1, -1, 1, 1, 1]

    delta_theta = [ 2.75966002808423856e-05, -0.337899655727420534, 0.370746356507624386, -0.0327125575542123806, 4.32255127155765586e-05, -2.15521350512154869e-05]
    delta_a = [ -7.88250659554172125e-05, 0.0139869088179907508, 0.000231688280975139715, 2.91819368482931809e-05, -0.000124835948031518963, 0]
    delta_d = [ 0.000119168913582740066, -21.0663682223099187, 19.1158795824362926, 1.95026602874106358, -0.000196470844129423283, 0.00031639741861320958]
    delta_alpha = [ 0.00115175046713722473, 0.00383141163943463833, -0.00357007571438706364, 0.000422446563816736287, -0.000317275935992844538, 0]

    TCP Offset:
    0 4 95.3 1.5915 0.0292 -0.0023

    답글삭제
  2. 신기하죠? 그렇다면 순수 회전이 아닌 회전+병렬의 경우는 어떨까요? 위의 [w] 행렬만 4*4 행렬로 살짝 바꿔주면 된답니다.
    밑에 있는 사진에서 v는 무엇을 의미하나요?

    답글삭제