我试图检测用户何时将手机向下移动,以及何时将手机向上移动。手机只能上下电影(没有左右移动)
我记录了加速度数据,但即使我向后移动,它也总是负数。这是为什么?
[_motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init]
withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[self performSelectorOnMainThread:@selector(update:) withObject:accelerometerData waitUntilDone:NO];
});
-Update:
- (void)update:(CMAccelerometerData *)accelData {
NSLog(@"acceldata.z %f",accelData.acceleration.z);
}
示例数据
2014-03-14 02:24:02.973 myApp[16294:60b] acceldata.z -0.863266
2014-03-14 02:24:02.993 myApp[16294:60b] acceldata.z -0.855530
2014-03-14 02:24:03.004 myApp[16294:60b] acceldata.z -0.853592
2014-03-14 02:24:03.024 myApp[16294:60b] acceldata.z -0.793396
2014-03-14 02:24:03.043 myApp[16294:60b] acceldata.z -0.774567
2014-03-14 02:24:03.053 myApp[16294:60b] acceldata.z -0.749664
2014-03-14 02:24:03.072 myApp[16294:60b] acceldata.z -0.716141
2014-03-14 02:24:03.082 myApp[16294:60b] acceldata.z -0.733749
2014-03-14 02:24:03.102 myApp[16294:60b] acceldata.z -0.752518
答案 0 :(得分:1)
问题是重力是一种加速度,它永远不会停止。 (实际上我觉得这是一件好事。)你的用户动作是隐藏的"在用户加速(基于肌肉的运动)和重力的组合。那是因为您正在使用原始加速度计数据。这是一件很愚蠢的事情。
您可以使用高通滤波器粗略地过滤掉重力。 Apple有很多示例代码说明如何做到这一点。
但是,使用CMDeviceMotion(startDeviceMotionUpdatesUsingReferenceFrame:
)会更加明智,它会为您提供userAcceleration
属性,该属性已经比您可以更准确地执行此过滤并且延迟更少可能会这样做。
答案 1 :(得分:0)
iOS返回的加速度数据是“标准化的”,其中值1.0表示与地球引力的等效性。也就是说,在桌子上面朝下放置的手机将始终返回-1.0左右的“Z”值(你永远不会以静态值结束;即使手机完全静止,它也会不断变化)。 / p>
acceleration.z
对象中的CMAccelerometerData
值表示垂直于手机正面/背面的轴。
根据您的数据(-0.86到-0.71的值),您将手机屏幕移向地球中心。如果没有X和Y轴值,很难确切知道发生了什么。基本上,-0.8的值表示z轴以0.2 * 9.8m / s / s的速度朝向地心加速。
如果您想要正值,请翻转手机屏幕。或者,您可以“放下”手机,使其向下加速度超过地球引力的加速度。
如果手机与地球的引力不完全垂直,你应该使用所有3个值来确定加速度矢量。