강좌 순서

1. MATLAB 각 Window 사용법 [바로가기]
2. M-File을 사용한 기초연산법 및 데이터의 그래픽 출력 [바로가기]
3. 데이터의 3D 출력 [바로가기]
4. 조건문 및 반복문의 사용. 에러대비 [바로가기]
5. Simulink의 기초 [바로가기]
6. Simulink의 기초 2 [바로가기]
7.  Function 문의 사용 [바로가기]
8. 동역학 시뮬레이션하기 [바로가기]
9. 애니메이션 구현하기 [바로가기]
10. 애니메이션을 이용한 동역학 시뮬레이션하기 [바로가기]
11. LQR 툴박스를 사용하여 제어기 구현하기 [바로가기]
12. GUI 시작하기 - Static, Edit Text 및 Push Button [바로가기]
13. GUI - Slider 사용하기 [바로가기]
14. GUI - List Box와 Pop-up Menu [바로가기]
15. GUI - Check Box와 Radio Button [바로가기]
16. GUI - 종합 예제 [바로가기]

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




   mat 화일 읽기 !  
 

MATLAB에서 데이터만 저장하는 화일을 mat화일이라고 합니다. 다루는 데이터의 등치가 큰 경우, 이 mat화일을 잘 활용하면 꽤 유용합니다.


Current Folder에서 운하는 mat화일을 더블클릭하거나

load('경로\화일명.mat')

으로 읽어오면 됩니다. 


이렇게 하면, work space에 

 
mat화일의 내용이 읽혀있음을 확인할 수 있습니다. 위 mat 화일은

입니다. 뭐 관심없는 분은 상관없지만, 위 mat화일은 저희가 직접 테스트한 화일로

1열 : 가속도센서에서 추출한 각도
2열 : 자이로센서에서 추출한 각속도
3열 : 엔코더에서 추출한 각도

입니다. 단지 설명을 위한 것이니 실험환경을 설명드릴 필요는 없을 것 같구요.^^. DSP에서 시리얼통신으로 데이터를 가져온 것인데, 샘플링타임은 10ms입니다.




   행렬에서 콜론( : ) 연산자 !  
 

이전 강의때 콜론연산자에 대해 이야기 했는데요. 벡터나 행렬에서는 이 콜론 연산자가 재미있는 역활을 합니다. 

 
위를 보시면, AccAng라는 변수에 아까 읽은 mat화일의 1열을 선택한 것입니다. 물론 mat화일을 저장할때, 저렇게 변수명을 각각 적어줄 수 있지만, 콜론연산자에 대해 이야기도할 겸해서요^^. 

 
이렇게 data(1:5,1)이라고 명령을 주면 1열의 1행부터 5행까지를 의미합니다. 


위 코드를 한번 보죠. 5행까지는 방금설명을 했구요. 7행은 변수로 샘플링타임(ts)을 10ms로 저장하고, 이제 시간축을 만들어내는 것이 9행입니다. 9행의 의미는 0초부터 0.01초의 간격으로 실험이 끝난 시각까지 시간을 만들어 내는 것입니다. length라는 명령어는 해당 벡터의 크기를 잡아줍니다. 그리고, -1 을 한 것은 0부터 시작해서 그렇구요. /100이야 당연히 ms단위로 만들어 주기 위해서지요^^. 위 코드를 다 실행하면


work space에 위와 같이 나타나야 합니다.
 



   다중 그래프 표현 !  
 


저렇게만 입력하면

 
위와 같은 그래프나 나타나는데요. (물론 빨간색 글씨는 없어요). subplot이라는 명령어로 한 figure에서 다중 그래프를 표현할 수 있습니다.

subplot(X, Y, N)

의 문법을 가지는데요. X는 위 그림에서 보면 행의 수 즉, 3이 되구요. Y는 열의 수로 2가니다. N은 순번이에요. 코드상에 빨간박스가 쳐져있는 번호가 위 그림의 번호를 의미합니다. 그러면 아까 읽었던 matlab.mat 화일을 가지고 다중 그래프를 한번 그려보죠.


load('matlab.mat')

AccAng = data(:,1)*180/pi;
GyroVel = data(:,2)*0.007*180/pi;
EncAng = data(:,3);

ts = 0.01;

t = 0:ts:(length(EncAng)-1)/100;

DiffEnc = [0; diff(EncAng)/ts];

figure
subplot(4,1,1);
    plot(t, AccAng)
    title('Angle using Accelerometer');
    ylabel('degree')
subplot(4,1,2);
    plot(t, GyroVel)
    title('Angular velocity using Gyro');
    ylabel('degree/sec')
subplot(4,1,3);
    plot(t, EncAng)
    title('Angle using Encoder');
    ylabel('degree')
subplot(4,1,4);
    plot(t, DiffEnc)
    title('Angle using Encoder');
    ylabel('degree/sec')
    xlabel('sec')
    
위 코드의 실행결과를 보기전에 11번행은 코드내의 변수 EncAng의 차분을 계산하는 루틴입니다. 

 
위 그림이 실행된 결과입니다. 




   3차원 그래프 !  
 

MATLAB의 다양한 그래프 출력 기능들 중 특별한 것들을 그저 간단히 한번 보겠습니다. 그 전에 테스트를 위해 데이터를 임의로 만들 필요가 있겠네요.


