【问题标题】:CMAccelerometer Data always Negative加速度计数据始终为负
【发布时间】:2014-03-14 15:58:54
【问题描述】:

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

我正在记录加速度数据,但它始终为负数,即使我向后移动也是如此。这是为什么呢?

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

【问题讨论】:

    标签: ios objective-c cmmotionmanager


    【解决方案1】:

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

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

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

    【讨论】:

    • 关于原始加速度 (apeth.com/iOSBook/ch35.html#_raw_acceleration) 和设备运动 (apeth.com/iOSBook/ch35.html#_gyroscope) 的讨论,请参阅我的书。
    • 我正在尝试检测用户何时将手机跌落约半米,然后再次将其恢复当我使用 CMDeviceMotion startDeviceMotionUpdatesUsingReferenceFrame: 记录数据并对其进行分析时,我注意到一个大约 4-10 -0.4 个值的聚类对应于我试图检测的运动。然而,这似乎是一种相对不完善的分析方法。您知道如何以更常规的方式从数据中解析出每个动作吗?我试图检测的运动是当用户上下移动他/她的设备时,保持屏幕朝上......
    • 比较难,尤其是你只能检测到acceleration,不能检测到position:你不知​​道设备的高度,所以平滑向下运动几乎没有加速度,可能根本不会出现。您可以检测到的是从静止到移动的加速度和从移动到静止的减速,但除了猜测之间发生了什么之外,您真的不知道。事实上,甚至不能总是区分开始移动和停止移动。他们看起来很像。
    • 这里是示例代码,我试图检测一些相当暴力的东西 - 用户将设备侧向拍打成张开的手掌 - 并且很难做到:github.com/mattneub/Programming-iOS-Book-Examples/blob/master/… 需要的是很多对所有数据进行更复杂的数学分析。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      相关资源
      最近更新 更多