OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6504|回复: 4

MPU9250姿态融合,航向角不正确 基本没有变动

[复制链接]
回帖奖励 1 金钱 回复本帖可获得 1 金钱奖励! 每人限 1 次

1

主题

5

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-7-5
在线时间
5 小时
发表于 2018-7-31 09:57:53 | 显示全部楼层 |阅读模式
我取了MPU9250的陀螺仪、加速度和磁力计数据,采用互补滤波算法进行数据融合,俯仰角和翻滚角的数据正确,但是俯仰角数据不正确,基本上没有变动。在绕Z轴转动时,磁力计数据全是正的值,数据融合代码如下。还望有大神指教!!!
float recipNorm;
float vx, vy, vz , wx, wy, wz;
float ex, ey, ez;
float qa, qb, qc;
float hx, hy, hz, bx,by, bz;

if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f)))   
{
  recipNorm = invSqrt(ax * ax + ay * ay + az * az);
  ax *= recipNorm;
  ay *= recipNorm;
  az *= recipNorm;        

    recipNorm = invSqrt(mx * mx + my * my + mz * mz);         
    mx = mx * recipNorm;
    my = my * recipNorm;
    mz = mz * recipNorm;

    hx = 2*mx*(0.5f - q2*q2 - q3*q3) + 2*my*(q1*q2 - q0*q3) + 2*mz*(q1*q3 + q0*q2);
    hy = 2*mx*(q1*q2 + q0*q3) + 2*my*(0.5f - q1*q1 - q3*q3) + 2*mz*(q2*q3 - q0*q1);
    hz = 2*mx*(q1*q3 - q0*q2) + 2*my*(q2*q3 + q0*q1) + 2*mz*(0.5f - q1*q1 - q2*q2);
  
    bx = sqrt((hx*hx) + (hy*hy));
    bz = hz;     
  
    vx = 2*(q1*q3 - q0*q2);
    vy = 2*(q0*q1 + q2*q3);
    vz = q0*q0 - q1*q1 - q2*q2 + q3*q3;

    wx = 2*bx*(0.5 - q2*q2 - q3*q3) + 2*bz*(q1*q3 - q0*q2);
    wy = 2*bx*(q1*q2 - q0*q3) + 2*bz*(q0*q1 + q2*q3);
    wz = 2*bx*(q0*q2 + q1*q3) + 2*bz*(0.5 - q1*q1 - q2*q2);  
  
    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(twoKi > 0.0f) {                              
   integralFBx += twoKi * ex * sample_period;   
   integralFBy += twoKi * ey * sample_period;
   integralFBz += twoKi * ez * sample_period;
   gx += integralFBx;
   gy += integralFBy;
   gz += integralFBz;
  }
  else {
   integralFBx = 0.0f;
   integralFBy = 0.0f;
   integralFBz = 0.0f;
  }

  gx += twoKp * ex;  
  gy += twoKp * ey;
  gz += twoKp * ez;
}


gx *= (0.5f * sample_period);  
gy *= (0.5f * sample_period);
gz *= (0.5f * sample_period);
qa = q0;
qb = q1;
qc = q2;                          
q0 += (-qb * gx - qc * gy - q3 * gz);
q1 += (qa * gx + qc * gz - q3 * gy);
q2 += (qa * gy - qb * gz + q3 * gx);
q3 += (qa * gz + qb * gy - qc * gx);


recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
q0 *= recipNorm;
q1 *= recipNorm;
q2 *= recipNorm;
q3 *= recipNorm;

Eular_X = atan2(2.0f*(q2*q3 + q0*q1),1.0f - 2.0f*(q1*q1 + q2*q2));
Eular_Y = asin(-2.0f*(q1*q3 - q0*q2));
Eular_Z = atan2(2.0f*(q1*q2 + q0*q3),1.0f - 2.0f*(q2*q2 + q3*q3));

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-5-15
在线时间
15 小时
发表于 2018-8-24 09:37:35 | 显示全部楼层

回帖奖励 +1 金钱

请问,您这个问题解决了么?
回复 支持 反对

使用道具 举报

9

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2017-7-10
在线时间
31 小时
发表于 2018-8-31 10:35:06 | 显示全部楼层

回帖奖励 +1 金钱

11sunshine 发表于 2018-8-24 09:37
请问,您这个问题解决了么?

我也碰到了这个问题,怀疑是不是算法的问题
回复 支持 反对

使用道具 举报

0

主题

668

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1917
金钱
1917
注册时间
2021-8-13
在线时间
261 小时
发表于 2022-1-10 12:55:51 | 显示全部楼层

回帖奖励 +1 金钱

请问最后是怎么解决的呢?
回复 支持 反对

使用道具 举报

14

主题

818

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1965
金钱
1965
注册时间
2021-7-17
在线时间
611 小时
发表于 2022-1-10 16:07:48 | 显示全部楼层

回帖奖励 +1 金钱


请问楼主这个问题解决了吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-11 00:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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