OpenEdv-开源电子网

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

原谅我又发一次贴,不懂为什么,不懂,不懂~~求助

[复制链接]

21

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
88
金钱
88
注册时间
2016-2-1
在线时间
68 小时
发表于 2016-7-22 20:35:22 | 显示全部楼层 |阅读模式
10金钱
1.png
问题是这样的:我用的是MPU6050,然后我的航向角YAW很奇怪,向左转的时候从0转到25度之后就又变为0了,然后如果从0又右转动的话,又瞬间变成25度左右
纳闷了好久,其他两个角度倒是挺稳定的


用的是IMU四元数,
  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
  Q_ANGLE.Z  +=  GYRO_AVG.Z* Gyro_G * 0.002f;//YAW,0.002是周期,GYRO_AVG.Z是陀螺仪的Z轴经过滑窗滤波之后的Z轴输出,Gyro_G 为常数,根据量程确定



然后还有一个问题就是计算航向角YAW还有这条公式,
Q_ANGLE.Z  = atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2*q2 - 2 * q3* q3 + 1)* 57.3; // yaw
我之前用这条之后,发现随着时间推移,那个角度会慢慢增加,然后到差不多25度的时候也是变为从0开始


求大神帮忙解决一下,或者提供下你们的思路
PS:为什么把问题放在四轴飞行器的板块好像没人去看过的样子~~~~
对了,还有一个问题就是我在看匿名的程序时候,发现他的PID控制好奇怪呀,或者说根本就没用到PID运算呀,不知道这份代码为什么这样子~~~

程序是这样子的~~

void CONTROL(float rol, float pit, float yaw)
{
        u16 moto1=0,moto2=0,moto3=0,moto4=0;
       
        PID_ROL.pout = PID_ROL.P * rol;//比例
        PID_ROL.dout = PID_ROL.D * MPU6050_GYRO_LAST.X;//微分
       
        PID_PIT.pout = PID_PIT.P * pit;//比例
        PID_PIT.dout = PID_PIT.D * MPU6050_GYRO_LAST.Y;//微分
       
        PID_YAW.dout = PID_YAW.D * MPU6050_GYRO_LAST.Z;
       
        PID_ROL.OUT = PID_ROL.pout + PID_ROL.iout + PID_ROL.dout;
        PID_PIT.OUT = PID_PIT.pout + PID_PIT.iout + PID_PIT.dout;
        PID_YAW.OUT = PID_YAW.pout + PID_YAW.iout + PID_YAW.dout;
       
        if(Rc_Get.THROTTLE>1200)
        {
                moto1 = Rc_Get.THROTTLE - 1000 - PID_ROL.OUT - PID_PIT.OUT + PID_YAW.OUT;
                moto2 = Rc_Get.THROTTLE - 1000 + PID_ROL.OUT - PID_PIT.OUT - PID_YAW.OUT;
                moto3 = Rc_Get.THROTTLE - 1000 + PID_ROL.OUT + PID_PIT.OUT + PID_YAW.OUT;
                moto4 = Rc_Get.THROTTLE - 1000 - PID_ROL.OUT + PID_PIT.OUT - PID_YAW.OUT;
                //现在遥控数据将会影响到飞机的飞行状态了
        }
        else
        {
                moto1 = 10;
                moto2 = 10;
                moto3 = 10;
                moto4 = 10;
        }
        if(ARMED)            Moto_PwmRflash(moto1,moto2,moto3,moto4);
        else                        Moto_PwmRflash(0,0,0,0);
}

然后再中断中每隔4ms控制一次姿态,然后控制的输入值是姿态的结算值,当场懵逼,这是PID?


求各位大大帮忙看看

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

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11545
金钱
11545
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-7-22 22:46:40 | 显示全部楼层

不懂,
这问题比较高端。


回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 17:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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