标题我觉得应该翻译为:傻瓜都能理解的卡尔曼滤波
原文链接
首先,从定义和复杂的方程出发(至少对我们这些凡人来说),几乎不可能理解Kalman滤波器的全部含义。
在大多数情况下,通过状态矩阵可以得到以下等式,这是一个更容易开始的:
上式中,下标k表示状态,这里我们可以把它理解为离散的时间间隔,比如说,k=1表示1ms。
我们的目标是得到 x ^ k \hat x_k x^k,即对于信号x的估计。我们希望找到每个k的结果。
z k z_k zk是测量值。需要记住的是,我们并不完全确定这个值;否则,我们根本无需做这些计算。
K k K_k Kk称之为卡尔曼增益
,是所有的关键; x ^ k − 1 \hat x_{k-1} x^k−1是对于上一状态信号的估计。
唯一未知的部分是等式中的卡尔曼增益 K k K_k Kk。因为我们已知测量值,并且得到了前一状态信号的估计值。你应该为每个结果状态计算这个卡尔曼增益。这当然不容易,但我们有工具去做这些。
另一方面,假设 K k K_k Kk为0.5,我们得到什么?这是一个简单的平均!换句话说,我们应该在每个状态下找到更聪明的卡尔曼增益系数。
最重要的一句话是:卡尔曼滤波为每个后续状态找到最佳的平均因子,也记住了一些过去的状态。
下面是一个简单的一步一步指导卡尔曼滤波。
这是最重要的步骤。首先,你必须确定,卡尔曼滤波条件适合你的问题。
请记住两个卡尔曼滤波的方程,如下:
每个 x k x_k xk可以用一个线性随机方程(第一个)来计算。任意 x k x_k xk是都是其先前值加上控制信号 u k u_k uk和过程噪声 w k − 1 w_{k-1} wk−1的线性组合。记住,大多数时候,没有控制信号 u k u_k uk。
第二个方程表明任何测量值都是信号值 x k x_k xk和测量噪声 v k v_k vk的线性组合。它们都被认为符合高斯分布。
过程噪声和测量噪声在统计上是独立的。
项A、B和H一般形式的矩阵。但是在大多数信号处理问题中,我们使用的模型使得这些项只是数值
。另外,虽然这些值在状态之间可能会发生变化,但大多数情况下,我们可以假设它们是常量
。
如果我们十分确定我们的系统满足这个模型,剩下的就是估计噪声函数 w k − 1 w_{k-1} wk−1和 v k v_k vk的均值和标准差。我们知道在实际生活中,没有信号是是纯高斯分布的,但我们可以用某种近似来假设它。这并不是一个大问题,因为我们将看到卡尔曼滤波算法试图收敛到正确的估计,即使高斯噪声参数估计得很差。 唯一要记住的是:“噪声参数估计得越好,得到的估计也就越好。”
如果你成功将你的模型适配到卡尔曼滤波器,下一个步骤就是决定必要的参数和初始值。
我们有两个不同的方程组:预测(Time Updata)和校正(Measurement Update)。两个方程组都适用于每个第k个状态。(有关公式推导,可以参考另一篇博客)
我们在步骤1中进行了建模,因此我们知道矩阵A、B和H。它们很可能是数值常数。即使最有可能,它们也会等于1。
剩下最痛苦的事情是确定R和Q。R(测量噪声协方差矩阵)很容易找到,因为,一般来说,我们对环境中的噪声非常确定。但发现Q(过程噪声协方差矩阵)并不是那么明显。在这个阶段,我不能给你一个具体的方法。(注:Q和R的大小将直接影响着滤波结果,若Q的元素远大于R的元素,则预测噪声大,从而更相信测量值,这样可能使得kalman滤波结果与测量值基本一致;反之,则更相信预测;若二者接近,则滤波结果介于前面两者之间。所以,通过不断尝试,选取不同的Q和R达到最佳效果)
为了开始这个过程,我们还需要知道 x 0 x_0 x0和 P 0 P_0 P0的估计值。( x 0 x_0 x0使用0时刻测量值来初始化状态,可以使得前面几次预测更准确)
在我们收集了所有我们需要的信息并开始了这个过程之后,现在我们可以迭代估计。请记住,前面的估计将是当前状态的输入。
x ^ k − \hat x_k^- x^k−是先验估计,意味着在measurement update correction
之前进行粗糙的估计。 P ^ k − \hat P_k^- P^k−是先验误差协方差矩阵。我们将这些先验值应用到Measurement Update方程组中。
在Measurement Update方程组中,我们可以得到x在时间k上的估计 x ^ k \hat x_k x^k,并且, x ^ k 和 P k \hat x_k和P_k x^k和Pk对k+1的估计是必要的。
我们计算的卡尔曼增益(Kalman Gain)不是下一步迭代所需要的,它是这组方程中隐藏的、神秘的和最重要的部分。
在Measurement Update阶段估计的值也称为后验值
。
现在,让我们尝试估计一个标量随机常数,例如源的“电压读数”。所以我们假设它有一个恒定的值a V(伏特),但是当然我们会看到一些高于或低于伏特的噪音读数。我们假设测量噪声的标准差为0.1V。
我们的模型是:
TIME(ms) | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
VALUE(V) | 0.39 | 0.50 | 0.48 | 0.29 | 0.25 | 0.32 | 0.34 | 0.48 | 0.41 | 0.45 |
我们应该从某个地方开始迭代,比如k=0。我们应该找到或假设一些初始状态。这里,我们抛出一些初始值,假设 x 0 = 0 , P 0 = 1 x_0=0,P_0=1 x0=0,P0=1。
为什么不选择 P 0 = 0 P_0=0 P0=0 ?
如果我们这样做了,那么表示环境中没有噪声,该假设会导致结果 x ^ k \hat x_k x^k是0,仍然保持初始状态。因此我们选择 P 0 P_0 P0不取0。
预测(Time Updata) 和 校正(Measurement Update) 方程组:
x ^ k \hat x_k x^k迭代过程如下:
下图显示卡尔曼滤波算法收敛到真实电压值。在这里,我展示了前10次迭代,我们清楚地看到了收敛的迹象。在大约50次迭代中,它会收敛得更好。
自己翻译的,翻译水平有限,有错误请指点