智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1315|回复: 7
打印 上一主题 下一主题

[咨询] 卡尔曼滤波

[复制链接]

55

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
威望
1361
贡献
22
兑换币
638
注册时间
2012-9-23
在线时间
302 小时
毕业学校
同济大学
跳转到指定楼层
1#
发表于 2013-1-22 14:23:27 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
void KalmanUpdate(float angle_m,float gyro_m)                        //gyro_m:gyro_measure
{
static const float Q_angle=0.001, Q_gyro=0.003, R_angle=300, 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, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
//-------------------------------------------------------
        CarAngle+=(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][0] += Q_angle -P[0][1]dt - P[1][0]dt-P[1][1]dt*dt 吗?
        P[0][1] += Pdot[1] * dt;
        P[1][0] += Pdot[2] * dt;
        P[1][1] += Pdot[3] * dt;                不是应该    P[1][1] += Pdot[3];吗?
        angle_err = angle_m - CarAngle;
        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;
        CarAngle += K_0 * angle_err;
        q_bias        += K_1 * angle_err;
        CarGyro = gyro_m-q_bias;
}
求解答。

7

主题

161

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1319

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

威望
572
贡献
405
兑换币
339
注册时间
2012-12-9
在线时间
171 小时
8#
发表于 2013-1-27 16:09:05 | 只看该作者
xiongcaifei 发表于 2013-1-23 15:54
那可能是这个+P[1][1]dt*dt 得到的数值太小了。可以忽略吗??

应该不是吧。忽略了也不一样阿。忽略后是:P[0][0] += Q_angle -P[0][1]dt - P[1][0]dt按照代码是P[0][0] += Q_angle*dt -P[0][1]dt - P[1][0]dt
我算出来后跟你的公式一模一样,疑问也是一模一样!
Pdot = A*P + P*A' + Q----中的Q是矩阵{ {Q_angle, 0},{0,Q_gyro}},A = [ 0 -1 ]
                                                                                                  [ 0  0 ]
代进去算出来后就是:
        Pdot[0] = Q_angle - P[0][1] - P[1][0];        
        Pdot[1] = - P[1][1];                        
        Pdot[2] = - P[1][1];                                 
        Pdot[3] = Q_gyro;   
Pdot = A*P + P*A' + Q是计算协方差矩阵的导数,怎么算出来的?不知道你弄懂了没有,求解释啊。。、
苦逼的孩子回不了家还一大堆问题。╮(╯▽╰)╭。。

回复 支持 反对

使用道具 举报

0

主题

1672

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
13030
QQ
威望
7128
贡献
3436
兑换币
424
注册时间
2013-1-5
在线时间
1233 小时
7#
发表于 2013-1-23 18:33:58 | 只看该作者
学习下
回复 支持 反对

使用道具 举报

55

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
威望
1361
贡献
22
兑换币
638
注册时间
2012-9-23
在线时间
302 小时
毕业学校
同济大学
6#
 楼主| 发表于 2013-1-23 15:54:22 | 只看该作者
那可能是这个+P[1][1]dt*dt 得到的数值太小了。可以忽略吗??
回复 支持 反对

使用道具 举报

0

主题

1672

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
13030
QQ
威望
7128
贡献
3436
兑换币
424
注册时间
2013-1-5
在线时间
1233 小时
5#
发表于 2013-1-23 12:30:43 | 只看该作者
看看
回复 支持 反对

使用道具 举报

55

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
威望
1361
贡献
22
兑换币
638
注册时间
2012-9-23
在线时间
302 小时
毕业学校
同济大学
4#
 楼主| 发表于 2013-1-22 15:31:30 | 只看该作者
至少这个+P[1][1]dt*dt 也应该加。我就得。求牛人解决
回复 支持 反对

使用道具 举报

55

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1987
威望
1361
贡献
22
兑换币
638
注册时间
2012-9-23
在线时间
302 小时
毕业学校
同济大学
3#
 楼主| 发表于 2013-1-22 14:35:15 | 只看该作者
求高手,做出来的人解答啊。
回复 支持 反对

使用道具 举报

6

主题

782

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4804
威望
2424
贡献
1324
兑换币
1685
注册时间
2011-11-2
在线时间
528 小时
2#
发表于 2013-1-22 14:31:13 | 只看该作者
正在研究呢
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 00:21 , Processed in 0.071245 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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