2015년 9월 22일 화요일

Inverse Kinematics(역기구학) 이란

안녕하세요 오랜만입니다. (늘 글이 오랜만인지라 이젠 이런 인사말도 좀 그렇네요ㅎㅎ) 예전에는 세월아 네월아 여러분들께 차근차근 개념 설명해드릴 여유가 있었는데 요즘은 제 코가 석자인지라 말이지요 ㅎㅎ 이러다 T-Robotics의 명맥이 사라지는건 아닐까 싶어 급한 맘에 한시간 정도 들여 후다닭~ 글을 써볼까 합니다. 주제는 바로 Inverse Kinematics (역기구학)이지요.

예전 글에서 다뤘던 칠판에 직선 긋기 과제, 기억나시나요?

먼저 글을 시작하기에 앞서 보통 로봇이 어떻게 움직이는지를 간략히 보자면, 일단 우리가 보는 세상에서 로봇이 가야할 궤적을 표현한 후 (보통 task space 상의 위치 x,y,z 와 자세 α,β,γ 로 표현되죠.) 이것을 로봇의 관절 궤적(joint space)으로 변환하죠. 그리고는 이 관절 각도/각속도들을 따라가기 위해 모터를 제어하는데, 이렇게 하면 여러 모터들의 움직임 조합이 하나의 로봇 움직임을 만들어내는 것이랍니다. 자세한 내용은 이전 블로그 글을 참고하세요.
[Link] 로봇으로 칠판에 직선 긋기 1탄  (2탄은 없습니다ㅠ)
여기서 관절공간의 값(e.g. 로봇 관절의 각도)들을 손 끝의 위치로 바꿔주는게 바로 forward kinematics (정기구학)이고요, 그 반대로, 손 끝의 위치를 관절공간의 값으로 바꿔주는게 바로 inverse kinematics (역기구학) 랍니다.
[Link] 로봇이 움직이는 공간, Joint Space 
그럼 우리가 로봇에게 "이 컵 좀 저리로 옮겨줘"라고 하면 로봇이 계산해야할 것은 무엇일까요? 먼저 컵이 어떤 궤적으로 움직여야 하는지 task space 상의 궤적을 찾고, 이를 수행하기 위한 각 관절각도들을 계산해야하겠죠? task space 에서 joint space로, 이것이 바로 오늘 다룰 역기구학 문제랍니다.

역기구학은 역기..와는 상관이 없다... (쏴리~ㅠ)

보통 로봇관절의 각도와 로봇 손끝의 위치와는 어떠한 함수 관계가 있습니다. 이것이 바로 정기구학 함수인데요,  이것의 역이 바로 우리가 구하고자 하는 역기구학 연산이 되겠죠.

Forward Kinematics (정기구학,FK) : Joint → Task   x = f(q)
Inverse Kinematics (역기구학,IK)  : Task  → Joint  q = f-1(x)

정기구학식은 사실 잘 알려져있습니다. 만약에 여러분이 로봇에 특정한 관절값을 준다면 (e.g. 어깨 0/45/15도, 팔꿈치 30도, 손목 45/30/0도) 손 끝이 가리키는 위치와 방향은 딱 하나로 결정되겠지요. 그리고 그 값은 여러분이 로봇공학 강좌만 잘 들으신다면 손 쉽게 구하실 수 있답니다. 아니면 제 글을 보시던가요~ 호호 (오늘따라 제 글 링크가 많네요 ㅎㅎ 그만큼 제 글들이 다음 글의 베이스가 된다는 얘기겠죠?)
[Link] 로봇의 움직임을 알려주는 Kinematics
하지만 역기구학은 단순하지가 않죠. 일례로 만약에 손으로 문고리를 잡는다면 손목을 많이 굽힐 수도 있고, 팔꿈치를 쫙 펼 수도 있고, 어깨를 구부정하게 할 수도 있고, 정말 많은 해가 있곘죠? 근데 또 어떤 때는 손을 그 위치로 가져가게끔 하는 해가 존재하지 않기도 하고 말이죠. 그렇다면 과연 어떨 때 해가 적고, 어떨 때 해가 많은 것일까요?

보통은 팔꿈치를 혀에 가져다대는 해가 존재하지 않는다. 보통의 경우는 말이다...(...) 

쉬운 경우부터 생각해볼까요? 2차원 평면에 직선을 그립니다. 만약에 구속조건이 "이 점 1개를 지나야 한다"라고 한다면 몇가지의 직선을 그릴 수 있을까요? 아마도 무한개겠죠? 점 2개를 지나라고 한다면? 아마 단 하나의 직선을 그릴 수 있을 것입니다. 만약에 3개를 동시에 지나야 한다면? 세 점이 일직선 상에 있지 않는한 해는 존재하지 않겠죠.

여기서 힌트를 얻을 수 있네요. 만약에 로봇의 관절 자유도 (Degree of Freedom, DOF)가 공간의 자유도(보통은 x,y,z,α,β,γ 의 6자유도 이죠) 보다 많다면 (e.g. 예를 들어 사람의 팔 관절이 막 100개 쯤 된다면) 팔 끝을 특정 위치로 놓기 위한 무한 개의 솔루션이 존재하겠죠. 관절자유도와 공간자유도가 같다면 아마도 1개의 해가 존재할 것이고요, 그보다 적다면 보통 해가 존재하지 않을 것입니다.

  1. 로봇의 DOF > Task Space의 DOF : 무한개의 역기구학 해 존재
  2. 로봇의 DOF = Task Space의 DOF : 1개의 해 존재
  3. 로봇의 DOF < Task Space의 DOF : 해가 존재하지 않음
