00001 #include "kalmanFilter.h"
00002
00003 KalmanFilter::KalmanFilter()
00004 {
00005 int params = 4;
00006 int measured = 2;
00007 myKalmanFilter = cvCreateKalman(params, measured);
00008 measurement_Z = cvCreateMat( measured, 1, CV_32FC1 );
00009
00010
00011 const float F[] = {
00012 1, 0, 1, 0,
00013 0, 1, 0, 1,
00014 0, 0, 1, 0,
00015 0, 0, 0, 1,
00016 };
00017 memcpy( myKalmanFilter->transition_matrix->data.fl, F, sizeof(F));
00018 cvSetIdentity( myKalmanFilter->measurement_matrix, cvRealScalar(1) );
00019 cvSetIdentity( myKalmanFilter->process_noise_cov, cvRealScalar(1e-5) );
00020 cvSetIdentity( myKalmanFilter->measurement_noise_cov, cvRealScalar(1e-1) );
00021
00022
00023 cvSetIdentity( myKalmanFilter->error_cov_post, cvRealScalar(1));
00024
00025 InitializeCriticalSection(&mutexPrediction);
00026 }
00027
00028 KalmanFilter::~KalmanFilter() {
00029
00030 cvReleaseMat( &measurement_Z );
00031 cvReleaseMat( &measurementNoise_V );
00032 cvReleaseKalman( &myKalmanFilter );
00033
00034 DeleteCriticalSection(&mutexPrediction);
00035 }
00036
00037
00038
00039 void KalmanFilter::predictionBegin(float x, float y) {
00040
00041 myKalmanFilter->state_post->data.fl[0] = x;
00042 myKalmanFilter->state_post->data.fl[1] = y;
00043 myKalmanFilter->state_post->data.fl[2] = (float)0;
00044 myKalmanFilter->state_post->data.fl[3] = (float)0;
00045
00046 predictionUpdate(x,y);
00047 }
00048
00049 void KalmanFilter::predictionUpdate(float x, float y) {
00050 EnterCriticalSection(&mutexPrediction);
00051 measurement_Z->data.fl[0] = x;
00052 measurement_Z->data.fl[1] = y;
00053 bMeasurement = true;
00054 LeaveCriticalSection(&mutexPrediction);
00055 }
00056
00057 void KalmanFilter::predictionGet(CvPoint &pnt) {
00058 EnterCriticalSection(&mutexPrediction);
00059
00060 const CvMat* prediction = cvKalmanPredict( myKalmanFilter, 0 );
00061 pnt.x = prediction->data.fl[0];
00062 pnt.y = prediction->data.fl[1];
00063
00064 if (bMeasurement){
00065 bMeasurement = false;
00066 } else {
00067 measurement_Z->data.fl[0] = prediction->data.fl[0];
00068 measurement_Z->data.fl[1] = prediction->data.fl[1];
00069 }
00070
00071
00072 cvKalmanCorrect( myKalmanFilter, measurement_Z );
00073 LeaveCriticalSection(&mutexPrediction);
00074 }