2.一维卡尔曼滤波(动态模型)

1.一维卡尔曼滤波(恒定的动态模型)
2.一维卡尔曼滤波(动态模型)
3.二维-卡尔曼滤波算法

1. 使用场景

测量的是1维的数据,只有一个测量值(例如:电压,电流,温湿度采集)----采集的数据是随机的
和测量硬币直径不同-----硬币的直径是固定的

2. 流程图

在这里插入图片描述
下面是一维的卡尔曼滤波示例,由于一维的特殊性,有些变量是1或者没有,导致公式省略了好多,
建议你先去研究一下3.二维-卡尔曼滤波算法,弄明白了再回来看一维的,就简单明了了

1. 先验估计计算

📌 固定公式 :
X k = A ⋅ X k − 1 + B ⋅ U k + W k \displaystyle{{X}_{k}}=A⋅{{X}_{k-1}}+B⋅{{U}_{k}}+{{W}_{k}} Xk=AXk1+BUk+Wk

X k : 是状态向量 \displaystyle {{X}_{k}} : \text{是状态向量} Xk:是状态向量
A = [ 1 ] : 是状态转移矩阵 \displaystyle {A}=\left [{\begin{matrix}1\end{matrix}}\right ]: \text{是状态转移矩阵} A=[1]:是状态转移矩阵
B = [ 0 ] : 是输入矩阵 ( 没有 ) \displaystyle {B}=\left [{\begin{matrix}0\end{matrix}}\right ]:是输入矩阵(没有) B=[0]:是输入矩阵(没有)
U k : 是控制输入向量 ( 没有 ) \displaystyle {{U}_{k}}:是控制输入向量(没有) Uk:是控制输入向量(没有)
W k : 是过程噪声向量 ( 省略 ) \displaystyle {{W}_{k}}:是过程噪声向量(省略) Wk:是过程噪声向量(省略)

📌 状态方程就可以写作:
X k = A ⋅ X k − 1 \displaystyle{{X}_{k}}=A⋅{{X}_{k-1}} Xk=AXk1
X k = X k − 1 \displaystyle{{X}_{k}}={{X}_{k-1}} Xk=Xk1 //代码1

2. 预测协方差矩阵

📌 固定公式 :
P k = A ⋅ P k − 1 ⋅ A T + Q = P k − 1 + Q \displaystyle{{P}_{k}}=A⋅{{P}_{k-1}}⋅{{A}^{T}}+Q={{P}_{k-1}}+Q Pk=APk1AT+Q=Pk1+Q

Q : 过程噪声协方差矩阵 , 需要自定义好 \displaystyle {Q}:过程噪声协方差矩阵,需要自定义好 Q:过程噪声协方差矩阵,需要自定义好

static float Q = 0.01; // 代码01 过程噪声协方差矩阵

📌
P k = P k − 1 + Q \displaystyle{{P}_{k}}={{P}_{k-1}}+Q Pk=Pk1+Q //代码2

在这里插入图片描述
在这里插入图片描述

3.建立测量方程

📌 固定公式 :
Z k = H X k + V k \displaystyle{{Z}_{k}}=H{{X}_{k}}+{{V}_{k}} Zk=HXk+Vk

📌
Z k = T e m p ( 传感器获取到的温度 ) / / 代码 3 \displaystyle{{Z}_{k}}=Temp (传感器获取到的温度) //代码3 Zk=Temp(传感器获取到的温度)//代码3

4.计算卡尔曼增益

📌 固定公式 :
K g ( k ) = P k − 1 ⋅ H T H P k − 1 ⋅ H T + R = P k − 1 P k − 1 + R \displaystyle{{K}_{g(k)}}=\frac{{{P}_{k-1}}⋅{{H}^{T}}}{H{{P}_{k-1}}⋅{{H}^{T}}+R} = \frac{{{P}_{k-1}}}{{{P}_{k-1}}+R} Kg(k)=HPk1HT+RPk1HT=Pk1+RPk1

