Plot with MATLAB.

  • MATLAB에서 그래픽을 그리는 일반적인 절차

(1) plot할 데이터를 준비한다.

(2) 데이터를 plot할 그림 창을 선택하고 Single graphic으로 할 건지 Multi graphic으로 할건지를 선택한다.

(3) plot함수를 호출한다.

(4) Line이나 marker의 property를 선택한다.

(5)축의 한계값, Grid line등을 설정한다.

(6) xlabel, legend, text등으로 그래픽 객체에 라벨링을 한다.

(7) 그래픽 객체를 출력한다.

  • Line을 그리는 그래픽 함수들

함수 설명
plot x와 y축에 대해서 모두 선형 배율(linear scale)로 된 그래프를 그린다.
loglog x와 y축에 대해서 모두 log 배율(linear scale)로 된 그래프를 그린다.
semilogx x축에 대해서는 log 배율(linear scale)로 y축에 대해서는 선형 배율(linear scale)로 된 그래프를 그린다.
Semilogy x축에 대해서는 선형 배율(linear scale)로 y축에 대해서는 log 배율(linear scale)로 된 그래프를 그린다.
plotyy y축의 좌우에 값으로 라벨이 된 그래프를 그린다.

  • plot를 사용한 선 그리기

(1) 2차원 데이터의 선 그리기의 경우

plot(x,y,Color+LineStyle+Marker)

(2) 3차원 데이터의 선 그리기의 경우

plot(x,y,z,Color+LineStyle+Marker)

(3) 여러 쌍의 데이터를 하나의 그림 창에 한꺼번에 그리고 싶은 경우

plot(x1,y1,CSM1, x2,y2,CSM2,, xn,yn,CSMn,)

  • Line을 그리는 함수들에서 사용 가능한 선의 color

MATLAB에서의 symbol Color (RGB값) MATLAB에서의 symbol Color (RGB값)
c Cyan (011) g green (010)
m Magenta (101) b blue (001) (default 값)
y yellow (110) w white (111)
r red (100) k black (000)

  • Line을 그리는 함수들에서 사용 가능한 선의 style

MATLAB에서의 symbol Style MATLAB에서의 symbol Style
- Solid line (default 값) : Dotted line
Dashed line -. Dash-dot line
none No line

  • Line을 그리는 함수들에서 사용 가능한 선의 marker

MATLAB에서의 symbol (용어) Marker Style MATLAB에서의 symbol (용어) Marker Style
+ (Plus sign) + ^ (Upward pointing triangle)
O (Circle) O v (Downward pointing triangle)
* (Asterisk) * > (Right pointing triangle)
. (Point) · < (Left pointing triangle)
X (Cross) × pentagram (Five pointed star)
square (Square) hexagram (Six pointed star)
diamond (Diamond) none No marker (default 값)

  • 그랙픽 객체에 라벨링을 하는 그래픽 함수들

함수 명 설명
title 그래프의 제목을 더한다.
xlabel x축에 라벨을 더한다.
ylabel y축에 라벨을 더한다.
zlabel z축에 라벨을 더한다.
legend 그래프에 범례를 더한다.
text 그래픽 객체의 임의의 위치에 문자열을 더한다.
gtext 마우스를 사용하여 그래픽 객체의 임의의 위치에 문자열을 더한다
grid 그래픽 객체에 격자를 더하거나 없앤다.

  • 극 좌표계에서의 선 그리기

polar(각도,반지름, ’Color+LineStyle+Marker’)

  • 좌표계의 변환

(1) 직각 좌표계에서의 데이터를 극 좌표계의 데이터로 변환 하는 함수

[각도,반지름]=cart2pol(x좌표,y좌표)

[각도,반지름,높이]=cart2pol(x좌표,y좌표,z좌표)

(2) 극 좌표계에서의 데이터를 직각 좌표계의 데이터로 변환 하는 함수

[x좌표,y좌표]= pol2cart (각도,반지름)

[x좌표,y좌표,z좌표]=pol2cart(각도,반지름,높이)

(3) 직각 좌표계에서의 데이터를 구면 좌표계의 데이터로 변환 하는 함수

[f,q,반지름]=cart2sph(x좌표,y좌표,z좌표)

