如何使用加速度计数步骤?
我必须开发与此计步器应用程序相同的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/5秒的时间间隔。 如果“冲击”看起来更为迅速,那么他们很可能只是从反弹/咔嚓声中。
- 而不是你的固定的门槛(
violence
)采用一个可变的门槛,基于以前事件的移动平均 。 - 考虑保持单独的x,y和z阈值,这是基于手机在短时间内不会改变方向的假设。
- 不要忽略超过一定水平的事件,应考虑忽略超出范围的事件,并用两个阈值(一个可能是另一个的一小部分)来限定。
- 考虑一下当你走路时会发生什么 – 身体的前后加速度是非常有节奏的,而随着脚踏地面的“震动”。 试图忽略震动(相当短暂的信号),而是寻找有节奏的前进/后退运动可能是最好的。
另一个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") } })