9

我必须开发与此计步器应用程序相同的功能

我已经非常详细地观察了这个计步器应用程序。

它不是一个完美的计步器应用程序。例如,如果您停留/坐在一个地方并握手,它还会检测步数和距离。

忽略这种理想和重力行为,因为在这个应用程序的说明中已经提到你应该系好你的 iPhone 或者你应该把它放在口袋里数步数。这样,我发现这个应用程序运行良好,它几乎可以检测所有步骤。

我的问题是:我根据上述逻辑开发了一个样本,但它没有达到那个水平。例如,有时它会同时检测 2-3 个步骤。有时它工作正常。

我的代码:

在 viewDidLoad 中:

[[UIAccelerometer sharedAccelerometer] setUpdateInterval:0.2] 

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    const float violence = 1.2;
    static BOOL beenhere;
    BOOL shake = FALSE;
    if (beenhere) return;
    beenhere = TRUE;
    if (acceleration.x > violence || acceleration.x < (-1* violence))
       shake = TRUE;
    if (acceleration.y > violence || acceleration.y < (-1* violence))
       shake = TRUE;
    if (acceleration.z > violence || acceleration.z < (-1* violence))
       shake = TRUE;
    if (shake) {
       steps=steps+1;
     }
  beenhere = false;
}

我究竟做错了什么?我无法确定阈值。如果我把它调高,它就不会检测到小步骤。如果我把它变小,它会同时注册 3-4 个步骤。

是否需要任何其他实现来执行此操作,或者在此代码中进行一些调整?

我看过所有其他类似的 Stack Overflow 链接。我发现没有任何东西可以达到这个水平。

请帮忙。

4

2 回答 2

20

一直在数打鼾,而不是步数,但有一些相同的问题。没有实际答案,但有一些建议:

  1. 需要步骤之间的时间间隔。是的,有人可能会慢慢走或慢跑,但即使是最快的,步伐之间也可能有 1/5 秒的时间间隔。如果“影响”看起来比那更快,它们可能只是来自反弹/嘎嘎声。
  2. 而不是您的固定阈值 ( violence) 使用基于先前事件的移动平均值的可变阈值。
  3. 基于手机在短时间内不会改变方向的假设,考虑保持单独的 x、y 和 z 阈值。
  4. 考虑忽略超出某个范围的事件,而不是仅仅忽略强于某个级别的事件,其限制由两个阈值指定(一个可能是另一个阈值的一小部分)。
  5. 想想当你走路时会发生什么——身体有节奏地向前/向后加速,当脚着地时会产生“震动”。最好尝试忽略冲击(一个相当短期的信号),而是寻找有节奏的向前/向后运动。

另一个建议

“现场”测试这种野兽是不可能的。(我可以想象你在将笔记本电脑放在你面前时试图慢跑,试图让调试器控制台集中注意力。)你应该做的是首先装备你的应用程序来制作一些包含原始的录音(即写入文件)测量值,然后重新装配您的应用程序(#ifdefs 在这里很方便)以便能够“回放”这些测量值,以便您可以使用调试器单步执行应用程序并观察其行为。

于 2011-11-29T12:59:32.660 回答
0
        var motionManager = CMMotionManager()
        motionManager.deviceMotionUpdateInterval = 0.1
        motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler:{
            deviceManager, error in

            var accelerationThreshold:Double = 1;
            var userAcceleration:CMAcceleration = deviceManager.userAcceleration;
            if(fabs(userAcceleration.x) > accelerationThreshold) || (fabs(userAcceleration.y) > accelerationThreshold) || (fabs(userAcceleration.z) > accelerationThreshold)
            {
                println("LowPassFilterSignal")
            }
        })
于 2016-04-05T09:13:57.767 回答