智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 8371|回复: 23
打印 上一主题 下一主题

卡尔曼滤波用的是非矩阵还是矩阵的?

  [复制链接]

11

主题

583

帖子

0

精华

常驻嘉宾

MISS Gao

Rank: 8Rank: 8

积分
5774

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
2282
贡献
1682
兑换币
935
注册时间
2012-2-12
在线时间
905 小时
跳转到指定楼层
1#
发表于 2013-1-24 13:52:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 subingkiun 于 2013-1-24 13:53 编辑

在网上找到的非矩阵的卡尔曼滤波的程序,非矩阵的,有人用他直立过么?

volatile float QingJiao = 0;
volatile float Gyro_Data = 0;
void Kalman(void)
{
   float Q =1,R = 300;
   static float RealData = 0,RealData_P = 0;
   float NowData = 0,NowData_P = 0;
   float Kg = 0,gyroscope_rate = 0,accelerometer_angle=0;
   float Acc_x = 0,Acc_z = 0, Gyro = 0;
   static float his_acc = 0.0,his_accx = 0.0,his_accz = 0.0;
   
   while(!ATD0STAT0_SCF);   //等待转换完成
        
    Acc_x = (float)ATD0DR1;
    Acc_z = (float)ATD0DR2;
    Gyro  = (float)ATD0DR0;
   
   if(Gyro > 4090) Gyro += 1000;
   else
   if(Gyro > 4084) Gyro += 500;
   
   if(Gyro < 55)   Gyro -= 1000;
   else
   if(Gyro < 60)   Gyro -= 500;
      
    Acc_x = Acc_x - 2342.0;
    Acc_z = Acc_z - 2076.0;
    Gyro  = Gyro  - 2048.0;
    Gyro_Data = Gyro;
   
    OutData[0] = Gyro_Data;
    accelerometer_angle = atan2f(-Acc_x,Acc_z);
    OutData[1] = accelerometer_angle*1000;

    gyroscope_rate = Gyro*0.0023;         //参考电压3.3v 12位ADC 放大9.1倍 enc-03 0.67mv/deg./sec.
   
                                          //(3300/4096)/(0.67*9.1)*(3.14/180) =  0.0023
   
    NowData = RealData + gyroscope_rate*0.01;                 
    //1.预估计 X(k|k-1) = A(k,k-1)*X(k-1|k-1) + B(k)*u(k)
    NowData_P = sqrt(Q*Q+RealData_P*RealData_P);            
    //2.计算预估计协方差矩阵   P(k|k-1) = A(k,k-1)*P(k-1|k-1)*A(k,k-1)'+Q(k)
    Kg = sqrt(NowData_P*NowData_P/(NowData_P*NowData_P+R*R));
    //3.计算卡尔曼增益矩阵 K(k) = P(k|k-1)*H(k)' / (H(k)*P(k|k-1)*H(k)' + R(k))
    RealData = NowData + Kg*(accelerometer_angle - NowData);
    //4.更新估计 X(k|k) = X(k|k-1)+K(k)*(Z(k)-H(k)*X(k|k-1))
    RealData_P = sqrt((1-Kg)*NowData_P*NowData_P);           
    //5.计算更新后估计协防差矩阵 P(k|k) =(I-K(k)*H(k))*P(k|k-1)
   
    QingJiao =  RealData;  
   
   
    OutData[2] = QingJiao*1000;
    OutPut_Data();
}
他用的AD转换是12位精度的。但是输出的波形是这样的
那我要调什么参数?
是不是陀螺仪的比例大了?
真心求指教!!!
红色的是陀螺仪
黄色是加速度的角度
蓝色的是融合后的。

本帖子中包含更多资源

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

x

11

主题

583

帖子

0

精华

常驻嘉宾

MISS Gao

Rank: 8Rank: 8

积分
5774

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
2282
贡献
1682
兑换币
935
注册时间
2012-2-12
在线时间
905 小时
2#
 楼主| 发表于 2013-1-24 13:54:29 | 只看该作者
国际惯例,沙发
求指教
回复 支持 反对

使用道具 举报

38

主题

1651

帖子

0

精华

功勋会员

Rank: 10Rank: 10Rank: 10

