Фильтр Калмана: некоторые сомнения
У меня есть несколько вопросов:
В примере, приведенном в документе openCV:
/ * генерировать измерение */ cvMatMulAdd( kalman->measure_matrix, состояние, измерение, измерение);
Это правильно? В учебном пособии: Введение в фильтр Калмана Уэлча и Бишопа в уравнении 1.2 говорится, что измерение = состояние H* + шум измерения
Не кажется, что оба одинаковы.
- Я пытался реализовать отслеживание прыгающего мяча для одного мяча. Я попробовал следующее: (Пожалуйста, укажите, если я делаю это неправильно.)
Для измерения я измеряю две вещи: а) хб) у центроида шара.
Я просто упоминаю строки, которые отличаются от примера, приведенного в документации 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, состояние, kalman->process_noise_cov, состояние);
1 ответ
В этой строке они просто используют переменные измерения для хранения шума. Смотрите предыдущую строку:
cvRandArr (& rng, измерение, CV_RAND_NORMAL, cvRealScalar(0),cvRealScalar(sqrt(kalman->measure_noise_cov->data.fl[0])));
Вы должны изменить размер
H
матрица также. Должно быть 5 на 2, чтобы можно было рассчитатьH*state + measurement noise
, Вы получаете ошибку, вероятно, в строкеmemcpy( cvkalman->measure_matrix->data.fl, H, sizeof(H));
потому что в первоначальном примере cvkalman->measurement_matrix
а также H
выделяются как 4 на 4 матрицы, и вы уменьшили размерность cvkalman->measurement_matrix
только до 5 на 2 (4*4 больше 5*2)