공학왕이될거야

칼만필터 - (2)

전공/Arduino

'칼만필터의 이해'라는 책에서 제시하고 있는 '이동평균 필터'의 개념과 Matlab 코드를 응용하여 아두이노 방식으로 적용해보았습니다.

 

이동평균 필터는 일정한 갯수의 데이터를 모아서 평균을 낸 값을 출력하는 방식입니다.

 

const int ECHO=9;
const int TRIG=10;

#define SIZE 50

int buffer[SIZE];
int Cm1, duration1;

long duration, Cm;

float sum;
float distance;

void setup() {
  Serial.begin(9600);
  Serial.flush();
  pinMode(TRIG,OUTPUT);
  pinMode(ECHO,INPUT);
  digitalWrite(TRIG,LOW);

  Cm=duration/(29.1*2);
  sum=0;

  for(int i=0; i<=SIZE-1; i++)
  {
    digitalWrite(TRIG,HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG,LOW);
    duration=pulseIn(ECHO,HIGH);
    buffer[i]=Cm;
    if(Cm>400) Cm=400;
    else if(Cm<2) Cm=2;
    sum+=buffer[i];
  }
}

void loop() {
  digitalWrite(TRIG,HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG,LOW);
  duration1=pulseIn(ECHO,HIGH);
  Cm1=duration1/58.8;
  sum-=buffer[0];

  for(int i=0; i<SIZE-1; i++)
  {
    buffer[i]=buffer[i+1];
  }

  buffer[SIZE-1]=Cm1;
  sum+=buffer[SIZE-1];
  distance=sum/SIZE;

  if(distance>400) distance=400;
  else if(distance<2) distance=2;

  Serial.println((int)distance);
  delay(10);
}

 

위 코드의 setup 부분에서 배열을 채워놓고 loop로 들어가는 이유는 배열을 모두 0으로 채워놓고 시작하게 되면 초기에 오차가 크게 나타나는 현상을 피할 수 있기 때문입니다.

이동평균 필터는 배열에 저장되는 모든 데이터를 동일한 가중치를 놓고 평균을 구하기 때문에 최근 값이랑 이전 값이 차이가 나더라도 출력되는 값에서 이를 민첩하게 반영하지 못합니다. 따라서 이동평균필터는 데이터 간의 변화가 클 때에는 사용하기에 적합하지 않습니다.


이러한 이동평균 필터의 한계를 극복하기 위해서 '칼만필터의 이해' 라는 책에서는
저주파 통과 필터를 제시합니다.

'전공 > Arduino' 카테고리의 다른 글

칼만필터 - (3)  (0) 2017.07.04
칼만필터 - (1)  (0) 2017.07.04

칼만필터 - (1)

전공/Arduino

아두이노를 이용해서 가장 손쉽게 사용해볼 수 있는 센서는 초음파센서(HC-SR04)라고 생각합니다.

 

이 센서는 초음파를 보내고 받을 때 까지의 시간을 측정합니다.

따라서 이 센서의 기본적인 반환값은 측정물체에 의해 반사된 초음파가 다시 센서까지 도달하는데 걸리는 시간이라고 할 수 있습니다.

 

​그러므로 초음파 센서를 사용하여 물체까지 거리를 구하기 위해서는 반환값을 적절히 변형해야 합니다.

 

 

데이터 시트에서 제시한 초음파의 속도는 340m/s이므로 1cm이동하는데 대략 29.4microsec가 걸린다는 것을 알 수 있습니다.

 

그러므로 초음파센서의 기본 반환 값에  2cm이동​하는데 걸리는 시간을 나누어 주면(duration/(29.4*2)) 원하는 cm단위의 물체간의 거리를 구할 수 있다.
 

그렇다면 기본적인 반환값은 아두이노의 pulseIn이라는 함수를 사용할 수 있습니다.

 

이대로 인터넷에서 쉽게 구할 수 있는 예제를 돌려서 시리얼창으로 값을 확인해보면 갑자기 값이 변할 때 튀는 값이 발생하게 됩니다.

 

