打印
[四轴技术交流]

MPU6050+HMC5883L IMU融合姿态,YAW为何还是飘??

[复制链接]
26749|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CCALM|  楼主 | 2016-1-15 18:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
无论陀螺仪还是加速度,电子罗盘都校准过,但是最后YAW偏航角还是会飘,慢的几秒一度,快的一秒一度..
检查过好多次,没发现哪里有问题..

//IMU四元素
void Calc_Quaternions(_Triaxial_f acc, _Triaxial_f gyro, _Triaxial_f mag)
{
        float ax = acc.x,ay = acc.y,az = acc.z;
        float gx = gyro.x,gy = gyro.y,gz = gyro.z;
        float mx = mag.x,my = mag.y,mz = mag.z;
//        float mx = 0,my = 0,mz = 0;

        float norm;
        float hx, hy, hz, bx, bz;               
        float vx, vy, vz, wx, wy, wz;
        float ex, ey, ez;

        float q0q0 = q0*q0;
        float q0q1 = q0*q1;
        float q0q2 = q0*q2;
        float q0q3 = q0*q3;
        float q1q1 = q1*q1;
        float q1q2 = q1*q2;
        float q1q3 = q1*q3;
        float q2q2 = q2*q2;   
        float q2q3 = q2*q3;
        float q3q3 = q3*q3;  
       
        float deltaT;

        if(ax*ay*az==0)
        return;

        deltaT = getDeltaT(GetSysTime_us());
       
        //ÖØÁ¦¼ÓËٶȹéÒ»»¯
        norm = invSqrt(ax*ax + ay*ay + az*az);      
        ax = ax * norm;
        ay = ay * norm;
        az = az * norm;
        //´ÅÁ¦¼Æ¹éÒ»»¯
        norm = invSqrt(mx*mx* + my*my + mz*mz);         
        mx = mx * norm;
        my = my * norm;
        mz = mz * norm;

        hx = 2*mx*(0.5f - q2q2 - q3q3) + 2*my*(q1q2 - q0q3) + 2*mz*(q1q3 + q0q2);
        hy = 2*mx*(q1q2 + q0q3) + 2*my*(0.5f - q1q1 - q3q3) + 2*mz*(q2q3 - q0q1);
        hz = 2*mx*(q1q3 - q0q2) + 2*my*(q2q3 + q0q1) + 2*mz*(0.5f - q1q1 - q2q2);
     
        bx = sqrt((hx*hx) + (hy*hy));               
        bz = hz;     
       
        //ÌáÈ¡ËÄÔªÊýµÄµÈЧÓàÏÒ¾ØÕóÖеÄÖØÁ¦·ÖÁ¿
        vx = 2*(q1q3 - q0q2);                                                                                               
        vy = 2*(q0q1 + q2q3);
        vz = q0q0 - q1q1 - q2q2 + q3q3 ;

        wx = 2*bx*(0.5 - q2q2 - q3q3) + 2*bz*(q1q3 - q0q2);
        wy = 2*bx*(q1q2 - q0q3) + 2*bz*(q0q1 + q2q3);
        wz = 2*bx*(q0q2 + q1q3) + 2*bz*(0.5 - q1q1 - q2q2);
       
        //ÏòÁ¿²æ»ýµÃ³ö×Ë̬Îó²î
        ex = (ay*vz - az*vy) + (my*wz - mz*wy);
        ey = (az*vx - ax*vz) + (mz*wx - mx*wz);
        ez = (ax*vy - ay*vx) + (mx*wy - my*wx);

        if(ex != 0.0f && ey != 0.0f && ez != 0.0f)
        {
                exInt = exInt + ex * Ki * halfT*deltaT;
                eyInt = eyInt + ey * Ki * halfT*deltaT;       
                ezInt = ezInt + ez * Ki * halfT*deltaT;
               
                //»¥²¹Â˲¨£¬×Ë̬Îó²î²¹³¥µ½½ÇËÙ¶ÈÉÏ£¬ÐÞÕý½ÇËٶȻý·ÖƯÒÆ
                gx = gx + Kp*ex + exInt;                                                                                          
                gy = gy + Kp*ey + eyInt;
                gz = gz + Kp*ez + ezInt;       
        }                                                                  

        //Ò»½×Áú¸ñ¿âËþ·¨¸üÐÂËÄÔªÊý
        q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT*deltaT;
        q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT*deltaT;
        q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT*deltaT;
        q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT*deltaT;

        //ËÄÔªÊý¹éÒ»»¯
        norm = invSqrt(q0q0 + q1q1 + q2q2 + q3q3);
        q0 = q0 * norm;
        q1 = q1 * norm;
        q2 = q2 * norm;
        q3 = q3 * norm;

        //ËÄÔªÊýתŷÀ­½Ç
        Angle.x = atan2f(2.0f * q2q3 + 2.0f * q0q1, -2.0f * q1q1 - 2.0f * q2q2 + 1) * RAD_TO_DEG;// ·­¹ö
        Angle.y = -safe_asin(-2.0f * q1q3 + 2.0f * q0q2) * RAD_TO_DEG; // ¸©Ñö
        Angle.z = -atan2f(2.0f*q1q2 + 2.0f*q0q3, -2.0f *q2q2 - 2.0f*q3q3 + 1) * RAD_TO_DEG;//Æ«º½               
}

相关帖子

沙发
michael_llh| | 2016-1-18 08:54 | 只看该作者
不好说是什么问题,我之前用6050没有用磁力计刚开始yaw有点飘,后面就趋于稳定,估计和代码有点关系。你是用32还是用其他来读取的呢?

使用特权

