通过从移动设备获取加速度数据对进行计步
此示例说明如何从 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;