강좌 순서
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화일을 저장할때, 저렇게 변수명을 각각 적어줄 수 있지만, 콜론연산자에 대해 이야기도할 겸해서요^^.
위 코드를 한번 보죠. 5행까지는 방금설명을 했구요. 7행은 변수로 샘플링타임(ts)을 10ms로 저장하고, 이제 시간축을 만들어내는 것이 9행입니다. 9행의 의미는 0초부터 0.01초의 간격으로 실험이 끝난 시각까지 시간을 만들어 내는 것입니다. length라는 명령어는 해당 벡터의 크기를 잡아줍니다. 그리고, -1 을 한 것은 0부터 시작해서 그렇구요. /100이야 당연히 ms단위로 만들어 주기 위해서지요^^. 위 코드를 다 실행하면
work space에 위와 같이 나타나야 합니다.
| 다중 그래프 표현 ! |
저렇게만 입력하면
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) ... 이렇게 좌표를 생성한 것입니다.
'공학기초 > MATLAB' 카테고리의 다른 글
| [MATLAB 연재] 6. Simulink의 기초 2 (8) | 2010/03/17 |
|---|---|
| [MATLAB 연재] 5. Simulink의 기초 (18) | 2010/03/16 |
| [MATLAB 연재] 4. 조건문과 반복문, 에러대비 (10) | 2010/03/10 |
| [MATLAB 연재] 3. 기초연산법 및 데이터의 그래픽 출력 2 (8) | 2010/03/09 |
| [MATLAB 연재] 2. 기초연산법 및 데이터의 그래픽 출력 1 (24) | 2010/03/03 |
| [MATLAB 연재] 1. MATLAB의 각 Window 사용법 (18) | 2010/03/03 |
| MATLAB Figure에서 그리스 문자나 수학기호 삽입하기 (8) | 2009/12/07 |
| Simulink에서 Mask 하기 (2) | 2009/10/25 |




matlab.mat
MATLAB 02. 기초 연산 법 및 그래픽 출력 02.pdf
댓글을 달아 주세요
잘 읽고 있습니다. 많은 도움된것에 대해 감사드립니다. ^_^*
잘 읽고 계시다니.. 저 또한 기분이 좋습니다.^^.
질문!
제가 평면방정식을 meshgrid로 표현을 해봤는데요
해결은했는데 궁금한것이 있어요
Z = X*3-Y*5+1; 은 되는데
계수를 변수앞에서 곱해주면 에러가 뜨네요
왜 그런거지요?
음 저는 테스트를 해보니
Z = 3*X-5*Y+1;
를 해도 잘 나오는데요...ㅜ.ㅜ
혹시 테스트하신 전체코드를 복사(타이핑말고)해서 올려주시면 다시 확인해보겠습니다^^
아 죄송합니다
제가 질문을 잘못했네요
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 라는거 아시는지요?
너무 감사합니다 이렇게 질문드릴 분이 생겨서^^
"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는 잘 모르겠는데요^^
안녕하세요!ㅎ 감사한 글로 잘 공부하고 있습니다 ㅎ
length(EncAng)-1)/100
몇가지 궁금한게 좀있는데요!ㅎ
t=0:ts
에서 length의 역할을 잘모르겠습니다.
해당벡터의 크기를 잡아준다고 하셨는데 EncAng는 위에서 정의하길 mat파일의 3열을 선택한 것인데요
그 3열을 벡터로 표현한다는게 잘 이해가 안됩니다.ㅎ;;
그리고 0부터 시작하려고 -1을 하셨다고 하셨는데 그건또 무슨 의미인지 잘 모르겠어요;;
그럼 원래 data의 내용은 처음시작이 1인 것인지요..?
허접한 질문 죄송합니다.ㅠ
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을 하셔도 됩니다.