Вопрос

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

Я заметил это Приложение для шагометра в очень высоких деталях.

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

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

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

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

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

Это было полезно?

Решение

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

  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")
            }
        })
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top