Main Content

通过从移动设备获取加速度数据对进行计步

此示例说明如何从 Android™ 或 iOS 移动设备收集加速度数据,并使用它来对行走步数进行计数。

此示例需要 Signal Processing Toolbox™。

设置您的移动设备

为了在 MATLAB® 中接收来自移动设备的数据,您需要在您的移动设备上安装和设置 MATLAB Mobile™ App。

从 MATLAB Mobile 的“设置”登录到 MathWorks® Cloud。

创建与移动设备的连接

在 MATLAB Mobile 的命令屏幕上,使用 mobiledev 命令创建一个表示您的移动设备的对象。

m = mobiledev;

输出应显示 Connected: 1,表明 mobiledev 对象已成功建立与该 App 的连接。

准备数据采集

在设备上启用加速度传感器。

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

绘图显示加速度幅值不是零均值。从数据中减去均值将消除任何常量影响,如重力。

magNoG = mag - mean(mag);

plot(t,magNoG);
xlabel('Time (s)');
ylabel('Acceleration (m/s^2)');

绘制的数据现在以零为中心,清楚地显示加速度幅值的峰值。每个峰值对应一个行走步。

对行走步进行计数

findpeaks 是 Signal Processing Toolbox 提供的一个函数,用于求加速度幅值数据的局部最大值。只有最小高度超过一个标准差的峰值才被视为一个行走步。此阈值应通过试验来调整,以匹配人行走时移动的程度、地面的硬度等。

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;