본문 바로가기

Theory/ControlTheory

궤환선형화 기법을 사용한 Two-Rotor 안정화 제어기 설계

 아래의 Two-Rotor 시스템(Two-Rotor (VTOL) 시스템의 동역학 모델)은


제어입력 u1이 x, y라는 두 개의 상태에 동시에 인가가 되면서 x, y, theta를 모두 제어하는데 어려움이 있습니다. 단적인 예로 만약 u2가 잘 동작해서 theta를 '0'으로 안정화 시키는 순간 sin(theta)가 '0'이 되어서 x를 제어하기 어려워지게 되는 겁니다. 그래서 각 상태에 들어가는 제어입력을 분리시킬 필요가 생깁니다.


그래서 위에서처럼 두 번 더 미분하게 됩니다. 여기서 theta는 시간에 관한 함수기 때문에 theta에 관해 미분할때 조심하셔야합니다.


그러면 위와 같이 x_(4), y_(4)에 인가되는 제어입력을 분리시킬 수 있게 됩니다. 이때 궤환선형과기법을 사용해서 아래의 a, b, c, d는 시스템을 안정화하는 선형제어기의 값을 대입하면 그만입니다.



위는 그 제어 블럭이고



투로터 블럭과 제어블럭을 연결한 것입니다.


시뮬레이션 초기값은 위와 같이 인가했으며


그 결과를 보면 10초가 약간 지나서 수렴함을 알 수 있습니다. 제어입력 u1, u2를 확인해보면



y축 range가 좀 크네요... 앞부분만 잘라서 다시 보면


위와 같습니다. 생각할 수 있는 문제점으로는 극 초반부에 인가되는 u2의 400이라는 값입니다. 단위는 N(newton)이 되겠지요... 이정도 힘을 낼 수 있느냐 없느냐는... 글쎄요.. 실제로 만들어 봐야 알 수 있을까요?^^

반응형
  • 케이크 2011.07.22 22:14

    시뮬링크를 공부하고 있습니다.
    인터넷에 이만큼 잘 설명 되있는덴 없는거 같네요..ㅎㅎㅎ

    위 그림대로 시뮬링크를 짜봤는데요.. (돋보기 기능써서..ㅠ)

    컨트롤러 말고 파란색 시스템 박스에서 u2를 적분하는 과정에서 에러가 발생합니다.. 에러 메시지는 time=0에서 inf 나 nan 이라 singularity가 발상해는거 같다는데.. 어떻게 해야될까요?

    • BlogIcon PinkWink 2011.07.23 14:54 신고

      이 글에 댓글이 달릴줄은 몰랐네요^^
      좀 큰 그림으로 놓어둘걸 돋보기 기능을 사용하셨군요.^^
      일단 질문하신 내용대로 시스템블럭만 가동시켜보았는데 초기치를 '0'로 할때, 중력방향으로 하염없이 떨어지는 그래프가 나왔습니다.
      http://pinkwink.kr/56 에 보시면 제가 시스템블럭을 올려두었습니다. 한번 확인해보시길 바랍니다.

  • 케이크 2011.07.25 00:26

    친절한 답변 감사드립니다! ㅎㅎ

    첨에 만들때, 시스템블럭은 올려주신거 그대로 사용하고,
    컨트롤러블럭은 그림보고, 또 식에 나온걸 표현하는식 해서 시뮬을 돌렸는데요.

    u1이 아무래도 0의 값으로 컨트롤러블럭에 들어가서 cos이나 sin을 0으로 나누는데서 문제가 생긴거 같았습니다..

    그래서 시스템블럭 쪽에 u1에 들어가는 integrator에 init cond를 주었더니 에러가 안생기고 그래프도 그려지더라구요..
    일단 x와 y는 포스팅에 나온 그래프와 비슷하게 나오네요..ㅠ

    어떤식으로 대처를 해야할지 잘모르겠네요..

    ㅠㅠ 이제 시작한 단계라, 막 해보는거라서.. 죄송합니다 ㅠ

    • BlogIcon PinkWink 2011.07.25 08:17 신고

      그렇다면, 시스템블럭만 시뮬을 돌렸다는건 아니군요. 그냥 잘못된 제어기가 들어갔다는 것인듯합니다.^^
      지금 다룬 동역학 모델은 굉장히 심플합니다. 그래서 잘 안될떄가 있어요. 기구적으로 프로펠러보다 무게중심이 낮은 형태로 모델링 되면 그대로 선형제어기가 성립됩니다. 비슷한 논문이 있었던것 같은데 제목은 잘 기억이 안나네요.

  • 케이크 2011.07.31 17:14

    답변 너무 감사합니다!ㅎㅎ

    그런데 계수 a, b, c, d는 어떻게 구해진거죠?;

    • BlogIcon PinkWink 2011.08.01 12:10 신고

      그건 사차방정식의 근의 위치를 잡는 것이 가장 편합니다.
      일반적으로 특방의 근이 모두 좌반부에 있으면 시스템이 안정하다고 할 수 있으므로,
      각 계수들을 근이 모두 좌반부에 있도록 만들면 됩니다.
      간단히
      (x+1)(x+2)(x+3)(x+4)
      를 전개해서.. 나타난 각 계수를 사용하면 아마 확인하실 수 있을겁니다.

  • ryu 2017.04.17 15:47

    안녕하세요, simulink를 실행해보려고 하고 있습니다.
    여기서 값을 대입해주고 하면 error가 생기는데 1/s부분에 internal 부분에 init_x라는 변수가 없다고 목록에 생깁니다.

  • ryu 2017.04.17 22:23

    임의의 값을 넣어서 해보니 일단, error 없이 됩니다.
    그리고, 죄송지만 제어블럭은 어떻게 구현해야되는 것인지도 궁금합니다.

    • BlogIcon PinkWink 2017.04.18 10:05 신고

      그림이 너무 작네요...
      이때 시뮬레이션 파일을 가지고 있지 않습니다.
      제어블럭의 구현은 제어기의 방정식이 이미 나타나 있으므로 그 식대로 구현하면 됩니다.