Как считать шаги, используя акселерометр? - PullRequest
9 голосов
/ 29 ноября 2011

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

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

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

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

20 голосов
/ 29 ноября 2011

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

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

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

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

0 голосов
/ 05 апреля 2016
        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")
            }
        })
...