У меня есть три значения гироскопа, шаг, рулон и рыскание. Я хотел бы добавить фильтр Kalman для получения более точных значений. Я нашел библиотеку opencv, которая реализует фильтр Kalman, но я не могу понять, как это работает.OpenCV Kalman filter
Не могли бы вы оказать мне помощь, которая может мне помочь? Я не нашел никаких связанных тем в Интернете.
Я попытался заставить его работать на одну ось.
const float A[] = { 1, 1, 0, 1 };
CvKalman* kalman;
CvMat* state = NULL;
CvMat* measurement;
void kalman_filter(float FoE_x, float prev_x)
{
const CvMat* prediction = cvKalmanPredict(kalman, 0);
printf("KALMAN: %f %f %f\n" , prev_x, prediction->data.fl[0] , prediction->data.fl[1]);
measurement->data.fl[0] = FoE_x;
cvKalmanCorrect(kalman, measurement);
}
в главном
kalman = cvCreateKalman(2, 1, 0);
state = cvCreateMat(2, 1, CV_32FC1);
measurement = cvCreateMat(1, 1, CV_32FC1);
cvSetIdentity(kalman->measurement_matrix,cvRealScalar(1));
memcpy(kalman->transition_matrix->data.fl, A, sizeof(A));
cvSetIdentity(kalman->process_noise_cov, cvRealScalar(2.0));
cvSetIdentity(kalman->measurement_noise_cov, cvRealScalar(3.0));
cvSetIdentity(kalman->error_cov_post, cvRealScalar(1222));
kalman->state_post->data.fl[0] = 0;
И я называю это каждый раз, когда я получаю данные из гироскопа:
kalman_filter(prevr, mpe->getGyrosDegrees().roll);
Я думал в kalman_filter первого параметр предыдущее значения и второй это значение. Я не и этот код не работает ... Я знаю, что у меня много работы, но я не знаю, как продолжить, что менять ...
Возможно, вы захотите задать более конкретный вопрос. У вас возникли проблемы с пониманием фильтра Kalman или его реализации? –
, если честно, я пока не понимаю фильтр Калмана. Я нашел некоторые статьи об этом, но это содержит так много высокой математики ... Я попытался реализовать что-то для одной оси гироскопа, но я не знаю, для какой переменной это зачем. Я добавляю код к вопросу. момент –
@Gabriel Schreiber: Я добавил код на вопрос. Спасибо за помощь! –