如何提高这种计步器算法的准确性?

时间:2010-10-09 06:07:48

标签: 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;
}

但是,这仅占用户用户步数的80%。如何提高计步器的准确度?

3 个答案:

答案 0 :(得分:3)

以下是检测每个步骤的更精确答案。但是,在我的情况下,我每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;
     }

答案 1 :(得分:2)

好的,我假设这段代码在addAcceleration函数中......

-(void)addAcceleration:(UIAcceleration*)accel

因此,您可以提高采样率以获得更精细的检测粒度。因此,例如,如果您目前每秒采集30个样本,则可以将其增加到40,50或60等...然后决定是否需要计算在弹跳范围内的多个样本并考虑单个样本步。由于缺少一些反弹,听起来你没有计算一些步骤。

另外,切换isChange的目的是什么?在x次计数后,您不应该使用具有重置的计数器吗?如果你在反弹之中......

if (dot  <= 0.994 && dot > 0.90) // bounce

你必须达到这个最佳位置2次,但你设置的方式,可能不是连续两个连续的样本,它可能是第一个样本和第五个样本,或第二个样本和第11个样本。这就是你失去步数的地方。

答案 2 :(得分:1)

请记住,并非每个人都采取相同的重要步骤。因此,点数计算应根据某人的长度,步长进行调整。

您应该相应地调整跳出阈值。尝试让程序了解它的乘客。