搜索
bottom↓
回复: 7

关于卡尔曼滤波的疑问和讨论

[复制链接]

出0入399汤圆

发表于 2014-7-22 11:11:48 | 显示全部楼层 |阅读模式
这里方便初学只说一维的(感觉多维的其实就把多维的写在一个数组里面--类似矩阵,程序看起来更简洁了,计算的过程中还是各算各得)。看了温度的那个例子,感觉很形象,照着一个程序看了一下,感觉应用上还算明白了一点,但是原理上还得看kalman的论文(一堆计算,一堆符号,太吓人了)。下面是一位网友照比温度的那个例子写出来的程序,不知道他的测试结果怎么样?

但是实际上那个温度的例子,文档中后面给出了建模的大致过程:

可以看到上面的建模和实际程序不太一样,Kg的计算图一中用的是标准差,而建模中用的方差。那温度的那个例子中作者岂不前后冲突了?还是说第二个图是第一个图的精简版,速度其较快,精度比其差?论坛中大部分的程序也都是用的这个建模例子写的,下面是其中一个:


还有一点温度例子中,最后的matlab仿真文件很多人说是错误的,我仿真了一下,波形也不对,传一个网友传的:
  1. clc
  2. clear
  3. N=200;
  4. w=randn(1,N);       %标准正态分布的随机数
  5. for t=1:N
  6.     z(t)=25+w(t)*3;     %测量值
  7. end
  8. mean(z)
  9. q1=std(z);      %求标准差
  10. R=q1^2;             %观测噪声  

  11. V=0.1*randn(1,N);
  12. q2=std(V);         
  13. Q=q2^2;             %模型噪声

  14. p(1)=10;
  15. x(1)=0;
  16. for t=2:N;
  17.     x1(t)=x(t-1);                      %预测状态
  18.     p1(t)=p(t-1)+Q;                 %预测估计协方差
  19.    
  20.     k(t)=p1(t)/(p1(t)+R);           %最优卡尔曼增益
  21.     x(t)=x1(t)+k(t)*(z(t)-x1(t));   %更新状态估计
  22.     p(t)=(1-k(t))*p1(t);               %更新协方差估计
  23. end

  24. t=1:N;
  25. plot([0,N],[25,25],'g',t,z,'b',t,x,'r');
  26. legend('真实值','测量值','估计值');
复制代码

仿真结果也是正确的:


还有一点,是关于零时刻的初始值和Q和R的值,大家都不知道如何选择,下面是部分高手给的回复:
初始值的估计:为了令卡尔曼滤波器开始工作,我们需要告诉卡尔曼两个零时刻的初始值,是X(0|0)和P(0|0)。他们的值不用太在意,随便给一个就可以了,因为随着卡尔曼的工作,X会逐渐的收敛(收敛到25度)。但是对于P,一般不要取0,因为这样可能会令卡尔曼完全相信你给定的X(0|0)是系统最优的,从而使算法不能收敛。我选了X(0|0)=1度,P(0|0)=10。(学院派的一种说法是:卡尔曼的收敛性与最初的系统估计关系不是很大,只要不为0,最终都会有比较理想的收敛效果。在最终的收敛完场之后,无论最初赋值为多少,都基本会稳定到某一个值)
QR的值:用通俗的语言描述下大概意思(A=1的情况下):Q值大小只影响初期预估值的稳定跟踪时间,稳定跟踪后几乎不起作用,所以Q=0都可以。但R值一定是非零数值,R值越小滤波效果越差,但跟踪越快,反之,R值越大滤波越平滑,但跟踪越慢。所以要达到预期效果,只要调节R值即可。多说一句卡尔曼滤波做为最优线性观测器,严格来讲是没有“参数”的,最优的东西是不应该受参数而转移的,系统误差矩阵和测量误差矩阵应该叫“模型”,它们的确定属于模型辨识问题而不是参数整定问题。

