2010-10-09 11 views
9

Próbowałem różnych sposobów mierzenia kroków, które użytkownik robi z iPhonem, czytając akcelerometr, ale żaden z nich nie był bardzo dokładny. Najdokładniejszym realizacja Użyłem jest następujący:Jak poprawić dokładność tego algorytmu krokomierza?

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; 
} 

Jednak to tylko łapie 80% krokach użytkownika. Jak mogę poprawić dokładność mojego krokomierza?

+5

pomnóż swoją odpowiedź przez współczynnik, aby dodać brakujące 20% - Założę się, że to właśnie robią tanie pedometry - mają na nich pokrętło czułości;) – deanWombourne

Odpowiedz

2

ok, jestem przy założeniu, ten kod jest wewnątrz funkcji addAcceleration ...

-(void)addAcceleration:(UIAcceleration*)accel 

Tak, można zwiększyć częstotliwość próbkowania, aby uzyskać lepszą szczegółowość wykrywania. Na przykład, jeśli obecnie bierzesz 30 próbek na sekundę, możesz zwiększyć ją do 40, 50 lub 60 itd. ... Następnie zdecyduj, czy musisz liczyć kilka próbek, które mieszczą się w twoim odbiciu i rozważyć, że jeden krok. Wygląda na to, że nie liczysz kilku kroków z powodu braku niektórych odskoków.

Jaki jest cel przełączenia opcji Zmień? Nie powinieneś używać licznika z resetem po x liczbie zliczeń? Jeśli jesteś w swoim odbiciu ...

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

trzeba by uderzyć ten Sweet Spot 2 razy, ale sposób, w jaki Ustawiono, nie mogą być dwie kolejne próbki z rzędu, może być pierwsza próbka i piąta próbka lub druga próbka i 11 próbka. Właśnie tam tracisz liczbę kroków.

1

Należy pamiętać, że nie każdy robi takie same duże kroki. Tak więc obliczenie kropki powinno być dostosowane do czyjejś długości, wielkości kroku.

Należy odpowiednio dostosować próg odbicia. Postaraj się, aby program dowiedział się o jego pasażerach.

3

Oto bardziej precyzyjna odpowiedź, aby wykryć każdy krok. Ale tak, w moim przypadku uzyskuję + lub - 1 krok na każde 25 kroków. Mam nadzieję, że to może ci pomóc. :)

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; 
    } 
Powiązane problemy