替代CMPedometer在iOS上使用加速度计计算步数

时间:2016-02-03 10:08:59

标签: ios iphone accelerometer gyroscope

由于CMPedometer不适用于iPhone5S以下。

CMPedometer StepCounting not Available

我们可以使用算法代码在ios上用加速度计编程步数吗?

由于

2 个答案:

答案 0 :(得分:1)

您可以使用CMMotionManager

中的加速计数据检测步骤事件
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);
        }
    }

答案 1 :(得分:1)

除了IOS之外,没有简单的解决方案可以仅使用加速度计输出来创建精确的计步器;这只是为了吵闹。使用陀螺仪的输出(如果可用)来过滤输出将提高精度。

但是这里的原油是计步器接线代码的粗略方法: - 检测步骤作为在Z轴上检测到的加速度的变化。假设你知道默认加速度(重力的影响),你就是这样做的:

float g = (x * x + y * y + z * z) / (GRAVITY_VALUE * GRAVITY_VALUE)

您的门槛为g=1(这是您站着不动时会看到的)。此值中的峰值表示步骤。因此,您所要做的就是计算峰值。请注意,一个简单的g> 1将不会这样做,因为一步,g值将增加一段时间然后返回(如果你随时间绘制值,它应该看起来像一个正弦波有一个步骤 - 基本上你想要计算正弦波)

请注意,这只是让你入门的事情;你将不得不增加更多的复杂性来提高准确性。 像:     - 滞后以避免错误的步骤检测     - 过滤加速度计输出     - 计算步骤间隔 不包括在这里,应该进行实验。