极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: 黑马

我的自平衡小车D2——加速度计与陀螺仪获取姿态参数的差异

  [复制链接]
发表于 2012-9-21 17:59:19 | 显示全部楼层
黑马 发表于 2012-3-23 13:39
感谢Malc的意见,搜了一下互补滤波,我的理解是这种滤波方式就是按一定的权重对两个值进行叠加,很直观的 ...

好不容易找找到了卡尔曼滤波的介绍,可是等到把它转化成arduino语言时发现不知道该如何用来滤波,没有输结果,而且整个过程中都是行列式,有限的几个输出也是行列式。
代码如下,只有函数,没有主程序,现在不知道该如何。加速度计计算的角度是x,陀螺仪是u,那么输出的结果应该也是个角度,但是不知道该如何进行。
  1. KalmanInit();                        /////参数初始化

  2. float KalmanFileter(float x,float u )

  3. {

  4.         float temp6,temp8;

  5.         float temp1[2],temp2[2],temp5[2],temp7[2],temp9[2],;

  6.         float temp3[2][2],temp4[2][2],temp10[2][2],temp11[2][2];





  7.                                                 //////第一步:计算预测的现在状态X_estimate//////////

  8.     /*

  9.                 | a11        a12        |                | X1 |                | T1 |

  10.                 | a21        a22 |        X        | X2 |        =        | T2 |       

  11.     */

  12.                 for( i = 0 ; i < 2 ; i++ )

  13.                 {

  14.                    for( j = 0 ; j < 2 ; j++ )

  15.             {

  16.                 temp1[i] = temp[i] + A[i][j] * X_optimal[j];        //A[2X2]X X_optimal[2X1]= temp1[2X1] 结果为列矩阵

  17.                         }

  18.                 }

  19.     /*

  20.                 | t1 |                                | T1 |

  21.                 | t2 |        X        g        =        | T2 |       

  22.     */               

  23.                 for( i = 0 ; i < 2 ; i++ )  

  24.                 {               

  25.                         temp2[i] = B[i] * u;                                                        //temp2 为[2X1]列矩阵

  26.                 }

  27.     /*

  28.                 | t1 |                | T1 |                | x1 |

  29.                 | t1 |        +        | T2 |        =        | x2 |       

  30.     */               

  31.                 for ( i = 0 ; i < 2 ; i++ )       

  32.                 {       

  33.                         X_estimate[i] = temp1[i] + temp2[i];                                //X_estimate[2X1]列矩阵

  34.                 }       

  35.                                                 /////第二步:计算X_estimate的协方差//////

  36.     /*   

  37.                 | a11        a12        |                | p11        p12 |                | T11        T12 |

  38.                 | a21        a22 |        X        | p21        p22 |        =        | T21        T22 |

  39.         */

  40.                 for( i = 0 ; i < 2 ; i++ )

  41.                 {

  42.                         for( j = 0 ; j < 2 ; j++ )

  43.             {

  44.                                 for( k = 0 ; k < 2 ; k++ )

  45.                 {                                       

  46.                                         temp3[i][j] = temp3[i][j] + A[i][k] * P_optimal[k][j];        //A[2X2] X P_optimal[2X2] = temp3[2X2]

  47.                                 }

  48.                         }

  49.         }

  50.     /*   

  51.                 | t11        t12        |                | A11        A21 |                | T11        T12 |

  52.                 | t21        t22 |        X        | A12        A22 |        =        | T21        T22 |

  53.         */               

  54.         for( i = 0 ; i < 2; i++ )

  55.         {   

  56.                         for( j = 0 ; j < 2; j++ )

  57.                         {

  58.                 for( k = 0 ; k < 2 ; k++ )

  59.                 {

  60.                                         temp4[i][j] = temp4[i][j] + temp3[i][k] * A[j][k];        //temp3[2X2] XAT[2X2] = temp4[2X2] AT为A的转置矩阵

  61.                                 }

  62.                         }

  63.                 }

  64.     /*   

  65.                 | t11        t12        |                | Q11        Q12 |                | P11        P12 |

  66.                 | t21        t22 |        +        | Q21        Q22 |        =        | P21        P22 |

  67.         */               

  68.         for( i = 0 ; i < 2 ; i++ )

  69.                 {

  70.                         for( j = 0 ; j < 2 ; j++ )

  71.             {  

  72.                                 P_estimate[i][j] = temp4[i][j] + Q[i][j];                                //P_estimate[2X2]矩阵

  73.                         }

  74.                 }       

  75.                                         /////////////第三步:计算得出卡尔曼增益///////////////

  76.     /*

  77.                                                         | P11        P21 |               

  78.                 | H2        H2 |        X        | P21        P22 |        =        | T1        T2 |       

  79.     */        

  80.                 for( i = 0 ; i < 2 ; i++ )

  81.         {

  82.                         for( j = 0 ; j < 2 ; j++ )

  83.                         {   

  84.                                 temp5[i] = temp5[i] + H[j] * P_estimate[j][i];                        //H[1X2]X P_estimate[2X2]= temp5[1X2]结果为行矩阵

  85.                         }       

  86.                 }

  87.         /*

  88.                                                         | P1 |               

  89.                 | H2        H2 |        X        | P2 |        =        R       

  90.     */                   

  91.                 for ( i = 0 ; i < 2 ; i++ )       

  92.                 {       

  93.                         temp6 = temp6 + temp5[i] * H[i] ;                                                        //[1X2]X[2X1] = R 结果为实数

  94.                 }       

  95.                 temp6 = temp6 + R ;

  96.                

  97.         for( i = 0 ; i < 2 ; i++ )

  98.         {   

  99.                         for( j = 0 ; j < 2 ; j++ )

  100.             {   

  101.                                 temp7[i] = temp7[i] + P_estimate[i][j] * H[j];                        // [2X2] X [2x1] = [2x1] 结果为列矩阵

  102.                         }

  103.                 }       

  104.                 for ( i = 0 ; i < 2 ; i++  )       

  105.                 {       

  106.                         Kg[i] = temp7[i] / temp6;

  107.                 }

  108.                        

  109.                                                         ////////////第四步:计算最优状态值X_optimal/////////

  110.                 for ( i = 0 ; i < 2 ; i++ )

  111.                 {

  112.                         temp8 = temp8 + H[i] * X_estimate[i] ;                                                //[1X2]X[2X1] = R 结果为实数

  113.                 }

  114.                

  115.                 temp8 = x - temp8;

  116.                 for ( i = 0 ; i < 0 ; i++ )

  117.                 {

  118.                         temp9[i] = temp8 * Kg[i];

  119.                         X_optimal[i] = X_estimate[i] + temp9[i];

  120.                 }

  121.                

  122.                

  123.                                 //////////第五步:最优值的协方差////////////

  124.     /*

  125.                 | k1 |                                                        | T11         T12 |

  126.                 | k2 |        X        | H1        H2 |        =        | T21         T22 |       

  127.     */        

  128.                 for( i = 0 ; i < 2 ; i++ )

  129.         {       

  130.                         for( j = 0 ; j < 2 ; j++ )

  131.             {   

  132.                                 temp10[i][j] = Kg [i]* H[j];                                                        //[2X1] X [1X2] = [2X2]

  133.                         }

  134.                 }

  135.     /*

  136.                 | a11        a12        |                | X1 |                | T1 |

  137.                 | a21        a22 |        X        | X2 |        =        | T2 |       

  138.     */               

  139.                 for( i = 0 ; i < 2 ; i++ )

  140.         {

  141.                         for( j = 0 ; j < 2 ; j++ )

  142.             {

  143.                                 temp11[i][j] = 1 - temp10[i][j];

  144.                         }       

  145.                 }       

  146.     /*   

  147.                 | a11        a12        |                | p11        p12 |                | T11        T12 |

  148.                 | a21        a22 |        X        | p21        p22 |        =        | T21        T22 |

  149.         */               

  150.                 for( i = 0 ; i < 2 ; i++ )

  151.                 {       

  152.                         for( j = 0 ; j < 2 ; j++ )

  153.             {

  154.                                 for( k = 0 ; k < 2 ; k++ )

  155.                                 {

  156.                                         P_optimal[i][j] = P_optimal[i][j] + temp11[i][k] * P_estimate[k][j];

  157.                                 }

  158.                         }

  159.                 }       

  160.                

  161.                

  162.        

  163. ////////////////完成///////////////////////////////

  164. }



  165. void KalmanFileter2( float x[3],u[3])

  166. {

  167.        

  168.                 //KalmanFileter(accangle[0] ,gyrangle[1]);

  169.         kalmanangle[0] = KalmanFileter(x[0] ,u[1]);

  170.         kalmanangle[1] = KalmanFileter(x[1] ,u[0]);

  171.         kalmanangle[2] = KalmanFileter(x[2] ,u[2]);



  172. }





  173. void KalmanInit(void)

  174. {

  175.         

  176.                 float T=0.02;

  177.         float A[2][2]={ { 1, -0.02},{ 0,   1} };

  178.         float B[2]={ 10.2,0  };

  179.         float Q[2][2]={ { 0.01, 0 },{ 0, 0.005 } };

  180.                 float H[2] = { 0.01,0.05 };               

  181.         float R=0.056;      

  182.                 float X_optimal[2]={ 0,0 }

  183.         float P_optimal[2][2]={ { 0.005, 0.005 },{ 0.005, 0.005 } }

  184.        

  185. }



  186.                 float T;

  187.         float A[2][2];

  188.         float B[2];

  189.         float Q[2][2];

  190.                 float H[2];               

  191.         float R;      

  192.                 float X_optimal[2];X_estimate[2];

  193.         float P_optimal[2][2],P_estimate[2][2];

  194.                 float X_optimal[2],P_optimal[2][2],Kg[2] ;
