为什么要滤波?
因为利用mpu6050(角速度传感器和加速度传感器)测量得到数据被噪声污染,为了得到稳定可靠的数据从而要进行滤波。
常见的滤波算法有很多种,根据其优缺点分析选择了卡尔曼滤波算法。
什么是卡尔曼滤波
卡尔曼滤波即属于一种线性最小方差估计法。即使估计所得值与实际值的均方误差达到最小,且估计具有线性形式。
卡尔曼滤波的基本原理是什么
假设对同一个目标有两组观测数据,这两组数据服从高斯分布,即:
X
A
∼
N
(
μ
A
,
σ
A
2
)
X
B
∼
N
(
μ
B
,
σ
B
2
)
X_{A} \sim N \left ( \mu _{A},\sigma ^{2} _{A} \right ) \\ X_{B} \sim N \left ( \mu _{B},\sigma ^{2} _{B} \right )
XA∼N(μA,σA2)XB∼N(μB,σB2)
对这两组数据进行加权的线性组合,即可得到更加准确的观测数据,即:
X
^
=
k
X
A
+
(
1
−
k
)
X
B
k
∈
[
0
,
1
]
X
^
∼
N
(
k
μ
A
+
(
1
−
k
)
μ
B
,
k
2
σ
A
2
+
(
1
−
k
)
2
σ
B
2
)
\hat{X}= kX_{A} + \left ( 1-k\right )X_{B} \qquad k\in \left [ 0,1 \right ] \\ \hat{X}\sim N \left (k \mu _{A} + \left ( 1-k\right ) \mu _{B},k^{2}\sigma ^{2} _{A}+\left(1-k\right )^{2}\sigma ^{2} _{B} \right )
X^=kXA+(1−k)XBk∈[0,1]X^∼N(kμA+(1−k)μB,k2σA2+(1−k)2σB2)
令组合后的数据方差最小,即不确定性最小,可得:
k
=
σ
B
2
σ
A
2
+
σ
B
2
X
^
∼
N
(
σ
B
2
σ
A
2
+
σ
B
2
μ
A
+
σ
A
2
σ
A
2
+
σ
B
2
μ
B
,
σ
A
2
σ
B
2
σ
A
2
+
σ
B
2
)
k=\frac{\sigma ^{2}_{B}}{\sigma ^{2}_{A}+\sigma ^{2}_{B}} \\ \hat{X}\sim N \left (\frac{\sigma ^{2}_{B}}{\sigma ^{2}_{A}+\sigma ^{2}_{B}} \mu _{A} + \frac{\sigma ^{2}_{A}}{\sigma ^{2}_{A}+\sigma ^{2}_{B}} \mu _{B},\frac{\sigma ^{2}_{A}\sigma ^{2}_{B}}{\sigma ^{2}_{A}+\sigma ^{2}_{B}} \right )
k=σA2+σB2σB2X^∼N(σA2+σB2σB2μA+σA2+σB2σA2μB,σA2+σB2σA2σB2)
最终整理如下:
X
^
∼
N
(
μ
A
+
K
g
(
μ
B
−
μ
A
)
,
(
1
−
K
g
)
σ
A
2
)
增益:
K
g
=
σ
A
2
σ
A
2
+
σ
B
2
新息:
μ
B
−
μ
A
\widehat{X} \sim N\left(\mu_{A}+K_{g}\left(\mu_{B}-\mu_{A}\right),\left(1-K_{g}\right) \sigma_{A}^{2}\right)\\ 增益:K_{g}=\frac{\sigma ^{2}_{A}}{\sigma ^{2}_{A}+\sigma ^{2}_{B}} \\ 新息:\mu_{B}-\mu_{A}
X
∼N(μA+Kg(μB−μA),(1−Kg)σA2)增益:Kg=σA2+σB2σA2新息:μB−μA
那么,如何在只有一组数据的情况下,运用最小方差线性估计呢?
假设有一组不断补充更新的数据a,b,c,d,e……对其进行不断地迭代估计,每测出一个新的数据,就将新的数据与之前的估计结果值进行最小方差线性估计。
最优估计
值
n
=
最优估计
值
n
−
1
+
K
n
(
测量
值
n
−
最优估计
值
n
−
1
)
卡尔曼增益
K
n
=
最优估计值误
差
n
−
1
最优估计值误
差
n
−
1
+
测量值误
差
n
最优估计值误
差
n
−
1
=
(
1
−
K
n
−
1
)
最优估计值误
差
n
−
2
最优估计值_{n}=最优估计值_{n-1} +K _{n}\left(测量值_{n}-最优估计值_{n-1}\right)\\ 卡尔曼增益K _{n}=\frac{最优估计值误差_{n-1}}{最优估计值误差_{n-1}+测量值误差_{n}}\\ 最优估计值误差_{n-1}=\left(1-K_{n-1}\right)最优估计值误差_{n-2}
最优估计值n=最优估计值n−1+Kn(测量值n−最优估计值n−1)卡尔曼增益Kn=最优估计值误差n−1+测量值误差n最优估计值误差n−1最优估计值误差n−1=(1−Kn−1)最优估计值误差n−2
假设有个小孩每个月都会受到一笔零用钱。他每收到一笔钱,都会对他收到的下一笔钱进行预测,而收到下一笔钱后,他会根据自己的预测结果和实际结果进行对比,从而调整对于预测结果的信赖程度。大致思路如此,不过真正的算法过程更为严谨。
卡尔曼滤波代码实现
写的比较随意,以后有时间再继续补充