搜索
bottom↓
回复: 23

求助:PD调节,四轴往其中一个轴偏

[复制链接]

出0入0汤圆

发表于 2014-4-10 19:30:45 | 显示全部楼层 |阅读模式
本帖最后由 wenzhouyxc 于 2014-4-10 19:31 编辑

现在只加了俯仰和滚转通道的PD控制,现象是四轴能在一定程度上保持稳定,缓慢转圈并向其中一个电机偏,然后越来越往下偏。。这种是四轴中心不平导致的么?还是说PD参数不合理,还没有加偏航通道的PD控制。或者其他原因?试了好多能放手的PD参数,都存在这种现象。。跪求回答

飞控是自己画的板子,四轴为X型四轴。电调是好盈的电调。遥控是天地飞7通道的

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

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-4-10 20:01:53 | 显示全部楼层
关注中!

出0入0汤圆

发表于 2014-4-10 20:06:20 | 显示全部楼层
呵呵  这个嘛 自己在琢磨下

出0入0汤圆

发表于 2014-4-10 20:07:51 | 显示全部楼层
好腻害啊!!

出0入0汤圆

发表于 2014-4-10 20:46:37 | 显示全部楼层
建议先用+模式玩下,这个的PID比较好调,网上也有教程,熟悉后再用X模式,因为他的PID有点难。

出0入0汤圆

发表于 2014-4-11 02:29:40 | 显示全部楼层
根据经验,应该和四轴两边重量不相等有关系,解决办法可以加大P参数,增加平衡的回复力,如果导致系统发散的话,可以考虑加入I控制,用来消除稳态误差,记得限幅。

出0入0汤圆

发表于 2014-4-11 08:58:28 | 显示全部楼层
四轴存在残差,肯定需要加I的!你加一个I进去,记住先加很小的,然后再慢慢观察四轴是缓慢回到平衡点,如果没有回平衡点,就是目测没有平衡,问题估计就出在你的姿态这方面的问题上了。现在就观察一下你的传感器传出的数据是不是在零点,进行校正一下。如果会回到平衡点,恭喜你,没得什么问题了,慢慢加大I,对I限幅,找到一个满意的参数就可以了

出0入0汤圆

 楼主| 发表于 2014-4-11 09:16:01 | 显示全部楼层
衍云 发表于 2014-4-11 02:29
根据经验,应该和四轴两边重量不相等有关系,解决办法可以加大P参数,增加平衡的回复力,如果导致系统发散 ...

加入I会不会使系统更难控制?因为进入控制周期的时间是不定的,只能根据导航板传来的参数周期进行估算。

出0入0汤圆

 楼主| 发表于 2014-4-11 09:17:05 | 显示全部楼层
whq5234970 发表于 2014-4-11 08:58
四轴存在残差,肯定需要加I的!你加一个I进去,记住先加很小的,然后再慢慢观察四轴是缓慢回到平衡点,如果 ...

传感器输出不能完全保证正好在零点。但是补偿过就是在零附近正负很小的范围内变化,这个影响应该可以忽略吧

出0入0汤圆

发表于 2014-4-11 09:57:53 | 显示全部楼层
wenzhouyxc 发表于 2014-4-11 09:17
传感器输出不能完全保证正好在零点。但是补偿过就是在零附近正负很小的范围内变化,这个影响应该可以忽略 ...

在目测范围内,没什么大问题就可以了。你始终没有调到平衡是因为没有加I进去, PD控制算法,对于一型系统(这里也不知道是几型,肯定的是超过一型),单位阶跃响应是肯定存在残差的。这个残差,是理论上都有的,不是你再调参数能够解决的。所以,如果姿态方面没什么大问题的话,你就得把积分加进去了!PD控制,P主要解决的是,飞机在有误差时要校正,D解决的是抑制飞机转的太快。I才是解决最后残余的误差的。LZ觉得这解释咋样

出0入0汤圆

发表于 2014-4-11 09:59:12 | 显示全部楼层
而且,看你已经调得差不多了,接下来就加积分也没什么问题了,只是开始的时候积分要慢慢加,积分从比例系数的万分之1开始加起也合适的

出0入0汤圆

 楼主| 发表于 2014-4-11 10:31:29 | 显示全部楼层
本帖最后由 wenzhouyxc 于 2014-4-11 10:32 编辑
whq5234970 发表于 2014-4-11 09:57
在目测范围内,没什么大问题就可以了。你始终没有调到平衡是因为没有加I进去, PD控制算法,对于一型系统 ...


这个我知道。老师上课有说过是静差问题,要加积分提高系统型别。但疑惑的是为什么一直往一个电机方向倾倒。而且偏的角度越来越大,这个应该不全是I的问题吧

出0入0汤圆

