简单的insignt
方程中,下标上的k是状态。在这里我们可以将其视为离散的时间间隔,例如k=1表示1ms,k=2表示2ms。
我们的目标是找到状态k处的X的估计值,即信号X的估计值。其中,Z_k是测量值,K_k称为卡尔曼增益,x_k-1是对先前状态的信号的估计。因为我们有了测量值,并且已经有了先前的估计信号。唯一不确定的量是K_k,即卡尔曼增益。我们应该为每个后续状态计算卡尔曼增益。
另一方面,假设K_k是0.5, 那么我们得到了什么呢?这是一个简单的平均数,换句话说,我们应该在每个状态下找到更智能的卡尔曼增益系数。最关键的是:卡尔曼滤波器为每个随后的状态找到最优的averaging factor。同样以某种方式对过去的状态保留一些记忆。
step-by-step 指南
step1-构造一个模型
卡尔曼滤波器有如下方程:
这意味着我们可以使用线性随机方程(第一个) 来评估每个x_k。任何x_k都是其先前状态x_k-1加上一个控制信号u_k加上一个过程噪声w_k-1的线性组合。在大多数情况下,没有控制信号u_k。
第二个方程告诉我们任何观测值z_k都是信号值x_k和测量噪音v_k的线性组合。他们都被认为是高斯分布的。过程噪声和测量噪声在统计上是独立的。A, B和H是一般形式的矩阵。在大多数信号处理问题中,这些量只是数值。尽管这些值在状态之间可能会发生变化,但是在大多数情况下,我们可以假定它们是恒定的。
如果我们的系统适合该模型,剩下的唯一事情就是估计噪声函数w_k-1和v_k的均值和标准差。我们知道,在现实生活中,没有信号是纯粹的高斯信号,但是我们可以近似地假设它。这不是一个大问题,因为即使高斯噪声参数的估算不佳,我们也会看到卡尔曼滤波算法试图收敛到正确的估算中。
step2-开始过程(start the process)
下一步是确定必要的参数和初始值。在这个过程中,有两个方程:Time Update(prediction) 方程和 Measurement Update(correction) 方程。这两个方程都应用在每个第k个状态。
我们在step1中进行了建模,因此我们知道矩阵A,B和H的值,大多数情况下,它们是数值常数。 甚至在大多数情况下,它们等于1。剩下最痛苦的事情是确定R和Q,R很容易找出,因为我们对环境中的噪声很确定。但是找出Q并没有那么显而易见。为了开始这个过程,我们还需要知道x_0和P_0的估计值。
step3-迭代
在我们收集了所需要的所有信息并开始了这个过程之后,现在我们可以迭代估计。先前的估计将是当前状态的输入。
在这里,Time Update中第一个公式等号左边的x_k,是prior estimate,表示在measurement update(correction) 之前的粗略估计,第二个公式等号左边的P_k是prior error covariance。在Measurement Update方程中,我们确实找到了在时间k处的x估计值,这是在时间k处x的估计值(我们希望找到的东西)。我们评估的卡尔曼增益(Kalman Gain)在下一个迭代步骤中是不需要的,它是这组方程组中隐藏,神秘且最重要的部分。
在Measurement Update中评估的值也被称为后验值。
一个简单的例子
现在,让我们尝试估计一个标量随机常数,例如从电源获得的“电压读数”。假设它具有恒定的 a 伏特,但是在a 伏特上下浮动,假设测量噪声的标准差是0.1伏。模型构建如下:
所以这个问题被归为一个简单的形式。
- 最重要的是,我们有一个一维信号问题,因此模型中的每个实体(A,B,H)都是一个数值,而不是一个矩阵。
- 没有控制信号u_k
- 由于信号是一个常数,A为1,因为我们已经知道下一个值将与前一个值相同。
- 值H = 1,因为我们知道测量是由状态值和一些噪声组成的。 很少会遇到现实生活中H不同于1的情况。
最后,假设有以下观测值:
我们需要给出x_0和P_0,假设x_0=0并且P_0=1,为什么不选择P_0=0?因为如果选择这种方式,则意味着环境中没有噪音,并且该假设将导致状态k的所有随之而来的x估计都为0(保持最初的state)。Time Update和Measurement Update方程计算如下:
在这里,详细显示了前2个状态迭代,其他的则遵循相同的模式。我们可以看到在经过一系列迭代之后,算法收敛到了真实值。
为了以更少的步骤使得估计收敛,你应该:
- 对系统进行更优雅地建模
- 更精确地估计噪声