搜索
bottom↓
回复: 6

imuupdate算法的算出的四元数结果问题

[复制链接]

出0入0汤圆

发表于 2015-1-6 10:40:47 | 显示全部楼层 |阅读模式
该算法中的符号与mpu6050读出数据的符号有关系吗?我用该算法只要略微扰动mpu6050,四元数就会疯狂变化,算出的角度也在疯狂变化。。求解答



void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
{
  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;
       
        if(ax*ay*az==0)
                return;

  norm = sqrt(ax*ax + ay*ay + az*az);      
  ax = ax /norm;
  ay = ay / norm;
  az = az / norm;

  // estimated direction of gravity and flux (v and w)            
  vx = 2*(q1q3 - q0q2);                                                                                               
  vy = 2*(q0q1 + q2q3);
  vz = q0q0 - q1q1 - q2q2 + q3q3 ;

  // error is sum of cross product between reference direction of fields and direction measured by sensors
  ex = (ay*vz - az*vy) ;                                                          
  ey = (az*vx - ax*vz) ;
  ez = (ax*vy - ay*vx) ;

  exInt = exInt + ex * Ki;                                                               
  eyInt = eyInt + ey * Ki;
  ezInt = ezInt + ez * Ki;

  // adjusted gyroscope measurements
  gx = gx + Kp*ex + exInt;                                                                                                  
  gy = gy + Kp*ey + eyInt;
  gz = gz + Kp*ez + ezInt;                                                                                  

  // integrate quaternion rate and normalise                                       
  q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
  q1 = q1 + ( q0*gx + q2*gz - q3*gy)*halfT;
  q2 = q2 + ( q0*gy - q1*gz + q3*gx)*halfT;
  q3 = q3 + ( q0*gz + q1*gy - q2*gx)*halfT;


  // normalise quaternion
  norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
  q0 = q0 / norm;
  q1 = q1 / norm;
  q2 = q2 / norm;
  q3 = q3 / norm;

  //Q_ANGLE.Yaw = atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2*q2 - 2 * q3* q3 + 1)* 57.3; // yaw
  Q_ANGLE_Y  = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch
  Q_ANGLE_X = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2015-1-6 11:37:26 | 显示全部楼层
第一,符号有关系。第二,先去掉积分。

出0入0汤圆

 楼主| 发表于 2015-1-6 12:53:02 | 显示全部楼层
QuadRotor 发表于 2015-1-6 11:37
第一,符号有关系。第二,先去掉积分。

我是自己焊接的mpu6050 应该需要如何处理六轴数据的符号,俯仰,翻滚时需要的六轴数据的符号是什么样的?还是只需要处理输出的正负号?我已经把积分项去掉了 还是略微扰动四元数不停的变只不过变得慢了些。

出0入0汤圆

 楼主| 发表于 2015-1-6 13:28:20 | 显示全部楼层
本帖最后由 谎言而上 于 2015-1-6 16:20 编辑
QuadRotor 发表于 2015-1-6 11:37
第一,符号有关系。第二,先去掉积分。


已解决,mpu6050按加速度为正的貌似是东北地就能用该算法了。

出0入0汤圆

发表于 2015-1-6 20:37:26 | 显示全部楼层
谎言而上 发表于 2015-1-6 13:28
已解决,mpu6050按加速度为正的貌似是东北地就能用该算法了。

东北地不是右手坐标系哦 。据我所知,6050原始数据不变符号的话,是北(X)西(Y)天(Z)。

出0入0汤圆

 楼主| 发表于 2015-1-7 14:53:07 | 显示全部楼层
QuadRotor 发表于 2015-1-6 20:37
东北地不是右手坐标系哦 。据我所知,6050原始数据不变符号的话,是北(X)西(Y)天(Z)。 ...

我是强行将z轴加速度加个负号。。。。很多东西都不了解。。。

出0入0汤圆

发表于 2015-1-8 00:03:17 | 显示全部楼层
谎言而上 发表于 2015-1-7 14:53
我是强行将z轴加速度加个负号。。。。很多东西都不了解。。。

这样也可以的。符号问题都是加个负号呗
加油
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 02:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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