본문으로 바로가기

   궤환선형화 기법을 이용한 제어기 설계 !  
 

이 전에 구축했던 부유체 위의 크레인의 동역학[[프로젝트/ControlTheory] - 부유체 위의 크레인 동역학]에서 라그랑지 방정식 부분


에서 힘에 관해 식을 다시 변경하고


이렇게 적어볼 수 있을 겁니다. 여기서


입니다. 그 식을 다시 적으면




으로 표현할 수 있는데요. 여기서 e는 오차입니다.


그러면 이렇게 오차에 대한 선형시스템을 구축할 수 있는데요. 이제 위 시스템을 안정화 할 수 있는 a, b, c, d를 구성하면 됩니다. 


실제 크레인의 정확한 제원을 몰라서 그냥 임의로 설정했습니다.


제가 이전글[[프로젝트/ControlTheory] - 부유체 위의 크레인 동역학 - 2. 절대좌표계에서 상태를 설정]에서 말했듯이, 트롤리의 절대좌표계에서의 수평위치를 기준값으로 인가해야합니다. 그 기준값은 위에 나타나 있습니다. 10초정의 시간동안 30미터를 이동하라는 지령을 내릴려고 하는 것이지요.


그리고, 아까말한 a,b,c,d는 위와 같이 중근을 같도록 그냥 편안하게^^ 잡았습니다.

   MATLAB을 이용한 시뮬레이션 !  
 

이제 MATLAB/Simulink를 이용해서 시뮬레이션을 해 보아야겠네요.^^


위 그림과 같이 전체 블럭을 구성했습니다. 표시된 부분은 [[프로젝트/ControlTheory] - 부유체 위의 크레인 동역학]에서 이야기한 결과식이


와 같이 들어가 있습니다.


위에 표시된 부분은 제어기인데요. 방금이야기한 제어기(F_t, F_b)를


와 같이 구성했구요.




위 부분은 기준값을 설정하는 부분입니다. 그것은 [[공학기초/MATLAB] - Embedded Block을 이용해보자.]에서 이야기했던 Embedded Block으로 


와 같이 짜여져 있습니다. 위와같이 구성한 이유는 시뮬레이션 시작과 동시에 미분값이 갑자기 큰 값이 들어가기 때문에 그것을 방지하기 위해서입니다.


위에 표시된 부분은 y_t의 기준신호를


에 의해 y로 변경해주는 블럭으로


간단히 function 블럭으로 꾸며져있습니다.



 
파도에 의해 흔들리는 부유체의 각도(alpha)를 표현하기 위해 위에 표시된 대로


정현파 입력을 사용합니다. 물론 그냥 미분기를 사용해서 dot_alpha, ddot_alpha를 구현할 수도 있으나 기준값을 설정해줄때와 같은 이유로 극초반의 큰 미분값을 막기 위해 실제 손으로 미분을 계산해서 각각 넣어주었습니다.

 
그리고, 표시된 저 부분은 시뮬레이션의 편의를 위한 부분으로 a,b,c,d값 뿐만아니라 시뮬레이션 파라미터의 변경을 편하게 해주기 위해 [[공학기초/MATLAB] - Simulink에서 Annotation 사용하기]에서 이야기했던 annotation을 사용한 것입니다. 

이렇게 해서 시뮬레이션한 결과


위와 같네요. 귀찮음으로 인해 그냥 화면캡쳐한 것을 용서해주세요^^

일단 트롤리의 수평성분(y_t)은 아주 잘 따라갑니다. 그것을 유지하기 위한 (y)의 움직임도 보이네요. 각도가 큰데? 하고 생각하실지 몰라도 소숫점 16자리에서의 변동으로 거의 변화가 없다고 봐도 무방합니다. 그런데 제어입력이 좀 크네요....ㅜ.ㅜ 10에 7승 정도라면, 꽤 크다고 볼 수 있습니다. 특히 스프레더 쪽에 추가제어력을 설치할 생각인데 이러면 곤란하지 않을까하는 생각도 드네요. 그것을 보완하기 위한 제어기 설계를 다시 생각해보아야겠습니다.



