강좌 순서

1. MATLAB 각 Window 사용법 [바로가기]
2. M-File을 사용한 기초연산법 및 데이터의 그래픽 출력 [바로가기]
3. 데이터의 3D 출력 [바로가기]
4. 조건문 및 반복문의 사용. 에러대비 [바로가기]
5. Simulink의 기초 [바로가기]
6. Simulink의 기초 2 [바로가기]
7.  Function 문의 사용 [바로가기]
8. 동역학 시뮬레이션하기 [바로가기]
9. 애니메이션 구현하기 [바로가기]
10. 애니메이션을 이용한 동역학 시뮬레이션하기 [바로가기]
11. LQR 툴박스를 사용하여 제어기 구현하기 [바로가기]
12. GUI 시작하기 - Static, Edit Text 및 Push Button [바로가기]
13. GUI - Slider 사용하기 [바로가기]
14. GUI - List Box와 Pop-up Menu [바로가기]
15. GUI - Check Box와 Radio Button [바로가기]
16. GUI - 종합 예제 [바로가기]

본 강좌에 사용되는 MATLAB은 버젼 7.9.0 (R2009b)을 대상으로 합니다.





   LQR !  
 

LQR(Linear Quadratic Regulation)은 선형 제어 기법 중 하나입니다. 대부분의 자동제어책에 그 내용이 설명되어 있습니다만, 우리는 MATLAB 연재를 진행하는 중이므로, 그냥 MATLAB에서 LQR을 어떻게 구현할 것인지를 이야기하겠습니다. 너무 쉽거든요^^. 왜냐면 MATLAB은 LQR 툴박스를 제공하기 때문이지요...^^ 일단, LQR을 사용하기 전에 우리가 요즘 다루고 있는 카트형 진자 시스템의 동역학(참조)에서 


상태행렬로 표현을 해야합니다. 


이렇게 말이죠. 행렬의 곱셈을 수행해보시면 아래 위 두 식이 같다는 것을 알 수 있습니다. 이제, 시스템의 상태행렬 A, B를 알게 되었네요.



그리고, 흔히 LQR에서 이야기하는 가중치 행렬을 설정합니다. 애초 상태행렬을 만들때 상태의 순서를 x, dot_x, theta, dot_theta로 잡았으니, 위 Q행렬 대로라면, theta의 가중치를 x보다 5배로 설정해두고 있습니다. R은 제어입력의 크기에 관여합니다. Q, R을 적절히 바꾸면, 제어성능을 어느정도 원하는 대로 이끌어 볼 수 있습니다. 더 알고싶다구요??? 현재 연재내용에서 벗어난다니까요...ㅎㅎ^^


LQR명령은 바로 위와 같이 주면 됩니다. 그러면 제어이득 K가 바로 나옵니다^^


이렇게 해주면 되죠.^^ 




   시뮬링크에 제어기 적용하기 !  
 

방금 구한 제어이득 K를 이제 시뮬레이션에 적용해봐야지요.

 
위에서와 같이 구현합니다. 아.. 그리고 자료를 만들다가 알았는데 theta의 방향이 음... 반대로 설정되었더군요... 죄송하니다^^ 일단 MATLAB을 연습하는 연재입장에서는 관계없는 내용이지만, 일단 Scope1앞에 Gain에 원래 180/pi가 들어가 있는데 여길 -180/pi로 변경해 주시구요. 에니메이션을 그리던 MATLAB Fcn문 안에 test1(u(1), u(2),u(3), u(4))라고 되어있는 부분을 test1(u(1), -u(2),u(3), u(4))로 변경해주시면 됩니다. 동역학 유도 단계에서 theta의 방향이 반대로 잡혀있다는 것을 지금 알았네요..ㅜ.ㅜ

 
실제 제어기가 구현되는 것은 위의 부분입니다. 상태(x, dot_x, theta, dot_theta)를 받아와서 제어게인 K와 곱해주면 되지요.


그런데 부궤환이라 -K로 입력하시고, Matrix(K*u)로 설정하시면 됩니다. 많은 분들이 이 제어기를 C나 C++로 어떻게 구현하냐고 하시는데, 실제로 구현하는 것이 이 블럭입니다. 간단하죠...^^

 
위가 그 결과입니다. 아까도 말씀드렸지만, theta가 ... 반대라는....ㅜ.ㅜ




   카트의 위치를 변경해 보기 !  
 

사실 LQR은 상태를 '0'으로 보내는 것이기 때문에 tracking 문제는 아닙니다만, 일단 간단하게 나마 error를 가지고 구현할 수는 있습니다.^^


이렇게 말이지요. 카트의 위치를 error로 바꾸는 것입니다. error = x - x_r 인 거죠. 여기서 x_r이 원하는 카트의 위치, 위에서는 2입니다. 그런데, 연결선을 잘 정리해야겠네요. 공간배치를 고민하지 않았더니.. 선연결이 엉망이네요..ㅜ.ㅜ


일단 sum을 나온 선, 즉 error는 제어게인쪽으로 들어가면 됩니다. 그러니까, error를 '0'으로 하겠다는 거죠. 그리고


