早晨看到了一个加速度求法,原文章地址在这里:
利用加速度求解位置的算法——三轴传感器
里面主要讲积分后的累计误差中的采样误差,
积分的值可以约等于区域面积之和。
如果采样时间趋近于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。
参考资料: