如何使用加速度计计算步数?

Tar*_*riq 9 iphone accelerometer motion-detection ios threshold

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

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

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

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

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

我的代码:

在viewDidLoad中:

[[UIAccelerometer sharedAccelerometer] setUpdateInterval:0.2] 
Run Code Online (Sandbox Code Playgroud)
- (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;
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我无法确定阈值.如果我把它做得很高,就不会发现很小的步骤.如果我把它缩小,它会同时记录3-4个步骤.

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

我已经看到了所有其他类似的Stack Overflow链接.我发现的任何东西都达不到这个水平.

请帮忙.

Hot*_*cks 20

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

  1. 需要步骤之间的时间间隔.是的,有人可以慢慢地走路或慢跑,但即使是最快的,步骤之间也可能有1/5秒的时间间隔.如果"影响"看起来比这更快,那么它们可能只是来自反弹/嘎嘎声.
  2. 而不是您的固定阈值(violence)采用可变阈值,基于先前事件的移动平均值.
  3. 考虑保持单独的x,y和z阈值,基于假设电话不会在短时间内改变方向.
  4. 不要只忽略强于特定级别的事件,而应考虑忽略范围之外的事件,限制由两个阈值指定(一个可能是另一个阈值的一小部分).
  5. 考虑一下你走路时会发生什么 - 身体的向前/向后加速是非常有节奏的,当脚踩到地面时会伴随着"震动".最好是试图忽略冲击(一个相当短期的信号),而是寻找有节奏的前进/后退运动.

另一个建议

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

  • +1是一个非常好的答案.此外,在#1 ...作为跑步者,我可以告诉你,每步1/5秒是一个不可避免的快速节奏.真正的快速翻转速度约为每分钟190次,每秒钟超过3次.这对于OP的目的是有好处的,因为你所看到的分辨率越大,你可以筛出的抖动越多.我也非常喜欢移动平均线的建议,因为你的撞击效果会因你的跑步风格,你的身体质量,你的身体成分,你的速度和其他因素而有所不同.一个神奇的数字永远不会在那里真正起作用. (2认同)