卡尔曼滤波笔记
笔记整理,视频链接 https://www.bilibili.com/video/BV1Rh41117MT?spm_id_from=333.788.videopod.episodes&vd_source=3a22043a6221908dd30039299c0c4976&p=4
1 基础概念
-
以超声波传感器为例子,横坐标为时间,纵坐标为距离
-
适用系统:线性高斯系统
- 线性:两个特性
- 叠加性 : y = a*x1 + b*x2
- 齐次性: ky<-----kx
- 高斯:噪声满足正态分布
-
宏观意义:滤波即是加权
理想状态: 信号x1 + 噪声*0
低 * 1 高 * 0 称之为低通滤波
估计值 *() 观测值*() 称之为卡尔曼滤波
|__________________________________________________________________|
修正
2 方程
状态空间表达式:
状态方程:
xk=Axk−1+Buk+Wk
x_k = Ax_{k-1} + B_{uk} + W_k\\
xk=Axk−1+Buk+Wk
x_k 当前状态的状态值
x_k-1 上一个时刻的状态值
uk 输入,给到x_k的输入
W_k 过程噪声
A 当前状态上一时刻的值 状态协方差
B 控制矩阵
例子 : 车从p1 到 p2 , 给到输入 vel
p2 = 1*p1 + dt * vel + wk
wk 相当于 摩擦,顺风,逆风,这些东西
观测方程:
yk=Cxk+Vk
y_k = Cx_k + V_k
yk=Cxk+Vk
y_k 观测量
Vk 观测噪声
例子:
火炉对水加温,温度传感器,xk : 水温的状态,yk : 水温的值
观测 : yk = 1 * xk + vk
状态 : xk = 1*xk-1 + dt + wk
dt : 温度是每时刻变化的
高斯分布
1.直观图解
- 一维 均值 方差
- 二维 投影到x轴 y轴 都是正态分布
- 三维 每个轴都符合高斯分布
参数分析
Wk∈N(0,Qk)Vk∈N(0,Rk) W_k \in N(0,Q_k)\\ V_k \in N(0,R_k)\\ Wk∈N(0,Qk)Vk∈N(0,Rk)
Wk ,Vk符合正态分布,均值为0 方差为Qk
通称为高斯白噪声
例子:
Vk Rk 定义
GPS ----> Position
1000m+−δmVk=δm
1000m +- \delta m \quad \quad \quad V_k = \delta m \\
1000m+−δmVk=δm
方差为1m噪声
Rk=1m
R_k = 1m
Rk=1m
Wk Rk
车在行驶,顺风的力
5m/s+−δm/sWk=δm/s
5m/s +- \delta m/s \quad\quad\quad W_k = \delta m/s
5m/s+−δm/sWk=δm/s
方差为1m/s
Qk=1m/s
Q_k= 1m/s
Qk=1m/s
2.方差
-
一维的方差 : 状态是一个值
-
Qk Rk
-
状态的方差 估计值的方差,估计值就是状态值,车跑了10m,由于噪声的影响,不是10m 有一个噪声, 10m+wk 本身符合正态分布,所以估计值就有一个方差
-
-
二维协方差
xt−=[xt1xt2]Wk1Wk2Cov(xt1,xt2)=[cov(x1,x1)cov(x1,x2)cov(x2,x1)cov(x2,x2)] x_{t-} = \begin{bmatrix} x_{t1}\\ x_{t2} \end{bmatrix}\\ W_{k1}\\ W_{k2}\\ Cov(x_{t1},x_{t2}) = \begin{bmatrix} cov(x1,x1) & cov(x1,x2)\\ cov(x2,x1) & cov(x2,x2) \end{bmatrix}\\ xt−=[xt1xt2]Wk1Wk2Cov(xt1,xt2)=[cov(x1,x1)cov(x2,x1)cov(x1,x2)cov(x2,x2)]
多维的状态方差也一样,就是维数增多了
3.超参数
Q,R ~ PID
Q : 过程噪声的方差
R : 观测噪声的方差
4**.卡尔曼直观图解**

没有- 表示的是最优估计值,也叫做修正值,有-先验估计值
x_k-1 上一时刻的最优估计值
x_k 基于上一时刻估计出来的当前时刻的值
yk 当前时刻的观测值

