use*_*872 9 iphone accelerometer
我已经尝试了几种方法来测量用户通过读取加速度计对iPhone进行的步骤,但没有一种方法非常准确.我使用的最准确的实现如下:
float xx = acceleration.x;
float yy = acceleration.y;
float zz = acceleration.z;
float dot = (mOldAccX * xx) + (mOldAccY * yy) + (mOldAccZ * zz);
float a = ABS(sqrt(mOldAccX * mOldAccX + mOldAccY * mOldAccY + mOldAccZ * mOldAccZ));
float b = ABS(sqrt(xx * xx + yy * yy + zz * zz));
dot /= (a * b);
if (dot <= 0.994 && dot > 0.90) // bounce
{
if (!isChange)
{
isChange = YES;
mNumberOfSteps += 1;
} else {
isChange = NO;
}
}
mOldAccX = xx;
mOldAccY = yy;
mOldAccZ = zz;
}
Run Code Online (Sandbox Code Playgroud)
但是,这仅占用户用户步数的80%.如何提高计步器的准确度?
这里有一些更精确的答案来检测每个步骤。但是是的,在我的情况下,我每 25 步就会得到 + 或 - 1 步。所以我希望这可能对你有帮助。:)
if (dot <= 0.90) {
if (!isSleeping) {
isSleeping = YES;
[self performSelector:@selector(wakeUp) withObject:nil afterDelay:0.3];
numSteps += 1;
self.stepsCount.text = [NSString stringWithFormat:@"%d", numSteps];
}
}
- (void)wakeUp {
isSleeping = NO;
}
Run Code Online (Sandbox Code Playgroud)
好的,我假设这段代码位于 addAcceleration 函数中......
-(void)addAcceleration:(UIAcceleration*)accel
Run Code Online (Sandbox Code Playgroud)
因此,您可以提高采样率以获得更精细的检测粒度。例如,如果您当前每秒采集 30 个样本,则可以将其增加到 40、50 或 60 等...然后决定是否需要计算反弹范围内的样本数量,并考虑单个样本步。听起来您由于错过了一些弹跳而没有计算一些步数。
另外,切换 isChange 的目的是什么?难道你不应该使用在 x 次计数后重置的计数器吗?如果你在你的弹跳范围内......
if (dot <= 0.994 && dot > 0.90) // bounce
Run Code Online (Sandbox Code Playgroud)
您必须达到这个最佳点 2 次,但是根据您的设置方式,它可能不是连续的两个连续样本,它可能是第一个样本和第 5 个样本,或者第 2 个样本和第 11 个样本。这就是您丢失步数的地方。
| 归档时间: |
|
| 查看次数: |
6141 次 |
| 最近记录: |