이 글은 블로그라는 특수성으로 인해 편집의 형태가 달라질 수는 있지만, 디바이스마트가 발행하는 잡지에 동시에 기고되는 글입니다. [디바이스마트매거진]. 그래서 글의 어투가 블로그에서 제가 오랫동안 사용하던 존칭이 아닙니다. 스케이트보드로봇 연재에서만 그러하니 기존의 블로그이웃들께서는 오해 없으시길 바랍니다.

 벌써 총 3회로 기획했던 스케이보드 로봇의 마지막 연재다. 애초 기획할 때와 달리 5회 정도로 연재를 했어야 한다는 후회가 벌써 들지만, 또 길게 연재를 했다면, 또다시 좀 더 길었어야 하는데 하는 아쉬움을 가졌을 것이라고 스스로 위안하는 중이다. 이번에는 1회와 2회에서 구축한 환경을 가지고 실제 스케이트보드 로봇을 구현하는 것이 목적이다.



   제어기의 설계 
 

 제어기 설계를 들어가기 전에 먼저 1회 내용을 수정할 것이 있다. 이미 만들어져 있던 스케이트보드 로봇을 내용을 편집해서 연재하는 것이었으면 이런 실수가 없었을 것 같은데, 로봇을 동시에 만들기 시작하면서 연재를 같이 시작해서 나타난 현상이지만, 1회 연재에서 유도한 동역학은 로봇의 바퀴가 돌아가는 각도와 각속도를 알고 있다고 가정하고 꾸며진 동역학 모델이다. 그런데 2회 연재를 진행하기 직전, 연구소 내부 사정으로 로봇에는 엔코더가 달리기 힘든 모터를 선정해버렸다. 그래서 1회에서 동역학 모델 중 절반은 소용없는 수식이 되어버렸다. (혹시 직접 스케이트보드로봇을 만드는 분이 있다면 쓸모있을 것이다.)
 일단 1회 연재에서 위에 말한 부분을 제외하고 실제 제어기 설계에 사용할 동역학을 그림 1과 그림 2를 통해 다시 보면


이다. 여기서

 

이다. 여기서 각 파라미터는 연재 1회[관련글]에서 이미 밝혔다. 

 

 

  일반적으로 선형제어기 설계기법에서 많이 알려진 것 중 하나인 LQR 제어기법을 사용하여 제어기를 설계하기 위해 상태를 [psi dot_psi]로 보고 상태방정식으로 표현하면

 

이다. 이 식을 MATLAB의 LQR툴박스를 이용하여

 

를 적용하고,

 

로 사용하면 제어게인을 구할 수 있다.
 1행부터 4행까지는 식 (3)의 A, B행렬을 얻기 위한 파라미터를 정리한 것이고, 5행부터 8행까지는 실제 A, B행렬에 대입할 수식을 미리 정의한 것이다. 9행과 11행은 A, B행렬이고, 10행과 12행은 서보제어기를 통해 적분이득을 구하기 위한 것이다. 13행과 14행에 가중치를 주고, 15행에서 LQR 툴박스를 사용했다. 16행에서는 두 모터의 게인의 합을 구한 것이다. 위 코드 2를 MATLAB에서 실행하면, 비례(P) 게인은 -451.3634, 미분(D) 게인은 -11.9383, 적분(I) 게인은 -14.1421를 얻게 된다.



   스케이트보드 로봇의 실제 구현
 

 현재 본 연재에서는 스케이트보드 로봇의 메인 MCU로 AVR - AT90CAN64를 사용하고 있다. 관련 회로는 연재 2회에서 밝혔으니 이번에는 위에서 구한 제어기를 어떻게 MCU에 펌웨어로 구현하는지에 대해 이야기를 한다.
 실제 제품으로 출시되는 우리 스케이트보드 로봇에는 안전과 구동상의 이유로 많은 코드를 추가로 가지고 있지만, 실제로 DIY(Do It Yourself)로 제작할 경우 필요한 코드만 본 연재에서 다루도록 하겠다.


 1행부터 19행까지는 연재 2회에서도 언급한 부분이지만, 자이로센서와 가속도센서가 융합되어있는 NT-ARSv1이라는 제품에서 Roll각도와 가속도를 받아오는 부분이다. 23행부터 25행은 안전을 위해 10도 범위를 벗어나면 시스템을 셧다운 시키도록 되어있다. 