그런 값들을 없애주기 위하여 여러 필터들을 사용할 수 있습니다.

 

'전공 > Arduino' 카테고리의 다른 글

칼만필터 - (3)  (0) 2017.07.04
칼만필터 - (2)  (0) 2017.07.04

inverse kinematics 원 그리기

전공/MATLAB

%% spec

clear

clc

L1 = 1; L2 = 1; r=0.5; % 링크 1 , 2 의 길이 및 경로 원의 반지름

phi= 0:1:360; % 0~ 360 까지 1 씩 값을 올림

xx = 1 + r*cosd(phi); % (1.1)r = 0.5 인 원을 그리기 위한 x

X = [xx xx xx xx xx]; %matrix를 만듬 phi0~360까지

yy = 1 + r*sind(phi); % (1.1)r = 0.5 인 원을 그리기 위한 y

Y = [yy yy yy yy yy]; %matrix를 만듬 phi0~360까지

%% plot

for i = 1:length(X) % X 행렬까지 반복 1부터 360까지의 X좌표 Y좌표를 하나하나 inverse kinematics 를 하기위함

x = X(i);

y = Y(i);

theta2 = acosd((x^2 + y^2 - L1^2 - L2^2)/(2*L1*L2)); % 세타2 값 정의

theta1 = asind((L2*sind(theta2))/(sqrt(x^2 + y^2))) + atand(y/x); % 세타1 값 정의

x1 = L1*cosd(theta1); % link 1 의 경로 x좌표

y1 = L1*sind(theta1); % 경로 y좌표

figure(1)

plot(X,Y,'k') % 원을 그림 'k'는 검은색을 나타냄

grid on %

hold on % 고정

H=plot([0 x1],[0 y1],'r','Linewidth',5) % 링크 1을 그린다?

hold on

H1=plot([x1 x],[y1 y],'b','Linewidth',5) % 링크 2을 그린다?

axis([-2 2 -2 2])

pause(0.01) % 빨리 돌게 하고싶으면 이거 시간 작게하면됩니당

delete(H) % deleteplotiter마다 지워줌 근데 원은지우면안되니까 링크만지웁니다.

delete(H1)

end

 

'전공 > MATLAB' 카테고리의 다른 글

rectangular window & hamming window  (0) 2017.05.31
inverse kinematics robot arm  (2) 2017.05.27
2-DOF inverse kinematics를 이용한 MATLAB 도형그리기  (2) 2017.05.27

rectangular window & hamming window

전공/MATLAB

① w_rect.m 코드

Zero-paddingfft, nomalization을 마친 Wk를 일반주파수 f에 대해 plot하기 위하여 plot x축을 linspace(0,1,N)이라 하였습니다. 이때 만일 각주파수 w에 관하여 나타내려면 linspace(-pi,pi,N)으로 나타내면 됩니다.

 

Log scale로 나타낼 때에는 이미 M값으로 normalize 되어 있기 때문에 20*log10(abs(Wk))라 표기하였습니다.

M 61일 때에도 동일하게 코드를 작성하였습니다.

M이 늘어났을 때 Main lobe의 폭이 좁아지고, Main lobe에 대한 Side lobe의 상대적인 크기가 작아졌으며 높이는 높아진 것을 확인할 수 있었다.

② win.m 코드

hdn은 식 10.2.2710.2.29를 참고하여 작성하였습니다. n0부터 N-1까지의 벡터이기 때문에 .* 연산을 해주었습니다. 또한 M이 홀수여서 31번째 값을 지정해주었습니다. w_rect_n hn에서 w_rect_n hdn을 곱할 때 행렬의 차원이 맞지 않다고 계속 오류가 나서 이를 맞춰 주기 위하여 zero-padding을 해주었습니다.

Plot w_rect.m과 동일하게 작성하였습니다.


Hamming window 식은 강의자료에 주어진 식을 참고하였으며, 위와 마찬가지로 행렬의 차원을 맞춰 주기 위하여 zero-padding 해주었습니다.

