Main Content

モバイル デバイスからの加速度データの取得による歩数のカウント

この例では、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;