💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
【IMU Kalman滤波器】9轴IMU传感器(加速度计、陀螺仪、磁力计)的卡尔曼滤波器算法研究
使用MPU9250(9轴IMU)的MATLAB扩展卡尔曼滤波器进行姿态估计和动画绘图
本文是一个用于9轴IMU传感器(加速度计、陀螺仪、磁力计)的卡尔曼滤波器算法。
您可以看到图形化动画的IMU传感器数据。
动画图
时间线
硬铁偏差补偿
角速度偏差补偿
基于四元数动力学的扩展卡尔曼滤波器
这篇文章专注于研究针对9轴IMU传感器(包括加速度计、陀螺仪和磁力计)的卡尔曼滤波器算法。我们选择了MPU9250作为研究对象,并借助MATLAB的扩展功能,实现了对姿态的准确估计以及动画的绘制。
在这篇博客中,我们深入探讨了卡尔曼滤波器在处理9轴IMU传感器数据中的应用。我们通过图形化动画展示了传感器数据的变化趋势,包括时间线、硬铁偏差补偿、角速度偏差补偿等关键步骤。通过这些动画,读者可以清晰地了解每个处理步骤对最终姿态估计的影响。
特别地,我们介绍了基于四元数动力学的扩展卡尔曼滤波器,这是一种高效且精确的算法,能够在考虑到传感器动力学特性的同时,有效地滤除噪声和误差,从而实现对姿态的精准估计。通过详细的实验结果分析,我们展示了该算法在不同场景下的稳健性和准确性。
总的来说,本文不仅提供了对于9轴IMU传感器卡尔曼滤波器算法的深入理解,同时也为工程应用提供了可靠的参考,尤其是在需要精确姿态估计的领域,如航空航天、导航系统等方面具有重要的指导意义。
📚2 运行结果
部分代码:
figure()
P1=plot(DATA_SI(10,:), PhiSaved, 'r');
hold on
P2=plot(DATA_SI(10,:), ThetaSaved, 'b');
P3=plot(DATA_SI(10,:), PsiSaved, 'g');
refline([0 0])
title('Euler Angle (degree)')
Timeline_1 = line('XData',x,'YData',y);
TimeValue_1= xlabel('');
legend([P1 P2 P3],{'Phi', 'Theta', 'Psi'},'Location','northwest','AutoUpdate','off');
axis([0 DATA_SI(10,Nsamples) -300 300])
figure()
subplot(1,3,1)
plot(DATA_SI(10,:),DATA_SI(1,:),'r',DATA_SI(10,:),DATA_SI(2,:),'g',DATA_SI(10,:),DATA_SI(3,:),'b');
refline([0 0])
title('Acceleration (m/s^2)');
Timeline_2 = line('XData',x,'YData',y);
TimeValue_2= xlabel('');
legend({'AccX', 'AccY', 'AccZ'},'Location','northwest','AutoUpdate','off');
axis([0 DATA_SI(10,Nsamples) -20 20])
subplot(1,3,2)
plot(DATA_SI(10,:),DATA_SI(4,:),'r',DATA_SI(10,:),DATA_SI(5,:),'g',DATA_SI(10,:),DATA_SI(6,:),'b');
refline([0 0])
title('Angular velocity (rad/s)')
Timeline_3 = line('XData',x,'YData',y);
TimeValue_3= xlabel('');
legend({'GyroX', 'GyroY', 'GyroZ'},'Location','northwest','AutoUpdate','off');
axis([0 DATA_SI(10,Nsamples) -3 3])
subplot(1,3,3)
plot(DATA_SI(10,:),DATA_SI(7,:),'r',DATA_SI(10,:),DATA_SI(8,:),'g',DATA_SI(10,:),DATA_SI(9,:),'b');
refline([0 0])
title('Magnetic flux density (uT)')
Timeline_4 = line('XData',x,'YData',y);
TimeValue_4= xlabel('');
legend({'MagX', 'MagY', 'MagZ'},'Location','northwest','AutoUpdate','off');
axis([0 DATA_SI(10,Nsamples) -40 40])
%% Graphical Plot & Dynamic Plot
%set IMU Object's vertex
Cuboid_1=[-2,-3,-0.5];
Cuboid_2=[2,-3,-0.5];
Cuboid_3=[2,3,-0.5];
Cuboid_4=[-2,3,-0.5];
Cuboid_5=[-2,-3,0.5];
Cuboid_6=[2,-3,0.5];
Cuboid_7=[2,3,0.5];
Cuboid_8=[-2,3,0.5];
Cuboid=[Cuboid_1; Cuboid_2; Cuboid_3; Cuboid_4; Cuboid_5; Cuboid_6; Cuboid_7; Cuboid_8];
% ?
fac = [1 2 6 5;2 3 7 6;3 4 8 7;4 1 5 8;1 2 3 4;5 6 7 8];
%Plot Object
figure()
view(3)
Obejct_IMU = patch('Faces', fac, 'Vertices', [0, 0, 0]);
Obejct_IMU.FaceColor = 'g';
axis([-5 5 -5 5 -5 5])
title('IMU state')
Realtime = xlabel(' ');
%Animate
for k=1:Nsamples-1
%Rotation matrix for vertex
Rz = [cosd(PsiSaved(k)) -sind(PsiSaved(k)) 0; sind(PsiSaved(k)) cosd(PsiSaved(k)) 0; 0 0 1];
Ry = [cosd(ThetaSaved(k)) 0 sind(ThetaSaved(k)); 0 1 0; -sind(ThetaSaved(k)) 0 cosd(ThetaSaved(k))];
Rx = [1 0 0; 0 cosd(PhiSaved(k)) -sind(PhiSaved(k)); 0 sind(PhiSaved(k)) cosd(PhiSaved(k))];
dt=(DATA_SI(10,k+1)-DATA_SI(10,k));
for j=1:8
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。
[1]王晓初,李宾,刘玉县,等.一种基于改进卡尔曼滤波的姿态解算算法[J].科学技术与工程, 2019, 19(24):7.DOI:CNKI:SUN:KXJS.0.2019-24-071.
[2]蔡阳,胡杰.基于卡尔曼滤波和互补滤波的AHRS系统研究[J].电脑知识与技术:学术版, 2021.
[3]陆永杰.基于多传感器融合的室外室内连续定位系统研究[D].南京邮电大学[2024-05-09].