본문으로 바로가기
본 강좌에 사용되는 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

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

이렇게 실행됩니다.


댓글을 달아 주세요

  1. BlogIcon 핑구야 날자 2010.04.13 21:03 신고

    이건 뭥미....무작위로 Click해서 본 포스팅... 그럿도 연재를 와우 놀라운 분이시군요,,

  2. 2010.05.24 10:20 신고

    정말 잘보고 많이 배우고 있어요..감사드린다는 말을 하고 싶어 이렇게 글을 남기네요..정말 감사드립니다..가끔 하다가 막히는거 자주자주 물어봐도 되죠?^^

  3. starvicino 2010.06.04 11:32 신고

    안녕하세요? 검색으로 들어와서 이것저것 배울께 많아서 자주들어오는 사람인데, 댓글쓰는건 처음이네요 ^^ 여쭤볼께 하나 있는데, 이렇게 for문을 통한 애니메이션을 구현하구 동영상파일은 어떻게 만드신건가요? 전 여태껏 현재 화면 녹화 프로그램을 이용하여 찍는데 매틀랩에서 바로 하는 방법이 있나 싶어서 여쭤봅니다 ^^ 항상 감사드리구용, 오늘도 좋은 하루 되세요!!

    • BlogIcon PinkWink 2010.06.04 11:36 신고

      네... 여기에 한번 포스팅한적이 있습니다.
      http://www.pinkwink.kr/287

    • starvicino 2010.06.04 14:13 신고

      역시 방법이 있었군요, 저 참 무식한 방법을 이용하고 있었네요 ㅜㅜ 감사합니다!! 좀 더 찾아보고 질문드릴껄 그랬네용 ㅜㅜ 주말 잘 보내세요! ^^

    • BlogIcon PinkWink 2010.06.04 14:21 신고

      예... 일반 유틸을 사용하는 것 보다는 편하긴 합니다만, plot 명령을 쓸 수 있는 곳만 사용할 수 있다는 단점을 가지고 있지요^^

  4. kay 2010.06.04 14:43 신고

    안녕하세요.^^ matlab으로 수치해석 공부를 하고 있는 학생입니다. 블로그에서 많은 정보들을 얻고 있습니다. 감사합니다. 한가지 여쭤볼 것이 있어서 댓글을 남기게 되었습니다. 예를 들어 선으로 연결되어 있는 3개의 점의 시간에 따른 변위를 알고 있는 상태에서 에니메이션을 이용하여 선들의 형태 변화를 보여주고 싶은데, 에니메이션에는 초짜이다 보니 어떤 식으로 표현해야 할지 감이 잡히지 않네요. simulink로 가능할까요? 에니메이션 쪽으로 추천해주실 책이 있는지도 여쭤보고 싶네요.

    • BlogIcon PinkWink 2010.06.04 14:40 신고

      사실 점을 애니메이션을 표현해보면 너무 작아서 좀 슬픕니다^^ 별표(*)로 설정하시고 marker 크기를 좀 크게 주시면 그나마 보기 괜찮습니다. plot으로 그리시는게 보기 좋구요. 그리고, 저는 MATLAB을 help와 doc, 그리고 인터넷의 다른 블로그를 돌아댕기며 공부하는 편이라 책은 잘 모르겠습니다..ㅠㅠ

    • kay 2010.06.04 14:46 신고

      아! plot으로도 에니메이션을 나타 낼 수 있군요! 빠른 답변 감사합니다.

    • BlogIcon PinkWink 2010.06.04 14:47 신고

      예.. http://www.pinkwink.kr/287 에 제가 설명한 적이 있습니다.^^

    • kay 2010.06.04 14:57 신고

      아핫! 그렇군요. 감사합니다.(__)

    • BlogIcon PinkWink 2010.06.04 16:28 신고

      별말씀을 좋은 공부되세요^^

  5. 2010.09.12 16:45

    비밀댓글입니다

    • BlogIcon PinkWink 2010.09.13 05:08 신고

      for문안의 코드는 코드아래의 슬라이드바를 움직이시면 모두 보입니다.그리고 해당코드를 별도로 제가 가지고 있지 않구요.. 또한, http://www.pinkwink.kr/notice/289 에서도 말했듯이 정말 죄송합니다만 저는 메일로는 답변을 드리지 않습니다.. 죄송합니다.

      그러나 해당 코드에서 더블클릭을 하면 코드전체가 선택됩니다. CTRL+C 해서 다른곳에 붙여넣기를 하시면 코드는 복사가 됩니다. 아참 제가 사용하는 크롬에서는 그런데 익스플로러에서는 잘모르겠습니다.^^

  6. lunefey 2010.10.01 18:42 신고

    오오!!! 진짜 된다. 너무 감사합니다 ㅠㅠㅠㅠㅠㅠ

  7. vino 2010.10.11 15:32 신고

    시침과 분침이 움직이듯 애니메이션을 그려야하는데...그 시침과 분침을 그리질 못하겠네요;;

    for t=0:0.1:100
    hx1=sin(t/12);hy1=cos(t/12);
    mx1=sin(t);my1=cos(t);
    plot([0 0],[hx1 hy1], 'linewidth',2);hold on
    plot([0 0],[mx1 my1]);hold on
    drawnow
    end

    이렇게해도 움직이지도 않았고요....
    제가 매트랩이 없어서 또 시험해보지도 못하네요 ㄷ...
    for t=0:pi./20:2.*pi;
    polar(t,2);hold on
    polar(t./12,1);hold on
    drawnow;
    end

    이런식으로 해도 움직일까요?;;;

    • BlogIcon PinkWink 2010.10.18 14:05 신고

      테스트해서 포스팅하고 싶었지만, 지금은 제가 원체 바빠서 그러질 못하네요.. 코드를 분석할 만한 시간적 여유가 없답니다. 언제 시간나면 한번 포스팅해 보겠습니다.

  8. lunefey 2010.10.30 14:04 신고

    이거 동영상으로 어떻게 저장하나요?

  9. 2010.11.26 01:32

    비밀댓글입니다

  10. good man 2010.12.03 21:11 신고

    우선 너무 감사드립니다. 그런데 제가 구의 r이 성장하는 거를 표현하려고 해요. for문을 써줘서 해봤는데 figure가 아주 여러장 뜨더라고요.
    제가 원하는건 한 figure안에서 지워지고 생기고를 반복하는 건데 어떻게 안될까요?ㅠㅋ

    • BlogIcon PinkWink 2010.12.03 22:51 신고

      질문하신 내용 두개...가
      모두 이 글에 있는데요...
      하나는 hold on이라는 명령이고
      또 하나는 set명령으로 좌표의 속성을 변경하는 것입니다.

  11. Bob 2011.02.21 11:02 신고

    애니메이션을 gif파일 처럼 저장할 방법이 있나요?
    matlab이 설치가 되어있지 않는데서 그 결과를 쉽게 보고싶어서 그럽니다.

    • BlogIcon PinkWink 2011.02.21 14:43 신고

      matlab에서 gif로 저장하는 옵션이 있는지는 모르겠습니다. 말씀하신 용도라면 avi도 괜찮을듯한데요. 아니면 avi에서 gif로 변환하셔도 될듯하구요. avi로 저장하는 방법은 http://pinkwink.kr/287 에 공개했습니다.

  12. guest 2012.08.14 19:56 신고

    안녕하세요, 좋은 글 포스팅 감사드립니다.

    궁금한게 하나 있는데, 위에 보이는 m-file editor가 조금 달라보이는데, 혹시 따로 사용하시는 프로그램이신가요?

    함수명 같은게 다른 색으로 보여 코딩하기 좋아보입니다.

    • BlogIcon PinkWink 2012.08.17 09:13 신고

      아 네.. 이건 그냥 블로그상에 코드를 보여주는 것 뿐입니다.
      저도 그냥 m-file editor를 사용합니다.
      전 은근 MATLAB의 에디터가 좋던데요^^

  13. 김형준 2012.12.19 14:08 신고

    포스팅 감사합니다.
    한가지 질문이 있는데요, 마지막 for 구문에 temp 변수는 무엇을 뜻하는가요?
    temp 수를 조절해 보니 속도가 달라지던데...
    temp라는 변수를 사용하는 곳도 없고, 어떻게 작용하여 속다조절이 가능한지 궁금합니다.

    • BlogIcon PinkWink 2012.12.21 16:24 신고

      temp라는 변수가 중요한게 아니고, 그 변수가 있는 for문이 중요합니다. for문이 돌면서 시간을 깍아먹거든요. 그걸로 속도를 조절했습니다.

  14. 안녕하세요 2013.03.21 00:24 신고

    메트랩 한참 배우고 있는 대학생입니다..^^
    포스팅 내용 잘 봤구요..
    질문 한가지가 있는데, 한점을 기준으로 진자운동을 만들어내는
    스크립트가 어디인가요;?

  15. 문재영 2013.08.19 11:52 신고

    안녕하세요. Simulink를 공부하고 있는 학생입니다.
    PinkWink님께서는 에니메이션을 구현하면서 시간을 for문으로 연산을 늘려서 표현하셨는데요.
    Simulink 상에서나 Matlab 상에서 실제시간으로 구현되게 할수는 없을까요?
    제가 Sampling 1초로 프로그램을 작성하였는데, 시뮬레이션에서도 1초간격으로 포인트가 찍혔으면 더 보기 좋을것 같아서요.
    항상 PinkWink님의 블로그에서 많은 도움받고 있습니다.
    감사합니다.

  16. 김창현 2015.07.28 23:32 신고

    좋은 정보 감사합니다~! 항상 도움되는 글 포스팅 해 주셔서 정말 감사드려요~~ 능력자님!

  17. 이제막시작 2017.05.28 20:16 신고

    안녕하세요. pinkwink님 블러그를 보면서 많이 배워가고 있습니다. 제가 위의 예제를 보고 애니메이션을 구현하려고 코드를 짜고 있는데 뭔가 원하는대로 잘 되지 않아 질문을 드립니다.
    %l = 5;
    %r = 0.1;
    L1= 2;
    L2= sqrt(2);
    th1= 0;
    th2=0;
    xa= 1.5+L1*cos(th1);
    xb= xa+L2*cos(th2);
    ya= 1.5+L1*sin(th1);
    yb= ya+L2*sin(th2);

    %x_plane = [-10 -10 10 10];
    %y_plane = [-0.6 -0.5 -0.5 -0.6];
    Link1_x=[1.5 xa xb];
    Link1_y=[1.5 ya yb];

    x_cart = [-2 -1 1 2 2 1 -1 -2];
    y_cart = [1 2 2 1 -1 -2 -2 -1];

    %x_pole = [-r -r r r];
    %y_pole = [-l 0 0 -l];
    plot(Link1_x, Link1_y, 'r');
    %plane = fill(x_plane, y_plane, 'k');
    grid on
    hold on

    cart = fill(x_cart, y_cart, 'g');

    %pole = fill(x_pole, y_pole, 'b');
    hold off

    axis([-5 5 -5 5]);

    th1= 0:0.01:pi/2;
    th2= 0:0.01:pi/2;

    for th1= 0:0.01:pi/2;
    xa= 1.5+L1*cos(th1);
    ya= 1.5+L1*sin(th1);


    for th2= 0:0.01:pi/2;
    xb= xa+L2*cos(th2);
    yb= ya+L2*sin(th2);
    end
    Link1_x=[1.5 xa xb];
    Link1_y=[1.5 ya yb];
    plot(Link1_x, Link1_y, 'r');
    axis([-5 5 -5 5]);
    drawnow;
    end

    이 코드 중 제가 원하는것은 'th1'각도에 해당하는 링크가 한번 움직일 때 'th2' 한번 움직이는 그런 현상을 하고 싶습니다. 지금 이 코드는 th1이 한번 동작했을 때 두번째 for문의 th2가 모두 동작해 버린 후 th1의 동작이 구현되고 있습니다. 코드를 어떻게 짜야할 지 잘 모르겠습니다.ㅠㅠ 시간이 되신다면 첨삭 부탁드리겠습니다.