就看了一天的资料,很多东西不一定对的。大家说说自己的看法吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-7-22 14:30:45 | 显示全部楼层
你这个是一维的,有多维的例子吗?

出0入399汤圆

 楼主| 发表于 2014-7-22 15:04:20 | 显示全部楼层
babyhua 发表于 2014-7-22 14:30
你这个是一维的,有多维的例子吗?

没有啊,用不到没研究。

出0入0汤圆

发表于 2014-8-14 00:07:45 | 显示全部楼层
mark              

出0入0汤圆

发表于 2014-8-14 01:10:12 | 显示全部楼层
我觉得卡尔曼滤波器就三个部分,
一是利用系统模型估计下一时刻的系统状态,
二是利用下一时刻的系统输出来估计下一时刻的系统状态,
三是给予这两个估计值一定的权重然后平均得出系统状态的最优值。
没看过卡尔曼滤波器的具体推导,所以我也不知道为什么这么做有用,但是的确有用。
关于QR值的说法,我的观点和LZ是一样的。
卡尔曼滤波器还有其他变种,比如扩展卡尔曼滤波器。传统卡尔曼滤波器要求系统是线性系统,扩展卡尔曼滤波器就没这个要求了。
还有其他几种不记得了,最近在研究状态机,没时间看这些。

