아주 기본적인것으로 1차안이다
계속 업그레이드 하면서 발전시키려고 함
IMU 센서(가속도, 자이로스코프)
Variable | Euler Angle | Symbol | Output Interval (Degrees) |
X | Roll | ϕ | −180 ≤ ϕ < 180 |
Y | Pitch | θ | −90 ≤ θ ≤ 90 |
Z | Yaw | ψ | −180 ≤ ψ < 180 |
* 3축 가속도 센서의 출력 값에는 회전성분이 포 함되므로 이를 고려하지 않고 하나의 대표값으로 처리
accmag = sqrt(accx.^2 + accy.^2 + accz.^2);
roll: y축에 대한 회전 (갸웃갸웃) roll = arctan(y/z)
pitch: x축에 대한 회전 (끄덕끄덕) pitch = arctan(x/z)
yaw: z축에 대한 회전 (도리도리) 중력가속도 방향과 일치하는 z축에 대한 회전은 감지할 수 없음
모든 물체는 지구 중심 방향으로 9.8m/s^2 중력가속도를 받음
스마트폰을 세워놓은 (정지)상태라면 중력가속도의 반대인 y축의 플러스 방향으로 9.8m/s^2의 가속도가 작용함
속력 = 거리/시간 -> 각속도 = 회전한 각도/시간
속력 * 시간 = 거리 -> 각속도 * 시간 = 회전한 각도
따라서 단위 시간 동안 측정되는 각속도를 이용하여 회전한 각도를 누적하여 더하게 되면 (적분) 회전한 각도를 구할 수 있게 된다. cumtrapz(time,accelerometer)
clc
clear all
%데이터 불러오기
AccData = csvread('Accelerometer.csv',1,1);
GyrData = csvread('Gyroscope.csv',1,2);
%가속도
accx = AccData(:,2);
accy = AccData(:,3);
accz = AccData(:,4);
%acc대표값
accmag = sqrt(accx.^2 + accy.^2 + accz.^2);
%velocity 속도
time = AccData(:,1)./1000;
accelx = (accx-mean(accx))*9.8;
accvel = cumtrapz(time,accelx);
%Displacement(변위) : cumtrapz(time,accvel)
%roll x축 회전
accroll = atan(accy./accz)*180/pi;
%pitch y축 회전
accpitch = -atan(accx./accz)*180/pi;
%STFT변환
spectrogram(accvel,'yaxis');
%자이로스코프
gyrx = GyrData(:,1);
gyry = GyrData(:,2);
gyrz = GyrData(:,3);
%roll x축 회전
gyrroll = atan(gyry./gyrz)*180/pi;
%pitch y축 회전
gyrpitch = -atan(gyrx./gyrz)*180/pi;
%STFT변환
spectrogram(gyrx,'yaxis');