我正在编写一个应用程序,我的目标是检测用户何时在行走。我使用卡尔曼滤波器,如下所示:
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
数组gravity[]被初始化为0。
我可以检测到用户是否在行走(查看加速度向量的大小),但我的问题是,当用户不行走而他移动手机时,看起来他正在行走。
我是否使用了正确的过滤器?
只观察向量的大小是正确的,还是必须查看单个值?
发布于 2015-07-16 15:25:20
谷歌为此提供了一个可以使用ActivityRecognitionApi
获得的名为DetectedActivity
的应用程序接口。这些文档可以通过here和here访问。
DetectedActivity
有一个方法public int getType()
来获取用户的当前活动,还有一个方法public int getConfidence()
,它返回一个从0到100的值。getConfidence()
返回的值越大,越能确定用户正在执行返回的activity。
下面是getType()
返回内容的恒定摘要
发布于 2013-01-03 17:35:30
我的第一个直觉是对传感器历史进行FFT分析,看看在行走时哪些频率具有高幅度。
它本质上就是看到行走的“声音”,把加速计传感器的输入当作麦克风,看到行走时响亮的频率(换句话说,在什么频率下发生的加速度最大)。
我猜你会在一些低频率下寻找一个高的震级(比如脚步率),或者其他一些东西。看到这些数据会很有趣。
我的猜测是,你运行FFT,并查找某个频率上的幅度大于某个阈值,或者两个频率的幅度之间的差异大于某个数量。同样,实际数据将决定您如何尝试检测它。
发布于 2012-10-03 05:40:33
对于行走检测,我使用来自加速度计的平滑信号的导数。当导数大于阈值时,我可以认为这是一个步骤。但我猜这不是最好的做法,而且只有当手机放在裤子口袋里时才有效。
在此应用程序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;
}
https://stackoverflow.com/questions/4993993
复制