Rectangular windowhamming window를 비교해 보았을 때 세 가지 그래프 모두 변화가 있었다. 두번째 그래프로 비교해 보았을 때 Rectangular windowHamming window에 비해 Main lobe의 폭이 좁은 것을 확인할 수 있었다. , Transition band가 더 sharp했다. 세번째 LPF를 비교해 보았을 땐, Hamming windowRectangular window에 비해 StopbandPassband ripple이 눈에 띄게 더 작은 것을 확인할 수 있었다.

 

'전공 > MATLAB' 카테고리의 다른 글

inverse kinematics 원 그리기  (5) 2017.07.04
inverse kinematics robot arm  (2) 2017.05.27
2-DOF inverse kinematics를 이용한 MATLAB 도형그리기  (2) 2017.05.27

inverse kinematics robot arm

전공/MATLAB

draw circle

 

https://www.youtube.com/watch?v=zkJZloPADug

 

draw rectangle

 

https://www.youtube.com/watch?v=rMG1zuz7jDA

 

draw ㄱ to the ㅁ

 

https://www.youtube.com/watch?v=i3BjXPWaYuI

2-DOF inverse kinematics를 이용한 MATLAB 도형그리기

전공/MATLAB

ROBOTICS 시간에 배운 inverse kinematics를 이용해 Trajectory Control system을 구현해보았습니다!

 

우선 2 DOF에 관한 식을 제가 풀어봤습니다.


그러면 이 식을 가지고 matlab code를 만들어볼까요??

 

 

 

 

'전공 > MATLAB' 카테고리의 다른 글

inverse kinematics 원 그리기  (5) 2017.07.04
rectangular window & hamming window  (0) 2017.05.31
inverse kinematics robot arm  (2) 2017.05.27

기본정리

전공/X-Hyper320TKU

ls - 폴더 및 파일 들여다보기

vi mon_group7 - 폴더 진입 ( : 폴더 안에 c파일 (새문서 - filename.c) & make 파일 만들기 , make - .o 파일 등등 생성 )

sudo minicom - minicom 진입 ( 비밀번호 누를 때 표시 안 됨 그냥 누르고 엔터)

ctrl A S - zmodem - 폴더 진입(스페이스바 2번) - 파일선택 (스페이스바 후 엔터)

./filename (: filename.c 아님)

rm -f filename - minicom 파일 삭제

make clean - .o 파일 등 삭제

 

 

 

소스 수정하기 (Example과 결합하기)

전공/TC237

오늘은 제공되는 DEMO팩들을 결합해보았어요.

 

오류가 너무 많이 나서 고생을 좀 했지만 해내서 다행이었어요ㅠㅠ.

 

U-Brain 만질 때 TC237과 같은 32비트 Cortex-M4를 다뤄봤던게 도움이 많이 된 것 같아요.

 

먼저 계속 팩을 씌우면서 같은 소스들이 겹쳐서 새로운 workspace를 생성해줬어요. 그리고 깨끗한 workspace에 원하는 zip파일들을 추가해줍니다.

 

 

그 다음에 합치기 원하는 소스의 헤더와 c파일을 넣어줍니다.

 

 

여러 함수들이 합쳐지기 때문에 EXTERN하는데 있어서 가장 오류가 많이 발생했어요.

 

저희 같은 경우는 PWM에서 glcd로 불러오는 Delay 함수가 정의된 곳에 없어서 같은 함수 이름으로 바꿔주었습니다.

 

 

그리고 Main 함수에 추가한 헤더들을 열어주고, 실행할 명령어를 입력해줍니다.

 

 

그리고 디버깅을 해주면 성공!!

 

 

이렇게 수정된 화면을 볼 수 있습니다.

 

 

 

 

 

 

 

 

 

 

'전공 > TC237' 카테고리의 다른 글

프로그램 다운로드 및 PC와 보드 연결  (0) 2017.05.01

프로그램 다운로드 및 PC와 보드 연결

전공/TC237