当前的估计值,是由 先验估计 和当前的观测值,取公共的部分,得到的
3 公式
1**.卡尔曼公式理解**
实现过程:
使用上一次的最优结果预测当前的值(先验估计)
同时使用观测值(传感器传回来的那个值)修正当前值(先验估计),得到最优结果
预测:
x^k−=Fx^k−1+Buk−1P^k−=F∗Pk−1∗FT+Q \hat{x}^{-}_{k} = F\hat{x}_{k-1} + Bu_{k-1}\\\\
\hat{P}^{-}_{k} = F*P_{k-1}*F^T + Q\\\\
x^k−=Fx^k−1+Buk−1P^k−=F∗Pk−1∗FT+Q
更新:
Kk=P^−∗HkT∗(Hk∗P^−∗HkT+R^−)−1x^k=x^k−+Kk(zk−Hx^k−)Pk=(I−Kk∗H)Pk−
K_{k} =\hat{P}^{-}*H_{k}^T*(H_{k}*\hat{P}^{-}*H_{k}^T + \hat{R}^{-})^{-1}\\\\
\hat{x}_{k} = \hat{x}^{-}_{k} + K_{k}(z_{k} - H\hat{x}^{-}_{k})\\\\
P_{k} = (I - K_{k}*H)P_{k}^{-}
Kk=P^−∗HkT∗(Hk∗P^−∗HkT+R^−)−1x^k=x^k−+Kk(zk−Hx^k−)Pk=(I−Kk∗H)Pk−
例子:
车 ,有两个状态 p位置 v速度
xt=[PV]
x_t = \begin{bmatrix}
P\\
V\\
\end{bmatrix}\\ xt=[PV]
运动模型 : 匀加速直线运动
预测模型:
Pi=Pi−1+Vi−1∗δt+a2∗δt2Vi=Vi−1+a∗δt[PiVi]=[1δt01]∗[Pi−1Vi−1]+[12∗δt2δt]∗ai=x^t−=F∗x^t−1+B∗ut−1\ P_i = P_{i-1} + V_{i-1}*\delta t + \frac{a}{2}*\delta t^2\\ V_i = V_{i-1} + a*\delta t\\\\ \begin{bmatrix} P_i\\ V_i\\ \end{bmatrix} = \begin{bmatrix} 1&\delta t\\ 0&1\\ \end{bmatrix} * \begin{bmatrix} P_{i-1}\\ V_{i-1}\\ \end{bmatrix} + \begin{bmatrix} \frac{1}{2}*\delta t^2\\ \delta t\\ \end{bmatrix} * a_i\\\\ =\hat{x}^{-}_{t} = F* \hat{x}_{t-1} + B * u_{t-1} Pi=Pi−1+Vi−1∗δt+2a∗δt2Vi=Vi−1+a∗δt[PiVi]=[10δt1]∗[Pi−1Vi−1]+[21∗δt2δt]∗ai=x^t−=F∗x^t−1+B∗ut−1
先验估计:
x^t−=F∗x^t−1+B∗ut−1+Wk \hat{x}^{-}_{t} = F* \hat{x}_{t-1} + B * u_{t-1} + W_k x^t−=F∗x^t−1+B∗ut−1+Wk
先验估计协方差:
P^t−=F∗Pt−1∗FT+Q
\hat{P}^{-}_{t} = F*P_{t-1}*F^T + Q\\\\
P^t−=F∗Pt−1∗FT+Q
F 状态转移矩阵
基础知识:
cov(x,x)=Var(x)cov(Ax,Ax)=A∗cov(x,x)∗ATcov(Ax+k,Ax+k)=A∗cov(x,x)∗AT
cov(x,x) = Var(x)\\
cov(Ax,Ax) = A*cov(x,x)*A^T\\
cov(Ax + k,Ax+k) = A*cov(x,x)*A^T\\
cov(x,x)=Var(x)cov(Ax,Ax)=A∗cov(x,x)∗ATcov(Ax+k,Ax+k)=A∗cov(x,x)∗AT
所以
cov(x^t−,x^t−)=cov(F∗x^t−1+B∗ut−1+Wk,F∗x^t−1+B∗ut−1+Wk)=F∗cov(x^t−1,x^t−1)∗FT+cov(Wk,Wk)=F∗Pt−1∗FT+Q
cov(\hat{x}^{-}_{t},\hat{x}^{-}_{t}) = cov(F* \hat{x}_{t-1} + B * u_{t-1} + W_k,F* \hat{x}_{t-1} + B * u_{t-1} + W_k)\\
= F*cov(\hat{x}_{t-1},\hat{x}_{t-1})*F^T +cov(W_k,W_k)\\
= F*P_{t-1}*F^T + Q
cov(x^t−,x^t−)=cov(F∗x^t−1+B∗ut−1+Wk,F∗x^t−1+B∗ut−1+Wk)=F∗cov(x^t−1,x^t−1)∗FT+cov(Wk,Wk)=F∗Pt−1∗FT+Q
测量模型:
Zp=Pt+ΔPtZv=0[ZpZv]=[10]∗[PtVt]+[10]∗[ΔPtΔVt]=Zt=[1,0]xt+ΔPt=H∗xt+v
Z_p = P_t + \Delta P_t\\
Z_v = 0\\\\
\begin{bmatrix}
Z_p\\
Z_v\\
\end{bmatrix}
= \begin{bmatrix}
1&0
\end{bmatrix} *
\begin{bmatrix}
P_{t}\\
V_{t}\\
\end{bmatrix} +
\begin{bmatrix}
1&0
\end{bmatrix} *
\begin{bmatrix}
\Delta P_{t}\\
\Delta V_{t}\\
\end{bmatrix}\\\\
= Z_t = [1,0]x_t + \Delta P_t\\
= H * x_t + v\\
Zp=Pt+ΔPtZv=0[ZpZv]=[10]∗[PtVt]+[10]∗[ΔPtΔVt]=Zt=[1,0]xt+ΔPt=H∗xt+v
测量方程:
Zt=H∗xt+v
Z_t = H * x_t + v\\
Zt=H∗xt+v
Z_t 的维数不一定跟 x_t 相同,比如z_v 为0 ,所以可以只写z_p
修正估计:
x^t=x^t−+Kk(zt−Hx^t−)
\hat{x}_{t} = \hat{x}^{-}_{t} + K_{k}(z_{t} - H\hat{x}^{-}_{t})\\\\
x^t=x^t−+Kk(zt−Hx^t−)
最终滤波结果
zt−Hx^t−z_{t} - H\hat{x}^{-}_{t}zt−Hx^t− 测量和预测的差值
更新卡尔曼增益:
Kk=P^−∗HkT∗(Hk∗P^−∗HkT+R^−)−1=Pt^−∗(P^t−+R^−)−1 =(Pt−1+Q)∗(Pt−1+Q+R)−1
K_{k} =\hat{P}^{-}*H_{k}^T*(H_{k}*\hat{P}^{-}*H_{k}^T + \hat{R}^{-})^{-1}\\\\
= \hat{P_t}^{-}*(\hat{P}_t^{-} + \hat{R}^{-})^{-1}\\\
= (P_{t-1} + Q) * (P_{t-1} + Q + R)^{-1}
Kk=P^−∗HkT∗(Hk∗P^−∗HkT+R^−)−1=Pt^−∗(P^t−+R^−)−1 =(Pt−1+Q)∗(Pt−1+Q+R)−1
更新后验估计协方差
后验是融合了传感器观测值的
Pt=(I−Kt∗H)Pt−
P_{t} = (I - K_{t}*H)P_{t}^{-}
Pt=(I−Kt∗H)Pt−
-
调节超参数
-
Q 与 R 的取值
F,H 取 1,化简得到
K=(Pt−1+Q)∗(Pt−1+Q+R)−1 K = (P_{t-1} + Q) * (P_{t-1} + Q + R)^{-1} K=(Pt−1+Q)∗(Pt−1+Q+R)−1
结合:
x^t=x^t−+Kk(zt−Hx^t−) \hat{x}_{t} = \hat{x}^{-}_{t} + K_{k}(z_{t} - H\hat{x}^{-}_{t})\\\\ x^t=x^t−+Kk(zt−Hx^t−)
当需要更信任观测值Z, 那么K值要增大,比如说你的传感器精度高,那么就可以让R小一点比如说运动模型很理想,Q,R 都可以调节的大一些
-
分析Q
比如车走在路上,基本没有摩擦,那么Q就可以取的小一点,如果模型不准确,那么就要调节的大一点
-
分析R
观测噪声的方差,比如说陀螺仪传感器很贵的时候,R就可以小一点,因为方差小,如果很便宜,R就要大一点
-
P0 与 x0 的取值
习惯取 x0 = 0, P往小的取,方便收敛,(一般取1,不可为0)
- 卡尔曼滤波的使用
- 选择状态量,观测量
- 构建方程
- 初始化参数
- 代入公式迭代
- 调节超参数
4 应用
离散系统
系统描述
x(k)=Ax(k−1)+Bu(k)(+W(k))
x(k) = Ax(k-1) + Bu(k) \quad( + W(k))\\
x(k)=Ax(k−1)+Bu(k)(+W(k))
测量值
Z(k)=Hx(k)+V(k)
Z(k) = Hx(k) + V(k)
Z(k)=Hx(k)+V(k)
系统预测
1.先验估计
x(k∣k−1)=Ax(k−1∣k−1)+Bu(k)
x(k | k-1) = Ax(k-1|k-1) + Bu(k)\\
x(k∣k−1)=Ax(k−1∣k−1)+Bu(k)
x(k-1) 预测结果
Ax(k-1|k-1) : k-1态最优结果
Bu(k) : 状态控制量
2.误差协方差
P(k∣k−1)=AP(k−1∣k−1)AT+Q
P(k |k-1) = AP(k-1 | k-1)A^T + Q
P(k∣k−1)=AP(k−1∣k−1)AT+Q
x(k | k-1) ------ cov[x(k | k-1)] —>P(k |k-1)
Ax(k-1|k-1) ----- cov[ Ax(k-1|k-1) ] — > AP(k-1 | k-1)A^T
测量方程
3.建立测量方程
Z(k)=Hx(k)+V(k)
Z(k) = Hx(k) + V(k)
Z(k)=Hx(k)+V(k)
结合观测值计算最优估计值x(k | k)
生成最优估计
4.计算卡尔曼增益
Kg(k)=(P(k∣k−1)∗HT)∗(HP(k∣k−1)∗HT+R)−1
Kg(k) = (P(k | k-1)*H^T) *(HP(k|k-1)*H^T + R)^{-1}
Kg(k)=(P(k∣k−1)∗HT)∗(HP(k∣k−1)∗HT+R)−1
5.修正估计
x(k∣k)=x(k∣k−1)+Kg(k)∗[Z(k)−Hx(k∣k−1)]
x(k|k) = x(k|k-1) + Kg(k)*[Z(k) - Hx(k|k-1)]
x(k∣k)=x(k∣k−1)+Kg(k)∗[Z(k)−Hx(k∣k−1)]
6.更新误差协方差
P(k∣k)=[1−Kg(k)∗H]∗P(k∣k−1)
P(k|k) = [1 - Kg(k)*H]*P(k|k-1)
P(k∣k)=[1−Kg(k)∗H]∗P(k∣k−1)
机器人应用案例
1 陀螺仪滤波
明确以下参数
陀螺仪噪声协方差 Q_angle
陀螺仪漂移噪声协方差 Q_gyro
加速度计协方差 R_angle
陀螺仪测得角速度 newGyro
采样周期 dt
状态量:
[angleQ_bias]−−−>[QangleQ_gyro] \begin{bmatrix} angle\\Q\_bias \end{bmatrix} --->\begin{bmatrix}
Q_angle\\
Q\_gyro
\end{bmatrix}
[angleQ_bias]−−−>[QangleQ_gyro]
观测量:
newGyro ---->R_angle
- 预测当前角度值
由先验估计方程式:
x(k∣k−1)=Ax(k−1∣k−1)+Bu(k)
x(k | k-1) = Ax(k-1|k-1) + Bu(k)\\
x(k∣k−1)=Ax(k−1∣k−1)+Bu(k)
[PiVi]=[1δt01]∗[Pi−1Vi−1]+[12∗δt2δt]∗ai
\begin{bmatrix}
P_i\\
V_i\\
\end{bmatrix}
= \begin{bmatrix}
1&\delta t\\
0&1\\
\end{bmatrix} *
\begin{bmatrix}
P_{i-1}\\
V_{i-1}\\
\end{bmatrix} +
\begin{bmatrix}
\frac{1}{2}*\delta t^2\\
\delta t\\
\end{bmatrix} * a_i\\\\
[PiVi]=[10δt1]∗[Pi−1Vi−1]+[21∗δt2δt]∗ai
预测当前角度值:
[angleQ_bias]=[1−dt01]∗[angleQ_bias]+[dt0]∗newGyro
\begin{bmatrix}
angle\\
Q\_bias\\
\end{bmatrix}
= \begin{bmatrix}
1&-dt\\
0&1\\
\end{bmatrix} *
\begin{bmatrix}
angle\\
Q\_bias\\
\end{bmatrix} +
\begin{bmatrix}
dt\\
0\\
\end{bmatrix} * newGyro\\\\
[angleQ_bias]=[10−dt1]∗[angleQ_bias]+[dt0]∗newGyro
运动方程:
anglei=anglei−1−Q_bias∗dt+newGyro∗dtQ_biasi=Q_biasi−1
angle_i = angle_{i-1} - Q\_bias * dt + newGyro*dt\\
Q\_bias_i = Q\_bias_{i-1}
anglei=anglei−1−Q_bias∗dt+newGyro∗dtQ_biasi=Q_biasi−1
2.预测协方差矩阵
由误差协方差
P(k∣k−1)=AP(k−1∣k−1)AT+Q
P(k |k-1) = AP(k-1 | k-1)A^T + Q
P(k∣k−1)=AP(k−1∣k−1)AT+Q
由 先验估计有系统参数:
A=[1−dt01]
A =\begin{bmatrix}
1&-dt\\
0&1\\
\end{bmatrix}
A=[10−dt1]
系统过程协方差噪声Q定义
[cov(angle,angle)cov(Q_bias,angle)cov(Q_bias,angle)cov(Q_bias,Q_bias)]\begin{bmatrix}cov(angle,angle) & cov(Q\_bias,angle)\\cov(Q\_bias,angle)&cov(Q\_bias,Q\_bias)\\
\end{bmatrix}
[cov(angle,angle)cov(Q_bias,angle)cov(Q_bias,angle)cov(Q_bias,Q_bias)]
角度噪声跟角速度漂移噪声独立
[D(angle)0)0D(Q_bias)]=[Q_angle0)0Q_gyro]\begin{bmatrix}
D(angle) & 0)\\
0&D(Q\_bias)\\\end{bmatrix} = \begin{bmatrix}
Q\_angle & 0)\\
0&Q\_gyro\\
\end{bmatrix}
[D(angle)00)D(Q_bias)]=[Q_angle00)Q_gyro]
Q_angle, Q_gyro 的方差为常数,可由于经验值或者计算得出
设上一次预测协方差矩阵Pk-1为
Pk−1=[ak−1bk−1ck−1dk−1]
P_{k-1} = \begin{bmatrix}
a_{k-1} & b_{k-1}\\
c_{k-1}&d_{k-1}\\
\end{bmatrix}
Pk−1=[ak−1ck−1bk−1dk−1]
本次预测协方差矩阵Pk为:
Pk=[akbkckdk]
P_{k} = \begin{bmatrix}
a_{k} & b_{k}\\
c_{k}&d_{k}\\
\end{bmatrix}
Pk=[akckbkdk]
将以上参数带入预测协方差公式:
[akbkckdk]=[1−dt01]∗[ak−1bk−1ck−1dk−1]∗[10−dt1]+[D(angle)0)0D(Q_bias)]=[ak−1∗ck−1∗dt−bk−1∗dt+dk−1∗dt2bk−1−dk−1∗dtck−1−dk−1∗dtdk−1]+[D(angle)0)0D(Q_bias)]
\begin{bmatrix}
a_{k} & b_{k}\\
c_{k}&d_{k}\\
\end{bmatrix} = \begin{bmatrix}
1 & -dt\\
0&1\\
\end{bmatrix} *\begin{bmatrix}
a_{k-1} & b_{k-1}\\
c_{k-1}&d_{k-1}\\
\end{bmatrix}*\begin{bmatrix}
1 & 0\\
-dt&1\\
\end{bmatrix} +\begin{bmatrix}
D(angle) & 0)\\
0&D(Q\_bias)\\
\end{bmatrix}\\\\
= \begin{bmatrix}
a_{k-1}*c_{k-1}*dt-b_{k-1}*dt + d_{k-1}*dt^2 & b_{k-1} - d_{k-1}*dt\\
c_{k-1}-d_{k-1}*dt&d_{k-1}\\
\end{bmatrix} +\begin{bmatrix}
D(angle) & 0)\\
0&D(Q\_bias)\\
\end{bmatrix}\\\\
[akckbkdk]=[10−dt1]∗[ak−1ck−1bk−1dk−1]∗[1−dt01]+[D(angle)00)D(Q_bias)]=[ak−1∗ck−1∗dt−bk−1∗dt+dk−1∗dt2ck−1−dk−1∗dtbk−1−dk−1∗dtdk−1]+[D(angle)00)D(Q_bias)]
-
建立测量方程
系统测量方程:
Z(k)=Hx(k)+V(k) Z(k) = Hx(k) + V(k) Z(k)=Hx(k)+V(k)
系统测量系数
H=[1,0] H = [1,0] H=[1,0]
code:
measure=newAngle measure = newAngle\\ measure=newAngle
4 计算卡尔曼增益
由于卡尔曼增益
Kg(k)=(P(k∣k−1)∗HT)∗(HP(k∣k−1)∗HT+R)−1
Kg(k) = (P(k | k-1)*H^T) *(HP(k|k-1)*H^T + R)^{-1}
Kg(k)=(P(k∣k−1)∗HT)∗(HP(k∣k−1)∗HT+R)−1
由于卡尔曼系数包括角度和陀螺仪漂移:
[k0k1]=[abcd]∗[10][1,0]∗[abcd]∗[10]+R_angle
\begin{bmatrix} k0\\k1 \end{bmatrix}
= \frac{\begin{bmatrix} a&b\\ c&d \end{bmatrix}*\begin{bmatrix} 1\\0 \end{bmatrix}}{[1,0] * \begin{bmatrix} a&b\\ c&d \end{bmatrix}*\begin{bmatrix} 1\\0 \end{bmatrix} + R\_{angle}}
[k0k1]=[1,0]∗[acbd]∗[10]+R_angle[acbd]∗[10]
角度测量噪声R_angle 为常数
- 计算当前最优化估计值
x(k∣k)=x(k∣k−1)+Kg(k)∗[Z(k)−Hx(k∣k−1)] x(k|k) = x(k|k-1) + Kg(k)*[Z(k) - Hx(k|k-1)] x(k∣k)=x(k∣k−1)+Kg(k)∗[Z(k)−Hx(k∣k−1)]
推出:
[angleQ_bias]=[angleQ_bias]+[k0k1]∗(newGyro−[10]∗[angleQ_bias]) \begin{bmatrix} angle\\Q\_bias\end{bmatrix} = \begin{bmatrix} angle\\Q\_bias\end{bmatrix}+ \begin{bmatrix} k0\\k1\end{bmatrix} * (newGyro - \begin{bmatrix} 1\\0\end{bmatrix}*\begin{bmatrix} angle\\Q\_bias\end{bmatrix}) [angleQ_bias]=[angleQ_bias]+[k0k1]∗(newGyro−[10]∗[angleQ_bias])
- 更新协方差矩阵
P(k∣k)=[1−Kg(k)∗H]∗P(k∣k−1) P(k|k) = [1 - Kg(k)*H]*P(k|k-1) P(k∣k)=[1−Kg(k)∗H]∗P(k∣k−1)
推出:
[akbkckdk]=[[1001]−[k0k1]∗[1,0]]∗[akbkckdk]
\begin{bmatrix}
a_{k} & b_{k}\\
c_{k}&d_{k}\\
\end{bmatrix} = [\begin{bmatrix}
1 & 0\\
0&1\\
\end{bmatrix} - \begin{bmatrix}
k0\\
k1\\
\end{bmatrix}*[1,0]] *\begin{bmatrix}
a_{k} & b_{k}\\
c_{k}&d_{k}\\
\end{bmatrix}\\\\
[akckbkdk]=[[1001]−[k0k1]∗[1,0]]∗[akckbkdk]
更多推荐
所有评论(0)