iOS上使用加速度计计算步数的替代方案,不需要使用CMPedometer

5

由于CMPedometer在iPhone5S以下的设备上不可用。

CMPedometer计步功能不可用

是否有算法代码可以使用iOS上的加速度计编程步数?

谢谢

2个回答

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

非常感谢您的解决方案。它在某种程度上有些缺陷,但确实起作用了。您的代码在初始加载时会经过11个步骤,然后才开始正确地检测步骤。我尝试调整ACCEL_DETECTION_LIMIT,初始加载效果更好,但准确性不够。这里有更多的解释:https://gist.github.com/anonymous/d8563c4c8fc8ba874ba6。您有什么想法吗? - Axil
@Axil修复了一个bug,只需将private double accel设置为-1即可。 - Kuchur Andrei

1
除了IOS之外,仅使用加速度计输出创建准确的计步器没有简单的解决方案;它太嘈杂了。使用陀螺仪(如果可用)的输出来过滤输出将增加准确性。
但是这里有一个粗糙的方法来编写计步器的代码: - 步数被检测为在Z轴上检测到的加速度变化。假设您知道默认加速度(重力的影响),下面是如何实现:
float g = (x * x + y * y + z * z) / (GRAVITY_VALUE * GRAVITY_VALUE)

你的阈值是g=1(当你静止时会看到这个值)。该值中的峰表示步数。所以你只需要数峰即可。请注意,简单的g>1不行,因为对于一步来说,g值会在一定时间内增加,然后回落(如果你将值随时间的变化绘制出来,应该像正弦波一样,当有一步时,你想要计数正弦波)。
请注意,这只是一个让你入门的东西;你需要添加更多的复杂性来提高准确性。 例如: - 滞后以避免误判 - 过滤加速度计输出 - 找出步伐间隔 这些都没有包含在内,需要进行实验。

好的,我猜这更像是我们需要进行的研究。你试过第一个吗?那个可以工作,但在加载开始时有一些奇怪的行为。如果我们能够微调它,它就会正常工作。谢谢。 - Axil
在构建电子罗盘时,我使用了这个公式以及更多的内容。校准部分可能有些棘手,特别是当仅使用加速度计时。但是一旦正确完成,它应该足够简单。 - Pandrei

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接