微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 国外找的卡尔曼滤波算法,程序无改动,供大家学习

国外找的卡尔曼滤波算法,程序无改动,供大家学习

时间:10-02 整理:3721RD 点击:
国外捞回来的一个卡尔曼滤波的栗子,学习了一下
程序解释:
程序中的Q是系统噪声,R是测量噪声,大概意思就是说该信谁多一点,如果Q=0就最后完全信预测结果,R=0则完全信测量结果

  1. /** A simple kalman filter example by Adrian Boeing
  2. www.adrianboeing.com
  3. */

  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>

  7. double frand() {
  8.     return 2*((rand()/(double)RAND_MAX) - 0.5);
  9. }

  10. int main() {

  11.     //initial values for the kalman filter
  12.     float x_est_last = 0;
  13.     float P_last = 0;
  14.     //the noise in the system
  15.     float Q = 0.022;
  16.     float R = 0.617;
  17.    
  18.     float K;
  19.     float P;
  20.     float P_temp;
  21.     float x_temp_est;
  22.     float x_est;
  23.     float z_measured; //the 'noisy' value we measured
  24.     float z_real = 0.5; //the ideal value we wish to measure
  25.    
  26.     srand(0);
  27.    
  28.     //initialize with a measurement
  29.     x_est_last = z_real + frand()*0.09;
  30.    
  31.     float sum_error_kalman = 0;
  32.     float sum_error_measure = 0;
  33.    
  34.     for (int i=0;i<30;i++) {
  35.         //do a prediction
  36.         x_temp_est = x_est_last;
  37.         P_temp = P_last + Q;
  38.         //calculate the Kalman gain
  39.         K = P_temp * (1.0/(P_temp + R));
  40.         //measure
  41.         z_measured = z_real + frand()*0.09; //the real measurement plus noise
  42.         //correct
  43.         x_est = x_temp_est + K * (z_measured - x_temp_est);
  44.         P = (1- K) * P_temp;
  45.         //we have our new system
  46.         
  47.         printf("Ideal    position: %6.3f \n",z_real);
  48.         printf("Mesaured position: %6.3f [diff:%.3f]\n",z_measured,fabs(z_real-z_measured));
  49.         printf("Kalman   position: %6.3f [diff:%.3f]\n",x_est,fabs(z_real - x_est));
  50.         
  51.         sum_error_kalman += fabs(z_real - x_est);
  52.         sum_error_measure += fabs(z_real-z_measured);
  53.         
  54.         //update our last's
  55.         P_last = P;
  56.         x_est_last = x_est;
  57.     }
  58.    
  59.     printf("Total error if using raw measured:  %f\n",sum_error_measure);
  60.     printf("Total error if using kalman filter: %f\n",sum_error_kalman);
  61.     printf("Reduction in error: %d%% \n",100-(int)((sum_error_kalman/sum_error_measure)*100));
  62.    
  63.    
  64.     return 0;
  65. }//

复制代码


感谢小编,顶上去;

这个算法很是经典,下来保留。

不是很懂,先拿走再说

谢谢,不知您是否有开源的导航算法代码?

真不是很懂,很多要学习啊

谢谢你无私的分享!

这个好,支持支持。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top