积分
8770
威望
4444
贡献
2638
兑换币
1818
注册时间
2010-12-29
在线时间
844 小时
3#
发表于 2013-1-24 14:20:00 | 只看该作者
呀!还有矩阵版本。
学到了,学到了。
回复 支持 反对

使用道具 举报

5

主题

123

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1954
威望
1007
贡献
533
兑换币
441
注册时间
2012-7-9
在线时间
207 小时
毕业学校
西南科技大学
4#
发表于 2013-1-24 14:31:05 | 只看该作者
两个都试过  不行  要么过冲非常大  要么没过冲就是太滞后了,完全不能接受,最后还是换成互补滤波了
回复 支持 反对

使用道具 举报

11

主题

211

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1260

优秀会员奖章活跃会员奖章

威望
690
贡献
318
兑换币
346
注册时间
2012-12-21
在线时间
126 小时
5#
发表于 2013-1-24 14:41:56 | 只看该作者
本帖最后由 hmit 于 2013-1-25 19:25 编辑

这卡尔曼被简化的有点厉害。A,B,H,I都是1了。
RealData = NowData + Kg*(accelerometer_angle - NowData);
^                              ^                     ^                   ^
|                               |                       |                      \           
最优估计值              Q/(Q+R)     观测值(加速度计 )     估计值(陀螺仪)     

你的程序 Q =1,R = 300;这样Kg很小几乎不起作用。懂了吗?         
回复 支持 反对

使用道具 举报

11

主题

583

帖子

0

精华

常驻嘉宾

MISS Gao

Rank: 8Rank: 8

积分
5774

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
2282
贡献
1682
兑换币
935
注册时间
2012-2-12
在线时间
905 小时
6#
 楼主| 发表于 2013-1-24 21:05:38 | 只看该作者
hmit 发表于 2013-1-24 14:41
这卡尔曼被简化的有点厉害。A,B,H,I都是1了。
RealData = NowData + Kg*(accelerometer_angle - NowDat ...

是要调Q跟R的是么?
dt要调么?
今天下午看了一下这个资料。
大概知道怎么个流程。
现在调出了这样的波形,不知道行不行。。
蓝色是滤波后的;
黄色是加速度的输出;
红色的是陀螺仪的输出。
希望指出不足,

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

0

主题

157

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2383
威望
1211
贡献
504
兑换币
382
注册时间
2012-2-17
在线时间
334 小时
毕业学校
北方工业大学
7#
发表于 2013-1-24 23:18:59 | 只看该作者
滞后有点严重啊
回复 支持 反对

使用道具 举报

0

主题

157

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2383
威望
1211
贡献
504
兑换币
382
注册时间
2012-2-17
在线时间
334 小时
毕业学校
北方工业大学
8#
发表于 2013-1-24 23:21:20 | 只看该作者
subingkiun 发表于 2013-1-24 21:05
是要调Q跟R的是么?
dt要调么?
今天下午看了一下这个资料。

这个真不错啊
回复 支持 反对

使用道具 举报

11

主题

211

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1260

优秀会员奖章活跃会员奖章

威望
690
贡献
318
兑换币
346
注册时间
2012-12-21
在线时间
126 小时
9#
发表于 2013-1-25 18:53:31 | 只看该作者
本帖最后由 hmit 于 2013-1-25 19:19 编辑
subingkiun 发表于 2013-1-24 21:05
是要调Q跟R的是么?
dt要调么?
今天下午看了一下这个资料。

差不多了。只不过陀螺仪最后的一段波形怎么回事?
dt是你调用卡尔曼滤波的周期。0.005就是5ms调用一次卡尔曼滤波。你10ms一次有点慢。
回复 支持 反对

使用道具 举报

11

主题

211

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1260

优秀会员奖章活跃会员奖章

威望
690
贡献
318
兑换币
346
注册时间
2012-12-21
在线时间
126 小时
10#
发表于 2013-1-25 19:02:05 | 只看该作者
还有你的陀螺仪信号与角度信号极性反了。在调PD要加个负号。还是推荐用矩阵的那个。他可以把角速度也很好的滤一下。
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 17:32 , Processed in 0.065385 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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