孤独的文艺青年 发表于 2016-8-15 18:27:35

自平衡车,直立控制,倾角控制车速

我在做平衡小车,在卡尔曼滤波计算出倾角之后我再进行PID调节的时候,因为在PID调节函数里面加上了if(Angle>-3.0&&Angle<3.0){Angle=0.0;},然后发现倾角在我缓慢变化至3度后,刚过3度时倾角会突然猛的增加,然后减小最后稳定在正常值上,如果我不加这句话,倾角变化一直正常,百思不得其解,希望有大神能帮帮我。。。。 另外,卡尔曼滤波和速度PID控制我都是写在中断里的,周期5ms,PID参数我暂时只加了一个P调节,其他均为零。 //******卡尔曼参数************                   const float Q_angle=0.001;const float Q_gyro=0.003;const float R_angle=0.5;const float dt=0.07;                           //dt为kalman滤波器采样时间;或0.005,0.07const char C_0 = 1;float Q_bias=0.0, Angle_err=0.0;float PCt_0=0, PCt_1=0, E=0;float K_0=0, K_1=0, t_0=0, t_1=0;float Pdot ={0,0,0,0};float PP = { { 1, 0 },{ 0, 1 } };float position;static const float Kp= 40.0;                           //PID参数Anglestatic const float Kd= 0.0;                                       //PID参数Gyro_ystatic const float Ksp = 0.0;                                 //PID参数motor_speedstatic const float Ksi = 0.0;                                  //PID参数    position          /*****************卡尔曼滤波**************************************************/void Kalman_Filter(float Accel,float Gyro)                {         Angle+=(Gyro- Q_bias) * dt; //先验估计                  Pdot=Q_angle- PP - PP; // Pk-先验估计误差协方差的微分          Pdot=-PP;         Pdot=-PP;         Pdot=Q_gyro;                  PP+= Pdot * dt;   // Pk-先验估计误差协方差微分的积分         PP+= Pdot * dt;   // =先验估计误差协方差         PP+= Pdot * dt;         PP+= Pdot * dt;                  Angle_err= Accel - Angle;      //zk-先验估计                  PCt_0= C_0 * PP;         PCt_1= C_0 * PP;                  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;          PP-= K_0 * t_0;                  //后验估计误差协方差         PP-= K_0 * t_1;         PP-= K_1 * t_0;         PP-= K_1 * t_1;                            Angle      += K_0 * Angle_err;         //后验估计         Q_bias      += K_1 * Angle_err;         //后验估计         Gyro_y   = Gyro - Q_bias;       //输出值(后验估计)的微分=角速度 } void Angle_Calculate(void){ /****************************加速度****************************************/                  Accel_x= MPU6050_Real_Data.Accel_X;         //读取X轴加速度         Angle_ax= Accel_x*1.2*180/3.14;   //弧度转换为度/****************************角速度****************************************/                   Gyro_y = MPU6050_Real_Data.Gyro_Y;               Angle_gy += (Gyro_y)*0.003;           /***************************卡尔曼融合*************************************/         Kalman_Filter(Angle_ax,Angle_gy);       //卡尔曼滤波计算倾角         } void Speed_Pid_Calculate(void){         if(Angle>-3.0&&Angle<3.0){Angle=0.0;}                                      Speed_control= (Kp*Angle + Kd*Gyro_y);            //PID:角速度和角度调节               Speed_control +=(Ksp*motor_speed + Ksi*position);                                         //PID:车速度调节                            speed_control_l= (int)Speed_control ;            //左轮速度                   speed_control_r= (int)- Speed_control;    //右轮速度                                      if(speed_control_l> MAX_SPEED) speed_control_l = MAX_SPEED;                   if(speed_control_l< -MAX_SPEED) speed_control_l = -MAX_SPEED;                   if(speed_control_r> MAX_SPEED) speed_control_r = MAX_SPEED;                   if(speed_control_r< -MAX_SPEED) speed_control_r = -MAX_SPEED; }

五哥1 发表于 2018-5-2 12:47:42

楼主希望的是个线性函数变化,但是显然是个非线性的变化,你的公式计算对吗?
页: [1]
查看完整版本: 自平衡车,直立控制,倾角控制车速