久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2289|回復: 1
打印 上一主題 下一主題
收起左側

卡爾曼濾波,自平衡車

[復制鏈接]
跳轉到指定樓層
樓主
ID:136370 發表于 2016-8-9 16:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我用printf("%0.2f   %0.2f   %0.2f\r\n",Angle,Angle_ax,Gyro_y);函數分別讀取的加速度,角速度和傾角,我發現當我快速的改變板子的傾角的時候,比如快速變化10度,Angle(卡爾曼濾波后的傾角)瞬時變化非常快,可能會瞬間變化幾十度然后回到正常角度,而當我緩慢變化10度的時候,Angle變化是正常線性變化到10度,在這兩種變化中,Angle_ax(從MPU6050讀取的值經過處理后的陀螺儀的Y軸數據)的變化一直都是線性正常的,并且Angle的值特別接近Angle_ax的值
問題:1,我快速改變板子傾角時Angle的變化正常嗎?
     2Angle正常變化的時候是應該與Angle_ax的值相近嗎?
*************讀取數據********************
//定義MPU6050內部地址
#define     SMPLRT_DIV             0x19          //陀螺儀采樣率典型值 0X07 125Hz
#define     CONFIG                        0x1A     //低通濾波頻率 典型值 0x00
#define     GYRO_CONFIG                  0x1B         //陀螺儀自檢及測量范圍                 典型值 0x18 不自檢 2000deg/s
#define     ACCEL_CONFIG        0x1C         //加速度計自檢及測量范圍及高通濾波頻率 典型值 0x01 不自檢 2G 5Hz
#define INT_PIN_CFG     0x37
#define INT_ENABLE      0x38
#define INT_STATUS      0x3A   //只讀
#define     ACCEL_XOUT_H       0x3B
#define     ACCEL_XOUT_L        0x3C
#define     ACCEL_YOUT_H       0x3D
#define     ACCEL_YOUT_L        0x3E
#define     ACCEL_ZOUT_H       0x3F
#define     ACCEL_ZOUT_L        0x40
#define     TEMP_OUT_H          0x41
#define     TEMP_OUT_L           0x42
#define     GYRO_XOUT_H    0x43
#define     GYRO_XOUT_L                  0x44         
#define     GYRO_YOUT_H        0x45
#define     GYRO_YOUT_L                  0x46
#define     GYRO_ZOUT_H        0x47
#define     GYRO_ZOUT_L                  0x48
//讀取寄存器原生數據
         
       MPU6050_Raw_Data.Accel_X = (buf[0]<<8 | buf[1]);
       MPU6050_Raw_Data.Accel_Y = (buf[2]<<8 | buf[3]);
       MPU6050_Raw_Data.Accel_Z = (buf[4]<<8 | buf[5]);
       MPU6050_Raw_Data.Temp =   (buf[6]<<8 | buf[7]);  
       MPU6050_Raw_Data.Gyro_X = (buf[8]<<8 | buf[9]);
       MPU6050_Raw_Data.Gyro_Y = (buf[10]<<8 | buf[11]);
       MPU6050_Raw_Data.Gyro_Z = (buf[12]<<8 | buf[13]);
      
      
       //將原生數據轉換為實際值,計算公式跟寄存器的配置有關
       MPU6050_Real_Data.Accel_X = -(float)(MPU6050_Raw_Data.Accel_X)/8192.0;
       MPU6050_Real_Data.Accel_Y = -(float)(MPU6050_Raw_Data.Accel_Y)/8192.0;
       MPU6050_Real_Data.Accel_Z = (float)(MPU6050_Raw_Data.Accel_Z)/8192.0;
             MPU6050_Real_Data.Gyro_X=-(float)(MPU6050_Raw_Data.Gyro_X- gyroADC_X_offset)/65.5;   
        MPU6050_Real_Data.Gyro_Y=-(float)(MPU6050_Raw_Data.Gyro_Y- gyroADC_Y_offset)/65.5;   
        MPU6050_Real_Data.Gyro_Z=(float)(MPU6050_Raw_Data.Gyro_Z- gyroADC_Z_offset)/65.5;   
    }
   
//******卡爾曼參數************
                  
const float Q_angle=0.001;  
const float Q_gyro=0.003;
const float R_angle=0.5;
const float dt=0.01;                           //dtkalman濾波器采樣時間;
const char C_0 = 1;
float Q_bias, Angle_err;
float PCt_0, PCt_1, E;
float K_0, K_1, t_0, t_1;
float Pdot[4] ={0,0,0,0};
float PP[2][2] = { { 1, 0 },{ 0, 1 } };
/*****************卡爾曼濾波**************************************************/
void Kalman_Filter(float Accel,float Gyro)               
{
         Angle+=(Gyro- Q_bias) * dt; //先驗估計
         
         Pdot[0]=Q_angle- PP[0][1] - PP[1][0]; // Pk-先驗估計誤差協方差的微分
         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;       //輸出值(后驗估計)的微分=角速度
}
******************傾角計算*****************
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;           
時間dt,所以此處不用積分
/***************************卡爾曼融合*************************************/
         Kalman_Filter(Angle_ax,Gyro_y);       //卡爾曼濾波計算傾角
         

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:136370 發表于 2016-8-9 16:26 | 只看該作者
求助求助
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美色图综合网 | 国产乱性| 欧美一级三级在线观看 | 精品国产乱码久久久久久丨区2区 | 国产精品国产三级国产aⅴ中文 | 欧美日韩亚洲一区 | 亚洲精品在线免费观看视频 | 国产成人精品久久二区二区 | 狠狠av| 中文字幕在线观看国产 | 日韩欧美视频 | 黄色av观看 | 国产成人久久av免费高清密臂 | 精品久久久久久久久久久久久 | 欧美亚洲国产日韩 | 久久精品无码一区二区三区 | 亚欧洲精品在线视频免费观看 | 精品一区二区三区四区外站 | 免费色网址 | 91pao对白在线播放 | 91av在线免费| 欧美成人激情 | 久久久人成影片一区二区三区 | 在线精品一区二区三区 | 欧美激情99| 亚洲一区二区三区久久久 | 欧美成人精品一区 | 一区二区三区免费观看 | 日本精品裸体写真集在线观看 | 一区二区中文 | www.干| 国产91在线播放 | 日韩有码在线播放 | 精品国产不卡一区二区三区 | 中文字幕欧美日韩一区 | 九九久久精品 | 亚洲性在线 | 一区二区三区四区免费视频 | 欧美伊人| 在线免费观看视频黄 | 播放一级黄色片 |