我发现此代码用于计算用户的足迹,但它无法正常工作。它没有显示确切的结果。
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
const float violence = 1.2;
static BOOL beenhere;
BOOL shake = FALSE;
if (beenhere) return;
beenhere = TRUE;
if (acceleration.x > violence || acceleration.x < (-1* violence))
shake = TRUE;
if (acceleration.y > violence || acceleration.y < (-1* violence))
shake = TRUE;
if (acceleration.z > violence || acceleration.z < (-1* violence))
shake = TRUE;
if (shake) {
steps=steps+1;
}
beenhere = false;
}
它也在检测错误的步骤。如何通过appliyng过滤器删除错误的步骤?
我一直在寻找信息好几天,在这里找到了一些信息:http://www.analog.com/library/analogDialogue/archives/41-03/pedometer.html,但我在应用它时遇到了麻烦。
答案 0 :(得分:0)
可能有助于获得加速度矢量的大小而不是测试x,或y或z。你为什么不绘制数据并查看它出错的地方?例如,保持一系列加速度矢量幅度,并标记它们触发步骤的位置。像这样:
typedef struct accelData {
float mag;
BOOL causedStep;
} accelData;
accelData gAcceleration[kMaxDataPoints];
int i = 0;
-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
const float violence = 1.2;
float magnitudeOfAcceleration = sqrt (acceleration.x*acceleration.x + acceleration.y * acceleration.y + acceleration.z * acceleration.z);
BOOL shake = magnitudeOfAcceleration > violence;
gAcceleration[i].mag = magnitudeOfAcceleration;
if (shake)
{
steps++;
gAcceleration[i].causedStep = YES;
}
else
{
gAcceleration[i].causedStep = NO;
}
}
获得此数据后,您可以对其进行分析,并查看导致错误录制步骤的原因。也许您需要对数据进行低通滤波以降低噪声或类似的效果。