智能车制作

 找回密码
 注册

扫一扫,访问微社区

12
返回列表 发新帖
楼主: liheng229
打印 上一主题 下一主题

论互补滤波和卡尔曼滤波

[复制链接]

4

主题

33

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1408
威望
787
贡献
383
兑换币
350
注册时间
2015-10-24
在线时间
119 小时
毕业学校
河南理工大学万方科技学院
11#
发表于 2016-4-28 23:41:36 | 只看该作者
这是我用的卡尔曼滤波程序

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

15

主题

383

帖子

0

精华

杰出人士

三轮飙车狂魔

Rank: 12Rank: 12Rank: 12

积分
18057
威望
12419
贡献
3292
兑换币
2783
注册时间
2015-10-15
在线时间
1173 小时
毕业学校
北方邮政大学
12#
发表于 2016-4-29 13:37:19 | 只看该作者
liheng229 发表于 2016-4-28 17:05
请问 你直接补偿是怎么补偿的啊

比如说你静止的时候,测到加速度计为20度,陀螺仪互补滤波后为22度

假设你车子的平衡位置是0度

这个时候,如果直接跑的话,虽然你设定是0度,但因为温漂,车子是控制到-2度的

也就是说,这个时候车子是比我们预计的要往前倾一些 小了还好,如果前倾大了,会全程加速

直接补偿的话,设定此时的平衡位置为2度,减去温漂得误差后,车子就控制到了0度

回复 支持 反对

使用道具 举报

0

主题

24

帖子

0

精华

高级会员

Rank: 4

积分
957
威望
494
贡献
295
兑换币
312
注册时间
2015-5-21
在线时间
84 小时
13#
发表于 2016-4-30 16:54:24 | 只看该作者
其实卡尔曼有时候速度环跟不上是你调的太滞后了,至于互补滤波他分一阶和二阶,一阶虽然他的响应速度很好,但是他的稳定性很差也就是毛刺很多,二阶互补滤波如果调的好,可以媲美卡尔曼,目前还是喜欢卡尔曼,比较稳定,至于你说的温漂,你弄个开机自动采集,一般都能处理得了
回复 支持 反对

使用道具 举报

18

主题

318

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1521

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

威望
809
贡献
476
兑换币
474
注册时间
2014-11-28
在线时间
118 小时
毕业学校
liao
14#
 楼主| 发表于 2016-5-2 20:14:50 | 只看该作者
九月阁 发表于 2016-4-30 16:54
其实卡尔曼有时候速度环跟不上是你调的太滞后了,至于互补滤波他分一阶和二阶,一阶虽然他的响应速度很好, ...

谢谢你的详细介绍
回复 支持 反对

使用道具 举报

18

主题

318

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1521

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

威望
809
贡献
476
兑换币
474
注册时间
2014-11-28
在线时间
118 小时
毕业学校
liao
15#
 楼主| 发表于 2016-5-2 20:17:56 | 只看该作者
361369499 发表于 2016-4-29 13:37
比如说你静止的时候,测到加速度计为20度,陀螺仪互补滤波后为22度

假设你车子的平衡位置是0度

可是我们车跑的过程,陀螺仪都会产生很大的偏差,换个型号试试,谢哦
回复 支持 反对

使用道具 举报

18

主题

318

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1521

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

威望
809
贡献
476
兑换币
474
注册时间
2014-11-28
在线时间
118 小时
毕业学校
liao
16#
 楼主| 发表于 2016-5-2 21:02:58 | 只看该作者
孤行5201314 发表于 2016-4-28 23:41
这是我用的卡尔曼滤波程序

嗯,一样的
回复 支持 反对

使用道具 举报

18

主题

318

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1521

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

威望
809
贡献
476
兑换币
474
注册时间
2014-11-28
在线时间
118 小时
毕业学校
liao
17#
 楼主| 发表于 2016-5-2 21:05:08 | 只看该作者
孤行5201314 发表于 2016-4-28 23:41
这是我用的卡尔曼滤波程序

static float P[2][2] = {
                          { 2, 0 },
                          { 0, 2 }
};
float Pdot[4] ={0,0,0,0};
char C_0 = 1;
float q_bias, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
/**************************************************************************
*Kalman滤波                              
angle_m:   角度
gyro_m:    角速度
**************************************************************************/

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;
   
   
   
   
    PCt_0 = C_0 * P[0][0];
    PCt_1 = C_0 * P[1][0];
   
    E = R_angle + C_0 * PCt_0;     //估计偏差
   
    K_0 = PCt_0 / E;               //卡尔曼增益
    K_1 = 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_err = angle_m - angle;
    angle   += K_0 * angle_err;     //最优估计值
   
    q_bias  += K_1 * angle_err;
    angle_dot = gyro_m-q_bias;      //输出值(后验估计的微分)=角速度
  
}

回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 19:57 , Processed in 0.060734 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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