이전에 8비트짜리 아두이노를 연결하거나 32비트짜리 CortexM4를 연결할 때도 이정도로 애를 먹진 않았던 것 같은데, 유독 이 TC237은 애를 먹였어요ㅠㅠ

 

삼성, LG, ASUS, hp 노트북을 사용해서 해보았는데 전부 다 잘 되지 않더라고요.

 

어제도 4시간 가량 붙잡고 있다가 오늘 새벽에서야 우리 박지훈님이 해내셨습니다!

 

그래서 어떻게 잘 연결할 수 있었는 지 순서를 보여드리도록 할게요.

 

먼저 AURIX iLLD Demos v.1.0.0.11.0.exe와 AURIX iLLD Package v1.0.0.11.0.exe는 파일자료에서 다운받으셨을 알집의 압축을 풀면 저절로 실행이 됩니다.

 

그리고 아래 사이트에 접속해서 Download Link - Free Entry TriCore Toolchain 를 클릭해주시고 인적사항을 기록한 후에 다운로드 진행해주시면 됩니다.

http://www.infineon.com/cms/en/product/microcontroller/32-bit-tricore-tm-microcontroller/tricore-tm-development-tools-software-and-kits/free-tricore-entry-tool-chain/channel.html?channel=db3a304344134c7a014420d628fa76ec&redirId=27777

 

 

이때 MAC-Address는 Window10 기준 아래와 같은 방식으로 알아볼 수 있습니다.

 

 

다운로드를 받고 나면 인적사항에 등록한 메일로 license가 오는데 C드라이브 > HIGHTEC > licenses 폴더 안에 넣어주시면 됩니다.

 

Eclipse를 다운로드하고 실행하려면 jdk과 jre를 다운받아야하는데, 이때 jdk는 꼭 32비트로(x86) 다운받아주셔야합니다. jre는 64비트.exe로 다운받았을 때 이상 없었어요.

 

http://www.oracle.com/technetwork/java/javase/downloads/index.html

 

ude나 DAS 다운로드는 Infineon의 강의자료 순서를 그대로 따랐습니다.  

DAS는 PC와 TC237의 시리얼 통신에 필요합니다.

 

다 다운로드 받으면 프로그램에(홈화면 왼쪽 맨 아래 클릭하고 스크롤) DAS폴더가 생성되었을텐데 그 안에 DAS Device Scanner를 열어줍니다!

 

그리고 PC와 보드를 연결한 뒤 Start DAS Server > Change > Installed Servers > UDAS의 Start 를 차례로 클릭하면 아래와 같이 뜹니다!

 

 

그 다음에 장치관리자에 들어가서 포트에 연결을 시켜주어야하는데요.

 

 

범용 직렬 버스 컨트롤러의 Infineon DAS JDS COM에서 마우스 오른쪽 버튼으로 속성에 진입한 뒤 고급에서 VCP 드라이버 설치 박스를 체크해줍니다.

 

그 뒤에 USB 포트를 뺐다가 다시 연결하면!

 

 

이렇게 포트에 등록됩니다! 휴 아두이노는 그냥 연결만 하면 됐었는데 이건 이리도 힘드네요ㅠㅠ

 

Eclipse를 실행하고 난 다음에 Examples를 열고 실행시키고자하는 프로젝트를 active 시켜줍니다.

 

 

 

 

프로젝트를 build 해주고

 

 

Debug As > Debug Configurations 에 진입해서 다음과 같이 진행합니다.

 

 

그리고 지금부터 너무 중요한데요!

 

 

이 순서로 클릭해주시면 Infineon 자료의 UDE 순서 뒷 부분 페이지가 나옵니다!

 

 

자료와 같은 순서로 진행을 쭉 해주시고

 

 

요놈! 을 클릭해주시면 프로젝트가 업로드됩니다!!!

 

ㅠㅠ 여기까지 오기가 너무 오래걸렸어요 ㅠㅠ

 

그래도 여기까지 왔으니 나머지도 잘 진행되길 바라봅니다!

 

'전공 > TC237' 카테고리의 다른 글

소스 수정하기 (Example과 결합하기)  (0) 2017.05.05