use*_*585 42 algorithm android accelerometer
我正在使用算法开发一些应用程序,如Runtastic计步器,但我没有得到结果之间的任何相似性.
我的代码如下:
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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
用于注册传感器:
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(
Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(mStepDetector,mSensor,SensorManager.SENSOR_DELAY_NORMAL);
Run Code Online (Sandbox Code Playgroud)
在算法中,我有不同的敏感度作为公共空白
setSensitivity(float sensitivity) {
mLimit = sensitivity; // 1.97 2.96 4.44 6.66 10.00 15.00 22.50 33.75 50.62
}
Run Code Online (Sandbox Code Playgroud)
在各种敏感度级别上,我的结果是:
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
Run Code Online (Sandbox Code Playgroud)
我没有得到任何符合要求的正确模式.根据我的分析,这个应用程序Sensor.TYPE_MAGNETIC_FIELD
用于步骤计算,请让我知道一些算法,以便我可以满足要求.
Ras*_*sob 19
您需要做的第一件事是决定算法.据我所知,大致上有三种方法可以使用文献中描述的加速度计来检测步骤:
使用毕达哥拉斯定理来计算加速度计中每个样本的加速度矢量的大小.低通滤波幅度信号以消除高频噪声,然后在滤波后的信号中寻找峰值和谷值.您可能需要添加其他要求以消除误报.这是迄今为止检测步骤的最简单方法,也是大多数(如果不是所有)普通计步器的方式,您可以从体育用品商店购买.
像(1)中那样使用Pythagoras,然后通过FFT运行信号,并将FFT的输出与已知的步行输出进行比较.这要求您可以访问相当大量的培训数据.
将加速度计数据馈送到使用一些合适的机器学习技术的算法中,例如神经网络或数字小波变换.当然,您可以在此方法中包含其他传感器.这还要求您可以访问相当大量的培训数据.
一旦你决定使用算法,你可能会想要使用像Matlab或SciPy这样的东西来测试你的计算机上的算法,使用你在Android手机上制作的录音.将加速度计数据转储到手机上的cvs文件,记录文件所代表的步数,将文件复制到计算机并对数据运行算法以查看它是否正确计数.这样您就可以检测算法的问题并进行纠正.
如果这听起来很难,那么获得良好步进检测的最佳方法可能是等到更多手机配备KitKat启用的内置步进计数器.
小智 18
https://github.com/bagilevi/android-pedometer
我希望这可能会有所帮助
我在走路仪器中使用步进检测. 我得到了很好的步检测结果. 我用achartengine绘制加速度计数据.看看这里.我所做的:
第3点计算:
看看这张图:
我发现您的实现与 grepcode 项目中的代码之间的一个主要区别是注册侦听器的方式。
你的代码:
mSensorManager.registerListener(mStepDetector,
mSensor,
SensorManager.SENSOR_DELAY_NORMAL);
Run Code Online (Sandbox Code Playgroud)
他们的代码:
mSensorManager.registerListener(mStepDetector,
mSensor,
SensorManager.SENSOR_DELAY_FASTEST);
Run Code Online (Sandbox Code Playgroud)
这是一个很大的区别。SENSOR_DELAY_NORMAL
用于方向改变,因此不是那么快(有没有注意到旋转设备和设备实际旋转之间需要一些时间?那是因为这是一些不需要超快的功能(这可能会甚至非常烦人)。您获得更新的速度并不是那么高)。
另一方面,SENSOR_DELAY_FASTEST
适用于计步器之类的东西:您希望传感器数据尽可能快且尽可能频繁,因此您的步数计算将尽可能准确。
尝试切换到SENSOR_DELAY_FASTEST
速率,然后再次测试!这应该会产生很大的影响。