附带一个用来计算姿态角的卡尔曼滤波器,多维的。
  1. %kalman 2014@L.

  2. clear;

  3. %define var
  4. ACC_LSB = 16384/9.8;
  5. GYR_LSB = 65.5/57.3;

  6. len = 1000;
  7. len2 = 300;

  8. ERROR = 1:len2;

  9. X_ACC = 1:len;
  10. Y_ACC = 1:len;
  11. Z_ACC = 1:len;

  12. X_GYRO = 1:len;
  13. Y_GYRO = 1:len;
  14. Z_GYRO = 1:len;

  15. theta_ANGLE = 1:len2;
  16. fal_ANGLE = 1:len2;
  17. pu_ANGLE = 1:len2;

  18. A = ones(4);

  19. X = [1, 0, 0, 0]';

  20. P = [1 1 1 1];
  21. P = diag(P);

  22. Q = [2e-5, 2e-5, 2e-5, 2e-5];
  23. Q = diag(Q);

  24. R = [5e-1,5e-1,5e-1];
  25. R = diag(R);

  26. I = [1 1 1 1];
  27. I = diag(I);

  28. H = ones(3, 4);
  29. h = ones(3, 3);

  30. t = 0.001;

  31. S = ones(3,1);

  32. T1 = ones(3,1);
  33. T2 = ones(3,1);
  34. T3 = ones(3,1);

  35. %read data file
  36. textData = importdata('/home/life/Code/ARM/STM32/F103/MPU6050/test.dat');

  37. %X_ACC
  38.     for i = 1:len
  39.         X_ACC(i) = textData(i,2)/ACC_LSB;
  40.     end
  41. %Y_ACC
  42.     for i = 1:len
  43.         Y_ACC(i) = textData(i,3)/ACC_LSB;
  44.     end
  45. %Z_ACC
  46.     for i = 1:len
  47.         Z_ACC(i) = textData(i,4)/ACC_LSB;
  48.     end
  49. %X_GYRO
  50.     for i = 1:len
  51.         X_GYRO(i) = textData(i,5)/GYR_LSB;
  52.     end
  53. %X_GYRO
  54.     for i = 1:len
  55.         Y_GYRO(i) = textData(i,6)/GYR_LSB;
  56.     end
  57. %X_GYRO
  58.     for i = 1:len
  59.         Z_GYRO(i) = textData(i,7)/GYR_LSB;
  60.     end

  61. %main loop
  62. for i = 1:len2
  63.     %calculate A
  64. %     A(1,1) = 1;
  65. %     A(1,2) = exp(-t*X_GYRO(i));
  66. %     A(1,3) = exp(-t*Y_GYRO(i));
  67. %     A(1,4) = exp(-t*Z_GYRO(i));
  68. %     
  69. %     A(2,1) = exp(t*X_GYRO(i));
  70. %     A(2,2) = 1;
  71. %     A(2,3) = exp(t*Z_GYRO(i));
  72. %     A(2,4) = exp(t*Y_GYRO(i));
  73. %     
  74. %     A(3,1) = exp(t*Y_GYRO(i));
  75. %     A(3,2) = exp(-t*Z_GYRO(i));
  76. %     A(3,3) = 1;
  77. %     A(3,4) = exp(t*X_GYRO(i));
  78. %     
  79. %     A(4,1) = exp(t*Z_GYRO(i));
  80. %     A(4,4) = 1;
  81. %     A(4,2) = exp(t*Y_GYRO(i));
  82. %     A(4,3) = exp(-t*X_GYRO(i));

  83. %calculate s
  84.       T1(1) = 0.5*(X_GYRO(3*i)+X_GYRO(3*i+1))*t;
  85.       T1(2) = 0.5*(Y_GYRO(3*i)+Y_GYRO(3*i+1))*t;
  86.       T1(3) = 0.5*(Y_GYRO(3*i)+Y_GYRO(3*i+1))*t;

  87.       T2(1) = 0.5*(X_GYRO(3*i+1)+X_GYRO(3*i+2))*t;
  88.       T2(2) = 0.5*(Y_GYRO(3*i+1)+Y_GYRO(3*i+2))*t;
  89.       T2(3) = 0.5*(Z_GYRO(3*i+1)+Z_GYRO(3*i+2))*t;
  90.       
  91.       T3(1) = 0.5*(X_GYRO(3*i+2)+X_GYRO(3*i+3))*t;
  92.       T3(2) = 0.5*(Y_GYRO(3*i+2)+Y_GYRO(3*i+3))*t;
  93.       T3(3) = 0.5*(Z_GYRO(3*i+2)+Z_GYRO(3*i+3))*t;
  94.       
  95.       S = T1+T2+T3+(33/80)*cross(T1, T2)+(57/80)*cross(T2, (T3-T1));
  96. %      
  97. %       q0 = cos(sqrt(S(1)^2 + S(2)^2 + S(3)^2));
  98. %       q1 = (S(1)/sqrt(S(1)^2 + S(2)^2 + S(3)^2))*sin(S(1)/sqrt(S(1)^2 + S(2)^2 + S(3)^2));
  99. %       q2 = (S(2)/sqrt(S(1)^2 + S(2)^2 + S(3)^2))*sin(S(2)/sqrt(S(1)^2 + S(2)^2 + S(3)^2));
  100. %       q3 = (S(3)/sqrt(S(1)^2 + S(2)^2 + S(3)^2))*sin(S(3)/sqrt(S(1)^2 + S(2)^2 + S(3)^2));

  101.     sx = S(1);
  102.     sy = S(2);
  103.     sz = S(3);
  104. %     sx = X_GYRO(i)*t;
  105. %     sy = Y_GYRO(i)*t;
  106. %     sz = Z_GYRO(i)*t;
  107.     s = 0.25*(sx^2+sy^2+sz^2);
  108.    
  109.     ac = 1-0.5*s+s^2/24;
  110.     as = 0.5*(1 - s/6 + s^2/120);

  111.       
  112. %     A(1,1) =  q0;
  113. %     A(1,2) = -q1;
  114. %     A(1,3) = -q2;
  115. %     A(1,4) = -q3;
  116. %     
  117. %     A(2,1) =  q1;
  118. %     A(2,2) =  q0;
  119. %     A(2,3) = -q3;
  120. %     A(2,4) =  q2;
  121. %     
  122. %     A(3,1) =  q2;
  123. %     A(3,2) =  q3;
  124. %     A(3,3) =  q0;
  125. %     A(3,4) = -q1;
  126. %     
  127. %     A(4,1) =  q3;
  128. %     A(4,2) =  -q2;
  129. %     A(4,3) = q1;
  130. %     A(4,4) = q0;

  131.     A(1,1) =  ac;
  132.     A(1,2) = -as*sx;
  133.     A(1,3) = -as*sy;
  134.     A(1,4) = -as*sz;
  135.    
  136.     A(2,1) =  as*sx;
  137.     A(2,2) =  ac;
  138.     A(2,3) = -as*sz;
  139.     A(2,4) =  as*sy;
  140.    
  141.     A(3,1) =  as*sy;
  142.     A(3,2) =  as*sz;
  143.     A(3,3) =  ac;
  144.     A(3,4) = -as*sx;
  145.    
  146.     A(4,1) =  as*sz;
  147.     A(4,2) =  as*sy;
  148.     A(4,3) = -as*sx;
  149.     A(4,4) =  ac;
  150.    
  151.     %q = sqrt(t*X_GYRO(i)^2+t*Y_GYRO(i)^2+t*Z_GYRO(i)^2);
  152.    
  153.     %R = [(1 - ((0.5*q)^2)/2), 0.5*X_GYRO(i), 0.5*Y_GYRO(i), 0.5*Z_GYRO(i)]';
  154.    
  155.     %A = A*R;
  156.    
  157.     %time updata
  158.     X = A*X;
  159.     P = A*P*A' + Q;
  160.    
  161.     %measure updata
  162.     %[ ax*q0 + ay*q3 - az*q2, ax*q1 + ay*q2 + az*q3, ay*q1 - ax*q2 - az*q0, ay*q0 - ax*q3 + az*q1]
  163.     %[ ay*q0 - ax*q3 + az*q1, ax*q2 - ay*q1 + az*q0, ax*q1 + ay*q2 + az*q3, az*q2 - ay*q3 - ax*q0]
  164.     %[ ax*q2 - ay*q1 + az*q0, ax*q3 - ay*q0 - az*q1, ax*q0 + ay*q3 - az*q2, ax*q1 + ay*q2 + az*q3]
  165.     %[ 2*q3*vz - 2*q4*vy,           2*q3*vy + 2*q4*vz, 2*q2*vy - 4*q3*vx + 2*q1*vz, 2*q2*vy - 4*q3*vx + 2*q1*vz]
  166.     %[ 2*q4*vx - 2*q2*vz, 2*q3*vx - 4*q2*vy - 2*q1*vz,           2*q2*vx + 2*q4*vz, 2*q1*vx - 4*q4*vy + 2*q3*vz]
  167.     %[ 2*q2*vy - 2*q3*vx, 2*q4*vx + 2*q1*vy - 4*q2*vz, 2*q4*vy - 2*q1*vx - 4*q3*vz,           2*q2*vx + 2*q3*vy]
  168.    
  169.     j = i;
  170.    
  171.     %calculate H   
  172.     H(1,1) =  2*X(3)*Z_ACC(j)-2*X(4)*Y_ACC(j);
  173.     H(1,2) =  2*X(3)*Y_ACC(j)+2*X(4)*Z_ACC(j);
  174.     H(1,3) =  2*X(2)*Y_ACC(j)-4*X(3)*X_ACC(j)+2*X(1)*Z_ACC(j);
  175.     H(1,4) =  2*X(2)*Y_ACC(j)-4*X(3)*X_ACC(j)+2*X(1)*Z_ACC(j);
  176.    
  177.     H(2,1) =  2*X(4)*X_ACC(j)-2*X(2)*Z_ACC(j);
  178.     H(2,2) =  2*X(3)*X_ACC(j)-4*X(2)*Y_ACC(j)-2*X(1)*Z_ACC(j);
  179.     H(2,3) =  2*X(2)*X_ACC(j)+2*X(4)*Z_ACC(j);
  180.     H(2,4) =  2*X(1)*X_ACC(j)-4*X(4)*Y_ACC(j)+2*X(3)*Z_ACC(j);
  181.    
  182.     H(3,1) =  2*X(2)*Y_ACC(j)-2*X(3)*X_ACC(j);
  183.     H(3,2) =  2*X(4)*X_ACC(j)+2*X(1)*Y_ACC(j)-4*X(2)*Z_ACC(j);
  184.     H(3,3) =  2*X(4)*Y_ACC(j)-2*X(1)*X_ACC(j)-4*X(3)*Z_ACC(j);
  185.     H(3,4) =  2*X(2)*X_ACC(j)+2*X(3)*Y_ACC(j);
  186.    
  187. %     H(1,1) =  2*X(3)*Z_ACC(i)-2*X(4)*Y_ACC(i);
  188. %     H(1,2) =  2*X(3)*Y_ACC(i)+2*X(4)*Z_ACC(i);
  189. %     H(1,3) =  2*X(2)*Y_ACC(i)-4*X(3)*X_ACC(i)+2*X(1)*Z_ACC(i);
  190. %     H(1,4) =  2*X(2)*Y_ACC(i)-4*X(3)*X_ACC(i)+2*X(1)*Z_ACC(i);
  191. %     
  192. %     H(2,1) =  2*X(4)*X_ACC(i)-2*X(2)*Z_ACC(i);
  193. %     H(2,2) =  2*X(3)*X_ACC(i)-4*X(2)*Y_ACC(i)-2*X(1)*Z_ACC(i);
  194. %     H(2,3) =  2*X(2)*X_ACC(i)+2*X(4)*Z_ACC(i);
  195. %     H(2,4) =  2*X(1)*X_ACC(i)-4*X(4)*Y_ACC(i)+2*X(3)*Z_ACC(i);
  196. %     
  197. %     H(3,1) =  2*X(2)*Y_ACC(i)-2*X(3)*X_ACC(i);
  198. %     H(3,2) =  2*X(4)*X_ACC(i)+2*X(1)*Y_ACC(i)-4*X(2)*Z_ACC(i);
  199. %     H(3,3) =  2*X(4)*Y_ACC(i)-2*X(1)*X_ACC(i)-4*X(3)*Z_ACC(i);
  200. %     H(3,4) =  2*X(2)*X_ACC(i)+2*X(3)*Y_ACC(i);
  201.    
  202. %     H(1,1) =  X(1)*X_ACC(i)+X(4)*Y_ACC(i)-X(3)*Z_ACC(i);
  203. %     H(1,2) =  X(2)*X_ACC(i)+X(3)*Y_ACC(i)+X(4)*Z_ACC(i);
  204. %     H(1,3) =  X(2)*X_ACC(i)-X(3)*Y_ACC(i)-X(1)*Z_ACC(i);
  205. %     H(1,4) =  X(1)*X_ACC(i)-X(4)*Y_ACC(i)+X(2)*Z_ACC(i);
  206. %     
  207. %     H(2,1) =  X(1)*X_ACC(i)-X(4)*Y_ACC(i)+X(2)*Z_ACC(i);
  208. %     H(2,2) =  X(3)*X_ACC(i)-X(2)*Y_ACC(i)+X(1)*Z_ACC(i);
  209. %     H(2,3) =  X(2)*X_ACC(i)+X(3)*Y_ACC(i)+X(4)*Z_ACC(i);
  210. %     H(2,4) =  X(3)*X_ACC(i)-X(4)*Y_ACC(i)-X(1)*Z_ACC(i);
  211. %     
  212. %     H(3,1) =  X(3)*X_ACC(i)-X(2)*Y_ACC(i)+X(1)*Z_ACC(i);
  213. %     H(3,2) =  X(4)*X_ACC(i)-X(1)*Y_ACC(i)-X(2)*Z_ACC(i);
  214. %     H(3,3) =  X(1)*X_ACC(i)+X(4)*Y_ACC(i)-X(3)*Z_ACC(i);
  215. %     H(3,4) =  X(2)*X_ACC(i)+X(3)*Y_ACC(i)+X(4)*Z_ACC(i);
  216.    
  217.     %calculate h
  218.     %[ q0^2 + q1^2 - q2^2 - q3^2,         2*q0*q3 + 2*q1*q2,         2*q1*q3 - 2*q0*q2]
  219.     %[         2*q1*q2 + 2*q0*q3, q0^2 - q1^2 + q2^2 - q3^2,         2*q0*q1 - 2*q2*q3]
  220.     %[         2*q0*q2 - 2*q1*q3,         2*q2*q3 + 2*q0*q1, q0^2 - q1^2 - q2^2 + q3^2]
  221.    
  222.     h(1,1) = X(1)^2 + X(2)^2 - X(3)^2 - X(4)^2;
  223.     h(1,2) = 2*(X(1)*X(4) + X(2)*X(3));
  224.     h(1,3) = 2*(X(2)*X(4) + X(1)*X(3));
  225.    
  226.     h(2,1) = 2*(X(2)*X(3) - X(1)*X(4));
  227.     h(2,2) = X(1)^2 - X(2)^2 + X(3)^2 - X(4)^2;
  228.     h(2,3) = 2*(X(1)*X(2) + X(3)*X(4));
  229.    
  230.     h(3,1) = 2*(X(1)*X(3) + X(2)*X(4));
  231.     h(3,2) = 2*(X(3)*X(4) - X(1)*X(2));
  232.     h(3,3) = X(1)^2 - X(2)^2 - X(3)^2 + X(4)^2;
  233.    
  234.     %H = 2*H;
  235.    
  236.     %calculate Kg
  237.     Kg = P*H'/(H*P*H' + R);
  238.    
  239.     %calculate new X and P
  240.     Z = [X_ACC(i), Y_ACC(i), Z_ACC(i)];
  241.     Z = Z';
  242.    
  243.     X = X + Kg*(Z - H*X);
  244.     P = (I - Kg*H)*P;
  245.    
  246.     ERROR(i) = 1- sqrt(X(1)^2+X(2)^2+X(3)^2+X(4)^2);
  247.    
  248.     X(1) = X(1)/sqrt(X(1)^2+X(2)^2+X(3)^2+X(4)^2);
  249.     X(2) = X(2)/sqrt(X(1)^2+X(2)^2+X(3)^2+X(4)^2);
  250.     X(3) = X(3)/sqrt(X(1)^2+X(2)^2+X(3)^2+X(4)^2);
  251.     X(4) = X(4)/sqrt(X(1)^2+X(2)^2+X(3)^2+X(4)^2);
  252.    
  253.     theta_ANGLE(i)  = asin(2*(X(2)*X(4)-X(1)*X(3)))*57.3;   
  254.     fal_ANGLE(i)  = atan2(2*X(1)*X(2)+2*X(3)*X(4), X(1)^2-X(2)^2-X(3)^2+X(4)^2)*57.3;
  255.     pu_ANGLE(i)  = atan2(2*X(1)*X(4) +2*X(2)*X(3),X(1)^2+X(2)^2-X(3)^2-X(4)^2)*57.3;
  256. end
复制代码

出0入0汤圆

发表于 2014-8-14 09:23:43 | 显示全部楼层
我也试过,MPU6050输出数据,边输边滤波,得到的效果很不错! 但是要如何在动态下滤波呢,就是测量的数据不是这种静态不变的,而是随时在变化的。我试过把MPU6050传感器移动,使加速度值是变化的,滤波的结果与真实值差很多,直到不动传感器,滤波结果在很长一段时间后才会收敛。

出0入0汤圆

发表于 2014-8-19 20:49:38 | 显示全部楼层
mark           

出0入0汤圆

发表于 2014-8-19 23:09:27 | 显示全部楼层
学习了,感谢楼主
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表