利用加速度求解位置的算法——三轴传感器对比

早晨看到了一个加速度求法,原文章地址在这里:

利用加速度求解位置的算法——三轴传感器

里面主要讲积分后的累计误差中的采样误差,

 

积分的值可以约等于区域面积之和。
如果采样时间趋近于0,那么结论将是正确的。但在实际中,将会产生如下错误,在处理的过程中,这个误差将会一直累积。
Ashampoo_Snap_2015.03.27_23h50m46s_004_.png           
这些错误称为采样损失。为了减少这些错误,我们再做进一步的假设。结果区域能够看成由两块小的区域的组合:
Ashampoo_Snap_2015.03.27_23h57m54s_005_.png
区域1是前一次采样的值(方形),区域2是一个三角形,是前一次采样和当前采样之差的一半。
 
最后得到一个近似公式:
Ashampoo_Snap_2015.03.28_00h06m26s_006_.png
注意:这里的信号应该采用当前周期信号,即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。

 

参考资料:

【翻译】利用加速度求解位置的算法——三轴传感器

posted @ 2017-12-11 13:11  大G霸  阅读(2409)  评论(0编辑  收藏  举报