1

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

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

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

2 回答 2

1

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

您可以使用高通滤波器大致过滤掉重力。苹果有大量的示例代码来展示如何做到这一点。

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

于 2014-03-14T17:50:21.910 回答
0

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

对象中的acceleration.zCMAccelerometerData表示垂直于手机正面/背面的轴。

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

如果您想要正值,请将手机屏幕向下翻转。或者,您可以“放下”手机,使其向下的加速度超过地球重力的加速度。

您实际上应该使用所有 3 个值来确定加速度矢量,以防手机不完全垂直于地球重力。

于 2014-03-14T17:14:52.080 回答