본문으로 바로가기

이번 연재는 꽤 길게 끌고 있네요. (연재의 길이가 길어지는 거라면 차라리 좋은데, 연재간 간격이 길어지고 있네요...ㅠㅠ) 요즘 기말고사 채점과 계절학기 수업 준비, 그리고 가장 큰 것은 논문준비로 인해서 입니다. (그럴거라는 생각은 안하지만..) 혹시 연재를 기다리시는 분들께는 꽤나 죄송합니다. 이제 좀더 하고 나면, 하드웨어(DSP2812)적인 부분도 다뤄야하는데 말이죠.^^

거기다 또 하나 고민이 생겼는데, 이전(2005년)에 저희가 밸런싱로봇을 한 번 만들었다[관련글]는 사실을 이야기했었는데요. 이것을 가지고, 그대로 진행하는 것은 왠지 좀 부족하지 않나 싶어 로봇의 YAW움직임도 제어하는 밸런싱로봇을 만들어야하지 않을까 생각하게 된겁니다. 그렇게 할려면 동역학도 수정되어야하거든요. 하드웨어적인 이야기를 진행하기 전에, 로봇의 동역학을 수정할려면 지금해야할 것 같아서요.

Yaw 움직임을 고려한 동역학을 수립하기로 결정하긴 했지만, 또 혹은 당연히 닥쳐오는 문제는 당연히 어떻게?? 입니다. 이럴때 가장 좋은 도구는 역시 우리 구글이죠. 딴 이야기입니다만, 전 개인적으로 네이버는 간략화된 정보(창원 맛집?, 춘천 드라이브 코스?) 뭐 이런 정보를 찾을 때, 혹은 요즘 부쩍 좋아하는 애프터스쿨의 사진 찾기? 등등으로는 꽤 좋은데요. 문서화된 정보를 찾는 것은 구글이 좋더군요^^ 하여간 구글로 찾다보니 좋은 문서가 하나 나타나던데요.

바로 저 놈입니다. 레고(Lego) 마인드스톰(Mindstorms) NXT 라는 모델입니다. 인터넷을 찾아보시면, 쉽게 관련 동영상을 확인하실 수 있습니다. 이 레고의 로봇의 모든 것은 기술문서화 되어서 인터넷에 배포되고 있더군요. 문서의 저자는 Yorihisa Yamamoto라는 분으로 CYBERNET SYSTEM 사의 Application Engineer라고 합니다. 하여간 저 분이 작성한 Lego Mindstorms NXT 모델의  기술문서를 읽게 되었습니다.

그리고, 그 문서를 통해 장인의 손길을 느끼게 되네요. 제 자신이 상당히 작아진 느낌입니다.ㅠㅠ 역시 우물은 좁고, 우린 스스로가 개구리라는 사실을 모르고 살고 있는 모양입니다. 이 타이밍에 제가 존경해 마지 않는 율리우스 카이사르(Julius Caesar)의 말이 생각이 나는군요.

"사람은 자신이 보고 싶은 것만 본다."
Julius Caesar

그래도 지금이라도 알았으니 참 다행이에요^^. 이번 포스팅의 모든 내용은 레고사의 기술문서에 있는 내용입니다.


레고사의 밸런싱로봇을 간략히 도식화한 그림입니다. 로봇의 폭은 W, 두게는 D, 높이는 H이구요. 좌우 바퀴의 각도를 각각, theta_r, theta_l로 두고, 바퀴의 반지름은 R로 두었습니다.

이 위의 그림이 가장 중요한 그림인데요. 이 후 수식의 전개를 설명하니까요.^^. 바퀴의 질량은 m으로 두고, 몸체의 질량은 M으로 둡니다. 몸체가 쓰러지는 방향의 관성모멘트는 J_psi로 바퀴의 관성모멘트는 J_w로 두었습니다. 로봇 전체 길이 H의 절반을 무게중심까지의 거리 L로 두었구요. 로봇의 Yaw 각도는 psi로 두었습니다. 오른쪽 그림에서 좌표계에 아랫첨자 l은 왼쪽바퀴의 회전중심의 좌표이구요, r은 오른쪽 바퀴에 대해서 입니다. 아랫첨자 m은 두 바퀴의 중심입니다. 아랫첨자 b는 로봇이 기울어지게 되면, 로봇의 무게 중심이 바퀴축의 수직축상에 있지 않고, x-y평면에서 보면 밖으로 나오게되는데요. 그때의 좌표입니다.

