CMAccelerometer数据总是负的



我试图检测用户何时将手机向下移动,以及何时将其向上移动。手机只有上下移动(没有左右移动)

我正在记录加速度数据,但它总是负的,即使我向上移动。为什么会这样?

[_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

问题是重力是一种加速度,它永远不会停止。(事实上,我想这是一件好事。)你的用户动作"隐藏"在用户加速(基于肌肉的动作)和重力的组合中。这是因为您使用的是原始加速度计数据。那是一件很愚蠢的事。

你可以用高通滤波器粗略地过滤掉重力。苹果公司有大量的示例代码来展示如何做到这一点。

然而,使用CMDeviceMotion (startDeviceMotionUpdatesUsingReferenceFrame:)会更明智,它为您提供了一个userAcceleration属性,它已经比您可能做的更准确地执行了此过滤,并且延迟更少。

iOS返回的加速度数据是"归一化"的,其中1.0的值表示与地球重力相等。也就是说,将手机正面朝上放在桌子上,将始终返回大约为-1.0的"Z"值(你永远不会得到静态值;即使手机完全处于静止状态,它也会不断发生轻微变化。

你的CMAccelerometerData对象中的acceleration.z值代表垂直于手机正面/背面的轴。

根据你的数据(值为-0.86到-0.71),你正在将手机屏幕向地球中心移动。如果没有X轴和Y轴的值,就很难确切地知道发生了什么。基本上,-0.8表示z轴以0.2 * 9.8m/s/s的速度向地球中心加速。

如果您想要正数,请将手机屏幕向下翻转。或者,你可以把手机"摔"下去,使它向下的加速度超过地球引力的加速度。

你实际上应该使用这三个值来确定加速度矢量,以防手机不完全垂直于地球引力

相关内容

  • 没有找到相关文章

最新更新