6-24 2,202PVs
随着卡尔曼滤波算法随着研究的进一步深入,慢慢对这个算法有了深的理解。卡尔曼滤波器,之前在网上看了一个关于kalman滤波器空间解释的博客,看得很费劲。
这次记录一些理解性的东西,首先是协方差(Covariances)的概念:如果说协方差是用来衡量一个样本中,样本值的偏离程度,那么协方差就是用来衡量两个样本之间的想关性有多少,也就是一个样本值的偏离程度,会对另外一个样本值的偏离程度产生多大影响。协方差是可以用来计算相关系数的。相关系数P=Cov(a,b)/Sa*Sb,Cov(a,b)是协方差,Sa,Sb分别是样本标准差,而协方差反映了两个标量之间协变动的状况。
下面介绍一维卡尔曼滤波的基本概念。对于随机过程,状态是以过去和现在估计的最小信息量来决定全部未来的相应的最佳估值。从而给出未来的带来噪声干扰的观测值。由卡尔曼滤波公式解读出这样一条消息,当我们在K时刻获取系统的状态信息,我们就可以结合k-1时刻的估计值进行线性组合,就可以得到K时刻对未来的估计值X(K)。简单理解就是,利用卡尔曼的递归公式,在参数已知的情况下,我们可以利用历史观测值y(1),y(2),y(3)….,y(k),求出系统状态X(k)的最佳滤波值和未来时刻状态的最佳预测值x(k+1)。
卡尔曼滤波算法可以表述为:A(k,k-1),B(k-1),H(K),W(k),V(k)。已知,X(k)的初始值x(0|0)和协方差矩阵的初始估计值P(0|0)。如何从观测值[y(1),y(2)…,y(k)]求得状态X(K+1)的线性、无偏、最小方差估值和估计误差协方差阵的地推形式。
一维卡尔曼滤波用于二维图像处理。例如车牌识别。
下面提供一个二阶卡尔曼滤波的程序,二阶卡尔曼滤波研究的还不是很透。我通过数据测试发现二阶卡尔曼滤波的效果要比一阶的好。但是为什么会好我还不知道。下面这个二阶的程序是github上的朋友写的。大家看看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
float kalman2_filter(kalman2_state *state, float z_measure) { float temp0 = 0.0f; float temp1 = 0.0f; float temp = 0.0f; /* Step1: Predict */ state->x[0] = state->A[0][0] * state->x[0] + state->A[0][1] * state->x[1]; state->x[1] = state->A[1][0] * state->x[0] + state->A[1][1] * state->x[1]; /* p(n|n-1)=A^2*p(n-1|n-1)+q */ state->p[0][0] = state->A[0][0] * state->p[0][0] + state->A[0][1] * state->p[1][0] + state->q[0]; state->p[0][1] = state->A[0][0] * state->p[0][1] + state->A[1][1] * state->p[1][1]; state->p[1][0] = state->A[1][0] * state->p[0][0] + state->A[0][1] * state->p[1][0]; state->p[1][1] = state->A[1][0] * state->p[0][1] + state->A[1][1] * state->p[1][1] + state->q[1]; /* Step2: Measurement */ /* gain = p * H^T * [r + H * p * H^T]^(-1), H^T means transpose. */ temp0 = state->p[0][0] * state->H[0] + state->p[0][1] * state->H[1]; temp1 = state->p[1][0] * state->H[0] + state->p[1][1] * state->H[1]; temp = state->r + state->H[0] * temp0 + state->H[1] * temp1; state->gain[0] = temp0 / temp; state->gain[1] = temp1 / temp; /* x(n|n) = x(n|n-1) + gain(n) * [z_measure - H(n)*x(n|n-1)]*/ temp = state->H[0] * state->x[0] + state->H[1] * state->x[1]; state->x[0] = state->x[0] + state->gain[0] * (z_measure - temp); state->x[1] = state->x[1] + state->gain[1] * (z_measure - temp); /* Update @p: p(n|n) = [I - gain * H] * p(n|n-1) */ state->p[0][0] = (1 - state->gain[0] * state->H[0]) * state->p[0][0]; state->p[0][1] = (1 - state->gain[0] * state->H[1]) * state->p[0][1]; state->p[1][0] = (1 - state->gain[1] * state->H[0]) * state->p[1][0]; state->p[1][1] = (1 - state->gain[1] * state->H[1]) * state->p[1][1]; return state->x[0]; } |
不明觉厉~
一旦懂了就会觉得不难。