Фильтр Калмана: некоторые сомнения

У меня есть несколько вопросов:

  1. В примере, приведенном в документе openCV:

    /* генерируем измерение */ cvMatMulAdd( kalman->measurement_matrix, state, Measurement, Measurement );

Это правильно? В учебнике: Введение в фильтр Калмана Уэлч и Бишоп в уравнении 1.2 говорят, что измерение = H*состояние + шум измерения

Не похоже, что оба одинаковы.

  1. Я пытался реализовать отслеживание прыгающего мяча для одного мяча. Я пробовал следующее: (Пожалуйста, укажите, если я делаю это неправильно.)

Для измерения я измеряю две вещи: а) х б) у центроида шара.

Я просто упоминаю строки, которые отличаются от примера, приведенного в документации 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 );


person Kaushik Acharya    schedule 06.05.2011    source источник
comment
Проверьте эту ссылку на ветку, где обсуждаются объяснения Калмана: stackoverflow.com/ вопросы/5478881/   -  person Jav_Rock    schedule 28.05.2012


Ответы (1)


  1. В этой строке они просто используют переменные измерения для хранения шума. Смотрите предыдущую строку:

    cvRandArr(&rng, измерение, 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)

person Andrey Sboev    schedule 07.05.2011
comment
Спасибо, что развеяли мои сомнения. Они должны были назвать переменную Measurement_noise. Но я думаю, что в примере в документации openCV H - это матрица 2 на 2, а не 4 на 4. Это example(url link) помог мне лучше понять. - person Kaushik Acharya; 13.05.2011
comment
если ваш вектор состояния имеет размерность n, а размерность измерения равна m, то матрица измерения равна n на m - person Andrey Sboev; 13.05.2011