このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
モバイル デバイスからの加速度データの取得による歩数のカウント
この例では、Android™ または iOS のモバイル デバイスから加速度データを収集し、それを使用して歩数をカウントします。
この例には Signal Processing Toolbox™ が必要です。
モバイル デバイスの設定
モバイル デバイスからのデータを MATLAB® で受信するには、モバイル デバイスに MATLAB Mobile™ アプリをインストールして設定する必要があります。
MATLAB Mobile の [設定] から MathWorks® Cloud にログインします。
モバイル デバイスへの接続の作成
MATLAB Mobile の [コマンド] 画面で mobiledev
コマンドを使用して、モバイル デバイスを表すオブジェクトを作成します。
m = mobiledev;
表示された出力は Connected: 1
になるはずです。これは、mobiledev
オブジェクトがアプリへの接続を正常に確立したことを示します。
データ取得の準備
デバイスの加速度センサーを有効にします。
m.AccelerationSensorEnabled = 1;
データ取得の開始
センサーを有効にすると、MATLAB Mobile の [センサー] 画面にはセンサーで測定された現在のデータが表示されます。Logging
プロパティを使用して、センサー データの mobiledev
への送信を開始できます。
m.Logging = 1;
これで、デバイスはセンサー データの送信中になります。
ログ記録中、歩き回っている間は、デバイスは手に持つか、ポケットに入れておきます。これにより、デバイスの向きにかかわらず、3 軸すべてにわたって加速度の変化が生成されます。
データ取得の停止
Logging
プロパティを再び使用して、デバイスから mobiledev
へのセンサー データの送信を停止します。
m.Logging = 0;
ログ データの取得
accellog
を使用して、デバイスから mobiledev
に送信された XYZ 加速度データとタイムスタンプを取得します。
[a,t] = accellog(m);
生センサー データのプロット
ログ記録された 3 軸すべての加速度データを一緒にプロットできます。
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)');
プロットは、加速度の大きさの平均がゼロでないことを示しています。データから平均値を減算すると、重力のような一定の影響が除去されます。
magNoG = mag - mean(mag); plot(t,magNoG); xlabel('Time (s)'); ylabel('Acceleration (m/s^2)');
これで、プロットされたデータの中心がゼロになり、加速度の大きさのピークが明確に示されます。各ピークは、歩行中の 1 歩に対応します。
歩数のカウント
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;