早晨看到了一個加速度求法,原文章地址在這里:
利用加速度求解位置的算法——三軸傳感器
里面主要講積分后的累計誤差中的采樣誤差,
積分的值可以約等於區域面積之和。
如果采樣時間趨近於0,那么結論將是正確的。但在實際中,將會產生如下錯誤,在處理的過程中,這個誤差將會一直累積。

這些錯誤稱為采樣損失。為了減少這些錯誤,我們再做進一步的假設。結果區域能夠看成由兩塊小的區域的組合:

區域1是前一次采樣的值(方形),區域2是一個三角形,是前一次采樣和當前采樣之差的一半。
最后得到一個近似公式:

注意:這里的信號應該采用當前周期信號,即A(n) = S(n) + abs(S(n)-S(n-1))/2 如果使用A(n) = S(n-1) + abs(S(n)-S(n-1))/2,會出現明顯的信號延時現象。
當T=1時,就是一種移動均值的濾波處理了。
我們的采樣周期只要足夠小,我們的求解就越貼近我們的采樣樣本,反過來采樣的樣本間隔越大,我們的誤差越大,相對應的處理出來的信號延時也會越明顯。
當T為0.1時,

基本看不出區別,但是隨着時間的推移,數據出現的大幅度的漂移。
而在T最小,采樣效果越好,數據越靠近真實情況。
這樣的話,當采樣周期足夠小的時候,采樣的數據的采樣誤差就會被彌補啦。
clc; clear; load('walk3.1.txt'); y = walk3_1(:,6)/8192; %y = signal; velocity =[]; for i=1:1194 velocity =[velocity;(sum(y(1:i)))]; end distance = []; for i=1:1194 distance =[distance;(sum(velocity(1:i)))]; end figure; hold on plot(y) y1 = []; y1(1,:) = y(1,:); for i = 2:1194 y1 = [y1;(y(i,:)+abs(y(i,:)-y(i-1,:))*0.1/2)]; end plot(y1) y2 = []; y2(1,:) = y(1,:); for i = 2:1194 y2 = [y2;(y(i,:)+(y(i,:)-y(i-1,:))*0.5/2)]; end %plot(y2) y3 = []; y3(1,:) = y(1,:); for i = 2:1194 y3 = [y3;(y(i,:)+abs(y(i,:)-y(i-1,:))*1/2)]; end %plot(y3) velocity1=[]; for i=1:1194 velocity1 =[velocity1;(sum(y(1:i)))]; end distance1 = []; for i=1:1194 distance1 =[distance1;(sum(velocity1(1:i)))]; end velocity2=[]; for i=1:1194 velocity2 =[velocity2;(sum(y1(1:i)))]; end distance2 = []; for i=1:1194 distance2 =[distance2;(sum(velocity2(1:i)))]; end velocity3=[]; for i=1:1194 velocity3 =[velocity3;(sum(y3(1:i)))]; end distance3 = []; for i=1:1194 distance3 =[distance3;(sum(velocity3(1:i)))]; end figure; subplot(2,1,1) hold on plot(velocity1,'p') plot(velocity2) plot(velocity3,'--') subplot(2,1,2) hold on plot(distance1,'p') plot(distance2) plot(distance3,'--')
這里對比的數據采集自MPU6050。
參考資料: