智能车制作
标题: 卡尔曼滤波 [打印本页]
作者: xiongcaifei 时间: 2013-1-22 14:23
标题: 卡尔曼滤波
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;
}
求解答。
作者: qurrer 时间: 2013-1-22 14:31
正在研究呢
作者: xiongcaifei 时间: 2013-1-22 14:35
求高手,做出来的人解答啊。
作者: xiongcaifei 时间: 2013-1-22 15:31
至少这个+P[1][1]dt*dt 也应该加。我就得。求牛人解决
作者: dlyt03 时间: 2013-1-23 12:30
看看
作者: xiongcaifei 时间: 2013-1-23 15:54
那可能是这个+P[1][1]dt*dt 得到的数值太小了。可以忽略吗??
作者: dlyt03 时间: 2013-1-23 18:33
学习下
作者: 除却巫山不是云 时间: 2013-1-27 16:09
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是计算协方差矩阵的导数,怎么算出来的?不知道你弄懂了没有,求解释啊。。、
苦逼的孩子回不了家还一大堆问题。╮(╯▽╰)╭。。
欢迎光临 智能车制作 (http://dns.znczz.com/) |
Powered by Discuz! X3.2 |