状态估计的概率解释
运动和观测方程:
{xk=f(xk1,uk)+wkzk=h(yj,xk)+vk,jk=1,…,N,j=1,…,M(1.1)
其中,各个参数的含义如下:
-
xk :机器人的位姿。
-
uk :系统在k时刻的输入量。
-
wk:位姿变化的随机噪声。
-
zk :系统的观测值,传感器采集的观测数据。
-
yj :路标,或者说是观测点。
-
vk,j:观测过程中的随机噪声。
我们的目标则是利用系统在k时刻的输入量uk和系统的观测量zk,估计机器的位姿xk和路标点yj的概率分布。
在比较常见且合理的情况下,我们可以假设状态量和噪声项服从高斯分布——这意味这我们在程序中只需要存储他们的均值和协方差矩阵即可。均值可以看作变量的最最优估计,协方差则可以度量变量的不确定性。
由于位姿xk和路标点yj都是需要我们估计的变量,这里我们改变符号的意义。令xk为k时刻所有的未知量,记作:
xkdef={xk,y1,…,ym}(1.2)
根据上述(1.1)和(1.2)可以将运动方程和观测方程写成如下形式:
{xk=f(xk1,uk)+wkzk=h(xk)+vk,jk=1,…,N(1.3)
现在考虑第k时刻的情况,我们希望使用过去0到时刻的数据来估计现在的状态分布:
P(xk|x0,u1:k,z1:k)(1.4)
根据贝叶斯公式,可以得到如下公式:
P(xk|x0,u1:k,z1:k)∝P(zk|xk)P(xk|x0,u1:k,z1:k−1)(1.5)
这里的第一项称为似然,第二项称为先验。似然由观测方程给定,而先验部分,xk是基于过去所有状态估计而来的。至少,它会受到xk−1的影响,于是我们以xk−1时刻为条件概率展开:
P(xk|x0,u1:k,z1:k−1)=∫P(xk|xk−1,x0,u1:k,z1:k−1)P(xk−1|x0,u1:k,z1:k−1)dxk−1(1.6)
对于后续的操作,有很多的方法。
在这里,我们先了解卡尔曼滤波的原理和应用。
线性系统和卡尔曼滤波
根据上文,我们假设了这个系统符合马尔可夫性,我们可以对公式(1.6)做出一些简化。
-
公式右侧第一部分可以简化成如下形式:
P(xk|xk−1,x0,u1:k,z1:k−1)=P(xk|xk−1,u1:k)(2.1)
-
公式右侧第二部分:(已知k时刻只和k-1时刻的状态相关)
P(xk−1|x0,u1:k,z1:k−1)=P(xk−1|x0,u1:k−1,z1:k−1)(2.2)
观察上述公式,我们可以知道,我们实际上在做“如何把k-1时刻的状态分布推导至k时刻”这一件事请。
我们假设状态量服从高斯分布,从最简单的线性高斯系统开始,得到如下公式:
{xk=Akxk−1+uk+wkzk=Ckxk+vk,jk=1,…,N(2.3)
假设所有的状态和噪声都符合高斯分布,这里的噪声可以记作:(这里省略了R和Q的下标)
wk∼N(0,R)vk∼N(0,Q)(2.4)
利用马尔可夫性,假设我们已知k-1时刻的状态,也就是k-1时刻的后验状态估计^xk−1及其协方差^Pk−1,现在要根据k时刻的输入,确认xk的后验。
这里我们使用^xk表示后验分布,使用~xk表示先验分布。
卡尔曼滤波第一步: 通过运动方程确认xk的先验分布。这一步是线性的,高斯分布的线性变换依然是高斯分布,所以可以得到如下公式:
P(xk|xk−1,x0,u1:k,z1:k−1)=N(Ak^xk−1+uk,Ak^Pk−1ATk+R)(2.5)
这里协方差的推导可以参考《概率论与数理统计》的P112页,关于n维正态随机变量的协方差矩阵。
这一步称为预测。可以记作:
~xk=Ak^xk−1+uk,~Pk=Ak^Pk−1ATk+R(2.6)
卡尔曼滤波第二步: 根据观测方程,我们可以计算莫格时刻应该产生怎样的观测数据:
P(zk|xk)=N(Ckxk,Q)(2.7)
我们已经假设状态量符合高斯分布,根据贝叶斯公式,可以得到如下公式:
N(^xk,^Pk)=ηN(Ckxk,Q)⋅N(~xk,~Pk)(2.8)
两侧都是高斯分布,我们带入高斯分布的公式,只需要保证指数部分相同,无需理会前面的因子部分。可以得到如下公式:
(xk−^xk)T^P−1k(xk−^xk)=(zk−Ckxk)T^Q−1k(zk−Ckxk)+(xk−~xk)T~P−1k(xk−~xk)(2.9)
我们需要根据上述这个公式推导出^xk和^Pk。
这里是通过系数相等进行了化简,我在这里简写一下:
⎧⎪
⎪
⎪⎨⎪
⎪
⎪⎩^P−1k=CTkQ−1Ck+~P−1k−2^xTk^P−1kxk=−2zTkQ−1Ckxk−2~xTk~P−1kxk(2.10)
我们记作K=^PkCTkQ−1得到如下公式:
⎧⎪⎨⎪⎩^Pk=(I−KCk)~Pk^xk=~xk+K(zk−Ck^xk)(2.11)
这个部称为更新。
总结kalmanFilter的用法
-
预测
~xk=Ak^xk−1+uk,~Pk=Ak^Pk−1ATk+R(2.12)
-
更新:先计算K(卡尔曼增益), 然后更新后验概率的分布。
K=^PkCTk(Ck~PkCTk+Qk)−1^Pk=(I−KCk)~Pk^xk=~xk+K(zk−Ck^xk)(2.13)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人