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
velocità e posizione in direzione X
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
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. –
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