发表于 2014-4-11 10:35:27 | 显示全部楼层
陀螺加速度计自检的时候要放平,再不行打点微调,或者在遥控上加混控补偿一下了。。

出0入0汤圆

发表于 2014-4-11 10:48:13 | 显示全部楼层
你把你控制的那部分代码帖出来看看就知道什么问题了

出0入0汤圆

 楼主| 发表于 2014-4-12 10:36:16 | 显示全部楼层
whq5234970 发表于 2014-4-11 10:48
你把你控制的那部分代码帖出来看看就知道什么问题了
  1. void Controlmy(Euler *Etransfer,PID *PIDtransfer)
  2. {
  3.         float fi,theta,psai;
  4.         static volatile float mox,moy,moz;
  5.         static volatile float th1,th2,th3,th4;
  6.         u16 MOTO1PWM,MOTO2PWM,MOTO3PWM,MOTO4PWM;
  7.         int state;
  8.         Quaternion q2;
  9.         Angularvelocity w2;
  10.         Euler euler2;
  11.        
  12.         CAP_Read();
  13.         CAP_CAL();
  14.        
  15.         q2.qw=q.qw;
  16.         q2.qx=q.qx;
  17.         q2.qy=q.qy;
  18.         q2.qz=q.qz;
  19.         w2.wx=w.wx;
  20.         w2.wy=w.wy;
  21.         w2.wz=w.wz;
  22.         euler2.fi=eulertemp.fi;
  23.         euler2.theta=eulertemp.theta;
  24.         euler2.psai=eulertemp.psai;
  25.         //if(euler2.psai>180) euler2.psai -= 360;       
  26.        
  27.        
  28.         fi=Etransfer->fi;
  29.         theta=Etransfer->theta;
  30.         psai=Etransfer->psai;
  31.         qd=EulerToQ(fi,theta,psai);
  32.         Conjugate(&q2);
  33.         qe=qmultiply(&qd,&q2);
  34. //         error=QToEuler(&qe);
  35.         qunitised(&qe);
  36.         //euler2=QToEuler(&q2);
  37.         error2.fi= fi-euler2.fi;//-fi;
  38.         error2.psai= psai-euler2.psai;//-psai;
  39.         error2.theta= theta-euler2.theta;//-theta;
  40.         if(error2.psai > 180) error2.psai -= 360;
  41.         else if(error2.psai < -180) error2.psai += 360;

  42.         //mox=(float)(PIDtransfer->Px)*(float)(qe.qx)+(float)(PIDtransfer->Dx)*(w2.wx);
  43.         //moy=(float)(PIDtransfer->Py)*(float)(qe.qy)+(float)(PIDtransfer->Dy)*(w2.wy);
  44.         //moz=(float)(PIDtransfer->Pz)*(float)(qe.qz)+(float)(PIDtransfer->Dz)*(w2.wz);
  45.         mox=(float)(PIDtransfer->Px)*(float)(error2.fi)+(float)(PIDtransfer->Dx)*(w2.wx);
  46.         moy=(float)(PIDtransfer->Py)*(float)(error2.theta)+(float)(PIDtransfer->Dy)*(w2.wy);
  47.         moz=(float)(PIDtransfer->Pz)*(float)(error2.psai)+(float)(PIDtransfer->Dz)*(w2.wz);
  48.         if(moz>300) moz = 300;
  49.         else if(moz<-300) moz = -300;
  50.        
  51.         th1=mox-moy-moz;
  52.         th2=mox+moy+moz;
  53.         th3=-mox+moy-moz;
  54.         th4=-mox-moy+moz;
  55.        
  56.         MOTO1PWM=thro+th1;//CAP_Data.Accelerator+th1;
  57.         MOTO2PWM=thro+th2;//CAP_Data.Accelerator+th2;//MOTO2BASE+th2;
  58.         MOTO3PWM=thro+th3;//CAP_Data.Accelerator+th3;//MOTO3BASE+th3;
  59.         MOTO4PWM=thro+th4;//CAP_Data.Accelerator+th4;//MOTO4BASE+th4;

  60.         PWM1=MOTOCAL(MOTO1PWM);
  61.         PWM2=MOTOCAL(MOTO2PWM);
  62.         PWM3=MOTOCAL(MOTO3PWM);
  63.         PWM4=MOTOCAL(MOTO4PWM);
  64.        
  65.         if(thro<1320)
  66.         {
  67.                 MOTO_PWM_GDP(1313,1313,1313,1313);
  68.                 return;
  69.         }
  70.         else
  71.         {
  72.                 MOTO_PWM_GDP(PWM1,PWM2,PWM3,PWM4);
  73.         }
  74.        
  75. }
复制代码

出0入0汤圆

