卡尔曼滤波

卡尔曼滤波(Kalman filtering)一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程,滤除噪声干扰。
通常情况下,卡尔曼滤波用于将多个来源的数据进行融合,适用于随机线性离散系统状态估计和参数估计
我们看一个离散控制过程的系统,它包括一个状态方程和一个测量方程
卡尔曼滤波
卡尔曼滤波
这里所有的变量其实都是向量或者矩阵,之所以用(列)向量而非一个数来表示状态值,是因为,虽然一只猪的体重可以用一个值来表示,但是在实际的应用中很多状态并不是一个数就能表示的(比如导弹在空间中的位置,同时有x、y、z三个坐标)
状态方程描述的是两个相邻时刻系统状态之间的关系,即Xk和Xk+1间的关系,测量方程描述的是观测量Z和系统状态量X间的关系,通过H将Z转换到X的量纲上,(比如估计车辆位置的问题中,我们测量的是速度,通过测量方程将其转换到位置量纲)
对于满足上面的条件(线性随机微分系统,过程和测量都是高斯白噪声),卡尔曼滤波器是最优的信息处理器。下图给出KF算法的流程和五个核心更新方程如下:

       Kalman滤波是一种递归过程,主要有两个更新过程:时间更新和观测更新,其中时间更新主要包括状态预测和协方差预测,主要是对系统的预测,而观测更新主要包括计算卡尔曼增益、状态更新和协方差更新,因此整个递归过程主要包括五个方面的计算:1)状态预测;2)协方差预测;3)卡尔曼增益;4)状态更新;5)协方差更新;

       用数学公式表示,如下:

状态预测:

卡尔曼滤波        (1)

其中,X(k|k)是k时刻的系统状态,U(k)是k时刻对系统的控制量(如果没有控制量,可以为零),卡尔曼滤波是状态转移矩阵,卡尔曼滤波是系统参数;

主要含义:X(k-1|k-1)是上一状态的最优结果,X(k|k-1)是利用上一状态预测得到的结果,这一步主要更新系统结果。

协方差预测:

卡尔曼滤波               (2)

其中,P(k-1|k-1)是上一状态X(k-1|k-1)对应的协方差,P(k|k-1)是X(k|k-1)对应的协方差,Q是系统过程噪声(假设为高斯白噪声)的协方差矩阵;

主要含义:对系统结果对应的协方差进行更新;

计算卡尔曼增益:

卡尔曼滤波

其中,K为卡尔曼增益,H为观测矩阵,R为测量噪声(同样假设为高斯白噪声)对应的协方差矩阵;

主要含义:用于状态更新和协方差更新中,因为前两个预测我们得到了当前状态的预测结果,然后再得到当前状态的观测值,通过预测值和观测值,以及增益,就可以得到当前状态的最优状态估计,也就是状态更新。

状态更新:

卡尔曼滤波

其中,Z(k)是k时刻的观测值;

主要含义:利用当前状态的观测值和预测值,及增益,计算k时刻下的最优状态估计值X(k|k),对应着公式(1)中的X(k-1|k-1);

协方差更新:

卡尔曼滤波

其中,I为单位矩阵;

主要含义:前面已经更新了状态,为了保证递推下去,还要跟新状态对应的协方差矩阵,对应着公式(2)中的P(k-1|k-1);

        最后,注意既然是一个递归过程,就需要给出参数的初始值,递归过程是否很好的收敛取决于初始值的选取,所以要根据实际情况合适选择。

举例说明:
假设我们要研究的问题是一个房间的温度。根据你的经验判断,这个房间的温度是恒定的。(这里的假设相当于状态方程的系数A为1)假设你对你的经验不是100%的相信,可能会有上下偏差几度,我们把这些偏差看成是高斯白噪声(这里就是W(k))。另外,我们在房间里放一个温度计,但是这个温度计也不准确的,测量值会比实际值偏差。我们也把这些偏差看成是高斯白噪声。(温度计的测量值就是Z(k),而由于温度测到的温度就是温度,不用再换算,所以系数H就是1,偏差就是V(k))。好了,现在对于某一分钟我们有两个有关于该房间的温度值:你根据经验的预测值(系统的预测值X(k|k-1))和温度计的值(测量值Z(k))。下面我们要用这两个值结合他们各自的噪声来估算出房间的实际温度值。
假如我们要估算k时刻的是实际温度值。首先你要根据k-1时刻的温度值,来预测k时刻的温度。因为你相信温度是恒定的,所以你会得到k时刻的温度预测值是跟k-1时刻一样的,假设是23度,同时该值的高斯噪声的偏差是5度(5是这样得到的:如果k-1时刻估算出的最优温度值的偏差(p(k-1|k-1)就是上一时刻的p(k|k))是3,你对自己预测的不确定度是4度,他们平方相加再开方,就是5(算出来的就是P(k|k-1)))。然后,你从温度计那里得到了k时刻的温度值(测量值Z(k)),假设是25度,同时该值的偏差是4度。由于我们用于估算k时刻的实际温度有两个温度值,分别是23 度和25度。究竟实际温度是多少呢?相信自己还是相信温度计呢?究竟相信谁多一点,我们可以用他们的covariance(协方差)来判断。因为 Kg2=52/(52+42)所以Kg=0.78,我们可以估算出k时刻的实际温度值是:23+0.78*(25-23)=24.56度。可以看出,因为温度计的covariance比较小(比较相信温度计),所以估算出的最优温度值偏向温度计的值。
现在我们已经得到k时刻的最优温度值了,下一步就是要进入 k+1时刻,进行新的最优估算。到现在为止,好像还没看到什么自回归的东西出现。对了,在进入k+1时刻之前,我们还要算出k时刻那个最优值(24.56 度)的偏差。
算法如下:((1-Kg)*52)0.5=2.35。这里的5就是上面的k时刻你预测的那个23度温度值的偏差,得出的2.35就是进入 k+1时刻以后k时刻估算出的最优温度值的偏差。就是这样,卡尔曼滤波器就不断的把 covariance递归,从而估算出最优的温度值。他运行的很快,而且它只保留了上一时刻的covariance。上面的Kg,就是卡尔曼增益(Kalman Gain)。他可以随不同的时刻而改变他自己的值,是不是很神奇!
卡尔曼滤波

注:例子来源于https://blog.csdn.net/u012554092/article/details/78290223

卡尔曼数学推导:

首先要计算预测值、预测值和真实值之间误差协方差矩阵:
卡尔曼滤波

有了这两个就能计算卡尔曼增益K,再然后得到估计值:
卡尔曼滤波

最后还要计算估计值和真实值之间的误差协方差矩阵,为下次递推做准备:
卡尔曼滤波