卡尔曼滤波器原理和matlab实现

项目最近正好用上kalman滤波器,故整理一下kalman滤波器相关资料,网上有很多详细的kalman资料,参考如下:
1、https://zhuanlan.zhihu.com/p/34656822
2、https://blog.csdn.net/m0_37953670/article/details/89528002
由于项目处理的是一维信号,过滤噪点,故上面2篇文献足够完成项目

以其中的一篇参考资料为例:
模型
卡尔曼滤波器的递归过程:

  1. 估计时刻k 的状态:
    X(k) = AX(k-1) + Bu(k)
    这里, u(k) 是系统输入,在项目中,一维输入信号A=1

  2. 计算误差相关矩阵P, 度量估计值的精确程度:
    P(k) = A*P(k-1)*A’+ Q
    这里, Q = E{ Wj^2 } 是系统噪声的协方差阵,即系统框图中的Wj的协方差阵, Q 应该是不断变化的,为了简化,当作一个常数矩阵。

  3. 计算卡尔曼增益, 以下略去 (k), 即 P = P(k), X = X(k):
    K = P C’ (C * P * C’ + R) -1
    这里 R = E{ Vj^2 }, 是测量噪声的协方差(阵), 即系统框图中的 Vj 的协方差, 为了简化,也当作一个常数矩阵。由于我们的系统一般是单输入单输出,所以 R是一个 1x1的矩阵,即一个常数,上面的公式可以简化为:
    K = P C’ / (C P * C’ + R)

  4. 状态变量反馈的误差量:
    e = Z(k) – C*X(k)
    这里的 Z(k) 是带噪声的测量,在项目中,一维输入信号C=1

  5. 更新误差相关矩阵P
    P = P – K * C * P

  6. 更新状态变量:
    X =X + Ke = X + K (Z(k) – C*X(k))

  7. 最后的输出:
    Y = C*X

%卡尔曼滤波实例
%测量房间温度,房间温度真实值为T=25度,一共测量两百个点
N=200;  T=25;  size=[N,1]; 
%取温度预测值的方差为Q=1e-3,温度传感器的测量方差为R=0.36,即我们更相信预测值,而较少相信传感器测量值。
Q=1e-3;  R=0.36;  T_mearsured=T+sqrt(R)*randn(size);
%初始时刻温度的最优估计值为T_start=22.5度,温度初始估计方差为P_start=2
T_start=22.5;  P_start=2;
T_kalman(1)=T_start;  P_kalman(1)=P_start;
%用_kalman的后缀表示最优估计值,用_pre的后缀表示预测值
for k=2:N
    %在进行温度预测时,因为温度是一个连续的状态,我们认为上一时刻的温度和当前时刻的温度相等,则有T(k)=T(k-1)。
	T_pre(k)=T_kalman(k-1); % 估计时刻k 的状态
	P_pre(k)=P_kalman(k-1)+Q; % 计算误差相关矩阵P, 度量估计值的精确程度
	K(k)=P_pre(k)/(P_pre(k)+R); % 计算卡尔曼增益
	T_kalman(k)=T_pre(k)+K(k)*(T_mearsured(k)-T_pre(k)); % 更新状态变量
	P_kalman(k)=P_pre(k)-K(k)*P_pre(k); % 更新误差相关矩阵P 
end
%画图
figure();
plot(T*ones(size),'g');
hold on
plot(T_mearsured,'b');
hold on
plot(T_kalman,'r');
legend('温度真实值','温度测量值','Kalman估计值')

kalman滤波效果
在项目上,关键的是获取到Q、R、P,这3个数据需要通过实验统计获取,

拓展研究:
3、https://blog.csdn.net/zengxiantao1994/article/details/71170728
4、https://www.mathworks.com/help/fusion/ref/trackingkf.html
5、https://www.mathworks.com/help/fusion/ug/linear-kalman-filters.html

PS:🐧号 1762016542 提供答疑咨询等

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
卡尔曼滤波器可以在MATLAB实现MATLAB提供了一些函数和工具箱来实现卡尔曼滤波器。下面是一种实现卡尔曼滤波器的示例方法: 1. 首先,定义系统模型。系统模型包括状态转移矩阵A、控制输入矩阵B、测量矩阵C和过程噪声协方差矩阵Q以及测量噪声协方差矩阵R。这些矩阵可以根据系统的特定要求进行定义。 2. 初始化卡尔曼滤波器的状态估计和协方差矩阵。初始状态估计可以通过系统的初值来设置,而初始协方差矩阵可以根据对系统的了解进行设置。 3. 在每个时间步骤中,按照以下步骤更新卡尔曼滤波器的状态估计和协方差矩阵: a. 预测步骤:根据系统模型和控制输入,使用状态转移矩阵A和控制输入矩阵B来进行状态预测。 b. 预测协方差:使用状态转移矩阵A和过程噪声协方差矩阵Q来进行协方差预测。 c. 更新步骤:根据测量值,使用测量矩阵C来更新状态估计。 d. 更新协方差:使用测量矩阵C、协方差矩阵和测量噪声协方差矩阵R来更新协方差矩阵。 e. 计算卡尔曼增益:根据预测协方差、测量矩阵C和测量噪声协方差矩阵R来计算卡尔曼增益。 f. 更新状态估计:使用卡尔曼增益和测量残差来更新状态估计。 4. 重复步骤3,直到达到所需的时间步数。 需要注意的是,以上步骤只是一种实现卡尔曼滤波器的方法,在实际应用中可能会有一些变化和调整。此外,MATLAB还提供了一些内置的函数和工具箱,例如`kalman`函数和`KalmanFilter`工具箱,可以更方便地实现和使用卡尔曼滤波器。 希望这可以帮助您实现卡尔曼滤波器MATLAB实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [卡尔曼滤波器原理讲解及其matlab实现](https://blog.csdn.net/weixin_41544435/article/details/124107741)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值