댓글을 달아 주세요

  1. BlogIcon 탐진강 2010.02.24 22:15

    제가 숫자에 약해서^^;
    김연아 경기 대단하더군요

  2. BlogIcon joniss 2010.03.01 14:33

    와우 ~ 저는 언제쯤 이 과정들을 이해할 수 있을까요?
    로봇만들기 이제 시작인데도 이리저리 부딪히는데 !
    형기오빠 대단해요 !

  3. 정현기 2016.01.21 11:33

    안녕하세요!
    블로그 잘보고 있습니다. 제어 부분을 공부하고 싶어서 수행하셨던 부유체 위의 크레인 제어기 설계를
    똑같이 구현하는것을 목표로 공부를 하고 있는데 의문사항이 들어 글을 남깁니다.

    블로그에서 잘 설명해주셔서 쉽게 따라하고 있었으나 이해하기 어려운 부분을 정리했습니다.

    1. 제어기(F_t, F_b) 블록에서 펑션블록을 F_t 2개 / F_b 3개를 왜 구분하여 배치하였는지 모르겠습니다.

    2. 크레인 동역학에서 제시하고 있는 F_t, F_b에 대한 식에서는 dot_dot_y, dot_dot_theta가 포함되어있는데
    제어기 부분에 인풋값으로 저 두값이 들어가지 않아 제어기 내 펑션 블록을 어떻게 해야될지 모르겠습니다.

    제가 너무 기초적인것을 물어보는것은 아닌가 싶으나 그래도 글을 남깁니다.

    • BlogIcon PinkWink 2016.01.21 12:59 신고

      F_b, F_ t를 시뮬링크로 구현할때 여러블럭인 이유는 그냥 제가 알아보기 편하게 나눈겁니다. 수식대로 하나의 블럭을 해도 되구요... 항이 길어서 그렇게 블럭을 나눠서 집어넣은거죠... 결국 블럭을 더하니까요...
      그리고. double_dot은 ddot_y가 오타가 아닐까하는데요... ddot_y, ddot_theta 둘다 사라져야하는데 ddot_theta는 없는데 ddot_y는 남아 있으니 말이죠~~~
      그러나.. 이 부분은 살짝 너무 오래전 제가 수행했던거라.. 기억이 정확하진 않습니다. 따라갈려니 약간 시간이 없기도 하다는 비겁한 변명도 하구요~^^

    • 정현기 2016.01.22 17:01

      바쁘실텐데 답변 주셔서 감사합니다.

      확인해보니 제가 착각하여 함수를 정의하지 못한거였습니다. ddot_y도 오류가 아닌거 같습니다.

      다시한번 감사드립니다.

    • BlogIcon PinkWink 2016.01.22 22:18 신고

      어이쿠.. 저런 다행입니다. 저는 또 오래전 기억을 더듬어서 이걸 다시 정리해야하나... 하고 걱정했답니다..
      하시는 공부에 좋은 결과 있기를 바랍니다.~^^

  4. 정현기 2016.01.26 11:53

    안녕하세요 !
    저번에 이어 또다시 도움을 청하고자 찾아왔어요....
    저번에 남겨주신 답변으로 모델링 까지 완료 했습니다. 그런데
    Simulink cannot solve the algebraic loop containing 'crane_dynamic/CraneDynamics' at time 0.0 using the TrustRegion-based algorithm due to one of the following reasons: the model is ill-defined i.e., the system equations do not have a solution; or the nonlinear equation solver failed to converge due to numerical issues.
    To rule out solver convergence as the cause of this error, either
    a) switch to LineSearch-based algorithm using
    set_param('crane_dynamic','AlgebraicLoopSolver','LineSearch')
    b) reducing the ode45 solver RelTol parameter so that the solver takes smaller time steps.
    If the error persists in spite of the above changes, then the model is likely ill-defined and requires modification.

    다른 에러들은 혼자 처리하였는데 다음과 같은 에러에서 몇일간 진전이 없어 여쭤보고자 합니다.

    혹시 크레인을 모델링 할때 겪어보셨던 에러인지 궁금 합니다.

    • BlogIcon PinkWink 2016.01.26 23:01 신고

      Simulink에서 위와 같은 에러가 나면 저도 구글링을 통해 정말 많은 것을 만지고 설정도 변경하곤했습니다..
      그런데.. 제 경우는 대부분 제가 솔루션이 존재할 수 없는 파라미터값을 인가했거나... 시뮬레이션의 첫 루프가 돌수 없도록 시뮬링크를 구성한 경우더라구요... 도움이 되지 못했네요... 그래도 혼자 여기까지 오셨다니.. 대단하십니다. 꼭 좋은 성과 있으시길 바랍니다.~~