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

그리고 이미 이 연재를 시작하기 전에 에니메인션에 대한 이야기를 했습니다.

[공학기초/MATLAB] - MATLAB에서 간단히 움직이는 그림 구현하기 (애니메이션 구현)

[공학기초/MATLAB] - Simulink에서 간단한 애니메이션 구현하기

위 글이 그 내용들입니다. 그래서 이번글에는 단지 지난번에 했던 카트형진자시스템을 애니메이션으로 구현하는 부분을 해볼려고 합니다. 이전에 이야기했던 애니메이션 방법은 구현이 상당히 편한 fill 명령과 set 명령을 이용한 속성바꾸기였는데요. 이 방법으로 구현할려면 첫 그림을 그려줘야합니다.

위의 그림은 진자만 그린겁니다만, 일단 카트와 카트가 다니는 길, 그리고 진자의 첫그림이 필요하죠

이렇게 만들어 줍니다. 이제, set명령을 이용해서 그림을 변경해줘야할 텐데요. 그전에 이전에 했던 시뮬레이션을 생각해보죠. 그 때, 분명 scope로 카트의 위치(x)와 진자의 각도(theta)를 받았습니다. 그럼 에니메이션을 구현할때도 그 두 성분을 가지고 그려야한다는 것인데요. 카트의 위치변경이야 직선운동이니 별 문제 없어 보이지만, 진자의 경우는 회전운동이라서 고등학교때 배운 삼각함수를 잠시 동원해야겠네요.

진자의 회전에 따른 각 좌표의 변화를 설명한 그림입니다. 이 좌표설정이 올바르게 작동하는 것인지 확인하기 위해 m-file 상에서 임의로 움직여 봐야겠네요.

l = 5;
r = 0.1;
 
x_plane = [-10 -10 10 10];
y_plane = [-0.6 -0.5 -0.5 -0.6];
x_cart = [-1 -1 1 1];
y_cart = [-0.5 0.5 0.5 -0.5];
x_pole = [-r -r r r];
y_pole = [-l 0 0 -l];
 
plane = fill(x_plane, y_plane, 'k');
grid on
hold on
cart = fill(x_cart, y_cart, 'g','EraseMode','normal');
pole = fill(x_pole, y_pole, 'b','EraseMode','normal');
hold off
axis([-10 10 -8 4]);
 
t = 0:0.01:20*pi/180;
 
for t = 0:0.01:20*pi/180
    updatedX_cart = x_cart + t;
    temp_x = [l*cos(3/2*pi+t-atan(r/l)) r*cos(pi+t) r*cos(t) l*cos(3/2*pi+t+atan(r/l))];
    temp_y = [l*sin(3/2*pi+t-atan(r/l)) r*sin(pi+t) r*sin(t) l*sin(3/2*pi+t+atan(r/l))];
    updatedX_pole = t + temp_x;
    updatedY_pole = temp_y;
    set(cart, 'Xdata', updatedX_cart);
    set(pole, 'Xdata', updatedX_pole,'Ydata', updatedY_pole);
    drawnow;
    
    for i=1:5000000
        temp = i;
    end
end

코드는 위와 같습니다. 단지 그냥 테스트용으로 동역학과는 별 상관없습니다. 위 코드를 실행하면 

이렇게 실행됩니다.

신고