发表于 2014-4-15 23:12:34 | 显示全部楼层
本帖最后由 zouyf12 于 2014-4-15 23:13 编辑

    虽然没看懂LZ的程序。   不过,我建议LZ,先手抓四轴, 试着往各个方向倾斜, 看看电机的动作是否在抑制你的转向, 而且抑制的力度应该与你倾斜的角度成正比, 如果这样,就说明程序算法应该没多大问题。 你可以试着加大P值看看效果。     
     如果电机的动作没有在抑制你的转向, 或者是只是在你转动过程中抑制, 等你稳定在一个倾角以后,电机却没有加力想要回到平衡位置的话,那就说明程序有问题, 最糟糕的情况可能是你姿态估算部分出现了漂移, 运行一段时间后,往一个角度飘逸, 那么程序后面的PID以为飞机往那个方向倾斜了,就肯定会往返方向加力。

最后祝LZ调试成功,  小弟四轴也是最近才飞起来的,过程也很艰辛,不过成功以后就很爽了,

出0入0汤圆

 楼主| 发表于 2014-4-23 17:03:02 | 显示全部楼层
zouyf12 发表于 2014-4-15 23:12
虽然没看懂LZ的程序。   不过,我建议LZ,先手抓四轴, 试着往各个方向倾斜, 看看电机的动作是否在抑 ...

分配给各电机的转速没有问题。。这两天去试飞各种不稳。。请问一下在正式试飞前你是怎么调姿态的?用绳子拴着调么?

出0入0汤圆

发表于 2014-4-23 21:31:47 | 显示全部楼层
感觉像是姿态有漂移,或者p不够

出0入0汤圆

发表于 2014-4-24 18:25:42 | 显示全部楼层
whq5234970 发表于 2014-4-11 09:57
在目测范围内,没什么大问题就可以了。你始终没有调到平衡是因为没有加I进去, PD控制算法,对于一型系统 ...

好像有些感悟了。。试试

出0入0汤圆

发表于 2014-4-10 19:30:46 | 显示全部楼层
wenzhouyxc 发表于 2014-4-23 17:03
分配给各电机的转速没有问题。。这两天去试飞各种不稳。。请问一下在正式试飞前你是怎么调姿态的?用绳子 ...

     我是做微型四轴的, 用乐高做了一个2轴自由度的平衡架子,在上面做了初期的平衡测试, 不过就算平衡后也还不能试飞,飞起来还是一边倒,然后是用乐高做了一个独轮车,把四轴放上去,调到不会向一边倾斜加速就行,最后可以试飞了,然后根据试飞效果不断改参数、
     另外不知道LZ程序有没有设置角度偏移量?  一般各种原因,比如安装、 IMU模块的精度、 电机本身一致性问题,都会导致四轴朝一个方向加速,  最简单的就是两个电机本身一致性差,导致在0度时,输出给两个电机的PWM一样,但是一个电机转得比另一个电机快, 这样四轴会往电机弱的那个方向飘了,这样始终无法稳定在0度。那如果你不让四轴稳定在0度, 比如你四轴倾斜的角度是+2度的话,那么你加一个-2左右的偏移量, 让四轴的PID设定值为-2度,这样,四轴就会努力往-2这个角度动作,等效与给弱的那个电机增加转速,恰好使两个电机转速相等,就可以达到稳定了。(当然这个偏移量是试出来的) 其实,这个可以理解为余差,用积分来消除,一开始我也是这样做的,但是感觉加了积分,四轴的相应速度会有延迟, 所以就没有加了,   

出0入0汤圆

 楼主| 发表于 2014-4-25 21:26:45 | 显示全部楼层
zouyf12 发表于 2014-4-25 21:20
我是做微型四轴的, 用乐高做了一个2轴自由度的平衡架子,在上面做了初期的平衡测试, 不过就算平衡 ...

请问除了用乐高做架子,有没有其他方法?

出0入0汤圆

发表于 2014-4-25 21:42:40 | 显示全部楼层
还没想好,我也准备做个大的,

出0入0汤圆

 楼主| 发表于 2014-4-25 21:45:39 | 显示全部楼层
zouyf12 发表于 2014-4-25 21:42
还没想好,我也准备做个大的,

拴绳子一个一个通道调的话,调好的参数整合到一起去试飞失败。。不知道论坛里的大神们都是怎么解决这个问题的?

出0入0汤圆

发表于 2014-5-16 16:27:55 | 显示全部楼层
zouyf12 发表于 2014-4-15 23:12
虽然没看懂LZ的程序。   不过,我建议LZ,先手抓四轴, 试着往各个方向倾斜, 看看电机的动作是否在抑 ...

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

本版积分规则

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

GMT+8, 2024-4-25 10:16

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

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