P k − 1 : 是先验状态协方差 ( P k 的初始值 = 1 ) \displaystyle {{P}_{k-1}}:是先验状态协方差({{P}_{k}}的初始值=1) Pk1:是先验状态协方差(Pk的初始值=1)

H : 是测量矩阵 [ 1 ] \displaystyle {H}:是测量矩阵\left [{\begin{matrix}1\end{matrix}}\right ] H:是测量矩阵[1]

R : 是测量噪声的协方差 , 需要自定义好 \displaystyle {R}:是测量噪声的协方差,需要自定义好 R:是测量噪声的协方差,需要自定义好

static float R = 0.05;  // 代码02 测量噪声的协方差

📌
K g ( k ) = P k − 1 P k − 1 + R \displaystyle{{K}_{g(k)}}=\frac{{{P}_{k-1}}}{{{P}_{k-1}}+R} Kg(k)=Pk1+RPk1 //代码4

R=0时,卡尔曼滤波的曲线就会 和 测量值 Z k \displaystyle {{Z}_{k}} Zk 重合
在这里插入图片描述

5.计算当前最优估计值

📌 固定公式 :
X k = X k − 1 + K g ( k ) ⋅ ( Z k − H ⋅ X k − 1 ) \displaystyle{{X}_{k}}={{X}_{k-1}}+{{K}_{g(k)}}⋅({{Z}_{k}}-H⋅{{X}_{k-1}}) Xk=Xk1+Kg(k)(ZkHXk1)

H = 1,所以

📌
X k = X k − 1 + K g ( k ) ⋅ ( Z k − X k − 1 ) \displaystyle{{X}_{k}}={{X}_{k-1}}+{{K}_{g(k)}}⋅({{Z}_{k}}-{{X}_{k-1}}) Xk=Xk1+Kg(k)(ZkXk1) //代码5

6.更新协方差矩阵

📌 固定公式 :
P k = [ I − K g ( k ) ⋅ H ] ⋅ P k − 1 \displaystyle{{P}_{k}}=[I-{{K}_{g(k)}}⋅H]⋅{{P}_{k-1}} Pk=[IKg(k)H]Pk1

I \displaystyle I I:单位矩阵 [ 1 ] \displaystyle\left [{\begin{matrix}1\end{matrix}}\right ] [1]

📌
P k = [ 1 − K g ( k ) ] ⋅ P k − 1 \displaystyle{{P}_{k}}=[1-{{K}_{g(k)}}]⋅{{P}_{k-1}} Pk=[1Kg(k)]Pk1 //代码6

7.实现代码

/**
 * @brief 卡尔曼滤波
 *
 * @param Zk 测量值
 * @return float 输出值
 */
float Kalman_filtering(float Zk)
{

    static float Q = 0.001; // 代码01 过程噪声协方差矩阵
    static float R = 0.05;  // 代码02 测量噪声的协方差

    static float Pk = 1; //
    static float Kg = 1; //
    static float Xk = 0; //

    // 1.先验估计计算
    // Xk = X(k-1); // 代码1

    // 2.预测协方差矩阵
    Pk = Pk + Q; // 代码2

    // 3.建立测量方程
    // Zk = Zk; // 代码3

    // 4.计算卡尔曼增益
    Kg = Pk / (Pk + R); // 代码4

    // 5.计算当前最优估计值
    Xk = Xk + Kg * (Zk - Xk); // 代码5

    // 6.更新协方差矩阵
    Pk = (1 - Kg) * Pk; // 代码6

    return Xk;
}

卡尔曼滤波需要我们来调教,分别调节下面的参数,会获取到不同的滤波效果

static float Q = 0.001; // 代码01 过程噪声协方差矩阵
static float R = 0.05;  // 代码02 测量噪声的协方差

注意:例如一个温度采集,这个温度是随机变化的,和时间变化没有关系,所以上面的计算中并没有使用到dt变量(采样时间间隔=100ms,500ms,1000ms…),但是这个时间间隔对参数迭代会有影响,因此dt同样会影响到滤波效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值