(4) 구면 좌표계에서의 데이터를 직각 좌표계의 데이터로 변환 하는 함수

[x좌표,y좌표,z좌표]=sph2cart(f,q,반지름)

  • 마우스를 사용한 좌표 값의 입력

[x좌표,y좌표,Button]=ginput(N)

  • 래픽 객체를 파일로 저장하는 방법

print -f<handle> -device -options filename

  • 그래픽 객체를 파일로 저장하기 위한 device들

Device명 저장 파일 형식
Dmeta 파일 확장자가 EMF인 Meta파일 형식으로 저장한다.
Dbitmap 파일 확장자가 BMP인 Bitmap파일 형식으로 저장한다.
Dps 파일 확장자가 PS인 흑백 프린터를 위한 PostScript 파일 형식으로 저장한다. (흑백으로 저장됨)
Dpsc 파일 확장자가 PS인 칼라 프린터를 위한 PostScript 파일 형식으로 저장한다. (칼라로 저장됨)
dps2 파일 확장자가 PS인 흑백 프린터를 위한 Level 2 PostScript 파일 형식으로 저장한다. (흑백으로 저장됨)
dpsc2 파일 확장자가 PS인 칼라 프린터를 위한 Level 2 PostScript 파일 형식으로 저장한다. (칼라로 저장됨)
deps 파일 확장자가 EPS인 흑백 프린터를 위한 Encapsulated PostScript 파일 형식으로 저장한다. (흑백으로 저장됨)
depsc 파일 확장자가 EPS인 칼라 프린터를 위한 Encapsulated PostScript 파일 형식으로 저장한다. (칼라로 저장됨)
deps2 파일 확장자가 EPS인 흑백 프린터를 위한 Encapsulated Level 2 PostScript 파일 형식으로 저장한다. (흑백으로 저장됨)
depsc2 파일 확장자가 EPS인 칼라 프린터를 위한 Encapsulated Level 2 PostScript 파일 형식으로 저장한다. (칼라로 저장됨)
dhpgl 파일 확장자가 HGL인 Hewlett-Packard 7475A 플로터를 위한 HPGL파일 형식으로 저장한다.
dill 파일 확장자가 AL인 Adobe Illustrator 88 호환 파일 형식으로 저장한다.
djpeg<nn> 파일 확장자가 JPG인 JPEG 파일 형식으로 저장한다.

<nn>은 Jpeg파일의 질을 나타내는 것으로 0에서 100사이의 값을 가진다.

dtiff 파일 확장자가 TIF인 압축된TIFF 파일 형식으로 저장한다.
dtiffnocompression 파일 확장자가 TIF인 압축되지 않은 TIFF 파일 형식으로 저장한다.
dpng 파일 확장자가 PNG인 Portable Network Graphic 24-bit truecolor image 파일 형식으로 저장한다.
dmfile 저장할 그림 창을 다시 복원할 MATLAB의 M-file과 MAT-file을 만든다.

  • 그래픽 객체를 프린터로 출력하는 방법

(1) 현재 windows시스템에 설정된 기본 프린터로 현재 활성화 되어 있는 그림 창의 그래픽을 출력하는 경우

print

(2) device를 사용하여 프린터로의 출력을 제어 하는 경우

print -f<handle> -device -options

(3) 그림 창의 File 메뉴의 print관련 메뉴를 사용한다.

  • 그래픽 객체를 프린터로 출력하기 위한 device들

Device명 설명
dwin 그래픽 객체를 현재 설정된 프린터로 흑백으로 출력
Dwinc 그래픽 객체를 현재 설정된 프린터로 칼라로 출력
dsetup 출력은 하지 않고 Print Setup dialog box를 띄운다.
v 출력을 하기 위해서 Print dialog box를 띄운다.
dljet2p HP LaserJet IIP 프린터로 출력
dljet3 HP LaserJet III 프린터로 출력
ddeskjet HP DeskJet and DeskJet Plus 프린터로 출력
dcdj550 HP Deskjet 550C (UNIX only) 프린터로 출력
dpaintjet HP PaintJet color printer 프린터로 출력
dpcx24b 24-bit color PCX file format, 3 8-bit planes
dppm Portable Pixmap (plain format)

  • 윤곽선 그래프

