2016-04-13 51 views
6

Ricevo dati di accelerazione grezzi da un accelerometro e sto cercando di raddoppiarlo per ottenere la posizione.MATLAB durante l'integrazione da accelerazione a velocità in posizione Sto ottenendo valori y molto elevati

Il telefono Android utilizzato per ottenere i dati viene impostato su una superficie piana per 3 secondi per ridurre la deriva. Prendo il mezzo di accelerazione nel periodo di riposo per azzerare l'inizio. Questo ha funzionato bene, ma quando ci integriamo con velocità e posizione (usando cumtrapz) otteniamo valori y irrealisticamente alti (metri/s per velocità e metri per posizione)

I dati grezzi stanno sventolando il telefono a un certo tempo.

Qualcuno ha idee sul perché la posizione ottiene valori così alti? Di seguito sono riportati i grafici che mostrano ciò che ho descritto così come il mio codice.

Modifica: anche quando i telefoni non vengono ruotati, i valori non sono realistici e non indicano il modo in cui il telefono è stato spostato. Nelle immagini allegate, il telefono è stato spostato a forma di scatola su una superficie piana senza alcuna rotazione.

%VarName2 = accelerometer values in X direction 
    %VarName3 = accelerometer values in Y direction 
    %VarName4 = accelerometer values in Z direction 
    %elapsedArray = time values for each sample of accelerometer data 

    ddx = VarName2 - mean(VarName2(1:limit)); 
    ddx = ddx(1:length(ddx)-200); 
    elapsedArray = elapsedArray(1:length(elapsedArray)-200); 
    ddy = VarName3 - mean(VarName3(1:limit)); 
    ddy = ddy(1:length(ddy)-200); 
    ddz = VarName4 - mean(VarName4(1:limit)); 
    ddz = ddz(1:length(ddz)-200); 

    velX = cumtrapz(ddx .* elapsedArray); 
    velY = cumtrapz(ddy .* elapsedArray); 
    velZ = cumtrapz(ddz .* elapsedArray); 

    dx = velX - mean(velX(1:limit)); 
    dy = velY - mean(velY(1:limit)); 
    dz = velZ - mean(velZ(1:limit)); 

    posX = cumtrapz(dx .* elapsedArray); 
    posY = cumtrapz(dy .* elapsedArray); 
    posZ = cumtrapz(dz .* elapsedArray); 

    x = posX - mean(posX(1:limit)); 
    y = posY - mean(posY(1:limit)); 
    z = posZ - mean(posZ(1:limit)); 

    figure; 
    plot(ddx); 
    title('Acceleration in X') 
    xlabel('Time (sec)') 
    ylabel('Acc (meters squared'); 

    figure; 
    plot(dx); 
    title('Velocity in X') 
    xlabel('Time (sec)') 
    ylabel('Velocity (meters)'); 

    figure; 
    plot(x); 
    title('Position X') 
    xlabel('Time (sec)') 
    ylabel('Position (meters)'); 

    figure; 
    plot(y); 
    title('Position Y') 
    xlabel('Time (sec)') 
    ylabel('Position (meters)'); 

    figure; 
    plot(z); 
    title('Position Z') 
    xlabel('Time (sec)') 
    ylabel('Position (meters)'); 

accelerazione in direzione X

Acceleration in X direction

velocità e posizione in direzione X

Velocity and Position in X direction

Acceleration of Box test in X direction

Velocity of Box test in X direction

Position of Box test in X direction

+0

Sei sicuro che trama iniziale è in realtà * * accelerazione? Inoltre, qual è il periodo di campionamento del tuo accelerometro? Suppongo che il tuo asse x sia sbagliato qui (cioè non hai scuotere il telefono per 13 minuti di seguito). Se lo fossi, a che frequenza stavi scuotendo il telefono? (potresti essere sottocampionato in modo tempestivo) – Suever

+0

Sì, il grafico iniziale è l'accelerazione poiché campiona direttamente dall'accelerometro. Il periodo di campionamento campiona all'incirca ogni centesimo di secondo e l'asse x è l'indice dell'array temporale, quindi corrispondono anche a ogni 1/100 di secondo. L'etichetta dell'asse x dice ancora secondi di un test precedente - scuse. –

+0

Sei sicuro di non ruotare il telefono mentre lo scuoti?L'accelerometro sta misurando lungo un asse fisso e se si ruota il telefono l'asse x in questa cornice di coordinate non è costante durante la finestra di campionamento (rispetto a una cornice fissata alla terra). – mikkola

risposta

1

Quello che state vedendo è il risultato di tempo di deriva. Supponiamo che le letture dell'accelerometro che stai misurando abbiano un errore molto piccolo, dErr, in ogni momento. Una volta integrati questi valori per ottenere velocità, l'errore in ogni punto temporale verrà moltiplicato per un fattore t. L'integrazione di una seconda volta per ottenere la posizione causerà l'errore originale moltiplicato per un fattore di t^2. Pertanto, l'errore in ogni punto temporale si propagherà a dErr (t) * t^2.

Per ottenere una buona stima della posizione, è possibile provare a incorporare informazioni preliminari sulla posizione, ma probabilmente sarà necessario utilizzare una combinazione di dati di accelerometro e giroscopio. Potrebbe anche essere necessario esaminare i filtri di Kalman.

Ecco un Google Tech Talk spiegando questo problema: https://youtu.be/C7JQ7Rpwn2k?t=23m33s

+0

Mentre questo è un fenomeno reale, questa non è la spiegazione dei risultati dell'OP. Come puoi vedere, i risultati dell'esperimento da tavolo sembrano abbastanza buoni e non soffrono del problema della deriva. Ci vuole molto più tempo per accumulare un errore di deriva molto più lungo del tempo per l'esperimento dell'OP. – gariepy

+1

Ho già lavorato su un problema come questo in cui ho cercato di stimare la posizione utilizzando i valori dell'accelerometro su un orologio Android. I sensori non sono abbastanza precisi da fornire una buona stima della posizione e gli errori di deriva si sommano nel breve periodo di tempo. Ecco un altro post su questo argomento: http://electronics.stackexchange.com/questions/156192/accelerometer-double-integration-error –

+0

Interessante ... un buon punto in questo post che è stato realizzato anche da @mikkola sulla gravità componente di accelerazione. – gariepy

Problemi correlati