打印

姿态解算

[复制链接]
1122|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
恶趣味|  楼主 | 2015-12-9 22:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是用的是mpu9150模块
程序是:
#define Kp 10.0f                        // proportional gain governs rate of convergence to accelerometer/magnetometer
#define Ki 0.008f                          // integral gain governs rate of convergence of gyroscope biases
#define halfT 0.001f                   // half the sample period

float q0 = 1, q1 = 0, q2 = 0, q3 = 0;    // quaternion elements representing the estimated orientation
float exInt = 0, eyInt = 0, ezInt = 0;    // scaled integral error
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;


  vx = 2*(q1q3 - q0q2);                                                                                               
  vy = 2*(q0q1 + q2q3);
  vz = q0q0 - q1q1 - q2q2 + q3q3 ;


  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;


  gx = gx + Kp*ex + exInt;                                                                                                  
  gy = gy + Kp*ey + eyInt;
  gz = gz + Kp*ez + ezInt;                                                                                          

                                          
  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;                                                                                                                               

  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
        /*if(GYRO_I.Z>=360)GYRO_I.Z=0;
        Q_ANGLE.Z = GYRO_I.Z;*/
}

但出现个问题,为什么俯仰角pitch 等于90左右和-90度左右时,横滚角roll会有变化,这是什么原因?

相关帖子

沙发
tkyl01| | 2015-12-11 09:02 | 只看该作者
这就是 欧拉角的 缺点

使用特权

评论回复
板凳
恶趣味|  楼主 | 2015-12-11 14:22 | 只看该作者
tkyl01 发表于 2015-12-11 09:02
这就是 欧拉角的 缺点

一定是这样的吗   如果要做到横滚角不变   要怎么做?

使用特权

评论回复
地板
landyjzlai| | 2015-12-12 12:27 | 只看该作者
有没有做过Zynq-based四轴飞行器项目的?

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