智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 6285|回复: 18
打印 上一主题 下一主题

关于卡尔曼滤波的一点理解

  [复制链接]

30

主题

264

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4664
QQ
威望
2397
贡献
1297
兑换币
1553
注册时间
2013-7-26
在线时间
485 小时
跳转到指定楼层
1#
发表于 2014-9-11 21:58:59 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
参加完第九届国赛,已经大半个月过去了,这段时间,闲来无事,研究一下卡尔曼滤波;
故此写下一点心得,不知道对于不对,望大神们指正指正。
代码:
//-------------------------------------------------------
//Kalman滤波,64MHz的处理时间约100um;
//-------------------------------------------------------
static float angle, AngleSpeed;   //外部需要引用的变量
//-------------------------------------------------------
static const float Q_angle=0, Q_gyro=0, R_angle=0, dt=0.005;
   //注意:dt的取值为kalman滤波器采样时间;
static float P[2][2] = {
       { 1, 0 },
       { 0, 1 }
      };
static float Pdot[4] ={0,0,0,0};
static const char C_0 = 1;
static float q_bias=0, angle_err=0, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
void Kalman_Filter(float angle_m,float gyro_m)   //gyro_m:gyro_measure
{
angle+=(gyro_m-q_bias)*dt;
Pdot[0]=Q_angle - P[0][1] - P[1][0];
Pdot[1]=- P[1][1];
Pdot[2]=- P[1][1];
Pdot[3]=Q_gyro;

P[0][0] += Pdot[0] * dt;
P[0][1] += Pdot[1] * dt;
P[1][0] += Pdot[2] * dt;
P[1][1] += Pdot[3] * dt;
angle_err = angle_m - angle;
  
PCt_0 = C_0 * P[0][0];
PCt_1 = C_0 * P[1][0];

E = R_angle + C_0 * PCt_0;

K_0 = 1.0*PCt_0 / E;
K_1 = 1.0*PCt_1 / E;

t_0 = PCt_0;
t_1 = C_0 * P[0][1];
P[0][0] -= K_0 * t_0;
P[0][1] -= K_0 * t_1;
P[1][0] -= K_1 * t_0;
P[1][1] -= K_1 * t_1;
  
angle += K_0 * angle_err/2;
q_bias+= K_1 * angle_err;         
AngleSpeed=gyro_m-q_bias;

}
{其实这些代码大家已经都知道了}

在调试过程中,我发现了,加速度计素提供的是一个类似于PI速度控制中的I所积分出来的一个作用;
陀螺仪所提供的作用是,让融合曲线跟踪加速度计的曲线;
如此这般,加速度计所提供的类似于PI控制中的I,不能有太大的波动,否则,车子会震动得特别厉害;
看了华中科技大学的报告,有点难以理解,他们的报告中这样写道(如图);
对于他们报告中的方法,我有点不解;
希望各位大神给予指点,谢谢,如果我所的错了,不要怕浪费了大哥的口水,尽量喷我,喷完后,我给你寄一瓶水过去。   小弟真心想学东西,请指教,谢谢。


本帖子中包含更多资源

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

x
回复

使用道具 举报

30

主题

341

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2323
威望
1188
贡献
743
兑换币
719
注册时间
2014-1-13
在线时间
196 小时
毕业学校
武威第二中学
19#
发表于 2015-3-20 20:40:03 | 只看该作者
赞赞赞
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

高级会员

Rank: 4

积分
570
威望
300
贡献
164
兑换币
166
注册时间
2014-11-11
在线时间
53 小时
毕业学校
黑龙江科技大学
18#
发表于 2015-3-16 20:30:14 | 只看该作者
float angle_m,float gyro_m   就是陀螺仪和加速度计采集到的数据么????   还有angle和AngleSpeed是经过滤波后的陀螺仪和加速度的数据么?如果是的话,就通过以下滤波么?
void AngleCalculate(void)
{

AD_GetValue();
kalmanUpdate(AD_value0,AD_value1);
GYRO_AngleSpeed  =(angle- 110 )*0.025; //陀螺仪角速度     *ratio2 归一化

ACCE_GravityAngle=(AngleSpeed-79)*2.405; //加速度计得到角度  归一化-90-0-90度
if(ACCE_GravityAngle>90)ACCE_GravityAngle=90;
if(ACCE_GravityAngle<-90)ACCE_GravityAngle=-90;
Car_Angle=GYRO_AngleIntegral;//
DeltaValue=(ACCE_GravityAngle-Car_Angle)/2;//加速度计角度值反馈给陀螺仪角度值
GYRO_AngleIntegral+=(GYRO_AngleSpeed+DeltaValue)*0.5;//积分  积分时间系数
}
回复 支持 反对

使用道具 举报

18

主题

104

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
威望
524
贡献
266
兑换币
315
注册时间
2014-11-21
在线时间
128 小时
17#
发表于 2014-11-25 12:31:43 | 只看该作者
华中科技大学的报告有吗  关于直立 的给我一份吧 !!系谢谢楼主
回复 支持 反对

使用道具 举报

15

主题

116

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2210
威望
1106
贡献
668
兑换币
670
注册时间
2014-7-15
在线时间
218 小时
16#
发表于 2014-10-25 21:16:29 | 只看该作者
回复 支持 反对

使用道具 举报

6

主题

618

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6491
威望
3362
贡献
527
兑换币
2332
注册时间
2013-8-31
在线时间
1301 小时
15#
发表于 2014-9-17 14:42:06 | 只看该作者
仪124 发表于 2014-9-17 12:31
大神,若要更精确些,那种滤波好?多谢了

卡尔曼
回复 支持 反对

使用道具 举报

23

主题

241

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1405
威望
717
贡献
428
兑换币
453
注册时间
2014-2-6
在线时间
130 小时
14#
发表于 2014-9-17 12:31:42 | 只看该作者
allenanswerzq 发表于 2014-9-16 16:02
就是说,代码没有卡尔满那么多。效果也能差不多

大神,若要更精确些,那种滤波好?多谢了
回复 支持 反对

使用道具 举报

6

主题

618

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6491
威望
3362
贡献
527
兑换币
2332
注册时间
2013-8-31
在线时间
1301 小时
13#
发表于 2014-9-16 16:02:05 | 只看该作者
仪124 发表于 2014-9-16 12:29
大神,何以解释?卡尔曼与互补滤波我虽然了解不多,但是觉得二者各有长处,应该不是包含关系,懂得不多, ...

就是说,代码没有卡尔满那么多。效果也能差不多
回复 支持 反对

使用道具 举报

23

主题

241

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1405
威望
717
贡献
428
兑换币
453
注册时间
2014-2-6
在线时间
130 小时
12#
发表于 2014-9-16 12:29:49 | 只看该作者
allenanswerzq 发表于 2014-9-12 16:02
互补滤波一句代码搞定。

大神,何以解释?卡尔曼与互补滤波我虽然了解不多,但是觉得二者各有长处,应该不是包含关系,懂得不多,见笑了。
回复 支持 反对

使用道具 举报

30

主题

264

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4664
QQ
威望
2397
贡献
1297
兑换币
1553
注册时间
2013-7-26
在线时间
485 小时
11#
 楼主| 发表于 2014-9-12 19:57:22 | 只看该作者
allenanswerzq 发表于 2014-9-12 16:02
互补滤波一句代码搞定。

互补滤波,不是很好,用着不是很精确,所以想改进一下
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-29 16:22 , Processed in 0.270144 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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