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


비가 오는듯 마는듯합니다. 분명 장마라고 하던데... 방금 예전에 제가 알바로 일했던 입시학원의 예전 선생님들을 만나 소주한잔 하고 왔습니다. 당시 저는 고등부 수학을 수업했었는데, 그때 이야기들을 한참하며 떠들고 웃었네요. 그 때, 한때는 학원강사로 평생을 일할까하는 생각도 했었는데, 지금은 이렇게 백수로 살고 있네요. 그래도 그 분들과의 오랜만의 자리가 너무 즐겁고 재미있었습니다. 한잔을 더 하고 싶지만, 어지러워서...ㅠㅠ 그래서 술이나 깰겸... 연재를 다시 올리네요..^^

레고의 마인드 스톰의 문서를 확인한 이후, 밸런싱로봇의 동역학을 따라가보았었습니다. [관련글
그 후, 디바이스마트에서 기구부를 구입하고, 모터의 파라미터를 도출했었습니다.[관련글
이제, 나머지 파라미터를 구성하고, 모델을 선형화해서, 선형제어기를 구할려고 합니다. 그 후 MATLAB/Simulink를 이용해 제어기의 타당성을 확인한 다음 실제 적용을 해봐야겠지요. 


레고 마이드 스톰의 문서가 저에게 많은 도움을 주는군요.. 저런 그림도 제공해주고 말이죠^^


디바이스마트에서 구입한 기구부의 제원에 맞도록 수치를 구했습니다. 물론 오차가 발생할것입니다만, 레고 마인드스톰의 기구부도 딱 저렇게 생기진 않았지요. 어차피 제가 생각한 LQR제어기를 구성하고 실제 시스템에 테스트를 해봐야알겠지만, 통상 펜들럼류의 로봇들은 저정도는 간략히해도 큰 문제가 없습니다. 지난번[관련글]에 모터의 마찰계수에 집착한것은 원체 그 모터의 마찰계수가 클것이기 때문이었으니까요.




   상태방정식 구하기 !  
 

이전에 문단 [관련글]에서 상태방정식을 구했었습니다. 그때 결과를 보면

 
로 표현가능하고, 각 요소들은

 


이었습니다. 그러나 동역학과 실제 시스템을 유심히 관찰하면, 기구가 넘어지는 psi와 기구가 이동한 거리를 의미하는 theta는 같은 제어기로 두고, 기구의 yaw 움직임을 관장하는 phi는 따로 제어기를 구성해도 괜찮아보입니다. 단지 블로그에 올리는 거니 따로 제어기를 구성해도 되는지, 안정화증명은 생략하도록하죠... (절대 귀찮아서 그런게 아닙니다...ㅠㅠ)


그래서 상태방정식을 위와 같이 분리합니다. 앗... 밑의 수식은 psi가 아니라 phi입니다. 큭... 음주 블로깅의 폐해....ㅠㅠ


위의 파라미터를 대입해서



이렇게 상태방정식을 구했습니다.






   LQR 제어기 설계 !  
 

MATLAB을 사용하면서 큰 장점중 하나는 역시 막강한 툴박스에 있겠죠^^ 그중 LQR 툴박스도 있습니다. LQR 툴박스의 사용방법은 예전에 언급했습니다.[관련글


툴박스를 사용하기 위한 가중치행렬을 정의하고, 제어기를 구해보면


라고 하는군요^^. LQR 툴박스는 제어입력 u=-Kx로 봅니다.^^




   MATLAB / Simulink 시뮬레이션 환경 구축하기 !  
 

미분방정식으로 나타난 동역학 방정식을 MATLAB/Simulink로 구현하는 방법은 [관련글]에서 설명을 했었습니다. 우리가 구현해야할 동역학은 당연히 밸런싱로봇의 비선형방정식입니다. 다시 이전에 구했던 결과식을 가져오면


입니다. MATLAB/Simulink에서는 위 동역학을 바로 밸런싱로봇이라고 볼 겁니다. 그러니 실제상황처럼 테스트를 하기 위해 위 동역학을 Simulink에서 구현해야지요


위 그림처럼 구성하고 빨강박스에는 theta에 관한 식이 들어갑니다.


음.. 사실 전 저 수식을 손으로 입력한게 아닙니다. 예전에도 한번 언급했지만, 위치벡터와 운동에너지와 위치에너지, 변수와 상태만 설정하면, 결과 동역학을 유도하도록 만들어 둔 프로그램이 있습니다. 제가 만든 그 프로그램의 마지만 단계가 시뮬레이션을 위해 저 function 블럭에 넣을 수식을 simulink에 사용할 수 있도록 변환시켜주는 것입니다. (언제한번 그것도 연재해야할 텐데 말이죠....ㅠㅠ)


저 빨간 박스에는 phi쪽 수식이 들어가야합니다.


마지막으로



저 박스에는


psi쪽 수식이 들어가게 됩니다. 그렇게 해서 저 전체 블럭을 Subsystem으로 변환합니다.[관련글]

 
그리고, 제어기 부분을 만들어 줘야겠네요^^


위에 빨간부분은 아까구한 LQR제어기법의 결과인 K1, K2가 각각 들어가면 됩니다. 저 빨간박스부분이 실제 마이크로 프로세서에 입력되는 부분으로서, 숫제 8개가 전부입니다...^^


이제 저 부분은 제가 이전에 동역학을 편의상 u1, u2로 두었는데요. 그걸 각 모터에 인가하는 전압으로 바꾸는 것입니다.

v_l = (u1+u2)/2
v_r = (u1-u2)/2

입니다.


   시뮬레이션 결과 !  
 

이제 시뮬레이션 결과를 봐야겠네요. 뭐 당연히 되는 거라 의미는 없지만, 


위에서 부터 theta, phi, psi입니다. 셋 다 모두 초기치를 2도로 주었습니다. phi를 제외 하면 대략 4초가 지나면서 안정화가 되었다고 볼 수 있습니다.


노란선이 u1이고 빨간선이 u2입니다.


실제 각 모터에 인가된 전압입니다. 24V Max 모터인데, 각각 8V정도를 극 초반에 사용하고, 오버슈트가 발생할때가 고작 0.8V정도네요. 일단 괜찮다는 것을 확인할 수 있습니다.

이제, 몇가지 작업을 더 하고, 실제 하드웨어 프로그램을 어떻게 구성하는지를 시작으로 각 상태의 측정과 제어기를 이식하는 것을 실제 다루게 되겠네요. 그때 테스트를 하면서, 제어기를 수정하게 될겁니다. 가중치행렬(Q,R)을 변경해가면서, 제어기의 성능을 향상시키게 되겠지요.^^


http://pinkwink.kr/trackback/337 관련글 쓰기
  • 핑구야 날자 2010/07/04 21:55

    술기운에 작성한 포스팅인줄알고,,,ㅎㄷㄷㄷ

  • 다질문 2010/07/05 19:28

    안녕하세요. 저는 그전에 '질문있습니다'라는 닉넴으로 질문공세를 했었던 공학도인데요...ㅎㅎ
    이번 글을 보니까 제가 질문했던 내용도 중간중간에 끼여있는거 같고,
    또 먼가 저같이 잘 모르는 사람을 위해서 쉽게쉽게 설명도 더 해주신거 같아서 감사해서 그냥 넘어갈수가 없네요 ㅎㅎㅎ 아 그리고 이제 '다질문'이란 닉넴으로 또
    질문을 바바박ㅋㅋ 하겠습니다.ㅎㅎ
    글 정말 잘보고 있습니다 감사합니다~~

  • brobot^^ 2010/07/28 15:33

    안녕하세요~연재 잘보고 있습니다^^

    첨부터 주욱 따라오고 있는데 막히는게 있어서요

    위에 상태방정식 구하기에서 psi와 theta는 같은 제어기로

    하고 yaw는 다른 제어기로 하면서 행렬식이 조금 변했는데

    거기서 그럼 행렬안에 있는 요소 값의 식도 변하는 건가요?

    제가 파라미터값을 변경해서 하기전에

    일단 그대로 직접 식에 대입해서 구해봤더니 pinkwink님이 계산한 값과 다르게 나오네요..ㄷㄷ

    예로 A44=(-2*beta*L*M*R-2*(f_w+beta)*J_psy-2*(f_w+beta)*L^2*M-4*f_w*J_m*n^2)/Den

    A44 = -32.5931

    이렇게 나오는데 blog에 찾아보면 -77.8635라고 되어있네요. 문제는 맞는 식도 있는데 안맞는 식이 더많네요..제가 잘못 계산한 것일 수도 있지만...

    아..그리고

    J_psy도 계산하니까

    J_psy=M*L^2/3

    J_psy = 0.0353 로 나오는데

    맨처음 파라미터값 제시할땐 0.1624로 나오네요.

    에..또 B52를 구하는 식에서 마지막에 u2도 나오는데

    이건 어떻게 지정해 줘야하는건지?..

    너무 많이 물어봐서 죄송하지만..꼭 답변부탁드립니다.

  • PinkWink 2010/07/29 08:21

    클클... 지적 정말 감사합니다. 포스팅할때 (음 시간이 좀 지나서 기억이 가물거리긴 하지만... 포스팅할때 계산기로 계산했는데 그게 제가 실수를 좀 한 모양입니다. 예를들면 1/3을 곱하지 않았다던지.. 포스팅중간에 MATLAB M-file을 올려놓은게 있는데, 그게 맞는 겁니다. ㅋㅋ 죄송합니다. m-file에서 구한 제어기를 그대로 사용했고, m-file 작성된걸 다시 보니 거기에 있는 수치는 맞는 것들이네요.. 그러면, 각 행렬의 요소들에 대한 답은 드렸고,

    마지막 B52에 있는 u2는 (역시 언제나 그렇듯..ㅠㅠ) 실수로 들어간것입니다. u2만 없다고 생각하시면 됩니다. u2의 계수가 B52거든요...ㅠㅠ

    아 그리고 A44는 제가 다시 계산해도 이 글과 같이 -77.8635라고 나오는데요..^^ 음.. 이상하군요...^^

    오타로 인해 혼돈을 드려서 죄송합니다. 그리고 소중한 지적 다시 감사드립니다.

    • brobot^^ 2010/07/29 16:19

      아..답변감사합니다^^

      다시 계산해보니 제가 계산 실수를 많이 했었네요..ㅠ

      아..한가지 더 궁금한게 있는데요..

      위에 동역학으로 구한 로봇의 비선형 방정식을

      LQR 제어로 선형화 시킨거죠?

      그런데 자이로센서 같은 경우에 누적오차같은

      오차문제도 제어가 되는 건가요?

      아님 오차제어를 위한 또 다른 필터같은게 필요한건지..

      바쁘신데 귀찮게 해드려 죄송해요..^^

    • PinkWink 2010/07/29 16:38

      http://pinkwink.kr/338 에서 소개한 것을 사용했습니다.

  • 재오리 2010/08/10 16:57

    모터에 인가하는 전압식이 왜 (u1+u2)/2, (u1-u2)/2를 하는 건가요? 하나는 입력 두개를 더하고 하나는 빼준 이유와 2로 나눠주는 건 왜 그런건가요?

    • PinkWink 2010/08/11 11:05

      그거야 애초 u1, u2를 만들때,
      u1 = v_r + v_l
      u2 = v_r - r_l (응? 순간 기억이 혹은 u2=v_l-v_r)
      로 잡았기 때문에 제어기에서 u1, u2가 나왔다면 다시 계산을 해서 v_r, v_l을 찾은 겁니다.

  • 다질문 2010/08/24 19:01

    m(바퀴를 뺀 나머지 무게)이 0.169kg이고 M(전체 무게)가 2.24kg가 된다고 하셨는데요.... 바퀴무게가 2kg정도란 말씀이신가요???

    • PinkWink 2010/08/25 13:30

      http://www.pinkwink.kr/336 에서 이야기했듯이 0.169는 바퀴의 무게입니다. 제가 본문 어디에서 문자를 혼돈해서 사용한 모양이군요.. 죄송합니다.

  • 다질문 2010/08/25 14:05

    위에서 Jm=0.00001이라고 하셨는데요.... 전에 블로깅에서 기구적인 파라미터 찾으실때, 관성모멘트 Jm=0.1916이라고 하셧던거 같은데... 혹시 다른 관성 모멘트인가요??

    • PinkWink 2010/08/25 14:25

      음.. 이상하군요.. 일단 제 답변은 같은 알파벳을 사용하고 있다고 하더라도 의미가 다를 수 있을겁니다. 이 글의 Jm은 모터축의 이너셔이고, 말씀하신, 0.1916의 수치라면, 아마 바퀴까지 포함했을 수도 있고, Jm의 의미가 몸체의 이너셔일 수도 있습니다. 다시한번 더 말씀드리지만, 알파벳이 같다고 같은 의미라고 생각하지 마시고, 해당글에서 의미를 정확히 읽으시길 바랍니다...^^

  • 다질문 2010/08/25 15:32

    아 그렇군요..동역학에서 필요한 '관성모멘트 Jm'은 모터축의 이너셔란 말씀이이신거 같은데요....
    그렇다면 블로깅 중에서 4. 기구적인 파라미터 찾기에서는 무게중심 l과, 로봇 바디의 이너셔 Jm과, 로봇 바디와 모터축 사이의 마찰계수 f_theta는 어디에 쓰실려고 구하셨는지 궁금합니다... 위의 동역학 simulink에서는 쓰이지 않은것 같은데 pinkwink님의 의견이 듣고싶습니다.

    • PinkWink 2010/08/25 15:52

      말씀하신 해당글에도 분명 말했듯이, 그 글에서 f-theta는 모터축과 로봇바디와의 마찰계수를 의미합니다. 또한 J_m은 로봇 몸체의 이너셔입니다. 그리고, 다시한번 더 말씀드리지만, 연재중에 로봇기구부를 변경했고, 동역학의 기본 컨셉도 확장하기위해 변경했습니다. 글 상당에 있는 목차만 보시면 됩니다. 목차이외의 연재는 제가 실수를 수정해가는 과정이거나 변경전 로봇입니다. 즉, 정리해 드리면, 말씀하시는 4번글은 변경전 로봇으로 그때는 필요해서 유도했지만, 그 후 연재 대상이 되는 로봇과 동역학을 변경했습니다.
      연재 번호로는 5번글 부터 읽으시면 된다고 생각되네요... 연재를 약간 중구난방으로 진행해서 죄송합니다.

  • 다질문 2010/08/25 19:50

    아닙니다 오히려 제가 질문을 귀찮게 많이 해서 죄송스럽습니다.
    하지만!! 저만 이런 생각을 가지지 않고 분명 다른 누군가도 저와 똑같은 궁금증을 가지고 제 댓글과 pinkwink님의 답변을 보며 같이 해결해 나가는 어떤 이들이 있다고 믿기에 이렇게 염치불구하지만, 또 과감히 질문 하나 하겠습니다.
    위에 A52항을 보면 끝에 u2가 곱해지는데 이 u2=vl-vr이라고 하셨는데...
    투로터 관련글에서 암만 봐도 잘 모르겠더라고요.....lqr제어기 게인값을 추출해내기 위해서는 이 A52항이 필요한데 u2는 어떻게 처리하셨나요??

    • PinkWink 2010/08/26 00:41

      B52항의 u2는 오타입니다.^^ 행렬구성상 밖으로 나갔어요^^

  • 다질문 2010/08/28 15:32

    'State'라는 scope전에 달려있는 게인은 무엇인가요??

    그리고 theta, psi, phi 초기치값을 2를 준다고 하셨는데 그건 subsystem안에 맨 마지막 1/s블럭안에 초기치를 준다는 의미인가요??

    • PinkWink 2010/08/30 02:21

      라디안(radian)을 디그리(degree)로 변경해주는 것일 뿐입니다. 아무래도 '도'로 각도를 보는것이 편하니까요. 그리고, 초기치에 관한것은 말씀하신대로입니다.

  • 다질문 2010/08/31 13:23

    pinkwink님... 저기 위에 각각 ddot_theta, ddot_phi, ddot_psi에 들어가는 수식이 비선형 방정식이 들어가 있는거잖아요... 선형화 한 수식이 들어가지 않은 이유는 밸런싱 로봇 자체가 비선형적인 범위에서 움직인다고 생각하기 때문인가요?? 그리고 위에 수식 중간중간에 조금씩 동역학 방정식과 다른 부분이 있는데 그게 틀린건지 의도해서 적어준건지 궁금합니다.

    • PinkWink 2010/08/31 13:31

      오잉?? 다른부분이 있던가요?? 음...
      일단.. 시스템을 시뮬레이션하는거라 비선형방정식을 그대로 시뮬레이션을 합니다. 선형화한 방정식은 선형화제어기를 꾸미기 위해서였구요^^
      그리고, 시뮬레이션을 위해 만든 비선형방정식을 시뮬링크에 그대로 넣었습니다. 만약 비선형방정식과 시뮬링크의 식이 제가 보여드린게 조금 다른곳이있다면 오타일 확률이 높습니다..ㅠㅠ 그런데 어디가 다르던가요??^^
      아.. 추가로... 비선형방정식을 시뮬레이션을 한 이유가 밸봇이 비선형적인 움직임을 가지기 때문이 아닙니다. 그렇다면 선형제어기를 설계를 안했겠죠. 시뮬레이션에 그래도... 실제와 비슷한 시스템을 넣기 위해서입니다.
      그나저나 다질문님.. 이제 거의 다 왔네요^^.. 조금 더 하시면.. 완성의 기쁨을 누릴수있겠습니다^^

    • 다질문 2010/08/31 14:47

      아 개강이라 바쁘실텐데 답변 정말 감사합니다....
      다른부분은 ddot_theta 첫줄에 2LMR이 아니라 LMR인것 같은데요...그 외에는 저도 계속 힘들게 찾아보고 있다가 찾는게 오히려 더 오래걸릴 것 같아서 그냥 새로 치고 있습니다 ㅎㅎㅎ 그나저나 완성이 아닐 것 같습니다... LQR제어 가중치 행렬 Q,R의 의미도 모르는 체로 일단 pinkwink님 따라 해봤는데 scope로 동역학 돌려보니 엉망이더군요.... 발산하고 요동치고 난리가나서.... 학부생이란 변명으로 너무 얕게 한것 같아서... 공대생이라면 또 항상 하는 디버깅을 하면서 해봐야겠습니다.. 무튼 좋은 답변 감사합니다 ㅎㅎ

    • PinkWink 2010/08/31 17:40

      네... 그렇군요... 좋은 성과있으시길 바랍니다.

  • 다질문 2010/09/01 17:59

    inputU12 scope를 찍어보면 u1, u2가 나타나는데요...
    그 전에 K1, K2가 총 6개의 수로 되어져 있기 때문에 저같은 경우에는
    inputU12를 찍어보면 총 6개의 선이 나타나는데요... 그전에 pinkwink님께서는 다른 작업을 해주어서 그런가요?

    • PinkWink 2010/09/01 18:26

      제어게인을 곱하는 Gain에서 행렬곱을 써야합니다.
      그래서 u1만 설명하면 상태 4개와 게인은 1*4의 크기를 가지니까 게인(1*4) * 상태(4*1)의 행렬곱의 크기가 1*1로 나타나도록 합니다. Gain을 더블클릭해서 행렬곱 혹은 벡터곱으로 변경하세요

  • 공상 2010/09/16 00:50

    상태 방정식을 살펴보면, 각도 각속도 이런 값들이 입력으로 들어가고, 출력으로 전압이 나오게 되는데요. 지금 현재 기구부의 모터가 엔코더 모터인데 엔코더는 사용하지 않으신거 맞죠 ? 그래프를 보면, 목표값에서 약간씩 전압이 흔들리면서 잡아주는거 같은데 맞나요 ? 그렇다면, 너무 신기하네요 .
    LQR 제어기 ...

    • PinkWink 2010/09/16 01:25

      약간은 다르게 표현하셔야합니다.^^ 이 포스팅에서 제시한 상태방정식에서 제어입력은 u1, u2이고, 실제로는 두 모터에 인가되는 전압 v1, v2를 더하고 빼서 표현한 것이니까 실제 제어입력은 두 모터에 인가되는 전압입니다. 그에 따른 각 상태의 변화를 알 수 있습니다. 그리고, 이 포스팅은 시뮬레이션까지만 한 것으로, 로봇의 기울어지는 각도와 로봇이 이동한 거리를 의미하는 바퀴의 회전각도, 그리고 Yaw방향의 회전각도와 그 세 각도의 미분치인 각속도.. 이렇게 6개의 상태는 측정가능하다고 가정하고 있습니다.^^

  • lunefey 2010/10/04 10:06

    저 동역학 식으로 변환되는 소스 좀 올려주시면 안될까요ㅡㅠ 지금 코딩 중인데 자꾸 에러가 나요. 틀린부분 찾기가 너무 어려워서요.

    • PinkWink 2010/10/04 12:27

      아직은 포스팅할 예정이 아니며(너무바빠서요...) 그리고 현재 포스팅 외의 방법으로 유츌시킬 생각이 없답니다. 죄송합니다.

  • 공대인 2011/05/17 23:06

    안녕하세요~
    홈 페이지에 신기한 내용들이 엄청 많군요.
    이것 저것 읽어 보고 따라하던 중 시뮬레이션 결과가 자꾸 다르게 나오는 군요..
    그래서 드는 생각이 포스팅 된 시뮬레이션 결과에서,

    psy의 초기치가 3으로 주신 것이 아닌가 해서 질문을 드리게 되었습니다.
    정말 좋은 자료들 많이 구경하게 해 주셔서 감사합니다 ^^ 앞으로 자주 들르도록 할께요

    • PinkWink 2011/05/18 08:43

      본문 중간에 보면 초기치를 2로 주었다고 되어있는데...
      오래전 포스팅이라 실제 얼마를 주었는지 확인은 힘드네요..^^
      그러나..
      여기서 시뮬레이션에서 초기치가 얼마인지는 그리 중요하지 않습니다.
      그냥 초기치를 극복하고 잘 서있구나가 중요한거라서요^^

    • 공대인 2011/05/19 11:36

      답변 감사합디다~ 앞으로 많이 배우도록 하겠습니다 ㅎ

    • PinkWink 2011/05/20 07:49

      비 오는 아침이네요.. 그래도 좋은 하루 되세요

  • mijong 2011/05/20 18:17

    atmega128로 동역학 모델의 식까지 연산하는거는 힘든가요??

    • PinkWink 2011/05/20 18:28

      앗.. 아닙니다. 간혹 그렇게 생각하시는 분들이 있으신데..
      마이크로프로세서에 동역학 모델이 들어가는 것이 아닙니다.

      동역학을 유도한 이유는 크게
      시뮬레이션을 해보기 위해서이며
      더 중요한 것은 동역학으로 시뮬레이션을 이용해서 제어기를 구하기 위해서입니다.
      실제 시스템에다 테스트하는 것이 번거롭거나 혹은 실제로 만들기 전에 제어가능성을 판별해보기 위해서이지요.
      결국 동역학은 실제 시스템이라고 보고
      실제시스템에 들어가는 것은 제어기(제어게인 몇개)만 들어가게 됩니다.

  • 공대인 2011/05/27 17:33

    엇 궁금한게 있는데요, 모델 방정식이랑 근사화 식에서 사용한 각도의 단위가 degree 인가요?? rad 인줄 알았는데 시뮬레이션 상에서 초기값을 degree로 주신 것 맞죠???

    • PinkWink 2011/05/29 07:47

      rad입니다. 관찰할때만 익숙한 degree로 보고 있을 뿐입니다.
      초기값도 3*pi/180처럼 주었기 때문에 rad으로 준겁니다. 단지 제가 표현을 3도로 표현했을 뿐입니다.

  • KSM 2011/07/25 16:09

    질문이 있는데요
    다른 논문을 보아도 그렇고, 여기도 그렇고 LQR 제어기를 사용하셨던데
    특별한 이유가 있는 것인가요?!
    PID 고전 제어로는 제어가 불가능한지요..
    비선형 시스템이라서 PID 고전 제어기로는 제어가 안 되는 것인가요..?!

    • PinkWink 2011/07/25 18:13

      제가 LQR제어기를 사용한 이유는 그냥 그게 저한테 편하기 때문입니다.^^ MATLAB에서 lqr이라는 명령어만 있으면 되니까요^^. 그리고, LQR제어기도 그 결과물은 PD혹은 PID제어게인으로 나타납니다. 마지막으로, 극배치법같은 고전제어방식을 사용해서 PID제어기를 설계하셔도 됩니다.^^

      그리고, 비선형이라 LQR을 적용한건 아닙니다. 어차피, LQR제어기도 선형화한후에 적용하는 겁니다.

  • 왕초보 2011/08/05 17:20

    LQR 설계에 대해 질문 있습니다.

    위의 과정에서 지정하신 Q1,Q2, R1,R2는 임의로 선택하신건지요, 아니면 여러번 시행착오를 통해 적절한 값을 찾으신건가요?

    이 값을 구하는 과정에 체계적인 방법이 있는 것인지, 아니면 수많은(?) 시행착오를 겪으면서 원하는 제어를 할 수있을때까지 반복하는 것인지 궁금합니다.

    LQR설계라는 것을 아직 배우지 않아서 자동제어 책을 참고해봤는데 LQR설계에 대해서는 아주 간략하게 언급하고 예제한개 풀고 지나가는 정도이네요..

    궁금한 점은 Q와 R행렬의 정의와 시스템에서 어떤 역할를 하는지에 대해서 좀 더 알고 싶습니다.

    • PinkWink 2011/08/05 17:13

      물론 Q행렬은 가중치라 어떤 의미를 가지기는 합니다. 중요하다고 생각되는 상태에 좀 더 많은 값을 인가하는 거지요. 그러나, Q,R모두.. 사실... 여러번의 시행으로 잡는겁니다.^^

    • 왕초보 2011/08/05 17:21

      헛.. 질문을 약간 수정했는데 벌써 답변을 해주셨네요.

      추가한 질문에 대해서도 설명을 듣고 싶습니다..^^

    • PinkWink 2011/08/05 17:27

      네.. 비슷한 내용을 포스팅하긴 했습니다.
      http://pinkwink.kr/361
      를 확인하시면 약간 더 자세한 내용을 보실 수 있습니다.^^

  • 김학준 2012/05/25 20:54

    안녕하세요. 많은걸 배움니다. 저가 처음부터 동학수리브로부터 지금까지 따라했는데요. 저가 한 matlab결과값과 simulink는 계속 에러가 생겨요. pinkwink님과 딱같게 했다고 생각했는데요 ...ㅠㅠ
    g=9.18;
    m=0.169;
    n=50;
    R=0.06;
    H=0.435;
    L=H/2;
    W=0.22;
    D=0.22;
    M=2.240;
    J_psy=M*L^2/3;
    J_phi=M*(W^2+D^2)/12;
    J_w=0.00031;
    J_m=0.00001;
    f_m=1.7747;
    f_w=0;
    alpha=1.0217;
    beta=0.5478+f_m;

    Den=(2*J_psy*J_w+2*J_w*L^2*M+J_psy*M*R^2+2*J_m*J_psy*n^2+4*J_m*J_w*n^2+2*J_psy*R^2*m...
    -L^2*M^2*R^2+2*J_m*L^2*M*n^2+2*J_m*M*R^2*n^2+2*L^2*M*R^2*m+4*J_m*R^2*m*n^2+4*J_m*L*M*R*n^2);


    A43=1/Den*(-R*g*L^2*M^2+2*J_m*g*L*M*n^2);
    A44=1/Den*(-2*beta*L*M*R-2*(f_w+beta)*J_psy-2*(f_w+beta)*L^2*M-4*f_w*J_m*n^2);
    A46=1/Den*(2*beta*L*M*R+2*beta*J_psy+2*beta*L^2*M);
    B41=1/Den*(alpha*L*M*R+alpha*J_psy+alpha*L^2*M);

    A55=-(W^2*(f_w+beta))/(m*R^2*W^2+2*J_phi*R^2+J_m*W^2*n^2+J_w*W^2);
    B52=-(R*W*alpha)/(m*R^2*W^2+2*J_phi*R^2+J_m*W^2*n^2+J_w*W^2);

    A63=1/Den*(L*g*M^2*R^2+2*L*g*m*M*R^2+2*J_m*L*g*M*n^2+2*J_w*L*g*M);
    A64=-1/Den*(-4*J_w*beta-4*R^2*m*beta+4*(f_w+beta)*J_m*n^2-2*M*R^2*beta-4*J_m*n^2*beta-2*(f_w+beta)*L*M*R);
    A66=-1/Den*(4*J_w*beta+4*R^2*m*beta+2*beta*M*R^2+2*beta*L*M*R);
    B61=-1/Den*(2*J_w*alpha+2*R^2*m*alpha+M*R^2*alpha+L*M*R*alpha);

    A1=[0 0 1 0;0 0 0 1;0 A43 A44 A46;0 A63 A64 A66]
    B1=[0;0;B41;B61]
    A2=[0 1;0 A55]
    B2=[0; B52]
    위 코드처럼 했는데요 결과값이 틀려요

  • 김학준 2012/05/30 13:47

    A1 =
    0 0 1.0000 0
    0 0 0 1.0000
    0 9.1310 -77.8635 77.8635
    0 26.3363 17.8690 -17.8690
    B1 =
    0
    0
    17.1266
    -3.9304
    A2 =
    0 1.0000
    0 -81.1881
    B2 =
    0
    -9.7407
    이것은 matlab에서 답이 같이 않게 나오고요.
    simulink는 in 'srt_02/BallBot/ddot_phi'
    has a syntax error
    simulink는 저가 blcok에 넣은 추치들이 틀린것이라고 생각하고 있어요.

    • PinkWink 2012/05/30 19:14

      ㅎㅎ.. 일단 저도 당연히 사람이니.. 제가 실수했을 수도 있으며
      김학준님께서 또한 뭔가 오류가 있으셨을 수도 있습니다.
      이것은 지금 제가 일일이 확인할 수 있느 것은 아닙니다.
      디테일보다는 큰 흐름으로 이렇게 흘러가는 구나..라고 학습해주시면 되겠습니다.
      그리고, 말씀하신 에러가 syntax에러라면, 수치의 잘못이 아니라, 문법에러이니 꼭 잡고 넘어가야합니다. matlab/simulink에서 문법상 오류를 일으키셨다는 것입니다. 단순히 괄호에서부터 체크를 꼼꼼이 하셔야할 듯 합니다.

  • sweetu 2012/09/13 20:45

    글 정말 잘 읽고 있습니다. 관련 논문 여러개 보면서 동역학 유도도 해보고 매트랩사용도 해보고 정말 감사합니다.
    지금 이 단계 까지 왔는데요~ 동역학을 유도하는 프로그램은 어떤 방식으로 되는 건가요? 연재할 생각 없으신가요?ㅎㅎ 아무튼 너무 재밌게 공부하고 있습니다. 그리고 더 깊숙히 공부하고 싶은데 어떤방식으로 접근하며 공부해야할지 모르겠네요 전공은 전자공학입니다.

    • PinkWink 2012/09/14 10:03

      저도 여러 논문으로 독파한거라, 약간 오류가 있을 수도 있습니다만, 그래도 여러 논문을 서치하다보면 조금씩 알게 되더군요^^