【状态估计】基于无味卡尔曼滤波模拟倾斜传感器研究(Matlab代码实现)

简介: 【状态估计】基于无味卡尔曼滤波模拟倾斜传感器研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥


🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。


⛳️座右铭:行百里者,半于九十。


📋📋📋本文目录如下:🎁🎁🎁


目录


💥1 概述


📚2 运行结果


🎉3 参考文献


🌈4 Matlab代码及讲解


💥1 概述

本文包括两部分中的第一部分:第一部分设计与仿真;第2部分实际系统实现。它旨在演示如何使用Matlab/Simulink与Rapid STM32块集和ARM Cortex-M3处理器(STM32)一起开发数字信号处理系统;使用倾斜传感器作为案例研究。它涵盖了从设计、仿真、硬件在环测试到创建独立嵌入式系统的开发过程。内容应该尽可能的简单。


在第一部分中,解释了使用Simulink进行嵌入式系统开发的动机。然后,建立了倾斜传感器系统的简化模型。


总结了卡尔曼滤波和Unscented卡尔曼滤波(UKF)理论。然后提供图形说明,以指导您完成实现Simulink模型的整个过程,以设计,模拟和评估UKF用于倾斜传感器系统的性能。


在第二部分中,提供图形说明,以指导您完成将您的设计从Simulink模型转移到基于Rapid STM32 - R1邮票板的现实世界独立倾斜传感器系统的过程。


目录:


71a26a3401bb4561afc5efbd6e42b0d9.png


从概念上讲,微控制器(uC)就像我们大多数人每天使用的个人电脑(PC)。uC与PC的不同之处在于,所有东西都是由一个小手指大小的集成电路(硅芯片)构建的,而PC可能由主板和几个附加卡组成。PC可能有大量的外设选择,如COM端口,USB, Wifi,键盘,鼠标,显示器等。uC的外设更有限,通常包括定时器,SPI, USART, i2c, ADC等。一台PC可能使用64位架构,运行在千兆赫兹的速度与数百千兆字节的硬盘和RAM。uC是8位、16位或32位,运行频率不超过几百MHz,内存只有几十或几百KB。


uC通常用于自动控制独立系统,如洗衣机、带LCD显示屏的冰箱或mp3播放器。在一辆更现代的汽车里,可能会有数百个uC;一个用于监测和控制自动燃油喷射,一个用于监测ABS,一个用于监测和控制机舱温度,等等。像个人电脑一样,要使用uC,我们需要开发程序来告诉它做什么、什么时候做以及如何做。uC编程已经从像汇编这样的低级语言发展到像c这样更流行的高级编程语言。然而,在程序正常运行之前,可能需要手工编写和调试数百或数千行代码,更不用说低级编程和设备驱动程序的调试了。


在第一部分中:


1. 解释了使用 Simulink 进行嵌入式系统开发的动机。

2. 开发了一种简化的倾斜传感器系统模型。

3. 总结了卡尔曼滤波和无迹卡尔曼滤波(UKF)理论。

4. 然后提供图形说明,指导您完成实施 Simulink 模型的整个过程,以设计、仿真和评估倾斜传感器系统 UKF 的性能。


注意:还提供了源代码,用于执行基于 Simulink 模型的蒙特卡罗模拟,以使用协方差分析评估 UKF 性能。


在第二部分中,将提供图形说明,指导您将设计从 Simulink 模型转移到基于 Rapid STM32 - R1 印章板的实际独立倾斜传感器系统的过程。


📚2 运行结果


b76b29a62c83425d9211c9427850d3c3.png

6916668582a641349f3654ca5b67de43.png

781a9f4f25d441918108d9139f815184.png


部分代码:

% Generate random seeds to drive the Band-Limited White Noise Block in
% the Accelerometer Sensor Subsystem
% the seed is picked from a uniform random variable between begin_bound and
% end_bound
RandStream.setDefaultStream(RandStream('mt19937ar','seed',sum(100*clock))); % set random seed based on clock
begin_bound = 0;
end_bound = 10000;
seed_vec = floor(begin_bound + (end_bound - begin_bound).*rand(2,final_run));
for k = 1:final_run
    seed1 = seed_vec(1,k);
    seed2 = seed_vec(2,k);
    disp(['Run' num2str(k)])
    sim('tilt_system',[start stop]); % This line of code starts and stops Simulink simulation automatically.
    if (k == 1)
        % First run
        % initialise record buffer
        true_roll_error_deg_rec = repmat(error_variance.signals(1).values(:,1),1,final_run);
        theoretical_roll_error_deg_rec = repmat(error_variance.signals(1).values(:,2),1,final_run);
        true_pitch_error_deg_rec = repmat(error_variance.signals(2).values(:,1),1,final_run);
        theoretical_pitch_error_deg_rec = repmat(error_variance.signals(2).values(:,2),1,final_run);
    else
        % Other runs
        % Import data from saved work space data
        true_roll_error_deg_rec(:,k) = error_variance.signals(1).values(:,1);
        theoretical_roll_error_deg_rec(:,k) = error_variance.signals(1).values(:,2);
        true_pitch_error_deg_rec(:,k) = error_variance.signals(2).values(:,1);
        theoretical_pitch_error_deg_rec(:,k) = error_variance.signals(2).values(:,2);
    end
