硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1547|回复: 3
收起左侧

请问这段通过卡尔曼滤波法解算出mpu6050的代码什么意思,哪位大神帮忙讲解一下,谢谢

[复制链接]

2

主题

2

回帖

8

积分

新手上路

积分
8
发表于 2022-3-13 16:51:59 | 显示全部楼层 |阅读模式
char str[100]={0};
        short aacx,aacy,aacz;                //加速度传感器原始数据
        short gyrox,gyroy,gyroz;        //陀螺仪原始数据
        float aacx1,aacy1,aacz1;                //加速度传感器原始数据
        float gyrox1,gyroy1,gyroz1,angle1;        //陀螺仪原始数据
        float Q=10000;
        float dt=0.03;
        float w=0;
        float angle=0;
        float angle2=0;
        float p1=0;
        float p2=0;
        float p3=0;
        float p4=0;
        int q=1;
        static float k1,k0,LTR1,LTR0,Ts;
        static float TTR=100;
  int R=10;
        static float mea;
        static int i=0;
        static float j=0;

        char a[100]={0};
        char b[100]={0};
        char c[100]={0};
        char d[100]={0};
////    *********************************卡尔曼滤波****************************************//
                angle=angle+w*dt;
                p1=p1+(p2+p3)*dt+p4*dt*dt+0.5*dt*dt*dt*Q;
                p2=p2+p4*dt+0.25*dt*dt*dt*dt*Q;               
                p3=p3+p4*dt+dt*dt*Q;
                p4=p4+0.5*dt*dt*dt*Q;
                k0=p2/(p4+R);
    k1=p4/(p4+R);
                angle=angle+k0*(mea-w);
                w=w+k1*(mea-w);
                p1=p1-p3*k0;
                p2=p2-p4*k0;
                p3=p3-p3*k1;
                p4=p4-p4*k1;
                if(i/10!=0)
                {
                angle=180*(atan2(aacx1,aacy1))/3.1415;
                i=0;
                       
                }
                LTR0=0.17*(aacx1*cos(angle*3.14/180)-aacy1*sin(angle*3.14/180))*cos(angle*3.14/180)+1.67*sin(angle*3.14/180);
   for(j=0;j<=3;)
                {
                       
                        Ts=Ts+0.1;
                        j=j+0.1;
                angle2=angle+mea*Ts;
               
                LTR1=0.16*(aacx1*cos(angle2*3.14/180)-aacy1*sin(angle2*3.14/180))*cos(angle2*3.14/180)+1.6*sin(angle2*3.14/180);
                        if(LTR1>=0.9||LTR1<=-0.9)
                        {      
            
                                if(q==0)
                                {
                                TTR=Ts;
                                j=4;
                                }
                          else
                                {
                                GPIO_WriteBit(GPIOC,GPIO_Pin_6,Bit_RESET);      
                                q=0;
                                TTR=Ts;
                                j=4;
                                }
                        }                        
                }
                TTR=Ts;
                if(TTR>3)
                {
                        TTR=100;
                        q=1;
                        GPIO_WriteBit(GPIOC,GPIO_Pin_6,Bit_SET);      
                }      
   sprintf(str,"angle=%.2f\r\n",angle);               
                LCD_ShowString(10,120,tftlcd_data.width,tftlcd_data.height,24,str);
                sprintf(a,"TTR=%.2f\r\n",TTR);      
                LCD_ShowString(10,160,tftlcd_data.width,tftlcd_data.height,24,a);
                sprintf(b,"LTR0=%.2f\r\n",LTR0);      
                LCD_ShowString(10,200,tftlcd_data.width,tftlcd_data.height,24,b);
                ESP8266_SendString ( ENABLE, str, 0, Single_ID_0 );

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106622
QQ
发表于 2022-3-13 18:30:11 | 显示全部楼层
帮顶。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2022-3-15 09:41:29 | 显示全部楼层
这是飞行控制的吧? 这有专门的研究的,不是这一行的资深博士级别,难以搞懂的。
回复

使用道具 举报

0

主题

11

回帖

11

积分

新手上路

积分
11
发表于 2022-7-5 15:05:47 | 显示全部楼层
没那么复杂。不用了解细节,按照函数来用就好了。做过一个压差传感器数据采集,初始数据波动较大,用了卡尔曼滤波,效果杠杠的!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 00:34 , Processed in 0.156654 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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