求解释一段平衡小车中关于卡尔曼滤波的各种卡尔曼参数的意义

2019-08-10 16:22发布

[mw_shl_code=c,true]//******角度参数************ float Gyro_y; //Y轴陀螺仪数据暂存 float Angle_gy; //由角速度计算的倾斜角度 float Accel_x; //X轴加速度值暂存,问为有X轴或者是说Y轴。 float Angle_ax; //由加速度计算的倾斜角度 float Angle; //小车最终倾斜角度 uchar value; //******卡尔曼参数************ // Q_angle、Q_gyro、R_angle、C_0、Angle_err、PCt_0, PCt_1, E //都是些什么东西 float code Q_angle=0.001; float code Q_gyro=0.003; float code R_angle=0.5; float code dt=0.01; //dt为kalman滤波器采样时间; char code C_0 = 1; float xdata Q_bias, Angle_err; //Q_bias是漂移 float xdata PCt_0, PCt_1, E; float xdata K_0, K_1, t_0, t_1; float xdata Pdot[4] ={0,0,0,0}; float xdata PP[2][2] = { { 1, 0 },{ 0, 1 } }; //********************************************************* // 卡尔曼滤波 //********************************************************* //Kalman滤波,20MHz的处理时间约0.77ms; void Kalman_Filter(float Accel,float Gyro) //这两个参数是什么 { Angle+=(Gyro - Q_bias) * dt; //先验估计 Pdot[0]=Q_angle - PP[0][1] - PP[1][0]; // Pk-先验估计误差协方差的微分 //协方差的意思是:cov(x,y) Pdot[1]=- PP[1][1]; Pdot[2]=- PP[1][1]; Pdot[3]=Q_gyro; PP[0][0] += Pdot[0] * dt; // Pk-先验估计误差协方差微分的积分 PP[0][1] += Pdot[1] * dt; // =先验估计误差协方差 PP[1][0] += Pdot[2] * dt; PP[1][1] += Pdot[3] * dt; Angle_err = Accel - Angle; //zk-先验估计 PCt_0 = C_0 * PP[0][0]; PCt_1 = C_0 * PP[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 * PP[0][1]; PP[0][0] -= K_0 * t_0; //后验估计误差协方差 PP[0][1] -= K_0 * t_1; PP[1][0] -= K_1 * t_0; PP[1][1] -= K_1 * t_1; Angle += K_0 * Angle_err; //后验估计 Q_bias += K_1 * Angle_err; //后验估计 Gyro_y = Gyro - Q_bias; //输出值(后验估计)的微分=角速度 } [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。