如何检测行走与Android加速度计 [英] How to detect walking with Android accelerometer
问题描述
我正在写一个应用程序,我的目标是当用户走到检测。 我使用的是卡尔曼滤波器是这样的:
I'm writing an application and my aim is to detect when a user is walking. I'm using a Kalman filter like this:
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
数组重力[]与0初始化。
The array gravity[] is initialized with 0s.
我可以检测当用户行走或不(看着加速度矢量的大小的值),但我的问题是,当一个用户是不是正和他移动电话,似乎他走
I can detect when a user is walking or not (looking at the value of the magnitude of the acceleration vector), but my problem is that when a user is not walking and he moves the phones, it seems that he is walking.
我使用的是正确的过滤器?
Am I using the right filter?
时的正确观看向量的唯一的幅度还是有我看单价值观
Is it right to watch only the magnitude of the vector or have I to look at the single values ??
推荐答案
有关检测走我用应用于从加速度平滑信号的导数。当该导数大于阈值I可以建议,这是一个步骤。但我想,这不是最好的做法,而且当手机放在裤子口袋里它仅适用。
For walking detection I use the derivative applied to the smoothed signal from accelerometer. When the derivative is greater than threshold value I can suggest that it was a step. But I guess that it's not best practise, furthermore it only works when the phone is placed in a pants pocket.
下面code是在这个程序中使用 HTTPS :?//play.google.com/store/apps/details ID = com.tartakynov.robotnoise
The following code was used in this app https://play.google.com/store/apps/details?id=com.tartakynov.robotnoise
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER){
return;
}
final float z = smooth(event.values[2]); // scalar kalman filter
if (Math.abs(z - mLastZ) > LEG_THRSHOLD_AMPLITUDE)
{
mInactivityCount = 0;
int currentActivity = (z > mLastZ) ? LEG_MOVEMENT_FORWARD : LEG_MOVEMENT_BACKWARD;
if (currentActivity != mLastActivity){
mLastActivity = currentActivity;
notifyListeners(currentActivity);
}
} else {
if (mInactivityCount > LEG_THRSHOLD_INACTIVITY) {
if (mLastActivity != LEG_MOVEMENT_NONE){
mLastActivity = LEG_MOVEMENT_NONE;
notifyListeners(LEG_MOVEMENT_NONE);
}
} else {
mInactivityCount++;
}
}
mLastZ = z;
}
这篇关于如何检测行走与Android加速度计的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!