Как я могу улучшить точность этого алгоритма шагомера? - PullRequest
9 голосов
/ 09 октября 2010

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

 float xx  = acceleration.x;
 float yy  = acceleration.y;
 float zz = acceleration.z;

 float dot = (mOldAccX * xx) + (mOldAccY * yy) + (mOldAccZ * zz);
 float a = ABS(sqrt(mOldAccX * mOldAccX + mOldAccY * mOldAccY + mOldAccZ * mOldAccZ));

 float b = ABS(sqrt(xx * xx + yy * yy + zz * zz));

 dot /= (a * b);

 if (dot  <= 0.994 && dot > 0.90) // bounce
 {

  if (!isChange)
  {

   isChange = YES;
   mNumberOfSteps += 1;

  } else {
   isChange = NO;
  }
 }

 mOldAccX = xx;
 mOldAccY = yy; 
 mOldAccZ = zz;
}

Однако, это ловит только 80% шагов пользователя. Как я могу улучшить точность своего шагомера?

Ответы [ 3 ]

3 голосов
/ 19 декабря 2013

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

if (dot <= 0.90) {
    if (!isSleeping) {
        isSleeping = YES;
        [self performSelector:@selector(wakeUp) withObject:nil afterDelay:0.3];
        numSteps += 1;
        self.stepsCount.text = [NSString stringWithFormat:@"%d", numSteps];
    }
}



- (void)wakeUp {

       isSleeping = NO;
     }
2 голосов
/ 15 апреля 2011

хорошо, я предполагаю, что этот код находится в функции addAcceleration ...

-(void)addAcceleration:(UIAcceleration*)accel

Таким образом, вы можете увеличить частоту дискретизации, чтобы получить более детальную детальность обнаружения. Так, например, если вы в настоящее время берете 30 выборок в секунду, вы можете увеличить его до 40, 50 или 60 и т. Д. Затем решите, нужно ли подсчитывать количество выборок, попадающих в ваш отскок, и считать, что шаг. Похоже, вы не учитываете некоторые шаги из-за отсутствия некоторых отскоков.

Кроме того, какова цель переключения isChange? Разве вы не должны использовать счетчик со сбросом после x числа отсчетов? Если вы находитесь в пределах отказов ...

if (dot  <= 0.994 && dot > 0.90) // bounce

вам нужно будет попасть в это «сладкое пятно» 2 раза, но, как вы его настроили, это может быть не два последовательных сэмпла подряд, это может быть первый и 5-й сэмплы или 2-й с 11-й образец. Вот где вы теряете количество шагов.

1 голос
/ 11 апреля 2013

Имейте в виду, что не все делают одинаковые большие шаги. Таким образом, расчет точки должен быть скорректирован в соответствии с чьей-то длиной, размером шага.

Вы должны соответствующим образом настроить порог отказов. Попытайтесь заставить программу узнать об этом пассажире.

...