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

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

我已经观察这个计步器应用程序非常高的细节。

这不是一个完美的计步器应用程序。 例如,如果你坐在一个地方并握手,它也可以检测步数和距离。

忽略这个理想和重力行为,因为在这个应用程序的说明中已经提到,你应该绑定你的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个步骤。

是否有任何其他实现需要做到这一点,或在这个代码中的一些调整?

我已经看到所有其他类似的堆栈溢出链接。 我发现没有什么能达到这个水平。

请帮忙。

一直计算打鼾,而不是步骤,但有一些相同的问题。 没有真正的答案,但一些build议:

  1. 需要一个步骤之间的时间间隔。 是的,有人可以慢跑或慢跑,但即使在最快的时候,也可能有1/5秒的时间间隔。 如果“冲击”看起来更为迅速,那么他们很可能只是从反弹/咔嚓声中。
  2. 而不是你的固定的门槛( violence )采用一个可变的门槛,基于以前事件的移动平均 。
  3. 考虑保持单独的x,y和z阈值,这是基于手机在短时间内不会改变方向的假设。
  4. 不要忽略超过一定水平的事件,应考虑忽略超出范围的事件,并用两个阈值(一个可能是另一个的一小部分)来限定。
  5. 考虑一下当你走路时会发生什么 – 身体的前后加速度是非常有节奏的,而随着脚踏地面的“震动”。 试图忽略震动(相当短暂的信号),而是寻找有节奏的前进/后退运动可能是最好的。

另一个build议

testing这个野兽“现场”将是不可能的。 (我可以想象你试着慢慢地把笔记本电脑放在你面前,试图让debugging器控制台集中注意力。)你应该做的是先安装你的应用程序来制作一些包含原始数据的logging(即写入文件)测量,然后重新安装您的应用程序(#ifdefs在这里会很方便),以便能够“回放”这些测量结果,以便您可以使用debugging器浏览应用程序并观察其行为。

  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") } })