end
time = error_variance.time;
mean_true_roll_error_deg = mean(true_roll_error_deg_rec,2);
mean_theoretical_roll_error_deg = mean(theoretical_roll_error_deg_rec,2);
mean_true_pitch_error_deg = mean(true_pitch_error_deg_rec,2);
mean_theoretical_pitch_error_deg = mean(theoretical_pitch_error_deg_rec,2);
std_true_roll_error_deg = std(true_roll_error_deg_rec,0,2);
std_true_pitch_error_deg = std(true_pitch_error_deg_rec,0,2);
% Plot results
subplot(2,1,1)
plot(time,mean_true_roll_error_deg,'r-',time,mean_theoretical_roll_error_deg,'b-',time,...
    std_true_roll_error_deg,'g-')
ylabel('Roll Errors (deg)'), xlabel('time (sec)')
legend('Mean errors','\surd(P_{11})','Error std')
subplot(2,1,2)
plot(time,mean_true_pitch_error_deg,'r-',time,mean_theoretical_pitch_error_deg,'b-',time,...
    std_true_pitch_error_deg,'g-')
ylabel('Pitch Errors (deg)'), xlabel('time (sec)')
legend('Mean errors','\surd(P_{22})','Error std')


🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。


[1]李开龙,胡柏青,高敬东,方轩.鲁棒四元数无味卡尔曼滤波算法在组合导航姿态估计中的应用[J].海军工程大学学报,2015,27(01):6-10.


[2]Krisada Sangpetchsong (2023). Introduction to Unscented Kalman Filtering


15e15a8ffba546d3af8ab114f026e96c.png


🌈4 Matlab代码及讲解


相关文章
|
2天前
|
算法
基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真
本项目基于梯度流的扩散映射卡尔曼滤波算法(GFDMKF),用于信号预处理的MATLAB仿真。通过设置不同噪声大小,测试滤波效果。核心代码实现数据加载、含噪信号生成、扩散映射构建及DMK滤波器应用,并展示含噪与无噪信号及滤波结果的对比图。GFDMKF结合非线性流形学习与经典卡尔曼滤波,提高对非线性高维信号的滤波和跟踪性能。 **主要步骤:** 1. 加载数据并生成含噪测量值。 2. 使用扩散映射捕捉低维流形结构。 3. 应用DMK滤波器进行状态估计。 4. 绘制不同SNR下的轨迹示例。
|
4月前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
5月前
|
算法
基于卡尔曼滤波的系统参数辨识matlab仿真
此程序采用卡尔曼滤波技术实现系统参数在线辨识,通过MATLAB 2022a仿真展现参数收敛过程、辨识误差,并比较不同信噪比下系统性能。卡尔曼滤波递归地结合历史估计与当前观测,优化状态估计。参数辨识中,系统参数被视为状态变量,通过迭代预测和更新步骤实现在线估计,有效处理了线性系统中的噪声影响。
119 12
|
7月前
|
资源调度 SoC
基于UKF无迹卡尔曼滤波的电池Soc估计matlab仿真
**摘要:** 使用MATLAB2022a,基于UKF的电池SOC估计仿真比较真实值,展示非线性滤波在电动车电池管理中的效用。电池电气模型描述电压、电流与SoC的非线性关系,UKF利用无迹变换处理非线性,通过预测和更新步骤实时估计SoC,优化状态估计。尽管UKF有效,但依赖准确模型参数。
|
8月前
|
数据可视化 算法
MATLAB Simulink 交交变流电路性能研究
MATLAB Simulink 交交变流电路性能研究
90 2
|
8月前
|
数据可视化 算法
MATLAB Simulink 直流斩波电路性能研究
MATLAB Simulink 直流斩波电路性能研究
129 1
|
8月前
|
数据可视化 算法
MATLAB Simulink 逆变电路性能研究
MATLAB Simulink 逆变电路性能研究
65 1
|
5月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
241 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
5月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
145 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
5月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
113 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码

热门文章

最新文章