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():
我的第一个直觉是对传感器历史进行FFT分析,并查看行走时哪些频率具有高幅度.
它基本上看到了"听起来像"的行走,将加速计传感器输入视为麦克风,并查看行走时响亮的频率(换句话说,发生最大加速度的频率).
我猜你会在一些低频率(如脚步率)或其他东西上寻找高幅度.看到数据会很有趣.
我的猜测是你运行FFT并查找某个频率的幅度大于某个阈值,或者两个频率的幅度之差大于某个数量.同样,实际数据将决定您如何检测它.
编辑:我认为它不够准确,因为正常行走时平均加速度将接近 0。您最多可以测量加速度是检测某人何时开始行走或停止(但正如您所说,很难从设备被站在一处的人移动)
所以...我之前写的内容可能无论如何都行不通:
您可以通过在用户不移动时丢弃(显而易见)来“预测”用户是否正在移动,我想到的前两个选项是:
使用接近度和光传感器(可选)检查手机是否“隐藏”。这种方法不太准确,但更容易。
控制运动的连续性,如果手机运动超过……10秒,并且运动不卑鄙,那么你就认为他在走路。我知道也不是完美的,但是如果不使用任何类型的定位,这是很困难的,顺便说一句......你为什么不直接使用LocationManager?
| 归档时间: |
|
| 查看次数: |
24426 次 |
| 最近记录: |