Альтернатива CMPedometer для подсчета количества шагов с помощью акселерометра на iOS.

Поскольку CMPedometer недоступен для моделей ниже iPhone5S.

Подсчет шагов CMPedometer недоступен

Есть ли код алгоритма, который мы можем использовать для программирования количества шагов с помощью акселерометра на ios?

Спасибо


person Axil    schedule 03.02.2016    source источник


Ответы (2)


Помимо IOS, нет простого решения для создания точного шагомера, использующего только выходные данные акселерометра; это просто шумно. Использование выходных данных гироскопа (где доступно) для фильтрации выходных данных повысит точность.

Но грубый вот грубый подход к монтажному коду для шагомера: - шаги определяются как изменение ускорения, определяемого по оси Z. Предполагая, что вы знаете ускорение по умолчанию (воздействие силы тяжести), вот как вы это делаете:

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

Ваш порог равен g=1 (это то, что вы увидите, стоя на месте). Пики в этом значении представляют собой шаги. Так что все, что вам нужно сделать, это посчитать шипы. Имейте в виду, что простой g>1 не годится, так как для одного шага значение g будет увеличиваться в течение определенного периода времени, а затем возвращаться обратно (если вы отобразите значение во времени, оно должно выглядеть как синусоидальная волна, когда есть шаг - по сути вы хотите посчитать волны синуса)

Имейте в виду, что это всего лишь то, что поможет вам начать; вам придется добавить больше сложности, чтобы повысить точность. Такие вещи, как: - гистерезис для предотвращения ложного обнаружения шагов - фильтрация выходных данных акселерометра - определение интервалов шагов Сюда не включены, и с ними следует поэкспериментировать.

person Pandrei    schedule 16.02.2016
comment
Хорошо, думаю, это больше исследований, которые мы должны провести для этого. ты первый пробовал? это работает, но просто странное поведение в начале загрузки. Если мы сможем это настроить, то все будет хорошо. Благодарность - person Axil; 18.02.2016
comment
Я использовал эту формулу и многое другое при построении экокомпаса. Часть калибровки может быть немного случайной, особенно при работе только с акселерометрами. Но если все сделано правильно, это должно быть достаточно просто. - person Pandrei; 18.02.2016

Вы можете определить событие шага, используя данные акселерометра из 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);
        }
    }
person Kuchur Andrei    schedule 03.02.2016
comment
Большое спасибо за ваше решение. это как-то работало с некоторыми недостатками в нем. Ваш код по какой-то причине при начальной загрузке доходит до 11 шагов, тогда только я начинаю правильно определять шаги. Я поиграл с ACCEL_DETECTION_LIMIT, у него была лучшая начальная загрузка, но точность снизилась. Вот еще объяснение. gist.github.com/anonymous/d8563c4c8fc8ba874ba6. Есть идеи, в чем проблема? - person Axil; 05.02.2016
comment
@Axil исправил ошибку, просто установил private double accel на -1 - person Kuchur Andrei; 01.03.2016