【发布时间】:2013-12-17 22:17:03
【问题描述】:
我正在使用algorithm 开发一些应用程序,例如 Runtastic Pedometer,但结果之间没有任何相似之处。
我的代码如下:
public void onSensorChanged(SensorEvent event)
{
Sensor sensor = event.sensor;
synchronized (this)
{
if (sensor.getType() == Sensor.TYPE_ORIENTATION) {}
else {
int j = (sensor.getType() == Sensor.TYPE_ACCELEROMETER) ? 1 : 0;
if (j == 1) {
float vSum = 0;
for (int i=0 ; i<3 ; i++) {
final float v = mYOffset + event.values[i] * mScale[j];
vSum += v;
}
int k = 0;
float v = vSum / 3;
//Log.e("data", "data"+v);
float direction = (v > mLastValues[k] ? 1 : (v < mLastValues[k] ? -1 : 0));
if (direction == - mLastDirections[k]) {
// Direction changed
int extType = (direction > 0 ? 0 : 1); // minumum or maximum?
mLastExtremes[extType][k] = mLastValues[k];
float diff = Math.abs(mLastExtremes[extType][k] - mLastExtremes[1 - extType][k]);
if (diff > mLimit) {
boolean isAlmostAsLargeAsPrevious = diff > (mLastDiff[k]*2/3);
boolean isPreviousLargeEnough = mLastDiff[k] > (diff/3);
boolean isNotContra = (mLastMatch != 1 - extType);
if (isAlmostAsLargeAsPrevious && isPreviousLargeEnough && isNotContra) {
for (StepListener stepListener : mStepListeners) {
stepListener.onStep();
}
mLastMatch = extType;
}
else {
Log.i(TAG, "no step");
mLastMatch = -1;
}
}
mLastDiff[k] = diff;
}
mLastDirections[k] = direction;
mLastValues[k] = v;
}
}
}
}
用于注册传感器:
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(
Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(mStepDetector,mSensor,SensorManager.SENSOR_DELAY_NORMAL);
在算法中,我有不同级别的敏感度作为公共无效
setSensitivity(float sensitivity) {
mLimit = sensitivity; // 1.97 2.96 4.44 6.66 10.00 15.00 22.50 33.75 50.62
}
在各种敏感度级别上,我的结果是:
sensitivity rantastic pedometer my app
10.00 3870 5500
11.00 3000 4000
11.15 3765 4576
13.00 2000 890
11.30 754 986
我没有得到任何合适的模式来满足要求。
根据我的分析,此应用程序使用Sensor.TYPE_MAGNETIC_FIELD 进行步数计算,请告诉我一些算法,以便我可以满足要求。
【问题讨论】:
-
大多数高质量的计步器使用一种算法来检测以特定模式重复的任何运动。所以当例如以大约相同的频率(通常限于典型的步行跨度)连续检测到至少 3 个步骤,所有三个步骤都被添加。计步器会继续以大致相同的频率添加任何步数。这样可以过滤掉其他设备的运动,并且可以将灵敏度保持在较高的设置而不会产生太多噪音。
-
有点跑题了,如果您只是针对 API 19(您可能不是),则有一个内置的计步器和计步器软件传感器。我之前测试过,非常准确。也许尝试深入研究源代码? developer.android.com/reference/android/hardware/…
-
可以肯定的是,您在同一设备上同时测试了这个,对吧?需要回答的主要问题是您的代码和计步器代码之间有什么区别。您知道的任何差异,还是应该完全相同?编辑:刚刚验证
onSensorChanged()与计步器项目相同。 -
@kevin 我很好奇.. 是计步器软件还是硬件.. 我有三个设备都在运行 kitKat 一个 HTC 一个、一个 nexus 5 和一个 nexus 7 .. 当我打电话时查看传感器类型 step_counter 是否可用,它仅在 nexus 5 上注册为 true。
-
@erik 是的,我想是硬件,之前没有仔细研究过。
标签: android algorithm accelerometer