본문으로 바로가기
본 강좌에 사용되는 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의 사용을 설명하는 연재이니 그러려니 생각해 주시기 바랍니다.

test.mdl

test1.m

MATLAB 09. Animation을 이용한 시뮬레이션.pdf


댓글을 달아 주세요

  1. merge 2012.05.18 22:03 신고

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

  2. Aeternus 2012.08.31 22:56 신고

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

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

    • BlogIcon PinkWink 2012.09.04 15:01 신고

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

  3. Aeternus 2012.09.10 17:17 신고

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

  4. guitar 2013.05.18 15:08 신고

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

  5. 문재영 2013.08.19 11:48 신고

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

    • BlogIcon PinkWink 2013.08.20 14:54 신고

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