밸런싱 로봇 (Balancing Robot) 만들기 연재
1. 동역학 구축 (1) [바로가기]
2. 동역학 구축 (2) [바로가기]
3. 동역학 구축 (3) [바로가기]
4. 기구부 구성 및 모터 파라미터 측정 [바로가기]
5. 제어기 설계 및 MATLAB을 이용한 시뮬레이션 [바로가기]
6. 밸런싱 로봇 만들기 [바로가기]



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

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



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


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

그리고, 그 문서를 통해 장인의 손길을 느끼게 되네요. 제 자신이 상당히 작아진 느낌입니다.ㅠㅠ 역시 우물은 좁고, 우린 스스로가 개구리라는 사실을 모르고 살고 있는 모양입니다. 이 타이밍에 제가 존경해 마지 않는 율리우스 카이사르(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시거든요. 배고파요...ㅠㅠ 아침먹으로 가야죠^^

http://pinkwink.kr/trackback/326 관련글 쓰기
  • 핑구야 날자 2010/06/12 12:41

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

    • PinkWink 2010/06/12 13:22

      히히.. 남아공 보내주시는 건가요???^^

    • 핑구야 날자 2010/06/15 08:23

      네 보내드려야죠... 조금만 더 모으면..얼마냐구요,10억
      이제 몇백 모았으니..어라 표정이 왜그래요
      한달 용돈 10만원 받고 팔짝뒤는 사람처럼...
      한달용돈 100만원 이하면 용도아니잖아요 껌값이지..
      ㅋㅋㅋ

    • PinkWink 2010/06/15 10:24

      ㅋㅋㅋ... 핑구야날자님.. 화이팅입니다... ^^

  • 재오리 2010/06/12 13:03

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

    • PinkWink 2010/06/12 13:21

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

      아참 말씀하신 링크는

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

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

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

  • 빨간내복 2010/06/16 11:11

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

    • PinkWink 2010/06/16 11:37

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

  • mijong 2011/03/23 21:00

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

    • PinkWink 2011/03/24 09:51

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

  • mijong 2011/03/23 21:05

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

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

    • PinkWink 2011/03/24 09:50

      여기서 yaw를 의미하는 phi와 dot_phi와 ddot_phi를 모두 '0'으로 생각해도 될겁니다.^^

  • balancing 2014/05/17 13:34

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

    • PinkWink 2014/05/18 00:51

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

  • 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출력값이 +와 -값을 넘나들면서 제대로 동작하지 않게 되는데... 모델링이 잘못 된것인지 아니면 다른 예상가는 점이 있는지 여쭤보고 싶습니다..

    • PinkWink 2014/05/21 12:31

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