卡尔曼滤波器:一些疑问

4

我有几个问题:

  1. 在OpenCV文档中给出的示例中:

    /* 生成测量 */ cvMatMulAdd(kalman->measurement_matrix,state,measurement,measurement);

这是正确的吗? 在Welch和Bishop的教程Kalman滤波器介绍中,方程式1.2中说测量= H*state + 测量噪声。

两者似乎不同。

  1. 我正在尝试为单个球实现弹跳球跟踪。 我尝试了以下方法:(如果我做错了,请指出。)

对于测量,我测量两件事:a)球心的x b) y坐标。

我只是提到与OpenCV文档中给出的示例不同的行。

CvKalman* kalman = cvCreateKalman( 5, 2, 0 );
const float A[] = { 1, 0, 1, 0, 0,
        0, 1, 0, 1, 0,
        0, 0, 1, 0, 0,
        0, 0, 0, 1, 1,
        0, 0, 0, 0, 1};

CvMat* state = cvCreateMat( 5, 1, CV_32FC1 );
CvMat* measurement = cvCreateMat( 2, 1, CV_32FC1 );

//initialize the state of kalman filter
            state->data.fl[0] = mean_c;
            state->data.fl[1] = mean_r;
            state->data.fl[2] = mean_c - prev_mean_c;
            state->data.fl[3] = mean_r - prev_mean_r;
            state->data.fl[4] = 9.81;

初始化后,这是导致崩溃的原因

cvMatMulAdd(kalman->transition_matrix,state,                     kalman->process_noise_cov,state);


请查看以下链接,其中讨论了Kalman解释的主题: http://stackoverflow.com/questions/5478881/kalman-filtering-for-programmers - Jav_Rock
1个回答

4
  1. 在这一行中,他们只是使用变量measurement来存储噪声。请查看前一行:

    cvRandArr(&rng, measurement, CV_RAND_NORMAL, cvRealScalar(0), cvRealScalar(sqrt(kalman->measurement_noise_cov->data.fl[0])));

  2. 您还应该更改H矩阵的维度。它必须是5乘2,以便计算H * state + measurement noise。您可能会在以下行中遇到错误:

    memcpy(cvkalman->measurement_matrix->data.fl,H,sizeof(H));

因为在初始示例中,cvkalman->measurement_matrix和H被分配为4乘4矩阵,而您仅将cvkalman->measurement_matrix的尺寸减小到了5乘2(4乘4大于5乘2)。


1
感谢你澄清我的疑惑。他们应该把这个变量命名为measurement_noise。 但我认为,在openCV文档的示例中,H是2乘以2的矩阵而不是4乘以4的。 这个示例(网址链接)帮助我更好地理解了它。 - Kaushik Acharya
如果您的状态向量维度为n,测量维度为m,那么测量矩阵就是n乘以m - Andrey Sboev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接