위 코드에 meshgrid라는 명령어는 일정간격을 가지는 격자형태의 좌표를 생성해 줍니다. 위 실행결과는 (-1, -1), (-0.5, -1), (0, -1) ... 이렇게 좌표를 생성한 것입니다.

 
위 형태처럼 Z축상의 데이터를 임의로 생성했습니다. 뭐 일종의 반구형태라고 해두죠^^. 그리고 mesh 명령어로 X,Y,Z 좌표를 다 주면

 
위 그림을 얻을 수 있습니다.

 
위에 보이듯이, surf 명령을 사용하면

 
이런 그림을 얻을 수 있구요.

 
보통 출력물을 종이로 인쇄하는 경우는 3D가 사실 좀 불편할 때도 있지요. 흔히 등위선이라고 부르는 contour가 이때는 적합합니다.

 
위 그림처럼 말이죠. contour는 등위선에 대한 주석이 필수 인데요. 그 명령이 clabel입니다.

 
위와 같이 잡아주는 거죠. 그러면,

 
이렇게 만들어 줍니다. 마지막으로


위와 같이
surfc라는 명령어는

 
저렇게 surf명령어와 같은 결과를 가지면서 X-Y 평면상에 등위선을 같이 그려줍니다.

http://pinkwink.kr/trackback/267 관련글 쓰기

댓글을 달아 주세요

  1. 박춘성 2010/03/09 11:01  댓글주소  수정/삭제  댓글쓰기

    잘 읽고 있습니다. 많은 도움된것에 대해 감사드립니다. ^_^*

  2. 3학년 2010/03/13 21:42  댓글주소  수정/삭제  댓글쓰기

    질문!

    제가 평면방정식을 meshgrid로 표현을 해봤는데요
    해결은했는데 궁금한것이 있어요

    Z = X*3-Y*5+1; 은 되는데
    계수를 변수앞에서 곱해주면 에러가 뜨네요
    왜 그런거지요?

    • PinkWink 2010/03/14 16:10  댓글주소  수정/삭제

      음 저는 테스트를 해보니

      Z = 3*X-5*Y+1;

      를 해도 잘 나오는데요...ㅜ.ㅜ

      혹시 테스트하신 전체코드를 복사(타이핑말고)해서 올려주시면 다시 확인해보겠습니다^^

  3. 3학년 2010/03/14 21:41  댓글주소  수정/삭제  댓글쓰기

    아 죄송합니다
    제가 질문을 잘못했네요
    Z = 3X -5Y + 1; 이게 안된다는 말인데 생각해보니깐 초등학생 질문이였네요-0-;;;ㅋㅋ

    죄송한데 하나더!!
    x(t) = (e^(0.1t))*sin(2t/3)을 그래프로 표현할때
    책에는 x = exp(-.1*t).*sin(2/3*t);라고 되어있네요
    (-.1*t)에서 0이 생략된 이유와 (2/3*t)에서 상수부분이 이해가 되지않네요

    너무 죄송한데 하나만 더 여쬐뵈도 될까요?
    책이 영어라서 이해가 잘안되는데 QQQQdata1.svc 라는거 아시는지요?

    너무 감사합니다 이렇게 질문드릴 분이 생겨서^^

    • PinkWink 2010/03/15 04:53  댓글주소  수정/삭제

      "0.1"을 표현할때 그냥 "0.1"이라고 해도 되고, ".1"로 표현해도 됩니다. 계산기들이 일반적으로 사용하는 입력의 표현입니다.
      (e^(0.1t))*sin(2t/3)

      (e^(0.1*t))*sin(2*t/3) 이나
      (e^(0.1*t))*sin(2/3*t) 나 역시 같은 표현입니다.

      아 그리고, QQQQdata1.svc는 잘 모르겠는데요^^

  4. SG 2010/05/21 10:58  댓글주소  수정/삭제  댓글쓰기

    안녕하세요!ㅎ 감사한 글로 잘 공부하고 있습니다 ㅎ
    몇가지 궁금한게 좀있는데요!ㅎ
    t=0:ts:(length(EncAng)-1)/100
    에서 length의 역할을 잘모르겠습니다.
    해당벡터의 크기를 잡아준다고 하셨는데 EncAng는 위에서 정의하길 mat파일의 3열을 선택한 것인데요
    그 3열을 벡터로 표현한다는게 잘 이해가 안됩니다.ㅎ;;
    그리고 0부터 시작하려고 -1을 하셨다고 하셨는데 그건또 무슨 의미인지 잘 모르겠어요;;
    그럼 원래 data의 내용은 처음시작이 1인 것인지요..?

    허접한 질문 죄송합니다.ㅠ

    • PinkWink 2010/05/21 11:15  댓글주소  수정/삭제

      t 는 시간축을 잡아 주는데요. 당연히 원 데이터와 같은 크기를 가져야합니다. EncAng가 만약 1000개의 데이터를 가지고 있다면, t는 ts(10ms)의 간격이니까. 10초까지가 아니라, 9.99초까지입니다. 왜냐면, 크기는 1부터 세는거고. 시간은 0초부터니까요. 그래서 EncAng의 크기를 length로 받아서, 시간 t는 0부터 ts의 간격으로 가는데 어디까지냐면, (length(EncAng)-1)/100까지하라고 한 것입니다. 아니면, t=(0: (length(EncAng)-1))/100을 하셔도 됩니다.