评论回复
板凳
orphanping| | 2016-2-20 12:06 | 只看该作者
同样遇到这样的问题,用的MPU9150,没有使用DMP。原始数据融合的Pitch和Roll特别的稳定,就Yaw会一直漂移,情况和你的一样。可能是代码哪里没有搞清楚,还在看,可以一起交流。

使用特权

评论回复
地板
huxiaoyingying| | 2016-2-26 16:43 | 只看该作者
orphanping 发表于 2016-2-20 12:06
同样遇到这样的问题,用的MPU9150,没有使用DMP。原始数据融合的Pitch和Roll特别的稳定,就Yaw会一直漂移, ...

你们的pitch和roll在板子晃动的时候不会抖吗?比如pitch角从0变到-20,我的会往下跳很多再恢复,能不能一起交流下啊
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-3
-2.95
-2.96
-2.96
-2.96
-2.97
-2.97
-2.97
-2.98
-2.98
-2.98
-2.98
-2.98
-2.98
-2.55
-2.44
-2.49
-2.53
-2.58
-2.5
-2.5
-2.54
-2.61
-2.74
-2.58
-2.29
-1.85
-57.9
-51.96
-74.21
86.2
-29.03
67.96
14.94
-9.64
-25.64
-24.77
-20.87
-20.8
-24.79
-28.19
-30.21
-20.47
-19.58
86.16
50.4
28.31
-7.21
-41.62
-52.05
-55.52
-58.09
-60.04
-58.5
-55.28
-52.74
-50.52
-48.64
-46.97
-47.71
-46.06
-44.47
-42.41
-40.52
-38.79
-37.75
-36.75
-35.38
-34.47
-33.61
-32.51
-31.73
-30.96
-30.07
-29.36
-26.32
-23.51
-23.27
-23.07
-22.82
-22.63
-22.39
-22.25
-19.83
-17.55
-15.43
-15.79
-16.15
-16.47
-16.71
-16.98
-17.16
-17.31
-17.41
-17.51
-17.63
-17.8
-17.96
-18.11
-18.15
-18.33
-18.34
-18.47
-18.58
-18.68
-18.72
-18.72
-18.86
-16.7
-17
-17.13
-17.29
-17.41
-17.65
-17.83
-18.04
-18.23
-18.3
-18.47
-18.63
-18.72
-16.57
-16.83
-17.12
-17.3
-17.45
-17.69
-17.82
-18.03
-18.22
-18.33
-18.4
-18.44
-18.6
-18.75
-18.77
-18.83
-18.94
-19.06
-19.17
-16.99
-14.93
-15.27
-15.67
-16.05
-16.4
-16.66
-16.89
-17.08
-17.35
-15.32
-15.72
-16.1
-16.4
-16.68
-16.93
-17.15
-17.33
-17.58
-17.72
-17.99
-18.19
-18.37
-18.55
-18.7
-18.84
-16.71
-17
-17.28
-17.47
-17.7

使用特权

评论回复
5
orphanping| | 2016-3-4 10:48 | 只看该作者
huxiaoyingying 发表于 2016-2-26 16:43
你们的pitch和roll在板子晃动的时候不会抖吗?比如pitch角从0变到-20,我的会往下跳很多再恢复,能不能一 ...

Pitch和Roll倒是很稳定的,只是Yaw会一直漂移。

使用特权

评论回复
6
huxiaoyingying| | 2016-3-4 14:36 | 只看该作者
orphanping 发表于 2016-3-4 10:48
Pitch和Roll倒是很稳定的,只是Yaw会一直漂移。

我的今天调好了,yaw也不会飘了,我之前的问题在于陀螺仪数据没有做单位换算,四元数参加运算的陀螺仪数据需要是弧度/s,之前一直用的度/s! Yaw会飘的原因是你的gz一直在抖吧!

使用特权

评论回复
评论
旭羽宏镞 2018-6-21 15:20 回复TA
怎么改啊,楼上会吗?你不是解决了吗? 
7
HC0725| | 2016-7-19 10:53 | 只看该作者
楼主问题解决了么?我也遇到了同样的问题

使用特权

评论回复
8
旭羽宏镞| | 2018-6-21 15:20 | 只看该作者
是啊,楼主解决了吗?

使用特权

评论回复
9
gaochy1126| | 2018-6-30 22:23 | 只看该作者
MPU6050+HMC5883L IMU融合姿态,这个不是都是校正吗?

使用特权

评论回复
10
gaochy1126| | 2018-6-30 22:23 | 只看该作者
以前做的姿态,没有使用HMC5883L也是飘,没有办法。                  

使用特权

评论回复
11
tiandihuanyu| | 2018-8-1 10:32 | 只看该作者
yaw需要做初始对准

使用特权

评论回复
12
a956880405| | 2018-9-25 14:28 | 只看该作者
tiandihuanyu 发表于 2018-8-1 10:32
yaw需要做初始对准

怎么校准  

使用特权

评论回复
13
小锅同学| | 2019-1-18 19:31 | 只看该作者

使用特权

评论回复
14
小锅同学| | 2019-1-18 19:31 | 只看该作者

使用特权

评论回复
15
小锅同学| | 2019-1-18 19:31 | 只看该作者

使用特权

评论回复
16
小锅同学| | 2019-1-18 19:32 | 只看该作者

使用特权

评论回复
17
小锅同学| | 2019-1-18 19:32 | 只看该作者

使用特权

评论回复
18
烈火狂龙| | 2019-1-31 12:09 | 只看该作者
各个轴的定义,以及方向是否都一致?

使用特权

评论回复
19
TwilightZR| | 2019-3-3 23:51 | 只看该作者
后来怎么解决了,我也遇到这个问题了,这个问题的正解是什么

使用特权

评论回复
20
零三翟邢止胃| | 2019-3-16 12:39 | 只看该作者
这个问题的正解是什么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

1

粉丝