(1) 2차원 데이터의 윤곽선 그래프의 경우

contour(x,y,z,N)

(2) 3차원 데이터의 윤곽선 그래프의 경우

contour3(x,y,z,N)

면 그래프를 그리기 위한 그래픽 함수들

함수 설명
mesh, surf 면 그리기
meshc, surfc contour(윤곽선,등고선)그리기가 포함된 면 그리기
meshz curtain(막)그리기가 포함된 면 그리기
pcolor 평평한 면 그리기
surf1 임의의 광원을 가진 3차원shade된 면 그리기
surface 면 그리기 (Low-level function)

  • 막대 그래프를 그리는 함수들

2차원 3차원
수직 방향 bar bar3
수평 방향 barh barh3

  • 파이 챠트 그리기

(1) 2차원 파이 챠트의 경우

pie(y)

(2) 3차원 파이 챠트의 경우

pie3(y)

  • 히스토그램 그리기

(1) 직각 좌표계에서의 데이터의 경우

hist(y)

(2) 극 좌표계에서의 데이터의 경우

rose(theta)

  • stem plot

(1) 2차원 데이터의 stem plot의 경우

stem(x,y,Color+LineStyle+Marker)

(2) 3차원 데이터의 stem plot의 경우

stem3(x,y,Color+LineStyle+Marker)

  • 계단 그래프 그리기

stairs(x,y)

  • 방향 및 속도 벡터 그래프 관련 함수들

함수 설명
compass Polar plot의 원점으로부터 발산하는 벡터를 그린다.
feather 수평선을 따라 등 간격으로 분포된 점들로부터 연장하는 벡터를 그린다.
quiver (u,v)성분에 의해 정의 되는 2차원 벡터를 그린다.
quiver3 (u,v,w)성분에 의해 정의 되는 3차원 벡터를 그린다.

  • 애니메이션

(1) movie를 사용하는 방법

axis equal

M = moviein(n);

for j=1:n

plot_command

M(:,j) = getframe;

end

Movie(M)

(2) redraw 와 erase를 사용하는 방법

p=erase_mode가 사용된plot_commad

hold on

axis를 사용한 축의 고정

for j=1:n

변화되는 점의 계산

set(p,’x’,x,’y’,y…)

drawnow

end

  • 기타의 그래픽 관련 유틸리티들

(1) subplot(m,n,i) 또는 subplot(mni)

하나의 그림 창에 여러 하부 그래픽 영역을 만든다.

(2) hold on/off

이미 존재하는 그래프에 기존의 그래프를 지우지 않고 새로운 그래프를 추가한다(hold on).

(3) axis([x축의 최소값, x축의 최대값, y축의 최소값, y축의 최대값])

축의 한계값을 입력된 벡터인 [x축의 최소값, x축의 최대값, y축의 최소값, y축의 최대값]에 맞추어 바꾼다.

(4) axis on/off

Tick mark와 축의 라벨을 보이거나(axis on) 감춘다(axis off).

(5) zoom

그래프를 확대 또는 축소 시킨다.

(6) colorbar

그래픽 객체에 색의 스케일을 나타내는 bar를 추가한다.

(7) hidden on/off

은선을 보이게(hidden off) 또는 보이지 않게(hidden on) 한다

(8) view(AZ,EL)

사용자가 그래픽 객체를 바라보는 높이와 방향을 의미하는 관찰점을 변경 시킨다.

(9) colormap

그림 창에 사용된 색의 수를 나타내는 행렬 값을 제어한다.

Sep 7th, 2010 | Filed under MATLAB
Tags: ,

칼만필터에 대한 알기쉬운 설명, Kalman Filter explanation.

인터넷 여기저기에 칼만 필터에 대한 설명 자료를 찾아봤지만 딱 이거다 싶은 글은 많지 않은거 같군요. 또 어떻게 작동하는고 어떻게 내가 원하는 프로그램에 적용하는가에 대한 정보를 거의 구할 수가 없어서 마침 Robabilistic Robotics 관련 자료 정리할 겸해서 몇개의 글을 쓰기로 했습니다.

본 내용은 가장 칼만필터에 대한 설명이 잘 되어있는 아래 문서의 내용을 정리한 것임을 밝혀 둔다.