sum을 통과하기 전 실제 카트의 위치는 원래 연결되던대로 해 주시면 됩니다.

그리고, 시뮬레이션을 한 번 해보세요^^




   Signal Builder를 이용하여 카트의 위치 조절 하기 !  
 

그냥 2로 가라.. 이러면 좀 심심하죠... 이번엔 signal builder를 한번 사용해 보겠습니다.


이렇게 연결해주고, 그리고 더블클릭으로 들어가서


위에서 처럼 만들어 주면 됩니다. 만드는 방법은 정말 편합니다. 마우스로 살짝살짝 움직여 보세요. 아 shift - click 하면, 절점이 만들어 집니다.


시뮬레이션 결과입니다. 왼쪽 그림을 보시면 카트가 +2에서 잠시 있다가 -2로 갔다가 0으로 오는 것을 보실 수 있습니다. 제어기를 좀 더 잘 꾸미시면, 더 좋은 성능을 찾을 수 있으실 겁니다. 위 구동 결과는


 
입니다.


마지막으로, 요 몇몇 연재는 하나의 주제로 이어져 있었는데요. MATLAB의 사용자체에 초점이 있어서 실제 시뮬레이션을 많이 하는 경우와는 좀 다른 경우도 있고, 효율성이 떨어지는 경우도 있습니다. 그저 MATLAB의 사용을 설명하는 연재이니 그러려니 생각해 주시기 바랍니다.



참고자료


시뮬링크 화일

시뮬링크내에서 사용한 함수

전체 자료



http://pinkwink.kr/trackback/286 관련글 쓰기
  • merge 2012/05/18 22:03

    안녕하세요 궁금한게 생겨서 질문드립니다
    R은 행렬일 필요가 없나요? Q만 가중치행렬인건지요,?

    • PinkWink 2012/05/21 09:24

      R도 행렬입니다. 어쩌다가 1*1크기의 행렬이 R로 잡힐 수도 있지만요.

  • Aeternus 2012/08/31 22:56

    안녕하세요. PinkWink님 덕분에 제어 공부 열심히 하고 있는 학생입니다.
    여쭈어 볼게 생겼는데요..
    위에서 x에 오차항을 둬서 x와 오차항 사이의 차가 0으로 되게 하는 것은 이해했습니다.

    그래서 마찬가지로 theta에 pi만큼의 차를 두어 LQR gain으로 넘기면 1차원 밸런싱의 한 형태로써 동작하지 않을까 기대했는데, theta가 pi로 수렴하지 않고 그대로 0에 수렴하더라고요..
    동역학 모델은 같은 것 같은데.. 무엇이 문제인가요?

    • PinkWink 2012/09/04 15:01

      theta - pi
      의 변수를 하나 두고, 그 변수를 '0'로 가게끔 설계를 하셔야할듯합니다. 이와같은 부분은 대체로 설계하신 분들의 코드나 개념의 문제라 제가 딱히 뭐라고 찍기에 좀 힘들답니다.^^

  • Aeternus 2012/09/10 17:17

    아 뭐가 잘못된건지 알았습니다. 이제야 답변을 확인하고 올리네요..ㅎㅎ
    처음에 cos theta 를 1로 근사하고, sin theta를 theta 로 근사한 것 자체가 theta가 0의 근처일 때를 기준으로 한 것이므로, cos theta를 -1로 근사하고, sin theta를 pi-theta 로 theta를 pi 근처에서 근사하니, 제대로 동작하네요..ㅎㅎ

    • PinkWink 2012/09/12 09:02

      음.. 애초 질문이 그 뜻이었군요. 전 tracking에 관한 질문인줄 알았는데...^^

  • guitar 2013/05/18 15:08

    시뮬링크를 해서 애니메이션을 나타냈습니다. 근데 잔상이 남더라구요..
    혹시 해결 할 수 있는 방법이 있을까요?? ㅠㅠ

    • PinkWink 2013/05/20 10:15

      그래요? 전 drawnow; 명령을 사용하니까 이전 그림이 사라지던데요. 흠...

  • 문재영 2013/08/19 11:48

    안녕하세요 error를 추가하는 부분에서 질문이 있습니다.
    PInkWink님께서는 signal builder로 에러를 추가하셨는데요,
    키보드 입력이나 키보드 방향키로 error를 실시간으로 추가할수도 있을까요?
    여기저기 찾아보면서 input block을 이용하거나, m-file을 이용하려 했는데 잘 안되네요.
    혹시 간단한 simulink block이 있거나 matlab function이 있다면 도움을 받을 수 있으련지요.
    항상 PinkWink님의 게시글에서 많은 도움을 받고 있습니다.
    감사합니다.

    • PinkWink 2013/08/20 14:54

      네 안녕하세요
      저도 사용해보지 않았습니다.
      그러나 MATLAB/Simulink의 데모들을 돌려보다보면,
      키보드나 마우스 입력을 받는 블럭을 본적은 많습니다.
      아마 matlabcentral에서 검색해보시면 정보가 있을듯합니다.