27행부터 30행이 앞 절에서 구한 제어게인을 적용하는 부분이다. 비례게인은 KP, 미분게인은 KD, 적분게인은 KI이고 전역변수로 선언되어있다. 그리고, 각 게인을 반영한 제어입력은 두 모터에 반으로 나눠져서 PWM으로 36행과 37행처럼 인가되도록 되어있다. 나머지 38행부터 43행은 그저 방향을 잡는 것이다. 이 코드는 10ms마다 실행되도록 되어있다.
실제 연재 1회에서 구한 동역학 모델을 연재 2회에서 기계적으로 구성하고, 회로를 꾸미고, 연재 3회 1절에서 설계된 제어기는 27행부터 30행이 전부이다. 27행부터 30행을 구현하기 위해 그 긴 과정을 수행한 것과 같다. 한가지 알아줘야할 것은 그와 같은 과정없이 그냥 PID게인을 잡아도 충분히 스케이트보드를 구현할 수 있다. 꼭 동역학 모델 같은 것이 필요한 것은 아니지만, 그래도 게인을 튜닝하기 위한 시간을 좀 줄일 수 있다는 것은 포기할 수 없는 매력이기도 하다. 실제 이번 연재에서 구현한 스케이트보드 로봇은 이렇게 구한 제어기를 그대로 사용하고 있다.



   결론  
 

 먼저 이 연재의 결과물은 유투브 동영상(http://youtu.be/RVI4XzJ3sLs)을 통해 확인 할 수 있다. 또한 이 연재의 결과물은 디바이스마트에서 60만원대의 조립 형태로 NT-SBMRv2라는 제품명으로 출시된다. 모든 소스코드를 공개한 상태로 출시되므로 관련 분야를 공부하고자 하는 학생들에게 꽤 유용할 것으로 생각된다.
 마지막으로 부족한 연재임을 스스로 인정하며, 다음번 연재를 또 혹시 기획하게 된다면, 좀 더 알차고 흥미로운 내용으로 기획해야겠다고 스스로 다짐하게 되었다. 스케이트보드 로봇에 대한 문의는 엔티렉스의 포럼(ntrexlab.co.kr)이나 필자의 개인블로그의 스케이트보드로봇 포스팅에 남겨주시면 좋겠다.



http://pinkwink.kr/trackback/458 관련글 쓰기
  • 핑구야 날자 2011/08/08 08:06

    코딩내용을 보니 조금은 알듯 말듯..ㅋㅋ

    • PinkWink 2011/08/08 13:46

      이걸 구매한 분들이 연구용으로 재미있어하기를 바랄뿐입니다.^^

  • 맨땅에 헤딩 2011/08/08 23:25

    재밌어보이는게 많네요

    • PinkWink 2011/08/09 08:21

      저도.. 그렇습니다.
      하고싶고 재미있어보이는건 많은데..
      아직 여러모로 부족해요...ㅠㅠ

  • 구차니 2011/08/14 11:00

    우와 너무 멋지세요 ㅠ.ㅠ

    아 혹시 예전에 말하신 리만 필터가 예측에 사용되는 건가요?
    openCV 라이브러리를 읽다보니 영상예측쪽에 리만필터가 나오더라구요

    • PinkWink 2011/08/14 11:13

      앗.. 아마 제가 이야기한거라면.. 칼만필터일것 같아요..
      그나저나.. 구차니님의 폭풍댓글에 깜짝 놀라게써요...^^

    • 구차니 2011/08/14 11:21

      앜ㅋㅋ 리만합이랑 순간 착각을 했나봐요 ㅋㅋ
      아무튼 예전 글에 나오던 그 키워드가 openCV에서 보여서
      깜짝 놀랐어요 ^^;

      제가 주말에 몰아서 RSS를 확인하다보니 폭풍댓글 처럼 보이는건 착각이십니다 ㅋㅋㅋㅋ

    • PinkWink 2011/08/14 19:11

      ㅎㅎ.. 그런가요? 하여간 항상 흔적을 남겨주셔서 감사합니다.^^

  • mijong 2011/08/29 17:05

    ㅎㅎ 역시 윙크님 ㅋ 대단하세요
    저는 요새 자바에 손을 대고 있어요 ㅋ 자바로 avr과 시리얼통신을 해서 재밋는거라도 만들어볼라구요 ㅋㅋ 뭐만들까 고민중이에요
    저도 밸런싱로봇만들려다 제어기만 설계하고 보상필터의 결과와 엔코더 값의 비교가 일치만 확인하고 만들다 말앗어요 ㅠㅠ 빨랑 자바 떼고 마무리 져야겟네요 ㅋㅋ 암튼 윙크님 한테 너무 많이 배웟음 ㅋㅋ

    • PinkWink 2011/08/30 12:42

      항상.. 자바에 목이 마르긴합니다만... 그놈의 게으름으로... ㅎㅎ^^

  • 정병진 2014/06/02 03:19

    안녕하세요! 밸런싱스케이트보드를 구현하다가 질문이 있습니다.........
    밸런싱로봇 연재를 따라오면서 dot_theta, dot_psy, ddot_theta. ddot_psy 에 관한 상태방정식을 만들었습니다.
    그런데 글에서 보면 엔코더가 없어 상태방정식을 dot_psy 와 ddot_psy 에만 대하여 식을 세우셨는데
    dot_theta 와 ddot_theta에 관한 식을 버리고 dot_psy와 ddot_psy에 대한 식으로도 구동가능한건가요??
    만약 윙크님처럼 dot_psy와 ddot_psy만 사용해서 구현하고싶으면 처음
    4개의 상태를 구한 상태방정식에서 dot_psy와 ddot_psy만 뽑아서 사용하면 되는지....
    또한가지 질문은 소스에서 angle_sum 이란 변수가 무엇을 의미하는지 모르겠습니다.
    그리고 28행에 TS 변수는 무엇을 의미하는건지도 궁금합니다...!!!!!!!

    ㅠㅠ 여태까지 열심히 따라했는데 혼란스럽습니다 ㅠㅠㅠㅠ

    요약하자면
    질문1.dot_psy와 ddot_psy에 대한 식으로도 구동가능한건가요??
    질문2. 밸런싱로봇 연재글에서처럼 4개의 상태에 대한 상태방정식을 구한 뒤 dot_psy와 ddot_psy에 관하여만 뽑아서 사용하면 되는건가요?
    질문3. 코드에서 angle_sum과 TS가 무엇을 의미하는건가요??
    질문4. H = [alpha; -alpha] 인거같은데... 아닌가요??
    질문이 너무 많네요ㅠㅠ 읽어주셔서 감사합니다..!!

    • PinkWink 2014/06/02 11:53

      이건 좀 아쉬운건데요. 제가 이 프로젝트에 합류할 당시에 중간에 합류를 했는데 합류하고나서 보니 엔코더가 모터에 없는 거에요.ㅠㅠ. 이미 설계가 끝나서 어쩔수가 없다고 하더라구요.ㅠㅠ.
      결국 엔코더가 없는 상태에서 제어를 해야했었지요.
      그래서 psi쪽만 제어대상으로 잡은 거랍니다.ㅠㅠ. 결국 그래서 엄청난 튜닝을 했지요.ㅠㅠ. 엔코더를 달 수 있다면 당연히 달아서 전체 상태를 보세요.
      그리고, TS와 sum은 적분때문에 사용하는 겁니다. TS는 샘플링 시간이구요. 각도(의 에러)를 누적하는 거지요.

  • 정병진 2014/06/08 21:39

    안녕하세요!! 저도 엔코더를 달기가 어려운상황이라 핑크님처럼 psy쪽만 제어대상으로 잡으려고 합니다.

    그래서 여태까지 구한 상태방정식에서 ddot_psy만 뽑아 선형화 하여 전달함수를 구한뒤 시뮬링크로 pid튜너를 이용해서 게인값을

    구했는데요..... 이렇게해도 잘 될까요?? 그리고 J_psy 인 사람의 관성모멘트는 어떻게구하셧는지...허헣....

    그리고 prop = 목표치 - 현재값 아닌가요...? 그러면 prop = 0 - roll_angle 이 아닌지요 ㅠㅠ...

    • PinkWink 2014/06/09 08:30

      네 그렇게 저도 했습니다. 어마어마한 튜닝을 했지만..ㅠㅠ
      그리고 목표치-현재냐 그 반대냐..는 그렇게 중요하지 않습니다. 뭐든 정의(definition)를 그렇게 잡았다면 그렇게 유도하면 됩니다. 저는 부호가 바뀌고 하는 것이 귀찮아서~~ 아마 그렇게 하지 않았나 하고 생각하는데요... 흠~~

1 ... 18 19 20 21 22 23 24 25 26 ... 44