얼마전에 MATLAB m-file로 정말 허덥하게 간단한 애니메이션 구현([공학기초/MATLAB] - MATLAB에서 간단히 움직이는 그림 구현하기 (애니메이션 구현))을 이야기 했었는데요. 이걸 다시 Simulink에서 불러보는 작업을 해서, Simulink상에서도 어떤 결과를 애니메이션화해서 관찰할 수 있도록 해보겠습니다.






   Simulink에서 주의해야할 점 !  
 

figure('name','Animation Test','numbertitle','off');
x = [-3 -3.5  -4 -4 -3];
y = [1 1.5 1 -1 -1];
 
box = fill(x,y, 'r','EraseMode','normal');
grid on
hold on
axis([-5 5 -5 5]);
 
t = 0:0.01:2*pi;
plot(3*cos(t), 3*sin(t))
plot(17^0.5*cos(t), 17^0.5*sin(t))
plot((3.5^2+1.5^2)^0.5*cos(t), (3.5^2+1.5^2)^0.5*sin(t), 'c')
 
for t = 0:0.01:2*pi
    updatedX = [10^0.5*cos(-(t+pi+atan(1/3))) (3.5^2+1.5^2)^0.5*cos(-(t+pi+atan(3/7))) 17^0.5*cos(-(t+pi+atan(1/4))) 17^0.5*cos(-(t+pi-atan(1/4))) 10^0.5*cos(-(t+pi-atan(1/3)))];
    updatedY = [10^0.5*sin(-(t+pi+atan(1/3))) (3.5^2+1.5^2)^0.5*sin(-(t+pi+atan(3/7))) 17^0.5*sin(-(t+pi+atan(1/4))) 17^0.5*sin(-(t+pi-atan(1/4))) 10^0.5*sin(-(t+pi-atan(1/3)))];
    set(box, 'Xdata', updatedX,'Ydata', updatedY);
    drawnow;
    
    for i=1:5000000
        temp = i;
    end
end

간단히 함수화 해서 시뮬링크의 MATLAB-Function 블럭을 사용할려고 하면 문제가 발생합니다. 원코드를 유심히 보면, 15행부터 시작되는 for문만 함수화되어야하거든요. 그럼 그 이전코드는 그냥 실행해주면 되겠지 하시면 곤란합니다. 바로 for문내에서 set 명령으로 5행의 fill 명령으로 만들어진 box라는 개체를 계속 업데이트하거든요. 시뮬링크의 fnc 블럭은 외부변수를 지정하지 않으면 workspace에서 간단히 불러오지 못합니다.






   Simulink에서 구현가능하게 변경하기 !  
 

이제 시뮬링크에서 변경가능하게 바꾸도록 해보죠. 먼저


위 그림이 시뮬링크로 구현한 것입니다. Clock블럭은 시간을 인가하기 위한 것이고, "Click here before running this simulation"이라는 것은 [공학기초/MATLAB] - Simulink에서 Annotation 사용하기 에서 이야기한 Annotation입니다. 그것의 CallBack함수를 지정하는 부분에 위 코드의 for문 전까지의 내용을 넣어둡니다. 


위와 같습니다. 그리고 Constant 블럭에 box가 들어가 있는 것을 볼 수 있는데요. 그것은 에초 코드에서 for문 안을 함수로 만들때 그 안에서 사용하는 set명령이 box개체를 참조할 수 있도록 해주기 위해서입니다. 이제 함수를 만들어야겠네요.^^
function y = Ani(t, boxName)

    updatedX = [10^0.5*cos(-(t+pi+atan(1/3))) (3.5^2+1.5^2)^0.5*cos(-(t+pi+atan(3/7))) 17^0.5*cos(-(t+pi+atan(1/4))) 17^0.5*cos(-(t+pi-atan(1/4))) 10^0.5*cos(-(t+pi-atan(1/3)))];
    updatedY = [10^0.5*sin(-(t+pi+atan(1/3))) (3.5^2+1.5^2)^0.5*sin(-(t+pi+atan(3/7))) 17^0.5*sin(-(t+pi+atan(1/4))) 17^0.5*sin(-(t+pi-atan(1/4))) 10^0.5*sin(-(t+pi-atan(1/3)))];
    set(boxName, 'Xdata', updatedX,'Ydata', updatedY);
    drawnow;
    
    for i=1:5000000
        temp = i;
    end
    
    y = 1;

이렇게 하면 됩니다. 뭐 너무 간단했나요^?^. 사용한 mdl화일과 m화일은 첨부해둡니다^^. 아참 실행할때, 꼭 같은 폴더에 두시고, path 지정하시고, 위 Annotation을 클릭해서 실행하시고, 그러면 시작되는 첫화면이 나와요... 그리고 play버튼을 누르세요^^



http://pinkwink.kr/trackback/192 관련글 쓰기
  • 멀티라이프 2009/10/16 10:12

    아악! ㅎ
    매틀랩.. 역시 쳐다만 보고 있어도 머리가 아프군요.
    언제봐도 반가지 않은 녀석임이 분명하네요 ㅎㅎ

    • PinkWink 2009/10/16 11:01

      왜요?^^ 전 이놈이 귀여운데요..ㅋㅋㅋㅋ 제말을 잘 들을때만...ㅋㅋ

  • 바람처럼~ 2009/10/17 15:08

    ㅎㅎㅎ 역시 대단하십니다 (뭔지는 아니? ㅋ)

    • PinkWink 2009/10/18 16:18

      ㅎㅎ.. 사실 뭔지 아시고나면 안 대단한거랍니다...
      그저 블로그에 너무 업데이트를 소흘히하지 않나 하는 생각에 깨작거려본것입니다..^^

  • 엘고 2009/10/17 16:47

    대단하세요~~이런 과정을 거처서 움직이기할수있군요~~
    비가왓네요~~~추워지려나봐요~~따스하고 행복한 주말되세요^^

    • PinkWink 2009/10/18 16:19

      예... 따뜻한 겨울 당연히 저도 보내고싶지요...^^
      엘고님도;... 따뜻한 주말 보내셨죠?^^

  • 윤스미스 2010/10/26 12:28

    ㅠ 제 매틀랩은 annotation 이 없네요 ㅠ

    • PinkWink 2010/10/26 12:51

      그런 경우도 있나요?? 음.. annotation이 없는 경우가 ... ㅠㅠ

  • 임건우 2010/12/01 12:32

    matlab 프로그램을 실행하면서 오피스 제품을 사용하면 키보드 자동변환기능이 제대로 작동 안하는데 그런 현상 보셨어요? 우와~정말 레포트 작성하기 정말 힘드네요. 헉헉....

  • 2011/09/10 16:40

    비밀댓글입니다

    • PinkWink 2011/09/12 15:50

      그냥 질문을 하시면 됩니다.
      개인이 운영하는 블로그이니.. 제가 아는 것은 대답하고
      잘 모르지만, 이렇게 되면 안될까.. 하는 것은 추측이라고 말씀을 드리고,
      또 모르는 것은 모른다고 한답니다...^^

  • 조성택 2012/04/27 09:25

    핑크윙크님의 블로그를 가끔 숙제를 하면서 참고하는데요, 고맙게 잘 보고 있습니다.
    질문!
    맨 마지막 그림의 코드 'function y ~중간내용생략~ y = 1;' 를 어디에다가 써야 되는 것인가요?

    • PinkWink 2012/04/27 18:02

      annotation을 더블클릭하셔서 들어가시면 됩니다.
      annotation은 그냥 화면을 더블클릭하면 커서가 나타나는데 글자를 입력하시면 됩니다.