Tengo tres valores de giroscopio, cabeceo, balanceo y guiñada. Me gustaría agregar el filtro de Kalman para obtener valores más precisos. Encontré la biblioteca opencv, que implementa un filtro de Kalman, pero no puedo entender cómo funciona realmente.OpenCV Filtro de Kalman
¿Me podría dar alguna ayuda que pueda ayudarme? No encontré ningún tema relacionado en internet.
He intentado hacer que funcione para un eje.
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);
}
en el principal
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;
Y yo llamo a esto cada vez, cuando recibo los datos de giróscopo:
kalman_filter(prevr, mpe->getGyrosDegrees().roll);
pensé en kalman_filter el primer parámetro es el valor anterior y el segundo es el valor correcto No estoy y este código no funciona ... Sé que tengo mucho trabajo con él, pero no sé cómo continuar, qué cambiar ...
Es posible que desee hacer una pregunta más específica. ¿Tiene problemas para entender el filtro de Kalman o su implementación? –
para ser sincero, todavía no entiendo el filtro de Kalman. Encontré algunos artículos al respecto, pero eso contiene mucha matemática ... Intenté implementar algo para un eje del giroscopio, pero no sé, para qué variable. Agrego un código a la pregunta. momento –
@ Gabriel Schreiber: agregué un código a la pregunta. ¡Gracias por ayudar! –