Mam trzy wartości żyroskopu, pitch, roll i odchylenie. Chciałbym dodać filtr Kalmana, aby uzyskać dokładniejsze wartości. Znalazłem bibliotekę opencv, która implementuje filtr Kalmana, ale nie mogę zrozumieć, jak to naprawdę działa.Filtr OpenCV Kalman
Czy możesz udzielić mi pomocy, która może mi pomóc? Nie znalazłem żadnych powiązanych tematów w Internecie.
Próbowałem sprawić, aby działało na jedną oś.
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);
}
w głównej
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;
I nazywają to za każdym razem, kiedy odbierać dane z żyroskopu:
kalman_filter(prevr, mpe->getGyrosDegrees().roll);
myślałem w kalman_filter pierwszy parametr jest poprzednia wartość, a druga jest poprawną wartością. Nie jestem i ten kod nie działa ... Wiem, że mam z nim dużo pracy, ale nie wiem jak kontynuować, co zmienić ...
Możesz chcieć zadać bardziej szczegółowe pytanie. Masz problemy ze zrozumieniem filtru Kalmana lub jego implementacji? –
Szczerze mówiąc, nie rozumiem jeszcze filtra Kalmana. Znalazłem kilka artykułów na ten temat, ale zawiera on tak dużo wysokiej matematyki ... Próbowałem zaimplementować coś dla jednej osi żyroskopu, ale nie wiem, dla której zmiennej jest. Dodaję kod do pytania. moment –
@Gabriel Schreiber: Dodałem kod do pytania. Dzięki za pomoc! –