【问题标题】:How to count steps using an Accelerometer?如何使用加速度计计算步数?
【发布时间】:2012-01-08 18:18:03
【问题描述】:

我必须开发与 Pedometer App 相同的功能

我已经非常详细地观察了这个Pedometer app

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

忽略这种理想和重力的行为,因为在这个应用程序的说明中已经提到你应该系好你的 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 链接。我发现没有任何东西可以达到这个水平。

请帮忙。

【问题讨论】:

  • 如果你得到了答案,可以分享一下代码吗?

标签: iphone ios accelerometer motion-detection threshold


【解决方案1】:

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

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

另一个建议

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

【讨论】:

  • +1 以获得非常好的答案。另外,在#1... 作为一名跑步者,我可以告诉你,每步 1/5 秒是一个不可能的快节奏。真正快速的周转速度约为 190 bpm,即每秒 3 英尺多一点。这对 OP 的目的是有好处的,因为您正在查看的分辨率越高,您可以筛选出的抖动就越多。我也很喜欢移动平均线的建议,因为你落地时的冲击力因你的跑步方式、你的跑姿质量、你的身体成分、你的速度和其他因素而异。一个神奇的数字永远不会在那里真正起作用。
  • 感谢 Licks 和 Dan。那么你会建议 setUpdateInterval 值而不是 0.2 吗?您还可以建议如何使阈值可变吗?
  • 0.2 的更新间隔可能很好,至少对于初学者来说是这样。要使阈值变量,您可能会保留先前加速度计值的移动平均值(x、y 和 z 的单独平均值),并使用移动平均值的 2 倍或 3 倍作为阈值。
  • 这可能有助于生成一些运动图表,以查看错误和正确时的值通常是什么。更好地生成包含多个不同人的图表。
  • 如果不是图表,至少是一个常规的 NSLog 事件,显示输入值、阈值和其他计算值。使用图形标志(例如,**)来指示“重要”的值,例如指示步幅的加速度测量值。 (当然,以某种方式#ifdef NSLogs,所以你可以在生产中关闭它们。)
【解决方案2】:
        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")
            }
        })

【讨论】:

    猜你喜欢
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    相关资源
    最近更新 更多