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

바로 직전 강좌에서 이야기한 에니메인션을 시뮬링크에서 구현해보겠습니다. 사실 그리 깔끔한 방법은 아닙니다만,.ㅜ.ㅜ.... 뭐 간단해서요^^ 일단 카트형진자 시스템을 시뮬링크로 구현한 블럭(참조)에서 

위 그림처럼 구현될 것인데요.

먼저 위에 표시된 부분은 Annotation으로 역시 한 번 이야기했었습니다.(참고글). 지금은

표시된 부분에 첫그림이 위치하도록 되어 있는데요

위의 코드가 삽입되어있습니다.

다음, 저 부분은 cart와 pole이라는 이름을 가진 fill로 채워진 box속성을 넣어줍니다. 이유는 function문은 외부변수를 참조할 수 없기 때문입니다. 그리고

위의 function에는

test1이라고 이름을 붙인 에니메이션을 실제로 구현하는 코드가 들어갑니다. 코드 내용은

function y = test1(pos_cart, theta, cart, pole)
 
l = 5;
r = 0.1;
x_cart = [-1 -1 1 1];
 
updatedX_cart = x_cart + pos_cart;
temp_x = [l*cos(3/2*pi+theta-atan(r/l)) r*cos(pi+theta) r*cos(theta) l*cos(3/2*pi+theta+atan(r/l))];
temp_y = [l*sin(3/2*pi+theta-atan(r/l)) r*sin(pi+theta) r*sin(theta) l*sin(3/2*pi+theta+atan(r/l))];
updatedX_pole = pos_cart + temp_x;
updatedY_pole = temp_y;
set(cart, 'Xdata', updatedX_cart);
set(pole, 'Xdata', updatedX_pole,'Ydata', updatedY_pole);
drawnow;
 
y = 1;

입니다.

그리고, 시뮬레이션을 실행하면, 또 step size 어쩌는 워닝이 뜨는데요. 시뮬레이션 속도도 좀 조절할겸해서 파라미터를 약간 만져주죠. 위 그림에서 simulation메뉴의 Confi~~~어쩌는 곳에 가서

저 부분을

Fixed-step으로 간격은 0.01로 잡아줍니다. 그리고 시뮬레이션을 하면 --- 아... 아까 처음에 만든 annotation을 먼저 클릭하고, 다음 실행해야합니다. 그러면, 상황에 맞는 에니메이션을 보실 수 있습니다. 문제는 좀 느리다는 것인데요. 순전히 PC속도에 따라갑니다. 라고 말씀드리고 싶지만(ㅜ.ㅜ) 사실 에니메이션을 구현하도록 제가 소개한 방법이 시뮬링크에서 구현하기엔 너무 느리기 때문입니다...ㅜ.ㅜ 뭐 그래도 보시기에 지장은 없습니다....


