在iOS上使用加速计计算步数的CMPedometer替代方案

在iOS上使用加速计计算步数的CMPedometer替代方案,ios,iphone,accelerometer,gyroscope,Ios,Iphone,Accelerometer,Gyroscope,因为CM计步器不适用于低于iPhone5S的手机 是否有一个算法代码,我们可以使用它在ios上编程加速度计的步数 谢谢您可以使用来自CMMotionManager的加速计数据检测step事件 protected CMMotionManager _motionManager; public event EventHandler<bool> OnMotion; public double ACCEL_DETECTION_LIMIT = 0.31; private const doub

因为CM计步器不适用于低于iPhone5S的手机

是否有一个算法代码,我们可以使用它在ios上编程加速度计的步数


谢谢

您可以使用来自
CMMotionManager的加速计数据检测step事件

protected CMMotionManager _motionManager;
public event EventHandler<bool> OnMotion;

public double ACCEL_DETECTION_LIMIT = 0.31;
private const double ACCEL_REDUCE_SPEED = 0.9;

private double accel = -1;
private double accelCurrent = 0;

private void StartAccelerometerUpdates()
    {
        if (_motionManager.AccelerometerAvailable)
            _motionManager.AccelerometerUpdateInterval = ACCEL_UPDATE_INTERVAL;
        _motionManager.StartAccelerometerUpdates (NSOperationQueue.MainQueue, AccelerometerDataUpdatedHandler);
    }   

public void AccelerometerDataUpdatedHandler(CMAccelerometerData data, NSError error)
        {           
        double x = data.Acceleration.X;
        double y = data.Acceleration.Y;
        double z = data.Acceleration.Z;

        double accelLast = accelCurrent;
        accelCurrent = Math.Sqrt(x * x + y * y + z * z);
        double delta = accelCurrent - accelLast;
        accel = accel * ACCEL_REDUCE_SPEED + delta;

        var didStep = OnMotion;

        if (accel > ACCEL_DETECTION_LIMIT) 
        {                                           
            didStep (this, true);//maked a step
        } else {
            didStep (this, false);
        }
    }
protectedcmmotionmanager\u motionManager;
公共事件事件处理程序OnMotion;
公共双加速度检测限值=0.31;
私用恒速双加速减速=0.9;
私人双加速度=-1;
专用双加速电流=0;
私有void StartAccelerometerUpdates()
{
如果(_motionManager.Accelerometravaailable)
_motionManager.AccelerometrUpdateInterval=加速更新间隔;
_motionManager.StartAccelerMeterUpdate(NSOperationQueue.MainQueue,AccelerometerDataUpdatedHandler);
}   
public void AccelerometerDataUpdatedHandler(CMAccelerometerData数据,N错误)
{           
双x=数据加速度x;
双y=数据。加速度。y;
双z=数据.加速度.z;
双accelLast=加速电流;
加速度电流=数学Sqrt(x*x+y*y+z*z);
双增量=加速电流-加速电流;
加速=加速*加速减速+增量;
var didStep=无运动;
如果(加速度>加速度检测极限)
{                                           
didStep(这是真的);//迈出了一步
}否则{
didStep(这个,false);
}
}

撇开IOS不谈,没有简单的解决方案可以仅使用加速计输出创建精确的计步器;太吵了。使用陀螺仪的输出(如果可用)来过滤输出将提高精度

但这里有一个粗略的方法来为计步器布线代码: -台阶被检测为Z轴上检测到的加速度变化。假设你知道默认加速度(重力的影响),下面是你如何做到的:

float g = (x * x + y * y + z * z) / (GRAVITY_VALUE * GRAVITY_VALUE)
您的阈值是
g=1
(这是您站着时看到的)。此值中的峰值表示步数。所以你要做的就是数一数钉子。请注意,简单的g>1是不行的,对于一个步骤,g值将在一定时间内增加,然后返回(如果您绘制随时间变化的值,当存在一个步骤时,它应该看起来像一个正弦波-基本上您想要计算正弦波)

提醒你,这只是让你开始的事情;您将不得不增加更多的复杂性以提高准确性。 例如: -滞后,以避免错误的步骤检测 -对加速度计输出进行滤波 -计算步距
此处不包括,应进行试验

非常感谢您的解决方案。不知怎的,它工作起来有一些缺陷。由于某种原因,您的代码在初始加载时达到11个步骤,然后只有我开始正确地检测这些步骤。我在加速检测极限附近玩过,它有一些更好的初始负载,但精确度不高。这里有更多的解释。知道问题出在哪里吗?@Axil修复了一个bug,只需将
private-double-accel
设置为-1好吧,我想我们还需要做更多的研究。你试过第一种吗?这是可行的,但只是在加载开始时出现了奇怪的行为。如果我们能对其进行微调,它就会正常工作。thanksI在建造ecompass时使用了这个公式以及更多的公式。校准部分可能会有点碰运气,尤其是在仅使用加速计时。但如果做得正确,它应该足够简单。