본문으로 바로가기

선택과 후회에 가까운 아쉬움? 뭐 이딴것들에 대해 요즘 생각 중이랍니다. 특히 팀플레이와 팀 혹은 단체의 분위기를 making한다는 것이 얼마나 우수운 이야기인지를 생각하며... 결국은 consensus라는 것이 얼마나 말할때는 있어보이지만.. 결국 아무것도 없이 떠들때는 우수운 이야기인지를 또한 생각하지요. 특히 집단 지성이라는 브레인 스토밍이라는 것의 헛점도 생각한답니다. 아무튼 요딴 것들은 모두 일종의 "책임전가", 혹은 "책임회피"라는 건방진 생각까지 하게 되네요. 뭐...그렇다는 겁니다.ㅎㅎㅎ...

아무튼 오늘은 예전에 분리시킨 Robotics라는 카테고리에 글도 쓸겸 기초적인 부분을 오랜만에 정립시킬겸 해서 로보틱스의 완전 기초부분인 좌표계의 표현과 기초적인 이동 행렬 및 회전 행렬에 대한 이야기를 해볼까 합니다.^^

{A}라는 좌표계는 위 그림처럼 x-y-z축을 의미하는 방향벡로 구성되고 그 위의 점 P가 있네요...

그 점을 표현하는 방법으로 일반적으로 위와 같이 P_atA로 표현합니다.

좌표계가 {A}, {B} 두 개가 있고... 같은 점 P를 각 좌표계에서 표현하는 경우는 어떨까요?

먼저 {A} 좌표계에서 본 P와 {B} 좌표계에서 본 P를 각 각 P_atA, P_atB로 표현할 수 있습니다. 그리고, 두 좌표계는 위 그림에서는 회전은 일어나지 않았으니 두 좌표계의 원점만 보면 {B}좌표계의 원점을 {A}좌표계에서 볼 때를 정의하면 될 것입니다.

그래서 위 식과 같이 {A}에서 본 P를 {B} 좌표계에서 본 P와 {A}에서 {B}의 원점의 벡터 합으로 표현할 수 있을 것입니다.

이번에는 회전까지 들어갔다고 보죠...

그럴 경우는 {A}좌표계에서 {B} 좌표계까지 회전한 양을 정의한 회전행렬로 또한 표현할 수 있을 것입니다.

그러면 위와 같은 표현으로 {A} 좌표계에서 P 점을 정의할 수 있는 것이지요.

이걸... Homogeneous Transform으로 표현해서 하나의 연산자로 표현하면 위 식과 같습니다.

이제.. 점의 이동을 정의해 보겠습니다. 위 그림처럼 {A} 좌표계 안에서 P_1이 P_2로 이동하게 하는 것을 표현하는 것이지요.

일단 위와 같이 편하게 표현가능합니다.^^

이를 연산자로 표현하면 위 식처럼 표현됩니다. 위의 식은 homogeneous transform입니다.

Dq는 위 식과 같은 모양이구요...

이동 행렬인 Q행렬은 위 수식과 같습니다.

좌표계 사이의 회전을 위 행렬처럼 정의합니다.

그러나 한 좌표계 안에서 회전을 표현할 때는 그냥 R...이렇게만 표현하면 됩니다.

회전 중심 축과 회전각까지 포함해서 수식을 표현하면 위 식처럼 되지요...

각 축을 중심으로 회전한 회전행렬의 정의는 위 식과 같습니다.^^

이제 간단히 예제를 한 번 볼까요^^ 일단, {A} 좌표계의 (1, 2, 1)이라는 점을 z축 중심으로 30도만큼 회전하고, x축 방향으로 1만큼 이동하는 계산을 해보죠...^^

RotZ = @(a) [cos(a) -sin(a) 0; sin(a) cos(a) 0; 0 0 1];

R_AtoB = RotZ(30*pi/180)
D_q = [1 0 0]'

P_atA = [1 2 1]'

P_atB = R_AtoB * P_atA
P_atB = P_atB + D_q

위 코드로 예제를 표현해 볼 수 있네요. 이걸 실행하고 나면

일단 회전행렬과 이동행렬이 정의되고, 대상이 된ㄴ 점 P_atA가 나오고나서

그 결과가 나왔네요.^^ 이번에는 연산자로 처리해 보겠습니다.

T_AtoB = [R_AtoB D_q; 0 0 0 1]

X_hatA = [1 0 0]';
Y_hatA = [0 1 0]';
Z_hatA = [0 0 1]';

P_atA = [X_hatA Y_hatA Z_hatA P_atA; 0 0 0 1]

P_atB = T_AtoB * P_atA

위와 같이 T_AtoB라는 행렬이 회전과 이동을 모두 정의했습니다. 그리고 P_atA도 기준 좌표축까지 모두 함께 정의를 해두고 연산하는 것이지요

그랬을때 나온 결과입니다. P_atB의 제일 우측 값을 보면 앞선 방법과 같은 결과가 나왔다는 것을 알 수 있습니다.^^ 이제 이 방법을 [바로가기]에서 이야기한 quiver3라는 함수를 이용해서 그래픽하게 한 번 표현해 보죠^^

figure
hold on; grid on; view(-40, 30)
xlabel('x'); ylabel('y'); zlabel('z')
set(gcf, 'Color', [1,1,1])
axis([-1 2 -1 2 0 2])

