이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
모바일 기기에서 가속도 데이터를 캡처하여 걸음 수 세기
이 예제에서는 Android™ 또는 iOS 모바일 기기에서 가속도 데이터를 수집하고 이를 사용하여 이동한 걸음 수를 세는 방법을 보여줍니다.
이 예제를 수행하려면 Signal Processing Toolbox™가 필요합니다.
모바일 기기 설정하기
MATLAB®에서 모바일 기기로부터 데이터를 수신하려면 모바일 기기에 MATLAB Mobile™ 앱을 설치하고 설정해야 합니다.
MATLAB Mobile 설정에서 MathWorks® Cloud에 로그인합니다.
모바일 기기에 대한 연결 만들기
MATLAB Mobile의 명령 화면에서 mobiledev
명령을 사용하여 모바일 기기를 나타내는 객체를 만듭니다.
m = mobiledev;
출력에 mobiledev
객체가 앱에 대한 연결을 성공적으로 설정했음을 나타내는 Connected: 1
이 표시되어야 합니다.
데이터 수집 준비하기
기기의 가속도 센서를 활성화합니다.
m.AccelerationSensorEnabled = 1;
데이터 수집 시작하기
센서를 활성화하면 MATLAB Mobile의 센서 화면에 센서가 측정한 현재 데이터가 표시됩니다. Logging
속성을 사용하면 센서 데이터를 mobiledev
로 보내기 시작할 수 있습니다.
m.Logging = 1;
이제 기기가 센서 데이터를 전송합니다.
기록하는 동안 기기를 들고 있거나 주머니에 넣은 상태로 걷습니다. 그러면 기기 방향에 상관없이 세 좌표축 모두에서 가속도가 변합니다.
데이터 수집 중지하기
Logging
속성을 다시 사용하여 기기가 mobiledev
로 센서 데이터를 보내는 것을 중지하도록 합니다.
m.Logging = 0;
기록된 데이터 가져오기
accellog
를 사용하여 기기에서 mobiledev
로 전송된 XYZ 가속도 데이터와 타임스탬프를 가져옵니다.
[a,t] = accellog(m);
원시 센서 데이터 플로팅하기
세 좌표축 모두에서 기록된 가속도 데이터를 함께 플로팅할 수 있습니다.
plot(t,a); legend('X', 'Y', 'Z'); xlabel('Relative time (s)'); ylabel('Acceleration (m/s^2)');
원시 가속도 데이터 처리하기
각 시점의 XYZ 가속도 벡터를 스칼라 값으로 변환하기 위해 크기를 계산합니다. 그러면 기기 방향에 상관없이 걷는 동안 이동한 걸음 수와 같이 전체 가속도의 큰 변화를 감지할 수 있습니다.
x = a(:,1); y = a(:,2); z = a(:,3); mag = sqrt(sum(x.^2 + y.^2 + z.^2, 2));
크기를 플로팅하여 가속도의 일반적인 변화를 시각화합니다.
plot(t,mag); xlabel('Time (s)'); ylabel('Acceleration (m/s^2)');
이 플롯에서 가속도 크기의 평균이 0이 아님을 알 수 있습니다. 데이터에서 평균을 빼면 중력과 같은 모든 일정한 효과가 제거됩니다.
magNoG = mag - mean(mag); plot(t,magNoG); xlabel('Time (s)'); ylabel('Acceleration (m/s^2)');
이제 플로팅된 데이터가 0에 중심을 두며 가속도 크기의 피크를 확실히 보여줍니다. 각 피크는 걷는 동안 취한 걸음에 해당합니다.
이동한 걸음 수 세기
findpeaks
는 가속도 크기 데이터의 국소 최댓값을 구하는 데 사용하는 Signal Processing Toolbox의 함수입니다. 최소 높이에서 1 표준편차 위에 해당하는 피크만 걸음으로 처리됩니다. 이 임계값은 실험을 통해 걸을 때 사람의 움직임 수준, 바닥면의 딱딱한 정도 등에 맞게 조정해야 합니다.
minPeakHeight = std(magNoG);
[pks,locs] = findpeaks(magNoG,'MINPEAKHEIGHT',minPeakHeight);
이동한 걸음 수는 단순히 발견한 피크 수에 해당합니다.
numSteps = numel(pks)
피크 위치는 가속도 크기 데이터로 시각화할 수 있습니다.
hold on; plot(t(locs), pks, 'r', 'Marker', 'v', 'LineStyle', 'none'); title('Counting Steps'); xlabel('Time (s)'); ylabel('Acceleration Magnitude, No Gravity (m/s^2)'); hold off;
정리하기
가속도 센서를 끄고 mobiledev
를 지웁니다.
m.AccelerationSensorEnabled = 0;
clear m;