댓글을 달아 주세요

  1. aslkgh 2010.12.08 02:34 신고

    matlab에 대한 자료를 찾다가 우연히 알게되어 자주 들어와서 강좌를 보면서 공부를 하고 있는 학생인데요~ 궁금한점이 있어서 글을 올립니다..
    위에서 3번째 simulink 에서 설명한 'cart와 pole이라는 이름을 가진 fill로 채워진 box속성을 넣어준다'라는 부분에서 어떻게 해야 블럭이 생성 되는지 모르겠습니다ㅠ library에 검색 해봐도 안보이고.. constant는 아닌것 같고ㅠ fill에 대한 명령어를 따로 넣어 줘야 하나요?? 답변부탁 드릴께요.. (참고로 R2008b버전입니다.)

    • BlogIcon PinkWink 2010.12.08 05:06 신고

      cart와 pole은 일종의 변수로 선언한것으로 말씀하신 부분은 simulink에서는 단순히 'Constant'블럭을 사용한 것입니다.

  2. KKABDDOL 2010.12.08 10:00 신고

    위에서 질문한 학생과 함께 공부하는 학생입니다.
    simulink 상에서 단순히 'constant' 블럭을 사용하셨다고 하셨는데, 그럼 fill로 인해 발생한 상수들을 집어 넣으셨다는 말씀이신지 궁금합니다.
    constant 블럭이기 때문에 값은 반드시 숫자로 입력이 되어야 하는 것으로 알고 있는데, 위에서는 fill로 채워진 속성을 box에 집어 넣는 것이라고 하셨습니다. 너무 헷갈립니다ㅠㅠㅠㅠ 꼭!!! 자세히 답변 부탁드릴께요ㅠㅠㅠㅠ

    • BlogIcon PinkWink 2010.12.08 11:07 신고

      본문에 말씀드린데로 초기속성 Fill 명령을 사용한 속성은 annotation에서 정의해서 처음 시작할때 사용자에게 실행을 유도(click here)하고. constant블럭에는 변수이름만 넣어두었습니다. pole 이렇게요.

  3. KKABDDOL 2010.12.09 01:33 신고

    식을 찾아보고 컴터를 보면서 공부를 해도 이해가 되지 않는 부분이 있어 귀찮으신 줄은 알지만 여쭙습니다. test1코드 부분인데 Matlab FCN에서 식을 선언하여 주고 M file을 생성한 후 실행을 시키자 식의 오류가 발견이 되더라구요,(??? Input argument "pos_cart" is undefined.

    Error in ==> test1 at 7
    updatedX_cart = x_cart + pos_cart) 이렇게 뜨는데 하나 하나 뜯어 보고 식을 다시 맞춰도 똑같이 오류가 나는데 왜 그런지 답변을 구할 수 있을까요????

    • BlogIcon PinkWink 2010.12.09 03:21 신고

      에러내용만 보자면, pos_cart가 정의되지 않았다고 하는 것이니, 함수의 입력을 받는 부분에 pos_cart가 이 글 처럼 되어있는지 확인하시라는 말씀이외에는 드릴말씀이 없습니다. 바쁘긴하지만, 저의 블로그에 적히는 댓글에 대한 답을 귀찮다고 생각한적 없습니다^^. 단.. KKABDDOL님과 비슷한 질문에 답은 사실 해드리기가 너무 어렵습니다. 왜냐하면, 저는 잘 되는것을 확인하고 블로그에 올렸지만, 간혹 처음하시는분들은 실수로 오류가 날수있는데, 단순히 그것을 에러코드만보고 답변드리는 것이 어렵다는 말씀입니다. 아무쪼록 성공하시길 빕니다.

  4. Flyer 2010.12.09 16:17 신고

    GUI에서 애니메이션을 실행시키는 예제를 하려면 MATLAB Fcn을 버튼클릭시 실행시키도록 해야할텐데 어떻게 변수를 주고 받죠 ?

  5. KKABDDOL 2010.12.09 19:26 신고

    벌써 세번째 질문을 드리네요. 첫번째 두번째 답변에 너무 많은 이득을 얻고 힌트를 얻어 어느 덧 시뮬레이션 바로 코 앞까지 왔습니다. 정말 정말 감사드린다는 인사 먼저 드립니다. 너~무 감사합니다!!!
    그런데, 어떤 책을 뒤져봐도 나오지 않고, 주변에 있는 사람들도 잘 모른다고 해서 혹시나 하는 마음에 염치 불구 하고 한 번 더 여쭤봅니다 ㅠㅠ
    모든게 완벽하다고 생각합니다. 사실 저는 pinkwink님의 시뮬레이션을 따라 가면서 많이 배웠고 또 어느 정도 matlab을 이해했다고 생각하는데 simulink를 run 하면 꼭 matlab fcn 에서 plus matrix dimensions must agree 라고 하며 error 가 뜹니다. 왜 그런지 너무너무 궁금해서 미쳐버릴 것 같습니다 ㅠㅠㅠㅠㅠ 제발 알려주세요 ㅠㅠㅠㅠㅠ

    • BlogIcon PinkWink 2010.12.09 21:24 신고

      행렬 연산에서 크기가 틀렸다는 에러는 통상
      시뮬레이션 설계시 나타나는 오류중 가장 광범위합니다.
      그리고.. 이는 제가 알려드릴 범위가 아닙니다.
      꼼꼼이 수행하신 시뮬레이션을 확인하시는 수 밖에 없답니다.

  6. Flyer 2010.12.10 00:10 신고

    저도 코앞까지 왔네요 ㅠ 몇시간째인지 ㅠ 늦은밤이지만 질문하나 해도될런지요

    저도 matlab fcn에서

    Undefined function or method 'test1' for input arguments of type 'double'.

    Error in 'test/MATLAB Fcn' while evaluating expression: Undefined function or method 'test1' for input arguments of type 'double'.

    2가지 에러가 뜨는데요 어디를 고쳐야 할런지요

  7. 훈쿤 2011.02.10 04:30 신고

    제가 조이스틱으로 인풋을 받아서 애니메이션을 하려고 하고있습니다 ㅎ
    리얼타임으로 조정하고 싶어서 공부하고있는데 시뮬링크와 애니메이션 그리고 GUI를 동시에 하려니 여간 공부를 많이 해야되는게 아니더라구요 ㅋㅋ

    질문 좀 드릴게요ㅎ
    1. 시뮬링크외에 m-file로 조이스틱인풋을 받을수 있을가요?
    2. 시뮬링크로 조이스틱인풋을 받아서 뿌린다면 Annotation 처리하지않고 한다는건 무리겠나요?
    3. 각도 theta를 조이스틱인풋으로 받으려면 초기인풋을 어떻게넣어야하나요?

    • BlogIcon PinkWink 2011.02.10 09:01 신고

      1번질문의 답 : 가능합니다. 여러가지 방법이 많이 있지만, 실제 matlabcentral에서 조이스틱으로 검색해보시면 matlab과 조이스틱을 연결한 데모 동영상이 생각보다 많습니다. 그중에 simulink도 있고 m-file도 있습니다.
      2번질문의 답 : 조이스틱인풋을 받는데 annotation처리가 꼭 필요한가요??
      3번질문의 답 : 나름대로의 초기화가 필요합니다. 그러나 대부분의 조이스틱은 가만히 두면 가운데 있지 않나요? 그러니 그 상태를 초기값으로 보고 미리 저장해두고 있어도 될듯합니다만... 조이스틱을 matlab과 연결해본적이 없어서 그냥 생각만 말씀드린것입니다.

  8. 훈쿤 2011.02.12 05:30 신고

    아프신대도 불구하고 답변을 달아주셔서 감사합니다.
    1번 3번 해결했습니다^-^

    2번의 조이스틱인풋에 annotation처리에 관한건
    제가 조이스틱인풋을 받아 선박을 이동하게 하는 시뮬레이터를 구축하려고 하기때문입니다. 그럼 필연적으로 애니메이션처리를 해야하는데 애니메이션에 관해서는 pinkwink님께서 강의하신대로하고 있거든요^-^;; 강의대로 for문 안에것은 function으로 밖에꺼는 annotation으로 했습니다.

    즉 시뮬링크로 조이스틱인풋을 받아 애니메이션을 한다..가 되겠군요. 조언좀 부탁드리겠습니다.시뮬링크를 이용해서 애니메이션을 할때 annotation을 안쓰고 하는 방법이 있으면 가르침 부탁합니다.

    글이 길어지는데..이 댓글에 여러번 질문하고 혼자서 고민하고 생각하고 풀리고.. 질문 지우고를 지금 수십번 반복하면서 스스로 공부가 되는것같습니다.^-^감사합니다.

    • BlogIcon PinkWink 2011.02.12 09:46 신고

      네.. 분명 가능합니다. 현재로는 코드설명까지 드릴 상황이(ㅜㅜ) 오래 앉아있으면 다리에 피가 쏠려서... 통증이...ㅠㅠ... 그러나 제가 annotation을 했던이유는 초기화 때문이었는데요 그걸 글로벌 변수로 flag같은 개념을 사용하면 가능하지 않을까 합니다.

  9. Cnsla 2012.11.29 13:13 신고

    안녕하세요.
    저는 Scatter3 명령어로, X,Y,Z 좌표값을 가진 점 13개를 프레임 단위로 애니메이팅하는 과업에 직면해 있는데... 쉽지 않네요...motion capture데이터다보니, 각 프레임의 좌표값은 txt로 저장되어 있고 이걸 불러들여서 프레임 단위로 업데이트해야 하는데, 어떤 구현이 가능할지 고견을 청해 봅니다...

    • BlogIcon PinkWink 2012.12.05 09:00 신고

      txt화일이라도 matlab이 읽을 수 있습니다.
      먼저 m-file로 바로 작성하는것보다는
      import/export 메뉴에서 한번 읽어보세요.
      그리고 나면 감을 잡을 수 있을겁니다.
      그리고나서 code를 짜는게 더 편하지 않으실까 합니다.

  10. guitar 2013.05.16 02:27 신고

    안녕하세요. ^^ test1으로 해서 4개를 입력해라는 건 이해가 됬는데용.. 두개 변수 cart 와 pole 이 있잖아요..
    이건 어떻게 입력해야 되는 건가요? 보통 const는 한번 정해주면 끝나는데.. 이게 문자로 되있어서 헷갈리네유 ㅠㅠ

    • BlogIcon PinkWink 2013.05.16 09:03 신고

      이 글에서 cart, pole은 글 상단쯤에 있는 annotation 내부에 들어가는 박스 속성을 가진 변수입니다. simulink 내부에서는 외부의 workspace 변수를 읽어오지 않기 때문에, 다른 방법을 써야하는데, 저는 그걸 cart, pole을 직접 인가하도록 사용했을 뿐입니다.

    • guitar 2013.05.18 15:30 신고

      오옷 !!! 감사합니다. 입력을 이렇게도 받을 수 있군요 ^^

    • BlogIcon PinkWink 2013.05.20 10:16 신고

      네... 좋은 성과 있으시길 바랍니다.^^

  11. dbrane 2013.10.26 19:08 신고

    안녕하세요.
    저도 님과 같은 분이 계셔서 MATLAB Simulink에 관해 님의 자료를 통해서 배우고 있고, 감사하게 생각합니다.
    MATLAB 2010a 버전에서는 잘 되는데요.
    2013a 버전에서만 MATLAB FCN이 없고 Interpreted MATLAB FCN이 있어서 이것만 바꾸고 했는데,
    다음과 같은 에러가 뜨네요.
    Subscript indices must either be real positive integers or logicals
    혹시 시간 되시면 해결 방법이 없을까요?
    그럼, 수고하세요.

    • BlogIcon PinkWink 2013.10.27 14:01 신고

      저런 2013 버젼을 제가 사용해보지 않아서 잘 모르겠습니다. 제가 블로그에서 다룬건 모두 제가 작성했기 때문에 테스트가 되었다고 볼 수 있는데요. 버젼 문제에 대해서는 저도 잘 모르겠습니다.

  12. 링크 2016.12.21 11:38 신고

    안녕하세요, 작성자분의 세세하고 친절한 글로 시뮬링크를 하나씩 배워나가고 있는 학생입니다.
    다름이 아니라 pos_cart는 무엇을 뜻하나요?
    다른 값들과는 달리 따로 정의를 해두지 않아서 pos_cart가 가지고 있는 값이 없어서 이 부분에서 계속 에러가 나네요 .

    • BlogIcon PinkWink 2016.12.21 12:24 신고

      pos_cart는 카트위 현 위치를 의미하며 시뮬링크 블럭에서 첫번째 인자인 u(1)이 받아 함수로 던져줍니다. u(1)은 블럭선도상 카트의 위치를 의미하구요.