2010-10-09 26 views
9

He intentado varias formas de medir los pasos que un usuario hace con un iPhone leyendo el acelerómetro, pero ninguno ha sido muy preciso. La aplicación más precisa que he utilizado es el siguiente:¿Cómo puedo mejorar la precisión de este algoritmo de podómetro?

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

Sin embargo, esto sólo capta el 80% de los pasos del usuario. ¿Cómo puedo mejorar la precisión de mi podómetro?

+5

multiplicar el resultado por un factor de añadir a los desaparecidos 20% - apuesto a que eso es lo podómetros baratos hacerlo - que tienen un dial de sensibilidad en ellos;) – deanWombourne

Respuesta

2

bien, estoy suponiendo que el código está dentro de la función addAcceleration ...

-(void)addAcceleration:(UIAcceleration*)accel 

Por lo tanto, se puede aumentar su velocidad de muestreo para obtener una granularidad más fina de la detección. Entonces, por ejemplo, si actualmente toma 30 muestras por segundo, puede aumentarla a 40, 50 o 60, etc. Luego, decida si necesita contar una cantidad de muestras que caen dentro de su rebote y considere que solo paso. Parece que no está contando algunos pasos debido a la pérdida de algunos de los rebotes.

Además, ¿cuál es el propósito de alternar isChange? ¿No deberías usar un contador con un reinicio después de x número de conteos? Si está dentro de su rebote ...

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

que tendría que ir a este punto dulce 2 veces, pero la forma en que ha configurado, no puede haber dos muestras consecutivas en una fila, puede ser una primera muestra y una 5ª muestra, o una 2ª muestra y una 11ª muestra. Ahí es donde estás perdiendo el conteo de pasos.

1

Tenga en cuenta que no todos hacen los mismos grandes pasos. Por lo tanto, el cálculo del punto se debe ajustar de acuerdo con la longitud, el tamaño del paso de una persona.

Debe ajustar el umbral de rebote en consecuencia. Intenta hacer que el programa aprenda sobre su pasajero.

3

Aquí hay una respuesta más precisa para detectar cada paso. Pero sí, en mi caso obtengo + o - 1 paso con cada 25 pasos. Así que espero que esto pueda ser útil para ti. :)

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