이때, 두 바퀴의 회전각도의 평균을 theta라고 두었습니다. 그리고, Yaw각인 psi를 잡는 부분이 나오는데요. 이건 추가 설명이 좀 필요하겠네요.

위 그림을 보시면 됩니다. 바퀴가 굴러가서 만든 원호의 길이 R(theta_r - theta_l)은 yaw각 psi에 의한 원주의 길이와 같아야겠지요. 그러니 라디안각 기준으로 W * psi = R * (theta_r - theta_l) 이어야할 겁니다.

그렇다면 두 바퀴의 중심의 좌표 (x_m, y_m, z_m)은 쉽게 도출가능한데요. 이것의 변화율은 일반적이지 않습니다. 두 바퀴 중심의 좌표의 변화율에 phi가 관여하지 않기 때문입니다. 그러므로, theta, phi가 모두 시간에 대한 함수이긴 합니다만, 두 바퀴 중심의 위치의 속도성분을 고려할때는 theta만 미분하게 됩니다.

이제, 그 바퀴중심의 좌표에서 왼쪽 바퀴의 좌표(x_l, y_l, z_l)과 오른쪽 바퀴의 좌표(x_r, y_r, z_r)는 쉽게 도출 가능하구요. 로봇의 무게 중심의 좌표(x_b, y_b, z_b)의 경우는 로봇이 기우는 각도 psi가 고려되어야합니다.

이제 본격적으로 동역학을 구축하기 위해서는 뉴턴역학을 이용한 방법인지 에너지를 이용한 라그랑지 방법을 이용할 것인지 생각해줘야합니다만, 통상 에너지식을 잘 수립할 수 있다면, 역시 라그랑지 방법만큼 편한 방법도 없지요^^ 그래서 운동에너지와 위치에너지를 구해야합니다. 운동에너지 중에서 먼저 병진운동에너지는

입니다. 세 개의 좌표(오른쪽, 왼쪽 바퀴와 로봇의 무게중심)를, 즉, 위치를 알고 있느니, 

 T = 1/2 * m * v^2 

이라는 고등학교 물리에 나오는 운동에너지 식을 사용하면 됩니다. 이제 좌표 각 성분의 제곱에 대해 고려하면 되지요. 문제는 회전운동에너지 인데요. 이는 병진운동성분에서 질량(m)을 관성모멘트(J)라고 생각하면

 T = 1/2 * J * omega^2

이 됩니다. 이를 가지고 구하면

입니다. 처음 네 개의 항은 바퀴 두개와, 로봇의 기우는 각도, 그리고, yaw 각도에 대해 각각 회전 운동에너지를 생각해 준 것이구요. 마지막 두 항은 모터가 회전하면, 바퀴도 굴리게 되지만, 그 반작용으로 로봇의 몸체에도 영향을 주게 되죠. 그것을 모터의 기어비(n)를 고려해서 만들어 준것입니다. 얼마전에 포스팅했던, Reaction Wheel Pendulum에 관한 글[관련글]에서, 이걸 알았다면, 좀 더 아름답게 정리 할 수 있었을 텐데 말이죠..ㅠㅠ (이것도 다시 포스팅 해야겠어요.. ㅎㅎㅎ)

하여간, 이렇게 운동에너지 모두를 고려했습니다. 위치에너지는 상대적으로 좀 쉬워요. 역시 우리가 배운 고등학교 물리에 의해 위치에너지는

U = mgh

라고 알고 있으니, 각 위치 좌표의 z축 성분만 가져다 놓으면 됩니다.

이렇게 말이죠^^

라그랑지 방법을 사용하는 다음 단계는 라그랑지안(Lagrangian)을 수립하는 것인데요. 총 운동에너지의 합에 총 위치에너지의 합을 빼면 됩니다.

그리고, 설정한 상태에 대해 라그랑지 방정식을 구해주면 됩니다.

이 과정과 외부힘 F, 그리고, DC 모터를 포함한 동역학의 완성은 다음에 포스팅해야겠네요. 아침 7시거든요. 배고파요...ㅠㅠ 아침먹으로 가야죠^^


