我正在尝试检测用户何时向下移动手机以及何时向上移动手机。手机仅可上下移动(没有左右移动)
我正在记录加速度数据,但是即使我向上移动,它也始终是负数。为什么是这样?
[_motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init]
withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[self performSelectorOnMainThread:@selector(update:) withObject:accelerometerData waitUntilDone:NO];
});
-更新:
- (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
最佳答案
问题在于重力是一种加速度,它永远不会停止。 (实际上,我认为这是一件好事。)用户加速度(基于肌肉的运动)和重力的结合使用户运动被“隐藏”。那是因为您使用的是原始加速度计数据。这是一件愚蠢的事情。
您可以使用高通滤波器粗略过滤重力。苹果有大量示例代码显示了如何执行此操作。
但是,使用CMDeviceMotion(startDeviceMotionUpdatesUsingReferenceFrame:
)会更加明智,它为您提供了userAcceleration
属性,该属性已经比您可能执行的更精确,延迟更少。
关于ios - 加速度计数据始终为负,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22410049/