아주 기본적인것으로 1차안이다

계속 업그레이드 하면서 발전시키려고 함

IMU 센서(가속도, 자이로스코프)

Variable Euler Angle Symbol Output Interval (Degrees)
X Roll ϕ −180 ≤ ϕ < 180
Y Pitch θ −90 ≤ θ ≤ 90
Z Yaw ψ −180 ≤ ψ < 180

https://kr.mathworks.com/help/fusion/gs/spatial-representation-coordinate-systems-and-conventions.html?searchHighlight=roll%20pitch&s_tid=doc_srchtitle

 

Orientation, Position, and Coordinate Systems - MATLAB & Simulink - MathWorks 한국

아래 MATLAB 명령에 해당하는 링크를 클릭하셨습니다. 이 명령을 MATLAB 명령 창에 입력해 실행하십시오. 웹 브라우저에서는 MATLAB 명령을 지원하지 않습니다.

kr.mathworks.com

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');

+ Recent posts