2016-04-13 8 views
6

Bir ivme ölçerden ham hızlanma verileri alıyorum ve pozisyon almak için onu ikiye katlamaya çalışıyorum.MATLAB Hızlanmadan sürate, pozisyona entegre edildiğinde çok yüksek değerler elde ediyorum.

Verileri azaltmak için kullanılan android telefon, sürüklenmeyi azaltmak için 3 saniye boyunca düz bir yüzeye ayarlandı. Başlangıçtan sıfıra düşmek için dinlenme periyodunda ivme ortalaması alırım. Bu iyi çalıştı, ancak hız ve pozisyona (cumtrapz kullanarak) entegre olduğumuzda, gerçek olmayan yüksek değerler alıyoruz (hız için metre/sn ve konum için metre.)

Ham veriler, telefonun belirli bir şekilde tempo.

Konumun neden bu kadar yüksek değerler aldığına dair bir fikri var mı? Aşağıda, neyi tarif ettiğimi ve kodumu gösteren grafikler verilmiştir.

Düzenleme: Telefonlar döndürüldüğünde bile, değerler gerçekçi değildir ve telefonun nasıl taşındığına dair bir gösterge değildir. Ekli resimlerde telefon, dönüşü olmayan düz bir yüzey üzerinde bir kutu şeklinde hareket ettirildi. X yönünde

Acceleration in X direction

hız ve konum X yönünde

%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)'); 

Hızlanma

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

Başlangıçtaki arsa olduğundan emin misin * aslında * ivme? Ayrıca ivme ölçerinizin örnekleme süresi nedir? X ekseninizin yanlış olduğunu varsayarak düşünüyorum (yani telefonu doğrudan 13 dakika boyunca çalmıyordunuz). Eğer olsaydın, telefonu ne sıklıkta sallıyordun? (zamanla çok az örneklemiş olabilirsiniz) – Suever

+0

Evet, ilk arsa doğrudan ivme ölçerden aldığı için hızlanır. Örnekleme periyodu, saniyenin yaklaşık her 100'ünde bir, x ekseni ise zaman dizisinin dizinleridir, böylece saniyenin her birinin 1/100'üne karşılık gelir. X ekseni etiketi hala önceki bir testten saniyeler gösteriyor - özür dileriz. –

+0

Telefonu sallarken döndürmediğinizden emin misiniz?İvmeölçer sabit bir eksen boyunca ölçülür ve telefonu döndürürseniz, bu koordinat çerçevesindeki x ekseni örnekleme pencerenizde sabit değildir (toprakla sabitlenmiş çerçeveye göre). – mikkola

cevap

1

Ne görüyorsanız zaman sürüklenme sonucudur. Ölçtüğünüz ivmeölçer okumalarının her zaman noktasında çok küçük bir hataya (dErr) sahip olduğunu varsayalım. Bu değerleri hız almak için bütünleştirdiğinizde, her zaman noktasında hata bir faktör t ile çarpılacaktır. Pozisyon almak için ikinci kez entegrasyon, orijinal hatanın t^2 faktörü ile çarpılmasına neden olur. Bu nedenle, her zaman noktasında hata, dErr (t) * t^2'de çoğalır.

Pozisyon için iyi bir tahmin elde edebilmek için, konum hakkında önceden bilgi eklemeyi deneyebilirsiniz, ancak muhtemelen bir ivmeölçer ve jiroskop verileri kombinasyonunu kullanmak zorunda kalacaktır. Kalman Filtrelerine de bakmak zorunda kalabilirsiniz. İşte

bir Google Tech Talk bu sorunu anlatıyor: https://youtu.be/C7JQ7Rpwn2k?t=23m33s

+0

Bu gerçek bir olay olsa da, bu OP'in sonuçlarının açıklaması değildir. Gördüğünüz gibi, masa üstü deney için sonuçlar oldukça iyi görünüyor ve sürüklenme sorununa maruz kalmıyor. OP'nin deneyi için zaman çerçevesinden çok daha fazla sapma hatası biriktirmek daha uzun sürer. – gariepy

+1

Ben zaten bir android saat ivmeölçer değerleri kullanarak konum tahmin etmeye çalıştığım böyle bir sorun üzerinde çalıştım. Sensörler, iyi bir konum tahmini sağlamak için yeterince doğru değildir ve kısa zaman diliminde sürüklenme hataları eklenir. İşte bu konuyla ilgili başka bir gönderi: http://electronics.stackexchange.com/questions/156192/accelerometer-double-integration-error –

+0

İlginç ... bu yazıda, yerçekimiyle ilgili olarak da Mıkkola tarafından yapılan iyi bir nokta. ivme bileşeni. – gariepy