如何使用Android加速度计检测行走

hav*_*oda 18 android accelerometer filter kalman-filter

我正在编写一个应用程序,我的目标是检测用户何时行走.我正在使用这样的卡尔曼滤波器:

float kFilteringFactor=0.6f;

        gravity[0] = (accelerometer_values[0] * kFilteringFactor) + (gravity[0] * (1.0f - kFilteringFactor));
        gravity[1] = (accelerometer_values[1] * kFilteringFactor) + (gravity[1] * (1.0f - kFilteringFactor));
        gravity[2] = (accelerometer_values[2] * kFilteringFactor) + (gravity[2] * (1.0f - kFilteringFactor));

        linear_acceleration[0] = (accelerometer_values[0] - gravity[0]);
        linear_acceleration[1] = (accelerometer_values[1] - gravity[1]);
        linear_acceleration[2] = (accelerometer_values[2] - gravity[2]);

        float magnitude = 0.0f;
        magnitude = (float)Math.sqrt(linear_acceleration[0]*linear_acceleration[0]+linear_acceleration[1]*linear_acceleration[1]+linear_acceleration[2]*linear_acceleration[2]);
        magnitude = Math.abs(magnitude);
if(magnitude>0.2)
  //walking
Run Code Online (Sandbox Code Playgroud)

数组gravity []初始化为0.

我可以检测用户何时行走(看加速度矢量幅度的值),但我的问题是,当用户不走路并且他移动电话时,他似乎正在走路.

我使用正确的过滤器吗?

是仅仅观察矢量的大小还是我要看单个值?

Dic*_*cas 22

Google为此提供了一个API DetectedActivity,可以使用ActivityRecognitionApi.这些文档可以在这里这里访问.

DetectedActivity具有public int getType()获取用户的当前活动的方法,并且还public int getConfidence()返回从0到100的值.返回的值越高getConfidence(),用户执行返回的活动的API就越确定.

以下是返回内容的常量摘要getType():

  • int IN_VEHICLE设备位于车辆中,例如汽车.
  • int ON_BICYCLE设备在自行车上.
  • int ON_FOOT设备位于正在行走或正在运行的用户上.
  • int RUNNING设备位于正在运行的用户上.
  • int STILL设备仍然(不移动).
  • int TILTING设备相对于重力的角度发生了显着变化.
  • int UNKNOWN无法检测当前活动.
  • int WALKING设备在正在行走的用户上.


dou*_*536 5

我的第一个直觉是对传感器历史进行FFT分析,并查看行走时哪些频率具有高幅度.

它基本上看到了"听起来像"的行走,将加速计传感器输入视为麦克风,并查看行走时响亮的频率(换句话说,发生最大加速度的频率).

我猜你会在一些低频率(如脚步率)或其他东西上寻找高幅度.看到数据会很有趣.

我的猜测是你运行FFT并查找某个频率的幅度大于某个阈值,或者两个频率的幅度之差大于某个数量.同样,实际数据将决定您如何检测它.


mde*_*lmo 0

编辑:我认为它不够准确,因为正常行走时平均加速度将接近 0。您最多可以测量加速度是检测某人何时开始行走或停止(但正如您所说,很难从设备被站在一处的人移动)

所以...我之前写的内容可能无论如何都行不通:

您可以通过在用户不移动时丢弃(显而易见)来“预测”用户是否正在移动,我想到的前两个选项是:
使用接近度和光传感器(可选)检查手机是否“隐藏”。这种方法不太准确,但更容易。
控制运动的连续性,如果手机运动超过……10秒,并且运动不卑鄙,那么你就认为他在走路。我知道也不是完美的,但是如果不使用任何类型的定位,这是很困难的,顺便说一句......你为什么不直接使用LocationManager

  • 人类上下摆动,脚步冲击的冲击力传遍你的身体。即使手机因握在手中而受潮,如果您没有从中获得合理可识别的信号,我也会感到惊讶。 (2认同)