简介
卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。
简介
卡尔曼滤波可以用于有不确定信息的动态系统,判断系统下一步的动作。他利用系统中现象的相关性,来得到系统的实际状态。
不确定性的来源:
- 不存在完美的数学模型
- 系统的扰动不可控,也很难建模
- 测量传感器存在误差
卡尔曼滤波非常适合不断变化的系统。他的优点是内存占用少(只需要保存之前的状态,不需要保留历史记录),而且速度非常快,适合解决实时问题和嵌入式系统。
学习卡尔曼滤波需要对概率和矩阵有基本的了解。
变量定义
过程噪声协方差矩阵Q
表示系统状态的不确定性:
- 矩阵对角线上的元素代表各个状态量的方差,反映了状态量的不确定性。
- 非对角线元素反映了状态量之间的相关性
控制卡尔曼增益:
- 卡尔曼滤波的核心是利用测量值来更新状态估计。过程噪声协方差矩阵Q 和测量噪声协方差矩阵R 共同决定了卡尔曼增益的大小
- 当Q 较大时,表示系统模型存在较大的不确定性,此时应该更相信测量值,卡尔曼增益会较大。
- 当Q 较小时,表示系统模型比较准确,此时应该更相信系统模型,卡尔曼增益会较小。
平滑状态估计:
- 过程噪声协方差矩阵Q影响状态估计的平滑性。Q 较大时,状态估计对测量噪声更不敏感,滤波效果更好。
- 但同时也意味着状态估计对系统模型的依赖性降低。对实际状态变化的响应会变慢。
测量噪声协方差矩阵R
- 表示测量值的不确定性:
- 矩阵对角线上的元素代表各个测量值的方差,反应了测量值的不确定性。
- 非对角线元素反映了测量值之间的相关性。
- 控制卡尔曼增益:
- 当R 较大时,表示测量值的不确定性较大,应该更相信系统模型,卡尔曼增益会较小。
- 当R 较小时,表示测量值比较精确,应该更相信测量值,卡尔曼增益会较大。
- 平滑状态估计:
- 测量噪声协方差矩阵R也会影响状态估计的平滑性。R 较大时,状态估计对测量噪声更不敏感,滤波效果更好。
- 但同时也意味着状态估计对测量值的依赖性降低,对实际状态变化的响应会变慢。
线性系统卡尔曼滤波
线性系统状态空间方程:
xk=Axk−1+B∗Uk−1+wk−1Zk=Hxk+vk
其中 xk 是状态向量,A 是状态转移矩阵,Uk是状态控制向量,B 是控制变量矩阵,w 为过程噪声,v 为测量噪声,w 和 v 均服从正态分布,w∼N(0,Q),v∼N(0,R)
预测:
xk−=Axk−1+B∗Uk−1Pk−=APk−1AT+Q
更新:
Kk=HkPk−HkT+RPk−HkTxk=xk−+Kk(Zk−Hkxk−)Pk=(I−KkHk)Pk−
其中 xk− 为 k 时刻先验估计状态,xk−1 ,xk 为 k−1 和 k 时刻的后验估计状态,Pk−1 和 Pk 分别为 k−1 和 k 时刻的后验估计协方差,Pk− 分别为 k 时刻的先验估计协方差,Kk 为卡尔曼增益。
扩展卡尔曼滤波(EKF)
非线性系统状态空间方程:
xk=f(xk−1,uk−1,wk−1)Zk=h(xk,vk)
线性化后:
xk=x~k−1+A(xk−1−xk−1)+Wwk−1zk=z~k+H(xk−xk)+Vvk
其中,xk 在 xk−1 处线性化,Zk 在 xk 处线性化,H=∂x∂h/xk,V=∂v∂h/xk
预测:
xk−=f(xk−1,uk−1,0)Pk−=APk−1AT+WQWT
更新:
xk=xk−+Kk(Zk−h(xk−,0))Kk=HPk−HT+VRVTPk−HTPk=(I−KkH)Pk−
无迹卡尔曼滤波(UKF)
无迹卡尔曼滤波不采用泰勒展开实现非线性系统线性化,而是采用无迹变换(Unscented Transform,UT)来处理均值和协方差的非线性传递问题。
** 无迹变化:**
- 原状态分布中按某一规则选取一些采样点(其均值和方差等于原状态分布的均值和方差)
- 将点带入非线性方程中(求取变换后的均值和协方差)
预测:
- 利用上一时刻的后验估计 xk−1 以及后验估计误差协方差 Pk−1 ,确定性采样生成2n+1个带权值的样本点(或 sigma points)
χ0=xk−1w0=n+κκχi=xk−1+((n+κ)Pk−1)i,i=1,2,⋯,nwi=2(n+κ)1χn+i=xk−1−((n+κ)Pk−1)i,i=1,2,⋯,nwn+i=2(n+κ)1
- 将所有样本点通过非线性变换 f[⋅]
Yi=f[xi,uk−1,k]
- 根据2n+1个 Yi ,得到先验估计 xk−1
xk−=i=0∑2nwi⋅Yi
- 根据2n+1个 Yi ,以及先验估计 xk−1,计算先验估计协方差 Pk−1−
Pk−=i=0∑2nwi⋅(Yi−xk−)(Yi−xk−)T
更新:
- 将所有样本点通过非线性变换 h[⋅]
Zi=h[xi,uk−1,k]
- 对当前时刻的观测值进行预测
zk−=i=0∑2nwi⋅Zi
- 计算 Pk−(z,z)
Pk−(z,z)=R+i=0∑2nwi⋅(Zi−zk−)(Zi−zk−)T
- 计算状态向量的先验估计与测量向量的先验估计的互相关矩阵 Pk−(x,z)
Pk−(x,z)=i=0∑2nwi⋅(Yi−xk−)(Zi−zk−)T
- 套入更新公式
xk=xk−+Kk(zk−Hxk−)Pk=(I−KkH)Pk−Kk=Pk−(x,z)[Pk−(z,z)]−1
参考链接:
- How a Kalman filter works, in picturesopen in new window
- 运动模型(CV&CA&CTRV)open in new window
- DR_CAN(卡尔曼滤波器)open in new window
- 无迹卡尔曼滤波推导Part1open in new window