Как считать шаги с помощью акселерометра?

Я должен разработать ту же функциональность, что и в этом приложении Шагомер

Я наблюдал это приложение Шагомер в очень высокой детализации.

Это не идеальное приложение шагомер. Например, если вы остаетесь / сидите в одном месте и пожимаете руку, он также определяет количество шагов и расстояние.

Игнорируйте это идеальное и серьезное поведение, потому что в инструкциях этого приложения уже упоминалось, что вы должны связать свой 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 шага одновременно.

Есть ли какая-либо другая реализация, необходимая для этого, или некоторые изменения в этом коде?

Я видел все другие подобные ссылки переполнения стека. Ничто, что я нашел, не выполняет до этого уровня.

Пожалуйста помоги.

2 ответа

Решение

Подсчет храпа, а не шагов, но есть некоторые из тех же проблем. Нет реальных ответов, но есть некоторые предложения:

  1. Требуется интервал времени между шагами. Да, кто-то может медленно ходить или бегать трусцой, но даже при самом быстром интервале времени между шагами может быть 1/5 секунды. Если "удары" кажутся более быстрыми, чем это, они, вероятно, просто от удара / дребезжания.
  2. Вместо вашего фиксированного порога (violence) использовать переменный порог, основанный на скользящей средней предыдущих событий.
  3. Рассмотрите возможность сохранения отдельных порогов x, y и z, исходя из предположения, что телефон в течение короткого периода времени не изменит ориентацию.
  4. Вместо того, чтобы просто игнорировать события, превышающие определенный уровень, рассмотрите возможность игнорирования событий, выходящих за пределы диапазона, с ограничениями, указанными двумя пороговыми значениями (один, возможно, доля другого).
  5. Подумайте, что происходит, когда вы идете - ускорение тела вперед и назад довольно ритмичное, наряду с "шоком", когда нога ударяется о землю. Лучше всего попытаться игнорировать шок (довольно кратковременный сигнал) и вместо этого искать ритмичное движение вперед / назад.

Еще одно предложение

Тестирование этого зверя "вживую" было бы невозможно. (Я могу представить, что вы пытаетесь бегать, держа ноутбук перед собой, пытаясь сфокусировать консоль отладчика.) Что вам нужно сделать, так это сначала настроить приложение, чтобы сделать несколько записей (т.е. записать файлы), содержащих исходные тексты. измерений, а затем перенастройте ваше приложение (здесь вам понадобится #ifdefs), чтобы иметь возможность "воспроизвести" эти измерения, чтобы вы могли просматривать приложение с помощью отладчика и наблюдать за его поведением.

        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")
            }
        })
Другие вопросы по тегам