댓글을 달아 주세요

  1. BlogIcon 핑구야 날자 2010.06.12 12:41 신고

    오늘 월드컵인데.. 응원로봇으로 임명합니다. ㅋㅋ

  2. 재오리 2010.06.12 13:03 신고

    언제나 잘 보고 갑니다. 요즘 매일 아침 출근하면 어떤 포스팅이 있을까 핑크님 블로그 들어오는게 일상입니다. 다름이 아니라 저 위에 찾으셨다는 레고사의 기술문서 링크나 첨부해 주시면 안될까요? 구글링 해봐도 전 잘 못 찾겠더라구요ㅋ

    • BlogIcon PinkWink 2010.06.12 13:21 신고

      헉.. 출근해서 바로 인터넷을 즐길수있는 직장이시군요^^?? ㅎㅎ 저한테도 소개를... (취업에 목마른 일인입니다. 푸하하)

      아참 말씀하신 링크는

      http://www.mathworks.com/matlabcentral/fileexchange/19147

      입니다. 이런말이 있지요. 구글은 검색자의 얼굴을 따진다. 얼굴보고 불쌍해보일수록... 좋은 검색결과를 알려준다는 뭐... 그런 말이.. ㅎㅎㅎ

      제가 재오리님보다 좀 더 불쌍해 보이나봅니다.^^

  3. BlogIcon 빨간내복 2010.06.16 11:11 신고

    요대로만 하면 R2D2가 만들어진다는 거죠. OK!
    ㅎㅎㅎ

    • BlogIcon PinkWink 2010.06.16 11:37 신고

      헉.. 사실... 변신로봇을 만들고 싶었던 때가 있었는데요..ㅠㅠ
      R2D2 ㅎㅎ.. 오랜만에 들어보는 이름입니다..ㅋㅋㅋ^^

  4. mijong 2011.03.23 21:00 신고

    그리고 제가 atmega128 쓰는데 교수님이 이mcu로는 필터계산 못할수도 있다는데 윙크님의견은 어떠신가요??

    • BlogIcon PinkWink 2011.03.24 09:51 신고

      복잡한 필터라면 MCU로 속도 문제가 발생할 수 있지만, 많이들 사용하는 칼만필터나 저의 상보필터의 경우는 AVR정도면 충분합니다. 소숫점 계산과 간단한 삼각함수(atan 같은)만 있으면 되니까요. 실제 AVR로도 CortexM3로도 DSP2812로도 모두 구현이 되더군요.

  5. mijong 2011.03.23 21:05 신고

    윙크님 잘지내셧나요 ㅎㅎ
    음 역시 동역학 모델 설정이랑 필터만드는게 제일 어렵네요....

    질문이 있는데요 이포스팅전에 한 거있잖아요 yaw 안고려하고 그냥 밸런싱만 맞추려면 전 포스팅만 참조 하면 되나요?? 아님 여기 포스팅에서 필요없는 성분지우고 쓰면 되나요?

  6. balancing 2014.05.17 13:34 신고

    안녕하세요 또다시궁금증이 생겨서 여쭤보게 되었습니다.
    저는 외바퀴로 balancing 로봇을 만드는 중이라 모델링을 함에 있어 좌표축을 잡을때도 바퀴하나만 가지고 하고, yaw축과 관련된 psi값을 전부 0으로 보고 모델링중에 있습니다.
    먼저 이렇게 모델링하여도 틀리지 않은 것인지 궁금하고....
    다음으로는...회전운동에너지를 구할 때 모터의 반작용으로 인한 힘을 계산할 때의 J_m값은 어떤 것에 관한 계수이고 어떻게 구할 수 있는 것인지 알고싶습니다...
    항상 도움이 되어 정말 감사드린다는 말씀 드립니다.

    • BlogIcon PinkWink 2014.05.18 00:51 신고

      네 Yaw측을 그렇게 하셔도 됩니다.... 그리고 Jm에 대한 질문은 제가 잘 모르겠습니다. 그러나 제 글중에 리액션휠에 대해 이야기를 했지만, 동역학 단계에서 모터의 회전으로 yaw를 고려하기 위해서는 로봇 전체의 이너셔를 모터에 적용하는 것 뿐만 아니라 모터의 반작용을 애초에 동역학단계에서 고려하셔야할듯합니다.

  7. balancing 2014.05.20 22:44 신고

    항상 도움에 감사드리고 있습니다.
    다시 한번 질문드릴 것은 yaw축에 대해서 psi값을 0으로 보고
    ( xm, ym, zm ) = ( R*theta, 0, R )
    ( xb, yb, zb ) = ( xm + l*sin(phi), 0, zm+l*cos(phi) )로 세우고 모델링 하여서
    A = [ 0 0 1 0;
    0 0 0 1;
    0 -M*g*l*( n^2*J_m - M*R*l ) 2*b*( n^2*J_m - M*R*l ) - 2*b*( M*l^2 + J_psy + n^2*J_m ) 2*b*( M*l^2 + J_psy + M*R*l );
    0 -M*g*l*( m*R^2 + M*R^2 + J_w + n^2*J_m ) 2*b*( m*R^2 + M*R^2 + J_w + n^2*J_m ) - 2*b*( n^2*J_m - M*R*l ) 2*b*( -M*R*l - m*R^2 - M*R^2 - J_w ) ];

    B = [ 0 ;
    0 ;
    a*( m*l^2 + J_psy + M*R*l );
    a*( -M*R*l - m*R^2 - M*R^2 - J_w ) ];
    를 도출하고 lqr게인 값을 구한 다음 실제 로봇에 구현해보고 있으나 최종적인 lqr출력값이 +와 -값을 넘나들면서 제대로 동작하지 않게 되는데... 모델링이 잘못 된것인지 아니면 다른 예상가는 점이 있는지 여쭤보고 싶습니다..

    • BlogIcon PinkWink 2014.05.21 12:31 신고

      통상 단위의 혼돈, 부호의 혼돈 등을 의심하시면 됩니다. 그러나 코드를 일일이 제가 확인하지는 못한답니다.

  8. 행방불명 2014.07.09 17:48 신고

    안녕하세요. 핑크윙크님~ 밸런싱로봇 연재 잘보고 있습니다. 궁금한 점이 있는데요. x_m = R * theta * cos(phi) 가 유도되는 부분을 좀더 자세히 알수 있을까요? R * cos(phi)가 x의 변화량인 것 까지 이해했는데요. theta를 곱해준 이유가 이해가 안됩니다.

    • BlogIcon PinkWink 2014.07.10 08:40 신고

      어떤 좌표평면위의 점의 x,y 좌표를 알고 싶다면
      원점에서 그 점까지 직선을 그어서 그 각도를 알고 있다고 하면
      그 점까지의 거리에 cos을 곱하면 x , sin을 곱하면 y축 좌표가 되지요. 그럼 cos과 sin이 곱해진 이유는 설명이 되었구요.
      바퀴회전이니까 그 직선 거리를 R*theta로 본 것입니다. 그러면 로봇이 이동한 직선 거리가 되거든요. 바퀴의 회전 각도에 따른 원호의 길이랑 같은거지요.^^

  9. 이경헌 2015.02.07 01:41 신고

    x_m, y_m, z_m 구하는 부분에서요.
    1. yaw각 psi가 Ø(파이)인가요? Ψ(프시)인가요?
    2. 좌표값 어떻게 구하셨는지.. 잘 모르겠습니다..
    제가 멍청해서 그런지.. x_m이 두바퀴 중심의 좌표를 구하는건데.. 어떻게 구하셨는지 모르겠네요..
    아.......

    • BlogIcon PinkWink 2015.02.07 22:58 신고

      yaw는 Ψ입니다. 근데.. 이 기호 Ψ는 어떻게 입력하셨나요? (신기^^.. 전 이경헌님이 쓰신걸 카피해서 방금 사용했습니다.^^)
      그리고 x_m 등등을 구하는 방법을 설명한 것이 본 문의 내용인데요... 약간 어려웠을 수도 있을 것 같습니다만... 댓글로 다 설명하기는 어렵구요. 본문에서 설명하는 것을 기하학적으로 한 번 더 고민하시길 바랍니다.

  10. 이경헌 2015.02.09 22:19 신고

    안녕하세요. 대단하신.. 핑크윙크님..ㅠ
    x_m = RθcosØ -> cosØ = x_m/Rθ 에서 빗변의 길이가 어떻게 바퀴가 굴러가서 만든 호의 길이가 되는지 궁금합니다.
    ^^

    • BlogIcon PinkWink 2015.02.09 23:38 신고

      xm = R Theta cos(phi) 에서
      xm은 두 바퀴의 중심의 x 좌표를 의미합니다.
      그리고 중심에서 본 R Theta는 두 바퀴의 중심이 이동한 직선 거리 입니다. 그 직선 거리에 cos(phi)를 곱해서 x축 좌표성분을 얻은겁니다.
      그리고... 전 대단하지 않습니다. 저역시 이 글은 공부하던 당시에 적었던 글이며 설명이 좀 부족할 수 있습니다. 말씀하신.. 그 "대단하신 " 과는 거리가 있습니다. 왜 "대단하신 "이라고 적으셨는지는 모르지만...
      아무튼 성과가 있기를 바랍니다.

  11. 왕초보 2015.02.11 15:38 신고

    핑크윙크님 연재를 열심히 보면서 이해를 하려고 하고 있으나
    이해가 잘되지 않아서 질문합니다
    x_l x_r x_b 좌표를 구할때
    x_m = x_m - (x_m - x_l) 에서 x_m - x_l 이 w/2* sinØ 라는것은 알겠으나
    제 생각에는 그림에서 w/2* cosØ 값이 x_m - x_l 이 아니라 w/2* sinØ인 이유가 이해가 잘안되네요..

    x_b의 좌표를 구할때는 x성분에 cosØ가 psi에 곱해지는것은 이해가 됩니다만......
    x_l x_r 좌표구할때 이해가 잘 되지 않네요 ...

    • BlogIcon PinkWink 2015.02.12 13:01 신고

      네.. 실제로는 cos(90-phi)와 sin(90-phi)였습니다.
      그걸 삼각함수 공식으로 풀면 각각 sin(phi)와 cos(phi)가 되어서 언듯 보면 이상해 보이는 겁니다.

  12. 힘내라 힘 2015.02.24 22:13 신고

    안녕하세요 핑크윙크님
    글을 읽으면서 헷갈리는게 있어서 질문합니다.
    처음에 theta와 phi를 구할때 제 생각엔 Yaw각 'psi'가 아니라 'phi'가 맞지 않나요..
    그리하여 밑에 그림에서 Ψ 가 아니라 Ø가 되면
    W * phi = R * ( theta_r - theta_l )
    phi = R/W * ( theta_r - theta_l ) 가 되는거 아닌가요?

    • BlogIcon PinkWink 2015.02.25 16:25 신고

      네.. 그런것 같습니다. 당시 글을 적을때 혼돈이 있지 않나 한데요^^. 링크해둔 원 소스를 확인하시면 됩니다.^^
      감사합니다.^^

  13. BlogIcon 이현선 2015.04.04 20:30 신고

    안녕하세요, 매번 좋은글 보고있습니다.
    동역학식을 세우다가 의문이 든게 있는데요.

    운동에너지를 구하는 부분에서 모터의 부하관성모멘트(Jm)과 관련된 식입니다만. 회전체가 받는 반작용을 다루는 것이라면 회전체를 기준으로 하는 지배방정식을 세우게 되며 이때는 기어비 n이 아니라 감속비 1/n을 사용해야하는게 아닐까 싶습니다. 일단 Yamamoto 씨의 논문을 저도 확인은 했습니다만, 기어비 n=1로 설정한 논문이라서 의문이 드네요.

    아래의 카페에서 관련된 글을 읽어보고 올립니다. 답변부탁드릴게요 ^^

    http://cafe.naver.com/techmecha/146508

    • BlogIcon PinkWink 2015.04.05 22:15 신고

      ㅎㅎ.. 그럴것 같습니다. 당시엔 이걸 익히고 구현하고 또 하나씩 되어가는 것에 꽤 많은 관심을 가졌으니 지나간 모양입니다만....
      아무튼.. 모터의 힘을 고려할때는 기어비를 곱하는 것이 맞습니다.
      그런데 여기는 회전운동에너지를 고려하는 곳이고.. 당연히 바퀴의 회전운동 에너지를 고려하는 것이니... 모터입장에서 생각한 속도인지... 휠입장에서 생각한 것인지를 봐야합니다. 그런데
      그림상 정의는 휠의 회전 각도를 정의했으니...
      모터의 회전속도와 휠 회전속도를 따로 정의를 했어야할 듯한데
      그러지 않았네요...
      제 생각에는 휠의 회전 속도이므로... 운동에너지를 고려할때는
      기어비는 아예 빼고 생각하고...
      다시 모터의 회전 속도와 휠의 회전 속도를 추가로 정의하면 될듯합니다.
      아무튼.. 좋은 지적 감사합니다.
      그러나 한가지~~~
      너무나.. 오래전 글이라 지금 제가 좋은 감~을 유지하고 있을지
      생각해야죠^^. 꼭 검증해서 다시 알려주세요~~^^

    • 2017.11.21 16:01

      비밀댓글입니다

    • BlogIcon PinkWink 2017.11.21 17:44 신고

      흠... 이게.. 너무 오래전 글이고.. 저 또한 너무 오래전에 감을 다시 찾는게 쉽지 않네요...ㅠㅠ.
      그나저나 다시 읽어보니... 왜 답변을 할때 더 신경쓰지 않았는지.ㅠㅠ.
      기어비 2:1이면 n은 2가 되겠네요...
      모터가 내는 힘이 두 배~^^
      로봇이 회전(혹은 기울여질려는)하려는 힘이 두 배~^^
      그러니 원문대로 곱하는 것이 맞겠네요...
      (라고 일단 말해놓고~ 살짝 고민하는 걸로~^^)

  14. 김영수 2015.06.05 15:12 신고

    안녕하세요!
    밸런싱 로봇 만들려고 여기저기 찾아다니다가 여기로 오게 되었네요. 보면서 감탄하고 있는 중인데 궁금한것이 이렇게 해서 밸런싱 로봇을 만들면 전진을 할 때에는 어떻게 하는건 가요?
    전진을 할려면 먼저 앞쪽으로 무게중심이 가야할텐데 위 그림을 보면 두 바퀴로만 균형을 잡고 있네요. 그러면 무게중심을 앞으로 이동시키는 것은 어떻게 해야하죠?

    • BlogIcon PinkWink 2015.06.05 15:23 신고

      그건 제어기가 알아서 합니다.^^.
      위치 명령을 인가하면 그렇게 가게 되도록 설계가 된답니다.
      그런 제어기를 꾸미는 것이 사용자가 해야할 일인데.. 그게 이 글에서 살짝 다루는 것이기도 하구요...^^

  15. 김영수 2015.06.05 17:39 신고

    오홍 일단 잘 와닿지는 않지만 좀더 해보고 궁금한거 생기면 또 질문 드릴께요~

    • BlogIcon PinkWink 2015.06.06 12:18 신고

      시뮬레이션이라도 곧 시작하셔서 이것 저것 테스트를 해보시면서 진행하시면 좋답니다. 좋은 성과가 있으시길 바랍니다.

  16. 성공을위함 2017.03.16 09:30 신고

    마지막 두 항은 모터가 회전하면, 바퀴도 굴리게 되지만, 그 반작용으로 로봇의 몸체에도 영향을 주기 때문에 n^2 항이 나온걸 이 연재로 확인하였습니다. 핑크님

    근데 수식이 왜 1/2*J_m*n^2*(d_the-d_psi)^2 이런식으로 나오는 지 알 수 있을까요 ??


    (d_the-d_psi) 이 부분이 툭히 이해가 안가는데 도움좀 주시면 감사하겠습니다..

    항상 감사히 보고 있구요!

    • BlogIcon PinkWink 2017.03.16 10:33 신고

      너무 오래된 글이라...
      복잡한 수식의 한 항만 가지고 왜 그렇게 나왔냐는 질문에는 대답하기 힘드네요...

  17. 성공을위함 2017.03.16 09:36 신고

    이 수식에서 모터 회전으로 인해 몸체에 영향을 주는

    1/2*J_m*n^2*(d_the-d_psi)^2

    이 항에서 J_m 은 무엇을 의미하나요 ?

    J_psi 랑 다르게 표현했긴 했던데 이는 파라미터 측정을 어떻게 해야할가요 ?ㅠㅠ