물론 예외들은 존재합니다. 좀더 깊이 파고들어가면 "로봇의 DOF = 공간의 DOF"인 경우도 elbow up/down의 해들이 존재하고, 로봇의 DOF가 많아도 Singularity가 곳곳에 존재하고... 뭐 이런 것들에 대해선 나중에 다룰 기회가 있을거에요ㅎㅎ 우리는 대충 공부하고 대충 감을 잡아보자는 것이니 이정도로 마무리 해 둡시다ㅎㅎ

그럼 각 경우에 대해서 솔루션을 알아볼까요? 먼저 3번 케이스가 제일 간단하네요. 해가 존재하지 않으니 "해는 없다"입니다ㅋㅋㅋ 그럼 2번 케이스는 어떨까요? 일단 정기구학은 워낙 복잡한 비선형식이니 이를 선형근사해봅시다. 로봇에 있어서 선형근사가 뭐였죠? 바로 자코비안이었죠!
[Link] Jacobian이란 무엇인가 (제일 인기 글 중 하나랍니다 ㅎㅎ)
자코비안을 이용하면 "약간의 관절변화"가 어떠한 "약간의 손끝변화"를 불러오는지 관계를 알 수 있습니다.


드디어 수식 등장! ㅎㅎ 뭐 별로 어려운건 아니에요. 약간의 관절변화(dq)와 약간의 손끝변화(dx)사이에는 J 또는 J-1의 관계가 있다는거죠. 여기서 m은 공간의 자유도이고, n은 로봇관절의 자유도입니다.

이제 명백해졌죠. m=n이라면 정사각행렬이니, 만약 J가 full rank (non singular)라면 역행렬을 구할 수 있겠죠? 그럼 이 경우엔 해가 dx =  J-1 dq  딱 하나가 나오는거죠. full rank가 아닌 경우는 뭐냐고요? 뭐 이런거죠, 조인트가 6개가 있는데 다 똑같은 방향으로 일렬로 늘어서 있다거나... 그러면 말만 6개지 사실 6개의 기능을 다 못하자나요. 이럴 경우엔 full rank가 아니어서 해가 존재하지 않을 수 있답니다.

이제 곧 산으로 갈 준비 되셨나요? ㅎㅎ 곧 어려워집니다~

그렇다면 n>m이라 무한개의 해가 있을 땐 어떻게 할까요? 이 경우엔 뭐... 무한개 중에 하나만 고르면 되겠지요. 미분방정식에서 혹시 homogeneous solution이랑 particular solution 기억하실랑가.... 간단히 얘기하자면 이런거죠.
Ax = y 라고 했을 때 Axh = 0 과 Axp = y
Ax = y의 해는 xh+xp 라고 할 수 있다.
우리도 똑같이 하자고요. 어차피 dx =  J-1 dq를 만족하는 dq 가 여러 개이니 최단거리의 코스 하나를 구하고, 나머지 여분도 null space motion으로 표현하자는 것이지요.


두둥~ 이것이 바로 저희가 원하는 해입니다. 앞의 항이 particular solution으로  dx =  J-1 dq 를 만들어주는 부분이고요, 뒷부분의 값은 0입니다.  따라서 위의 식을 보자면 우리가 선택하는 변수 알파와 g의 값에 따라 우리는 다양한 관절각도를 얻을 수 있다는 뜻이지요.

뒷 부분을 우리는 zero motion이라고 부릅니다. 예를 들어 여러분 주먹을 벽에 대 볼까요? 그러면 벽에 댄 주먹을 움직이지 않고 팔꿈치를 움직일 수 있지요? 다시말해 손 끝점의 위치가 변하지 않으면서 여러분이 여러개의 관절값들을 만들어내고 있는건데요, 이것이 바로 zero motion이죠. 좀더 수학적으로 말하자면 null space 상에서 여러분의 관절값들이 움직이고 있는 것이랍니다.

자, 그렇다면 마지막 질문, n>m인 경우 수많은 해 중 어떤 해를 골라야 좋을까요?

고마해라... 이미 마이 어렵다 아이가...

그래서 쓰이는 것이 바로 목적함수 g입니다. 여러분의 목적에 따라 목적함수 g 를 세우고 이를 최적화하는 값 하나를 고르는거죠. 대표적인 g에는 장애물과의 거리가 있을 수 있겠네요. 만약에 여러분이 물건을 들고 가는데 팔꿈치가 벽에 닿을 것 같다면 이를 피해야겠죠? 그러면
"손 궤적을 제시해 준 궤적으로 이동하되 나머지 자유도는 장애물을 피하는데 신경을 써라" 
이렇게 얘기할 수 있는 것이죠. 따라서 여분의 자유도는 이렇게 부가적인 목적을 달성하는데 쓰인답니다.

오늘의 inverse kinematics 이야기 어떠셨나요? 잘 이해가 되시려나요? 지금 이해하지 못하시더라도 나중에 관련 내용을 접하게 되면 '아.. 이런거였구나..'라며 다시 이 글을 찾아보시게 되길 기대해보겠습니다. 그럼 멀지않은 미래에 다시 또 글 쓸게요 ㅎㅎ


* T-Robotics의 글은 facebook과 rss reader로도 받아보실 수 있습니다.
[facebook] http://facebook.com/trobotics
[rss] http://t-robotics.blogspot.kr/feeds/posts/default