复制代码
回复 支持 反对

使用道具 举报

发表于 2012-9-26 20:35:04 | 显示全部楼层
楼主,给个能用的代码,可以不,照顾一下小白嘛
回复 支持 反对

使用道具 举报

发表于 2012-12-26 20:45:26 | 显示全部楼层
马克了!楼主我也在用你用的那个板子 3合一~哇哈哈~ 我正在给我的航模飞机弄一个惯性参考系统~

滤波的算法有时间再研究了= = 好高深的样子~ 我现在用的是最最最弱智的方法——取加权平均值。。我用加速度仪和陀螺仪各算出一个角度,然后给算加权平均。。。 然后每隔一段时间,只要陀螺仪的读数没变化(飞机静止或匀速运动),就用加速度仪的读数来校正~~
回复 支持 反对

使用道具 举报

发表于 2013-5-9 18:45:15 | 显示全部楼层
简直就是神器啊
回复 支持 反对

使用道具 举报

发表于 2013-6-16 23:48:31 | 显示全部楼层
不错,这几天我也在搞这个传感器,顶下!!
回复 支持 反对

使用道具 举报

发表于 2013-11-30 11:25:30 | 显示全部楼层
楼主好厉害,最近也在做这个东东,感觉好难
回复 支持 反对

使用道具 举报

发表于 2014-2-16 20:51:01 | 显示全部楼层
陀螺仪偏移量是怎么得到的?
回复 支持 反对

使用道具 举报

发表于 2014-7-28 14:26:43 | 显示全部楼层
darkorigin 发表于 2012-9-2 15:29
谢谢~~~呵呵,我用了另外的一个开源的东西搞起来了,很强大。

请问是你用的是什么啊?
回复 支持 反对

使用道具 举报

发表于 2014-7-29 09:01:26 | 显示全部楼层
chd77903499 发表于 2014-7-28 14:26
请问是你用的是什么啊?

MWC开源代码~~~
回复 支持 反对

使用道具 举报

发表于 2014-9-10 19:21:30 | 显示全部楼层
超级厉害  佩服佩服  多谢分享  
回复 支持 反对

使用道具 举报

发表于 2015-11-26 22:03:58 | 显示全部楼层
很好的资料
回复 支持 反对

使用道具 举报

发表于 2018-3-5 22:30:22 | 显示全部楼层
好贴,顶,本人水平有限,学习了收藏了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 23:39 , Processed in 0.048465 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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