kalman filter 卡爾曼濾波的例子

因爲在研究中使用了kalman 濾波,這是一個挺難理解的控制理論,我花了好長時間才瞭解一些基本的概念,opencv雖然提供了一個實例,但是這個例子基於c的,不容易看懂,也不好重用,後來我整理了一個簡單的類來,期間在論壇上有一個handsome & romantic 的法國小夥也在研究這個濾波,後來我給了他程序,他修改後發給了我,所以這裏的代碼也有他的部分,算是中法合作產品 :)

對於kalman的初學者來講,像我這樣沒什麼數學功底的人,看教科書真是很累,說實在的,我覺得老外的基礎理論的書都很評議近人,不像國內那些教授搞得那麼懸虛,

初學者可以參考

http://bbs.matwav.com/index.jsp 研學論壇有幾篇通俗易懂的中文解釋

http://www.cs.unc.edu/~welch/kalman/ 這裏是老外綜合的kalman基地,很不錯的。

 

代碼示例:

  1. ============================kalman.h================================  
  2.  
  3. // kalman.h: interface for the kalman class.  
  4. //  
  5. //////////////////////////////////////////////////////////////////////  
  6.  
  7. #if !defined(AFX_KALMAN_H__ED3D740F_01D2_4616_8B74_8BF57636F2C0__INCLUDED_)  
  8. #define AFX_KALMAN_H__ED3D740F_01D2_4616_8B74_8BF57636F2C0__INCLUDED_  
  9.  
  10. #if _MSC_VER > 1000  
  11. #pragma once  
  12. #endif // _MSC_VER > 1000  
  13.  
  14. #include <math.h>  
  15. #include "cv.h"  
  16.  
  17. class kalman    
  18. {  
  19. public:  
  20.  void init_kalman(int x,int xv,int y,int yv);  
  21.  CvKalman* cvkalman;  
  22.  CvMat* state;   
  23.  CvMat* process_noise;  
  24.  CvMat* measurement;  
  25.  const CvMat* prediction;  
  26.  CvPoint2D32f get_predict(float x, float y);  
  27.  kalman(int x=0,int xv=0,int y=0,int yv=0);  
  28.  //virtual ~kalman();  
  29.  
  30.  
  31. };  
  32.  
  33. #endif // !defined(AFX_KALMAN_H__ED3D740F_01D2_4616_8B74_8BF57636F2C0__INCLUDED_)  
  34.  
  35.  
  36. ============================kalman.cpp================================  
  37.  
  38. #include "kalman.h"  
  39. #include <stdio.h>  
  40.  
  41.  
  42. /* tester de printer toutes les valeurs des vecteurs...*/ 
  43. /* tester de changer les matrices du noises */ 
  44. /* replace state by cvkalman->state_post ??? */ 
  45.  
  46.  
  47. CvRandState rng;  
  48. const double T = 0.1;  
  49. kalman::kalman(int x,int xv,int y,int yv)  
  50. {       
  51.     cvkalman = cvCreateKalman( 4, 4, 0 );  
  52.     state = cvCreateMat( 4, 1, CV_32FC1 );  
  53.     process_noise = cvCreateMat( 4, 1, CV_32FC1 );  
  54.     measurement = cvCreateMat( 4, 1, CV_32FC1 );  
  55.     int code = -1;  
  56.       
  57.     /* create matrix data */ 
  58.      const float A[] = {   
  59.    1, T, 0, 0,  
  60.    0, 1, 0, 0,  
  61.    0, 0, 1, T,  
  62.    0, 0, 0, 1  
  63.   };  
  64.        
  65.      const float H[] = {   
  66.     1, 0, 0, 0,  
  67.     0, 0, 0, 0,  
  68.    0, 0, 1, 0,  
  69.    0, 0, 0, 0  
  70.   };  
  71.          
  72.      const float P[] = {  
  73.     pow(320,2), pow(320,2)/T, 0, 0,  
  74.    pow(320,2)/T, pow(320,2)/pow(T,2), 0, 0,  
  75.    0, 0, pow(240,2), pow(240,2)/T,  
  76.    0, 0, pow(240,2)/T, pow(240,2)/pow(T,2)  
  77.     };  
  78.  
  79.      const float Q[] = {  
  80.    pow(T,3)/3, pow(T,2)/2, 0, 0,  
  81.    pow(T,2)/2, T, 0, 0,  
  82.    0, 0, pow(T,3)/3, pow(T,2)/2,  
  83.    0, 0, pow(T,2)/2, T  
  84.    };  
  85.      
  86.      const float R[] = {  
  87.    1, 0, 0, 0,  
  88.    0, 0, 0, 0,  
  89.    0, 0, 1, 0,  
  90.    0, 0, 0, 0  
  91.    };  
  92.      
  93.       
  94.     cvRandInit( &rng, 0, 1, -1, CV_RAND_UNI );  
  95.  
  96.     cvZero( measurement );  
  97.       
  98.     cvRandSetRange( &rng, 0, 0.1, 0 );  
  99.     rng.disttype = CV_RAND_NORMAL;  
  100.  
  101.     cvRand( &rng, state );  
  102.  
  103.     memcpy( cvkalman->transition_matrix->data.fl, A, sizeof(A));  
  104.     memcpy( cvkalman->measurement_matrix->data.fl, H, sizeof(H));  
  105.     memcpy( cvkalman->process_noise_cov->data.fl, Q, sizeof(Q));  
  106.     memcpy( cvkalman->error_cov_post->data.fl, P, sizeof(P));  
  107.     memcpy( cvkalman->measurement_noise_cov->data.fl, R, sizeof(R));  
  108.     //cvSetIdentity( cvkalman->process_noise_cov, cvRealScalar(1e-5) );      
  109.     //cvSetIdentity( cvkalman->error_cov_post, cvRealScalar(1));  
  110.  //cvSetIdentity( cvkalman->measurement_noise_cov, cvRealScalar(1e-1) );  
  111.  
  112.     /* choose initial state */ 
  113.  
  114.     state->data.fl[0]=x;  
  115.     state->data.fl[1]=xv;  
  116.     state->data.fl[2]=y;  
  117.     state->data.fl[3]=yv;  
  118.     cvkalman->state_post->data.fl[0]=x;  
  119.     cvkalman->state_post->data.fl[1]=xv;  
  120.     cvkalman->state_post->data.fl[2]=y;  
  121.     cvkalman->state_post->data.fl[3]=yv;  
  122.  
  123.  cvRandSetRange( &rng, 0, sqrt(cvkalman->process_noise_cov->data.fl[0]), 0 );  
  124.     cvRand( &rng, process_noise );  
  125.  
  126.  
  127.     }  
  128.  
  129.        
  130. CvPoint2D32f kalman::get_predict(float x, float y){  
  131.      
  132.  
  133.     /* update state with current position */ 
  134.     state->data.fl[0]=x;  
  135.     state->data.fl[2]=y;  
  136.  
  137.       
  138.     /* predict point position */ 
  139.     /* x'k=A鈥k+B鈥k  
  140.        P'k=A鈥k-1*AT + Q */ 
  141.     cvRandSetRange( &rng, 0, sqrt(cvkalman->measurement_noise_cov->data.fl[0]), 0 );  
  142.     cvRand( &rng, measurement );  
  143.       
  144.      /* xk=A?xk-1+B?uk+wk */ 
  145.     cvMatMulAdd( cvkalman->transition_matrix, state, process_noise, cvkalman->state_post );  
  146.       
  147.     /* zk=H?xk+vk */ 
  148.     cvMatMulAdd( cvkalman->measurement_matrix, cvkalman->state_post, measurement, measurement );  
  149.       
  150.     /* adjust Kalman filter state */ 
  151.     /* Kk=P'k鈥T鈥?H鈥'k鈥T+R)-1  
  152.        xk=x'k+Kk鈥?zk-H鈥'k)  
  153.        Pk=(I-Kk鈥)鈥'k */ 
  154.     cvKalmanCorrect( cvkalman, measurement );  
  155.     float measured_value_x = measurement->data.fl[0];  
  156.     float measured_value_y = measurement->data.fl[2];  
  157.  
  158.       
  159.  const CvMat* prediction = cvKalmanPredict( cvkalman, 0 );  
  160.     float predict_value_x = prediction->data.fl[0];  
  161.     float predict_value_y = prediction->data.fl[2];  
  162.  
  163.     return(cvPoint2D32f(predict_value_x,predict_value_y));  
  164. }  
  165.  
  166. void kalman::init_kalman(int x,int xv,int y,int yv)  
  167. {  
  168.  state->data.fl[0]=x;  
  169.     state->data.fl[1]=xv;  
  170.     state->data.fl[2]=y;  
  171.     state->data.fl[3]=yv;  
  172.     cvkalman->state_post->data.fl[0]=x;  
  173.     cvkalman->state_post->data.fl[1]=xv;  
  174.     cvkalman->state_post->data.fl[2]=y;  
  175.     cvkalman->state_post->data.fl[3]=yv;  
  176. }  
  177.  

轉載自:http://blog.csdn.net/hardVB/archive/2005/06/28/405582.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章