2010-10-09 11 views
9

Ho provato diversi modi di misurare i passi compiuti da un utente con un iPhone leggendo l'accelerometro, ma nessuno è stato molto preciso. L'implementazione più preciso che ho usato è il seguente:Come si migliora la precisione dell'algoritmo del pedometro?

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

Tuttavia, questa cattura solo l'80% di passaggi dell'utente. Come posso migliorare la precisione del mio contapassi?

+5

moltiplicare la risposta per un fattore per aggiungere il 20% mancante - Scommetto che è ciò che fanno i pedometri economici - hanno un quadrante di sensibilità su di essi;) – deanWombourne

risposta

2

ok, sto assumendo questo codice è all'interno della funzione addAcceleration ...

-(void)addAcceleration:(UIAcceleration*)accel 

Quindi, si potrebbe aumentare la frequenza di campionamento per ottenere una granularità più fine di rilevamento. Quindi, per esempio, se stai attualmente prendendo 30 campioni al secondo, potresti aumentarlo a 40, 50 o 60 ecc ... Quindi decidi se devi contare un numero di campioni che rientrano nel tuo rimbalzo e considera che un singolo passo. Sembra che tu non stia contando alcuni passaggi a causa della mancanza di alcuni rimbalzi.

Inoltre, qual è lo scopo di alternare isChange? Non dovresti usare un contatore con un reset dopo il numero x di conteggi? Se siete nel vostro rimbalzo ...

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

si dovrà colpire questo sweet spot 2 volte, ma il modo in cui è stata impostata questa funzione, non può essere di due campioni consecutivi di fila, può essere un primo campione e un quinto campione, o un secondo campione e un undicesimo campione. È qui che stai perdendo i conteggi dei passi.

1

Ricorda che non tutti fanno gli stessi grandi passi. Quindi il calcolo del punto dovrebbe essere regolato in base alla lunghezza di qualcuno, alla dimensione del passo.

È necessario regolare la soglia di rimbalzo di conseguenza. Cerca di far conoscere al programma il suo passeggero.

3

Ecco una risposta più precisa per rilevare ogni passaggio. Ma sì, nel mio caso sto ricevendo + o - 1 passo ogni 25 passi. Quindi spero che questo possa esserti utile. :)

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