2016-02-03 26 views

risposta

1

È possibile rilevare passo evento utilizzando i dati dell'accelerometro da CMMotionManager

protected CMMotionManager _motionManager; 
public event EventHandler<bool> OnMotion; 

public double ACCEL_DETECTION_LIMIT = 0.31; 
private const double ACCEL_REDUCE_SPEED = 0.9; 

private double accel = -1; 
private double accelCurrent = 0; 

private void StartAccelerometerUpdates() 
    { 
     if (_motionManager.AccelerometerAvailable) 
      _motionManager.AccelerometerUpdateInterval = ACCEL_UPDATE_INTERVAL; 
     _motionManager.StartAccelerometerUpdates (NSOperationQueue.MainQueue, AccelerometerDataUpdatedHandler); 
    } 

public void AccelerometerDataUpdatedHandler(CMAccelerometerData data, NSError error) 
     {   
     double x = data.Acceleration.X; 
     double y = data.Acceleration.Y; 
     double z = data.Acceleration.Z; 

     double accelLast = accelCurrent; 
     accelCurrent = Math.Sqrt(x * x + y * y + z * z); 
     double delta = accelCurrent - accelLast; 
     accel = accel * ACCEL_REDUCE_SPEED + delta; 

     var didStep = OnMotion; 

     if (accel > ACCEL_DETECTION_LIMIT) 
     {           
      didStep (this, true);//maked a step 
     } else { 
      didStep (this, false); 
     } 
    } 
+0

Grazie mille per la soluzione. in qualche modo ha funzionato con alcuni difetti in esso. Il tuo codice per qualche ragione sul caricamento iniziale arriva a 11 passi quindi solo io inizio a rilevare correttamente i passaggi. Ho giocato attorno a ACCEL_DETECTION_LIMIT ha avuto un caricamento iniziale migliore ma la precisione è disattivata. Ecco un'altra spiegazione. https://gist.github.com/anonymous/d8563c4c8fc8ba874ba6. Qualche idea qual è il problema? – Axil

+0

@Axil ha corretto un bug, è sufficiente impostare 'private double accel' su -1 –

1

IOS a parte, non esiste una soluzione semplice per creare un pedometro accurata utilizzando solo l'uscita accelerometro; è solo rumoroso. L'utilizzo dell'output da un giroscopio (ove disponibile) per filtrare l'output aumenterebbe la precisione.

Ma un greggio qui è un approccio approssimativo al codice di cablaggio per un pedometro: - i passaggi vengono rilevati come una variazione dell'accelerazione rilevata sull'asse Z. A patto di saper l'accelerazione di default (l'impatto della gravità) ecco come si fa:

float g = (x * x + y * y + z * z)/(GRAVITY_VALUE * GRAVITY_VALUE) 

tua soglia è g=1 (questo è quello che si vede quando si sta fermi). I picchi in questo valore rappresentano passi. Quindi tutto ciò che devi fare è contare le punte. Ricordati che un semplice g> 1 non lo farà, come per un passo, il valore g aumenterà per un certo periodo di tempo e poi tornerà indietro (se si traccia il valore nel tempo, dovrebbe apparire come un'onda sin quando c'è un passo - essenzialmente vuoi contare le onde sin)

Ricordati che questo è solo qualcosa per iniziare; dovrete aggiungere più complessità ad esso per aumentare la precisione. cose come: - isteresi per evitare il rilevamento del passo falso - filtrare l'uscita dell'accelerometro - calcolare gli intervalli di passo Non sono inclusi qui e dovrebbero essere sperimentati.

+0

ok supponiamo che più ricerche debbano essere risolte per questo. hai provato il primo? funziona, ma solo un comportamento strano all'inizio del carico. Se riusciamo a sintonizzarlo, funzionerà perfettamente. grazie – Axil

+0

Ho usato questa formula più molto di più quando si costruisce un'ecompass. La parte di calibrazione può essere un po 'incostante, specialmente quando si lavora solo con gli accelerometri. Ma uno fatto correttamente dovrebbe essere abbastanza semplice. – Pandrei