본문 바로가기

Software/MATLAB

Simulink에서 간단한 애니메이션 구현하기


얼마전에 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버튼을 누르세요^^


반응형