http://academic.csuohio.edu/simond/courses/eec644/kalman.pdf

칼만필터 (이후 KF)는 비행체 위치 제어, 네비게이션이나 영상 처리등 여러 분야에서 각 시스템의 작동 중에 필수적으로 요구되는 주요 변수 (비행체의 자세, 이동체의 위치 또는 Tracking 하는 객체의 위치등)를 예측하는데 사용 되는 도구 입니다. 수학적으로 칼만 필터는 선형 시스템(Linear System)의 상태를 예측해서 발생할 수 있는 오류를 최소화 하면서 예측합니다.

선형시스템 (Linear Systems)

선형 시스템(http://en.wikipedia.org/wiki/Linear_system) 이란 시스템을 모델링한 수식이 선형 연사자 (linear operator)들로 표현이 가능한 시스템을 말합니다. 실제 환경에서 이러한 선형 시스템을 찾기는 쉽지 않으며 많은 경우 비선형 시스템을 위한 EKF나 UKF등을 사용하는 경우가 많습니다만 KF는 선형 시스템의 예측을 위한 필터이니 만큼 선형 시스템을 위주로 설명하도록 하겠습니다.

KF가 추출된 신호 (signal)에서 잡음(noise)를 제거하기 위해서는 현재 모델링하려는 프로세스 (즉, 위치제어 또는 영상처리 시스템의 주요 기능)가 선형 시스템으로 기술이 가능해야 합니다. (즉, Y = aX + b와 같은 수식으로 표현이 되어야 한다는 뜻입니다) 길을 따라 주행 중인 자동차, 지구 주위를 도는 위성, 지나가는 전하 흐름에 의해서 돌아가는 모터 샤프트나 라디오 신호 전파에 사용되는 사인파 의 경우는 선형 시스템으로 근사화(approximated) 시킬 수 있습니다.

선형 시스템을 기술 할때 일반적으로 아래의 2개의 간단한 수식으로 표현 합니다.

상태 수식 (Sate Equation – 시스템의 전반적인 신호 파형을 표현 합니다. Process Model, Plant Model등으로 불립니다):

출력 수식 (Output Equation – 시스템 신호 중 측정 가능한 값들을 표현 합니다. Measurement Model, Sensor Model등으로 불립니다):

우선, A, B, C는 메트릭스(Matrix – 모피우스를 빨랑 찾아야 할거 같네요) 입니다. k는 시간의 index이며 x는 시스템의 상태를 나타내는 벡터(Vector)입니다. y_{k}는 센서등을 이용해서 측정된 값을 의미하며, w, z는 잡음 (에러) 입니다. 특히, w는 프로세스 잡음(Process Noise), z를 측정 잡음 (Measurement Noise)라고 합니다. x, y, w, z 는 대부분의 경우 벡터 입니다.
이 부분에서 잡음은 무시 하면 될 듯 합니다만 KF에서 가장 중요한 것이 잡음 입니다. 실제 KF의 기본적인 동작이 가능해지는 시점에 튜닝을 위해서는 이들 잡음를 나타내는 Covariance Matrix의 값들을 조절해서 KF의 감도나 응답 특성을 변경할 수 있게 됩니다. 실제 주요 튜닝 방법은 이후 다른 포스트에서 논의 하도록 하겠습니다.

우선, 프로세스 상태 벡터인 X의 경우 시스템의 현재 상태에 대한 모든 정보 (비행체의 위치 정보 – X, Y, Z좌표와 각도, 가속도 바이어스등)를 나타냅니다. 하지만, 중요한 것이 이들을 직접적으로 측정할 수가 없습니다. 대신, 측정 잡음 Z에 의해서 어느 정도 값이 깨어진 Y를 (즉, 센서에서 읽어들인 값들을) 측정할 수 있습니다. 이 측정된 Y를 이용해서 거꾸로 X를 계산 해 낼 수 있습니다. (단순 선형식을 이용해서 X를 계산하고 측정된 Y값을 이용해서 이를 다시 보정합니다. 이는 아래 쪽에서 좀더 자세히 설명 됩니다)

시스템의 상태인 X를 Y의 값을 이용하면 추정(estimate)해 낼 수 있다고는 합니다만 이는 측정 잡음 Z에 의해서 값이 변형이 된 상태이기 때문에 그대로 값을 사용할 수는 없습니다. 모든 센서에는 기본적으로 가지고 있는 오차가 있습니다. GPS의 경우 5-6개의 위성이 Fix된 상태라고 한다 하더라도 오차는 작게는 2-3미터 크게는 10-20미터까지 날 수 있습니다. 물론 Gyro, Magneto 센서나 가속도 센서 (Accelerometer)의 경우도 역시 마찬가지 오차를 가지고 있으며 Datasheet에 어느정도 기술 되어 있습니다. 하지만 정확한 튜닝을 위해서는 이값들을 조금씩 변행해야 합니다.

원저에서 저자는 Y를 정치가에 비유하네요. 어느정도 믿어야 하지만 (믿을 수 밖에 없지만) 모든 내용을 신뢰하지는 말아야 한다는 거죠 ^.^

그럼 직선으로 주행 중인 자동차의 예를 들어 보죠. 자동차의 현재 위치는 p, 속도는 v로 이동 하고 있습니다. 시스템의 입력 u는 현재 지시된 가속도 이고 출력치(측정치) 인 y는 현재 위치 입니다.  매 T 초 마다 가속도를 변경하면서 위치를 측정한다고 합시다.

이때 우리는 기본적인 물리 법칙에 의해서 속도 v가 다음의 식에 의해서 표현 된다고 할 수 있습니다:

이는 T초 후의 속도는 현재 속도에 지시된 (가령, 자동차의 가속 페달을 밟아서 속도를 올리거나 브레이크를 밟는등) 가속도에 시간 T를 곱한 값이 됩니다. 하지만 위의 식에 의해서 정확한 v_{k+1}의 값을 알수는 없습니다. 이유는 도로상에 갑작스럽게 바람이 분다던가 노면이 울퉁 불퉁 하다거나 다른 상상할수 있는 많은 이유에 의해서 속도에 변화가 발생하게 될 수 있다는 것이죠. 이때 속도에 관여한 잡음은 시간에 따라서 변화하는 랜덤변수 (Random variable) 입니다.

그래서, 좀더 실제에 가까운 식은 아래와 같이 기술 될 수 있습니다:

위 식에서 v~_{k}는 속도 잡음 입니다.

위치p 를 표현하는 공식도 다음과 같이 기술 될 수 있습니다:


위 식에서 p~_{k}는 위치 잡음 입니다.

그럼 이제 우리가 표현하려는 시스템의 상태(State Vector, X)를 아래와 같이 현재 위치와 속도로 구성되어 있다고 보겠습니다 :

이제 최종적인 측정 값이 현재 위치라고 했으니 전체 시스템을 위한 선형 식은 다음과 같이 표현이 가능합니다:


위에서 x_{ k+1}을 p, v로 각각 Row 별로 간단한 행렬 계산을 해 보시면 이전에 언급했던 간단한 물리 공식과 같음을 아실 수 있을 겁니다. 즉, 프로세스 상태 식은 우리가 표현 하려는 프로세스의 물리식을 행렬로 표현 한 것이라고 보시면 됩니다.
y_{k} 의 경우는 측정하려는 위치에 잡음이 고려된 공식 입니다.

z_{k}는 센서나 측정 장비의 오류등에 의한 측정 잡음(measurement noise) 입니다. 현재 고려 하고 있는 예제에 피드백 시스템을 도입하려고 한다면 위치 p와 속도 v가 어느 정도 정확하게 측정되어야 합니다.

즉,  x를 정확하게 예측 해야 한다는 것이지요. 이를 위해서 칼만 필터가 사용 됩니다.

다음 포스팅에서 KF에 대해서 논의 해 보죠.

Sep 7th, 2010 | Filed under Kalman Filter, Robotics

OpenCV on Mac, Installation.

1. OpenCV Source 다운 받기


svn 을 통해서 다운 받을 수 있겠지만, 그냥 기본적으로 opencv-2.0.0으로 아래 사이트에서 다운 받습니다.

(여기서는 /Users/bkim/opencv에 소스파일을 다운받았습니다.)
2. pkgconfig, jpeg, libpng, tiff 설치
터미널에서

$ sudo port install pkgconfig $ sudo port install install jpeg libpng tiff


설 치를 마쳤다면, path 설정을 합니다.

$ export PKG_CONFIG_PATH = /usr/local/lib/pkgconfig


path 가 잘 나가는지, 확인하고 싶다면,

$ pkg-config –cflags opencv -> I/usr/local/include/opencv


$ pkg-config –libs opencv -> L/usr/local/lib -lcxcore -lcv -lhighgui -lcvaux -lml


3. cmake 설치
아 래 사이트에서 다운을 받습니다. 현재(09년 1월), cmake-2.8.0-Darwin-universal.dmg이 최신 버전이군요. http://www.cmake.org/cmake/resources/software.html
설 치 후, 실행을 하면,


Specify the generator for this project는 Xcode, 그리고 Use default native compilers 선택합니다.
Where is the source code에서 다운 받은 opencv 경로를 작성, Where to build the binaries에 원하는 경로를 작성합니다. (여 기선, source code 경로로 ‘/Users/bkim/opencv’, binaries 경로로 ‘/Users/bkim/opencv/_make’로 설정하였습니다.) 경 로 설정 후, ‘Configure’ 버튼을 누르면, 아래와 같은 화면이 나타납니다.


붉 게 표시된 목록에서,

BUILD_NEW_PYTHON_SUPPORT = OFF ENABLE_OPENMP = ON


두 가지 옵션을 선택 후, 다시 한번 ‘Configure’버튼을 클릭합니다. 클릭 후 조금 기다리면 ‘Generate’을 누를 수있게 됩니다. ‘Generate’ 클릭 후 또한 조금 기다리면 성공을 알리는 메시지가 나타납니다.
최 종적으로 잘 마무리 되었는지는 설정한 binaries 경로에 OpenCV.xcodeproj이 존재하는지 확인합니다. (여 기서는, /Users/bkim/opencv/_make/)


4. Xcode 컴파일
생성된 OpenCV.xcodeproj 파일을 열면 XCode가 시작됩니다. 아래와 같이 설정 후, 컴파일(⌘B)을 합니다.

Active Configuration = Release Active Architecture = i386



5. OpenCV.framework 만들기
쉘스크립트를 통해서 framework를 만들 수 있습니다. opencv를 다운 받은 경로에서 (여기서는 /Users/bkim/opencv),

$ sh make_frameworks.sh


다소 시간이 흐른 뒤, opencv 경로에 ‘OpenCV.framework’가 생성되며, 그것을 ‘/Library/Framework’로 복사합니다.
framework이 잘 만들어졌는지 확인을 위해 ‘opecv/samples/MacOSX/FaceTracker.xcodeproj’를 실행 및 컴파일해봅니다.

향 후, 본인만의 OpenCV 프로그래밍시에 Xcode 실행, 아래 그림처럼 ‘Add’->’Existing Frameworks’ 선택, 그리고 ‘Opencv.Framework’이 존재하는지 확인합니다. 없다면, ‘Add Other…’를 통해 ‘/Library/Framework’안에 존재하는 ‘opencv.framework’를 추가하시면 됩니다.



6. 예제 코드 컴파일하기
OpenCV에서 제공하는 예제 코드(opencv/samples/c)들을 가지고 놀기 위해서 컴파일을 해줍니다.

$ sh build_all.sh


혹시 컴파일에 문제가 있다면, build_all.sh 파일을 아래와 같이 수정해줍니다.

# 10번째 줄 # gcc -ggdb `pkg-config –cflags opencv` -o `basename $i .c` $i `pkg-config –libs opencv`; 를 다음처럼 수정 gcc-4.0 -ggdb `pkg-config –cflags opencv` -o `basename $i .c` $i `pkg-config –libs opencv`;
# 14번째 줄 # g++ -ggdb `pkg-config –cflags opencv` -o `basename $i .cpp` $i `pkg-config –libs opencv`; 를 다음처럼 수정 g++-4.0 -ggdb `pkg-config –cflags opencv` -o `basename $i .cpp` $i `pkg-config –libs opencv`;


컴파일이 마무리 되셨으면, 예제 코드를 가지고 놉니다. :)

$ ./edge




이상~ 끝. :)

Sep 6th, 2010 | Filed under Apple, Mac OS
Tags: