얼마전에 MATLAB m-file로 정말 허덥하게 간단한 애니메이션 구현([공학기초/MATLAB] - MATLAB에서 간단히 움직이는 그림 구현하기 (애니메이션 구현))을 이야기 했었는데요. 이걸 다시 Simulink에서 불러보는 작업을 해서, Simulink상에서도 어떤 결과를 애니메이션화해서 관찰할 수 있도록 해보겠습니다.
| Simulink에서 주의해야할 점 ! |
일단 이전에 소개한 글([공학기초/MATLAB] - MATLAB에서 간단히 움직이는 그림 구현하기 (애니메이션 구현))에서 사용한 코드를
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버튼을 누르세요^^
반응형
'Software > MATLAB' 카테고리의 다른 글
| [MATLAB 연재] 1. MATLAB의 각 Window 사용법 (50) | 2010.03.03 |
|---|---|
| MATLAB Figure에서 그리스 문자나 수학기호 삽입하기 (8) | 2009.12.07 |
| Simulink에서 Mask 하기 (2) | 2009.10.25 |
| MATLAB에서 간단히 움직이는 그림 구현하기 (애니메이션 구현) (36) | 2009.10.10 |
| MATLAB에서 컴파일, 독립 실행 파일 만들기 (16) | 2009.07.23 |
| MATLAB/Simulink Scope 창에서 데이터 축출하기 (16) | 2009.07.11 |
| Embedded Block을 이용해보자. (2) | 2009.04.15 |
Ani.m