quiver3(0, 0, 0, P_atA(1,1), P_atA(2,1), P_atA(3,1), '--', 'LineWidth', 1.5, 'Color', 'red')
quiver3(0, 0, 0, P_atA(1,2), P_atA(2,2), P_atA(3,2), '--', 'LineWidth', 1.5, 'Color', 'green')
quiver3(0, 0, 0, P_atA(1,3), P_atA(2,3), P_atA(3,3), '--', 'LineWidth', 1.5, 'Color', 'blue')
quiver3(0, 0, 0, P_atA(1,4), P_atA(2,4), P_atA(3,4), '--', 'LineWidth', 1.5, 'Color', 'black')

quiver3(0, 0, 0, P_atB(1,1), P_atB(2,1), P_atB(3,1), 'LineWidth', 2.5, 'Color', 'red')
quiver3(0, 0, 0, P_atB(1,2), P_atB(2,2), P_atB(3,2), 'LineWidth', 2.5, 'Color', 'green')
quiver3(0, 0, 0, P_atB(1,3), P_atB(2,3), P_atB(3,3), 'LineWidth', 2.5, 'Color', 'blue')
quiver3(0, 0, 0, P_atB(1,4), P_atB(2,4), P_atB(3,4), 'LineWidth', 1.5, 'Color', 'black')

hold off

이렇게 표현하고 나면...

요런 결과를 얻을 수 있답니다.^^. 정사영된 기준선 등등이 표현되면 좋겠지만.. 뭐.. 그건 다음에 하죠^^.


댓글을 달아 주세요

  1. BlogIcon 착한곰돌이 2015.11.26 10:33 신고

    저는 감히 엄두가 안나는 분야네요 ㅎㅎ

    • BlogIcon PinkWink 2015.11.26 10:56 신고

      이건 비밀인데요^^.. 이 분야에서는 기초랍니다. 제가 몹시 느리게 기초를 이제서야 공부한다는 뜻이지요.. ㅎㅎㅎ
      아무튼.. 댓글 감사합니다.^^

  2. BlogIcon 핑구야 날자 2015.11.26 12:28 신고

    고민이 많으시군요~~말대로 듯대로 안되는게 세상사 인듯 해요

    • BlogIcon PinkWink 2015.11.26 12:37 신고

      눼... 그런듯해요... 요즘 느끼는건 결국 내가 변하고.. 내가 변화를 만들어야하는 거구나.. 하는 생각을 하지요^^

  3. BlogIcon Deborah 2015.11.26 15:28 신고

    보기만해도 복잡하네요.

  4. BlogIcon 훈잉 2015.11.26 18:40 신고

    이거.. 대학교때 본거같은대요 ㅋㅋㅋ

  5. BlogIcon 뫼듀 2015.11.26 21:18 신고

    맽랩...정말 쉬운 듯 싶다가도 어려운...ㅠㅠ 분명 맞게 한 것 같은데 그래프가 이상하게 나오곤 했던 기억이 나네요 ㅎㅎㅎ

  6. BlogIcon 비키니짐(VKNY GYM) 2015.11.27 09:05 신고

    잘 보고갑네요. 즐거운 하루 되세요.

  7. BlogIcon 위네모 2015.11.27 10:02 신고

    3차원 좌표를 IDL로 프로그래밍하는 걸 잠시 해본적이 있는데
    프로그래밍 상에서는 간단하지만, 이걸 머리로 이해하려면 복잡하더군요.
    이미 배움의 시기는 지나서인지, 그래프만 봐도 이제 지근지근 ㅠ.ㅜ 합니다.

    • BlogIcon PinkWink 2015.11.27 13:02 신고

      그래서 도구가 필요한데.. 그 도구를 익히는데도 또 노력이 필요하더라구요... 나이를 먹을수록 배워야할 것이 많아져서 말이죠^^

  8. BlogIcon 공돌이pooh 2015.11.27 16:31 신고

    재미있네요. 이 내용 리처드 파인만의 책에서 좌표계가 다른 경우 미사일 발사를 어디에 어떻게 할 것인가 하는 문제를 말로 풀어 설명한 적 있는데, 거기에 적용 가능한 방법 같네요. 심지어 선형대수로 표현 가능한지 몰랐습니다. 항상 건승하시기 바랍니다.

  9. 김익명 2015.11.27 22:01

    아으.. 볼링공 궤적 구한다고 벡터가지고 이리저리 회전시키면서 삽질하던 시절의 기억이 나네요. 결국은 마찰력을 잘못넣어서 실패했었는데..

  10. BlogIcon 악랄가츠 2015.11.28 04:25 신고

    스팀 세일 기간이라 한참 신나게 게임을 하다 왔는데....
    저에게 신세계를 보여주시네요! ㅋㅋㅋ

  11. BlogIcon 귀여운걸 2015.11.28 18:38 신고

    오오~ 예전에 배웠던 기억이 새록새록 떠오르는군요~
    오랜만에 공부 하고 갑니다^^

  12. BlogIcon 호련 2015.11.29 13:31 신고

    안녕하세요! 댓글 달아주셔서 놀러와봤는데 저랑 같은 스킨이네요. 우와~ *_*
    플러그인 같은 거 저도 좀 벤치마킹 좀 해야겠어용.. ㅎㅎㅎ (할 수 있을지 모르지만)
    이런 전문분야 블로그 좋아요! ㅋㅋ 재미있는 블로깅 하세용~ ^^

  13. 윤주열 2016.11.10 16:31

    혹시 화살표 끝부분만 점으로 나타나게 할 수 있는 법을 알 수 있을까요?ㅠ

    • BlogIcon PinkWink 2016.11.11 07:42 신고

      아 quiver를 사용한건데...화살표 끝부분의 설정은 잘 모르겠습니다. matlab central에서 한 번 찾아보시는게 어떨까요?