whq5234970 发表于 2014-3-27 21:08:37

匿名四轴的控制算法的角速度内环的讨论

   如题,研究了很久的飞控算法,研究来研究去还是PID,这里提出一个角速度环的讨论。关于飞机角度控制,(自稳模式),直接使用角度误差做PID控制,这种控制算法在理论上是没有问题的。参数调的好,照样可以爽飞。我这里提出的双闭环控制,仅对有兴趣研究控制算法这部分的朋友一起讨论研究。不惜勿喷。关于角度PID控制的,就不多说,反正我们控制的目标最后都是角度。从理论上讲,我们角度有了误差就要进行调节,角度的变化是由角速度引起的。所以这里对角速度再做一个PID,其实我认为这里做一个PI控制即可,但是由于功底不够深厚,所以采用PID。先是角度有误差,产生一个对角速度的控制量,这就是我们的角速度的控制输入量,角速度进行反馈作差,产生PID输出到电机上产生角度变化。再反馈到角度环上。这样就形成了一个双闭环的系统。这里,可以对角速度做一个限幅,防止在角度误差太大的时候,过分调节。 思路就是这样,很简单。有兴趣的出来沟通沟通。 源文件附上,只改了control。c里面的一小部分。求有机器的大神帮忙调调参数验证一下。
#include "control.h"
#define Gyro_Gr                0.0010653f       

PID PID_ROL,PID_PIT,PID_YAW,PID_ALT,PID_POS,PID_PID_1,PID_PID_2;
//PID PID_ROL_W,PID_PIT_W;   //¶Ô½ÇËÙ¶È×öPID¿ØÖÆ ÄÚ»·
float get_lastgro_rol=0,get_lastgro_pit=0;
float gro_rol_i=0,gro_pit_i=0;

int16_t getlast_roll=0,geilast_pitch=0;
float rol_i=0,pit_i=0,yaw_p=0;

vs16 Moto_PWM_1=0,Moto_PWM_2=0,Moto_PWM_3=0,Moto_PWM_4=0,Moto_PWM_5=0,Moto_PWM_6=0,Moto_PWM_7=0,Moto_PWM_8=0;

void Control(T_float_angle *att_in,T_int16_xyz *gyr_in, T_RC_Data *rc_in, u8 armed)
{
        T_float_angle angle;
        T_float_angle gyro;
        float KAG=0.001;//½Ç¶È¿ØÖƵ½½ÇËٶȿØÖƵıÈÀý ×î´ó½ÇËٶȲ»³¬¹ý5¡ã/s
       
        angle.rol = att_in->rol - (rc_in->ROLL-1500)/25;//½Ç¶ÈÖ®²î
        angle.pit = att_in->pit - (rc_in->PITCH-1500)/25;
       
        rol_i += angle.rol;//½Ç¶È»ý·ÖÏÞ·ù
        if(rol_i>2000)
        rol_i=2000;
        if(rol_i<-2000)
        rol_i=-2000;

        PID_ROL.pout = PID_ROL.P * angle.rol; //½Ç¶È ×÷P
        PID_ROL.dout = PID_ROL.D * gyr_in->X;   //½Ç¶È×÷D
        PID_ROL.iout = PID_ROL.I * rol_i;      // ½Ç¶È×÷I

        pit_i += angle.pit;
        if(pit_i>2000)
        pit_i=2000;
        if(pit_i<-2000)
        pit_i=-2000;

        PID_PIT.pout = PID_PIT.P * angle.pit;
        PID_PIT.dout = PID_PIT.D * gyr_in->Y;
        PID_PIT.iout = PID_PIT.I * pit_i;
       
       
        if(rc_in->YAW<1480||rc_in->YAW>1520)
        {gyr_in->Z=gyr_in->Z+(rc_in->YAW-1500)*10;}
        yaw_p+=gyr_in->Z*0.0609756f*0.002f;// +(Rc_Get.YAW-1500)*30

        PID_YAW.pout=PID_YAW.P*yaw_p;
        PID_YAW.dout = PID_YAW.D * gyr_in->Z;                                  
       
        if(rc_in->THROTTLE<1200)
        {               
                pit_i=0;
                rol_i=0;
                yaw_p=0;
        }

        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;
       
        /*   ¿ªÊ¼¶ÔÄÚ»· ¼´½ÇËÙ¶È×öPID¿ØÖÆ
        ÕâÀïÓÉÓÚ²»ÖªµÀÔõôÉè¼Æ¿ØÖÆÆ÷ ËùÒÔÓÃPID
        ¸öÈ˾õµÃÆäʵÓÃPI¾Í¿ÉÒÔÁË*/
        // ·ÇÏßÐÔ»¯´¦Àí£¬ÔÚ´óÎó²îµÄÇé¿öÏ»ºÂýµ÷½Ú
        PID_ROL.OUT= (PID_ROL.OUT>2500)?2500:PID_ROL.OUT;   
        PID_ROL.OUT= (PID_ROL.OUT<(-2500))?(-2500):PID_ROL.OUT;
PID_PIT.OUT= (PID_PIT.OUT>2500)?2500:PID_PIT.OUT;   
        PID_PIT.OUT= (PID_PIT.OUT<(-2500))?(-2500):PID_PIT.OUT;
        //¿ªÊ¼¶Ô½ÇËÙ¶È×ö¿ØÖÆ
        gyro.rol=PID_ROL.OUT*KAG-(gyr_in->X)*Gyro_Gr;//½ÇËÙ¶ÈÎó²î
        gyro.pit=PID_PIT.OUT*KAG-(gyr_in->Y)*Gyro_Gr;
       
        gro_rol_i +=gyro.rol;   //½ÇËÙ¶ÈÎó²î»ý·Ö
        gro_pit_i +=gyro.pit;
               
        PID_PID_1.pout=gyro.rol * PID_PID_1.P;
        PID_PID_1.dout=(gyro.rol - get_lastgro_rol)* PID_PID_1.D; //ÕâÀï¿ÉÒÔ²ÉÓà D=0
        PID_PID_1.iout=gro_rol_i*PID_PID_1.I;
        PID_PID_1.OUT = PID_PID_1.pout+PID_PID_1.iout +PID_PID_1.dout;
       
        PID_PID_2.pout=gyro.pit * PID_PID_2.P;
        PID_PID_2.dout=(gyro.pit - get_lastgro_pit)* PID_PID_2.D; //ÕâÀï¿ÉÒÔ²ÉÓà D=0
        PID_PID_2.iout=gro_pit_i*PID_PID_2.I;
        PID_PID_2.OUT = PID_PID_2.pout+PID_PID_2.iout +PID_PID_2.dout;
       

        if(rc_in->THROTTLE>1200&&armed)
        {
                Moto_PWM_1 = rc_in->THROTTLE - 1000 - PID_PID_1.OUT - PID_PID_2.OUT + PID_YAW.OUT;
                Moto_PWM_2 = rc_in->THROTTLE - 1000 + PID_PID_1.OUT - PID_PID_2.OUT - PID_YAW.OUT;
                Moto_PWM_3 = rc_in->THROTTLE - 1000 + PID_PID_1.OUT + PID_PID_2.OUT + PID_YAW.OUT;
                Moto_PWM_4 = rc_in->THROTTLE - 1000 - PID_PID_1.OUT + PID_PID_2.OUT - PID_YAW.OUT;
        }
        else
        {
                Moto_PWM_1 = 0;
                Moto_PWM_2 = 0;
                Moto_PWM_3 = 0;
                Moto_PWM_4 = 0;
        }
        Moto_PwmRflash(Moto_PWM_1,Moto_PWM_2,Moto_PWM_3,Moto_PWM_4);
                               
}

whq5234970 发表于 2014-3-27 21:11:57

文件传上来,其他的去匿名的官网上面下载,我上传不了大于10M的文件,我就传了control。c ,要要的留邮箱

小号 发表于 2014-3-28 11:35:14

你这种最原始的串级pid,和经典pid在控制效果上没有太大区别,应该说只是参数表达方式变了,最后的输出曲线是几乎一样的,差别就是在i上,不过经典pid也完全可以稍微修改,就做出和串级pid一模一样的输出,只能说是一条化简后一样的公式的两种表示形式

whq5234970 发表于 2014-3-28 14:51:00

大哥,你这么说来就不一样了,用经典控制理论来说的话,PID为何可用通用呢,是因为包含了超前滞后环节,参数调得好的,基本都可以满足。为啥要多加一个串级控制呢,可以理解为状态空间模型,实现多状态控制。这样理解可行

longwu537 发表于 2014-3-29 00:02:45

本帖最后由 longwu537 于 2014-3-29 00:18 编辑

whq5234970 发表于 2014-3-28 14:51
大哥,你这么说来就不一样了,用经典控制理论来说的话,PID为何可用通用呢,是因为包含了超前滞后环节,参 ...

你好,请问你的算法你有测试过吗?效果变化明显吗?

个人感觉方向是对的,但是对串级控制的结构理解还有一定的偏差,而且对控制理论中控制框图中的反馈和控制变量、输出的关系也是有点混乱的。

如果你测试之后效果确实很明显,我再回去啃书去……

小号 发表于 2014-3-29 09:35:23

昨晚去测试了你的这个方法,角度环pid后给角速度pid(这里的d我以前试过,是不可取的,拿含有噪音的数据去微分,会导致错误数据)所以我只用了pi,这么一来,先抛开i,这个控制算法的实质就是经典pid中把角速度这项由一次变成二次。然后有本质区别的就是我之前说的积分了。然后经过实际飞行,现在是有5个参数了,参数的意义就变得不好理解了,而飞行效果。就是角速度的力度很大,把回中给压制了,我试着调大角度环的p到很大。直到很回中,但是飞行手感和稳定性变的很差,几乎到了无法稳定控制的地步,也许是我没怎么折腾参数,但我没有感觉到这算法的优势{:handshake:}

whq5234970 发表于 2014-3-29 11:31:25

小号 发表于 2014-3-29 09:35
昨晚去测试了你的这个方法,角度环pid后给角速度pid(这里的d我以前试过,是不可取的,拿含有噪音的数据去微 ...

多谢哈,我感觉这个方法还是有可取得地方,我再研究研究,等有了新进展,再来讨论

mazhenyu 发表于 2014-3-29 12:02:08

小号 发表于 2014-3-29 09:35
昨晚去测试了你的这个方法,角度环pid后给角速度pid(这里的d我以前试过,是不可取的,拿含有噪音的数据去微 ...

本来我也觉得内环用d不合适,会放大噪声,但实际试了试貌似可以用,问题不大,不过还是最好不用

sylarwcy 发表于 2014-3-29 12:19:04

我也是拿传感器出来的数直接用,连角度都没转换,直接取个平衡位置的数当基准,然后PID

whq5234970 发表于 2014-3-29 13:34:49

只是多了一个比例系数而已,这个问题不大

小号 发表于 2014-3-29 14:01:14

经典pid在四轴的表现。就要要四轴按角度比例回中角速度,回中速度是P/D,力度是pd的值,而速度直接比例控制转矩。经典pid的另一种表达方式,那就是角度比例控制角速度,角速度比例控制转矩。而你的这个方式,是角度pd控制角速度,这里就多了一个d,然后用这个结果去比例控制转矩,这样就多了角度环的一个微分,化简公式,其实就是……这里我很难用文字来表达了,如果把公式写出来,先抛开i,那就是out1=p1*角度+d1*角速度;out2=out1+d2*角速度;公式中省略了一些比例系数那么,化简后是out2=p1*角度+(d1+d2)*角速度。如果算上i,那就有所不同了,但实际上i的参与是很小的,所以,这么写算法,似乎还是回到了经典pid哦{:handshake:}

whq5234970 发表于 2014-3-29 19:21:14

D:\[内环/img]

whq5234970 发表于 2014-3-29 19:21:48

   这个样子可行

木君之上 发表于 2014-3-29 22:38:55

我觉得搞控制的还是得看看理论才行,好多东西还是的学

小号 发表于 2014-3-30 00:04:51

图片很模糊啊,那具体实现程序呢?还有一种不同的,就是角度的pid中的d,不要直接使用角速度,而是真正的d,这样,就把遥控器的输入也叠加进来了,而不是单纯的给阶跃相应。还融入了提前控制量,我试过这种方式,当然我也不是用角度微分,而是用角速度在叠加遥控数据的微分。控制效果就是指哪打哪,但是弊端就是控制太用力了就容易出事,所以加了衰减后,效果还是不错的

dyxwxjdy 发表于 2014-3-30 08:35:18

顶一个~~LZ说的是串级吧?

longwu537 发表于 2014-3-30 11:33:56

本帖最后由 longwu537 于 2014-3-30 11:39 编辑

楼主,这个帖子我越看越纠结。可能是我的自控基础太差,一直不能理解你所说的双环控制是怎么做到的。能将13楼的控制框图画的清晰明确点吗?
我很纠结这个双环是怎么形成的,从理论上说。
很纠结,我也不知道想说什么了



能不能请稍微解释下,内环和外环的输入量、输出量各是什么?

whq5234970 发表于 2014-3-31 08:37:17

外环控制的角度,内环控制的角速度

whq5234970 发表于 2014-3-31 08:38:40

可惜没做系统辨识,都是瞎掰,有传递函数就不用在这里意淫了

小号 发表于 2014-3-31 10:04:07

系统辨识中需要用到传感器微分的数据,都让噪音给搅乱了

whq5234970 发表于 2014-3-31 11:42:09

如图,局部反馈校正,工程中常用的另外一种基本校正方法。仅看内环部分 内环的开环传递函数为G1(S),如果采用串级控制方法 ,闭环传递函数为(G1(S)*PID)/(1+G1(S)*PID)。如果采用反馈校正,传递函数为G1(S)/(1+G1(s)*H(S)),H(S)为设计的反馈控制器。这里主要讨论反馈控制。如果H(S)*G1(S)>>1的话,那么该部分传递函数可以近似认为是
1/H(S),那么就忽略掉了内环部分的传递函数。当然这里的前提条件是,H(S)*G1(S)>>1,工程上认为只要大于5就可以了。这样整理一下,整个系统的开环传递函数就成为了
PID*1/S*1/H(S),闭环传递函数为(1/s*PID*H(s)) / (1+1/s*PID*H(s)),这里的PID,H(S)都是自己设定的传递函数,可以在人为控制。只要考虑系统稳定的前提下,就可以更加高效的求取更快更稳定的系统。思路大概就这样子,是否比直接使用PID控制有提高?

whq5234970 发表于 2014-3-31 11:43:01

图不清楚的话,请点开看大图哈

小号 发表于 2014-3-31 13:23:45

看不懂你第二种方法,两个角速度间的传递函数都是啥,连pwm输出点我都没看出来在哪

whq5234970 发表于 2014-3-31 13:48:06

{:sweat:}经典控制方式中的反馈控制,和串级控制并列......

小号 发表于 2014-3-31 14:17:55

第三种的控制方式,确实比经典pid好,不过经典pid把d换成角速度,角速度叠加上遥控数据(实质上就是和角度微分后串级到角速度的结果是一样的)的控制方法是一样的。纯粹的经典pid还真是没法飞,但只要把微分项改了,就能达到能飞的效果了。而这第二种,真的看不懂,你能直接把c程序写出来么,第一和三的g(s),是pwm通过飞机这个物理模型后传递到角速度的传递函数,那么,第二个的g(s)和h(s),到底是啥,你是想表达角度pid后,和角速度经过h(s)传递函数后直接叠加么?那么h(s)具体是啥函数

whq5234970 发表于 2014-3-31 14:31:32

=我整理一下,稍后再给你答复。第二种控制方法,被称为反馈校正。该方法比其他两种方法(串级校正),具有更高的抗干扰能力和鲁棒性。

whq5234970 发表于 2014-3-31 14:32:31

只是没有直接看PID那么直观好理解,放在传递函数上看还是比较好理解的!

angel_gph 发表于 2014-4-8 16:10:53

这个PID太复杂,真是牛啊!!!!!!

angel_gph 发表于 2014-4-8 16:11:15

whq5234970 发表于 2014-3-31 11:42
如图,局部反馈校正,工程中常用的另外一种基本校正方法。仅看内环部分 内环的开环传递函数为G1(S),如果采 ...

赞!!!!

whq5234970 发表于 2014-4-11 09:16:32

自己顶一个吧,只要顶满50楼,就可以召唤超级大神,实现愿望了{:lol:}

小号 发表于 2014-4-11 11:29:51

那我帮帮你顶

a457738242 发表于 2014-4-12 20:26:45

楼主的想法没错 , 从理论上来说控制会更平稳,不过对于D项的处理,个人觉得用融合之后角度的微分以及微分的微分会比较好。

a457738242 发表于 2014-4-12 20:27:42

今天也刚在尝试这种PID发现整定参数的难度 比经典PID 不是大了一点点..

whq5234970 发表于 2014-4-14 15:54:33

a457738242 发表于 2014-4-12 20:27
今天也刚在尝试这种PID发现整定参数的难度 比经典PID 不是大了一点点..

据说匿名调他的PID的时候调了三天三夜......这个过程很漫长啊。没有传递函数就是卵蛋

小号 发表于 2014-4-15 10:02:38

大哥,谁跟你说匿名的pid需要调那么久啊,一块电池的功夫就出来了好不,随便试的,震就减小,不震就加大,反正是小四轴,也不怕炸,5个回合内基本的参数就出来了

whq5234970 发表于 2014-4-15 10:50:32

小号 发表于 2014-4-15 10:02
大哥,谁跟你说匿名的pid需要调那么久啊,一块电池的功夫就出来了好不,随便试的,震就减小,不震就加大, ...

大哥,你是有了大概的参数嘛....人家是没有这个大概的时候....况且...我经验不丰富{:sweat:}

小号 发表于 2014-4-15 13:35:17

额,一开始哪有大概参数的,我开始先调d,我记得一开始是给了个很夸张的大概是几十是d,直接就振动到无动力了,那么就给5不行,给0.5不行0.05大概可以有轻微控制效果,那么就0.2,有点震,那就0.1,就这数了,p也给几十不行给几就可以了,这不就出来了,p从0.几到接近10都可以飞,不断根据飞行效果取中点一下就出来了{:sweat:}最后在加一点点i不导致起振就好,我都想不出调这东西有多难,我也遇到一大堆人总是调到死都不行的,我的结论只有一个,姿态根本没处理好

dyxwxjdy 发表于 2014-5-2 23:21:01

顶两位大神!

qwe2231695 发表于 2014-5-3 00:11:21

本帖最后由 qwe2231695 于 2014-5-3 00:13 编辑

我用这种PID做了 大中小 差不多5中四轴机型。都效果显著,如果只用单环基本上只能做到悬停,

简单说一下

角度环:为系统提供回复力,PI为主导 ,配合一点点D,表现上为:负责遥控手感和回中响应。P为回中速度和打舵机动性,只用P会造成回中后超调震荡若干。所以 PI 配合,可以做到很好的遥控飞行,一点点的D负责抑制P的超调震荡。这个环输出角速度命令。

内环陀螺环:用它可以保持四轴的姿态,注意是保持。它接收角度环给的命令。角度环要求执行多少角速度就执行多少角速度。只有这个环,会是三轴模式。可以翻跟头特技。调参经验:PID都要。P负责稳定的力量大小,为系统提供阻尼力。I为辅助,比较容易造成震荡。D为强烈的抑制本环控制作用。

Yaw的控制只用内环,PI主导,I有很好的锁定作用。


whq5234970 发表于 2014-5-3 23:50:17

qwe2231695 发表于 2014-5-3 00:11
我用这种PID做了 大中小 差不多5中四轴机型。都效果显著,如果只用单环基本上只能做到悬停,

简单说一下...

老兄,你用的这种方法么?我看了很多国外的飞控基本都有内环控制的,你用这种方法做的怎么样了,发个视频来看看

qwe2231695 发表于 2014-5-3 23:53:36

whq5234970 发表于 2014-5-3 23:50
老兄,你用的这种方法么?我看了很多国外的飞控基本都有内环控制的,你用这种方法做的怎么样了,发个视频 ...

只能说飞的很不错,已经量产了。   

whq5234970 发表于 2014-5-3 23:58:46

qwe2231695 发表于 2014-5-3 23:53
只能说飞的很不错,已经量产了。

内环是PID?给个参考的参数

qwe2231695 发表于 2014-5-4 00:26:31

whq5234970 发表于 2014-5-3 23:58
内环是PID?给个参考的参数

和参数没有关系的啊,参数和pwm幅度,传感器输入幅度,控制周期,控制对象有关。怎么调我上面说的很明白了,先外环P=1 内环P=1 开始调,注意这个时候的PID控制器已经自带微分了。

culapple 发表于 2014-5-4 22:06:23

qwe2231695 发表于 2014-5-4 00:26
和参数没有关系的啊,参数和pwm幅度,传感器输入幅度,控制周期,控制对象有关。怎么调我上面说的很明白 ...

大神求视频看看,学习学习

a457738242 发表于 2014-5-12 17:53:31

qwe2231695 发表于 2014-5-3 00:11
我用这种PID做了 大中小 差不多5中四轴机型。都效果显著,如果只用单环基本上只能做到悬停,

简单说一下...

我也试了很多次认同你的观点 角度环PID角速度环 我认为PD即可 当然加I 也没问题 ..

ispex13 发表于 2014-5-18 23:42:20

内环控制角速度,实现速度阻尼。外环控制姿态角,实现姿态保持。无论是陀螺稳定平台还是飞行控制都是一样的。内环的带宽通常是外环的5-10倍,所以对于外环来说,内环的响应速度非常宽,在外环控制仿真时可以视为一个增益环节。对于PID控制器的使用,我从校正网络的角度来理解,P实现系统的控制带宽,I提供低频段的刚度,但是I过大会造成剪切频率处的相位滞后大于180°,造成系统振荡。d我没太用过。

pxpx601 发表于 2014-5-19 16:47:40

想来说说我的体会,我也是用内外环串级,原来内环是PD,外环是PID,发现,这样如果内环P偏大,D就要跟着增大,才能保证内环反应的速度,如果P偏小,D也就小了,反应速度慢点。这时再加上外环,如果P大了,调整力度大了,容易造成振荡,里面这时增加d,振荡会被小更消失,但是控制的反应速度就变慢了。
如果用APMV3。0里面的串级,内环pid,外环p,这个就相对好调一点。他的i固定是p值的0.01倍,随p变化而变化,内环调好后,那外环就好调了就一个p,都调好后,p值取0.75倍,前面说到的内环i值取与内环p值相同。实际调试中,发现外环p值调好后不用取0.75倍,不然调整力度会偏小一点。

pxpx601 发表于 2014-5-19 17:10:34

http://v.youku.com/v_show/id_XNjc2ODgwMjA4.html这个是用内环PD,外环PID调的。真的很难调

pxpx601 发表于 2014-5-19 17:33:02

http://v.youku.com/v_show/id_XNzA2Mjg4MTgw.html
(无GPS,无定高,试了一下前后左右移动。上下猛推油门,小孩拍的,抖的厉害凑合看吧)这个是用内环PID,外环P调的,这中间机架由原来的450变为550,电机和桨都换了,感觉参数不用变差别不大。

// 内环p=1.4 i=0.9 d=0.05 ,外环p=3.8 静止时比较稳定但是快速大角度打舵时会震荡几下
//内环p=1.35 i=0.4 d=0.04 外环p=3.8 静止时没有上面的稳定但快速大角度不震荡目前在用视频上的.
//内环P=1.3 i=1.3 d=0.02外环p=3.8到位时还会再移一下,有点慢

whq5234970 发表于 2014-5-19 22:24:33

pxpx601 发表于 2014-5-19 17:33
(无GPS,无定高,试了一下前后左右移动。上下猛推油门,小孩拍的,抖的厉害凑合看吧)这个是用内环PID, ...

我看了MWC的算法,内环用的PD控制,外环用的PI控制, 外环参数是P=3.3 I=0.025,内环的貌似用的是动态的PD参数,没看懂....

pxpx601 发表于 2014-5-20 10:35:18

mwc的与apm用的有点像但不一样

superfight 发表于 2014-5-20 15:00:56

pxpx601 发表于 2014-5-20 10:35
mwc的与apm用的有点像但不一样

请教一下APM的代码
update_rate_bf_targets有一层P , 这个是不是内环用于控制角速度?
rate_bf_to_motor_roll有一层PID , 这个是不是外环用于控制姿态角?

谢谢

whq5234970 发表于 2014-5-20 21:09:27

superfight 发表于 2014-5-20 15:00
请教一下APM的代码
update_rate_bf_targets有一层P , 这个是不是内环用于控制角速度?
rate_bf_to_motor_r ...

没有看APM的代码,就只研究了MWC的代码,可以交流MWC的

SMC 发表于 2014-5-20 21:13:41

我认识的一个控制专业的网友跟我说的,多闭环控制就是套圈圈越套越慢。

whq5234970 发表于 2014-5-20 22:55:45

SMC 发表于 2014-5-20 21:13
我认识的一个控制专业的网友跟我说的,多闭环控制就是套圈圈越套越慢。
...

可以这么理解,但是内环可以有效抑制超调,参数好的话,动态性能更好

pxpx601 发表于 2014-5-22 06:44:11

superfight 发表于 2014-5-20 15:00
请教一下APM的代码
update_rate_bf_targets有一层P , 这个是不是内环用于控制角速度?
rate_bf_to_motor_r ...

第一个是载体坐标系下目标角速度是内环一部分,第二个是载体从标系下将角速度转化为电机的控制量

whq5234970 发表于 2014-5-24 23:52:02


void Control(T_float_angle *att_in,T_int16_xyz *gyr_in, T_RC_Data *rc_in, u8 armed)
{
T_float_angle angle;
        angle.rol =   (rc_in->ROLL-1500)/25- att_in->rol;
        angle.pit =   (rc_in->PITCH-1500)/25 - att_in->pit ;
       
        rol_i += angle.rol;
        if(rol_i>2000)
        rol_i=2000;
        if(rol_i<-2000)
        rol_i=-2000;
        PID_ROL.pout = PID_ROL.P * angle.rol;
        PID_ROL.dout = PID_ROL.D * gyr_in->X;
        PID_ROL.iout = PID_ROL.I * rol_i;
                floaterror_g_r;
        static float error_g_r0;
        //rol限幅
        PID_ROL.OUT = PID_ROL.pout + PID_ROL.iout + PID_ROL.dout;
        PID_ROL.OUT= (PID_ROL.OUT>300)?300:PID_ROL.OUT;   
        PID_ROL.OUT= (PID_ROL.OUT<(-300))?(-300):PID_ROL.OUT;
        error_g_r=PID_ROL.OUT-(gyr_in->X)*Gyro_Gr;
        PID_PID_1.pout=error_g_r * PID_PID_1.P;
        PID_PID_1.dout=(error_g_r-error_g_r0) * PID_PID_1.D;
        error_g_r0=error_g_r;
        PID_PID_1.OUT=PID_PID_1.pout+PID_PID_1.dout;
       
       
        pit_i += angle.pit;
        if(pit_i>2000)
        pit_i=2000;
        if(pit_i<-2000)
        pit_i=-2000;
        PID_PIT.pout = PID_PIT.P * angle.pit;
        PID_PIT.dout = PID_PIT.D * gyr_in->Y;
        PID_PIT.iout = PID_PIT.I * pit_i;
                PID_PIT.OUT = PID_PIT.pout + PID_PIT.iout - PID_PIT.dout;
       
        PID_PIT.OUT= (PID_PIT.OUT>300)?300:PID_PIT.OUT;   
        PID_PIT.OUT= (PID_PIT.OUT<(-300))?(-300):PID_PIT.OUT;
                floaterror_g;
        static float error_g0;       
        error_g=PID_PIT.OUT+(gyr_in->Y)*Gyro_Gr;
        PID_PID_2.pout=error_g * PID_PID_2.P;
        PID_PID_2.dout=(error_g-error_g0) *0.5f* PID_PID_2.D;
        error_g0=error_g;
        PID_PID_2.OUT=PID_PID_2.pout+PID_PID_2.dout;
               
        if(rc_in->YAW<1480||rc_in->YAW>1520)//P是用来锁定角度的
        {gyr_in->Z=gyr_in->Z+(rc_in->YAW-1500)*10;}
        yaw_p+=gyr_in->Z*0.0609756f*0.002f;// +(Rc_Get.YAW-1500)*30


        PID_YAW.pout=PID_YAW.P*yaw_p;
        PID_YAW.dout = PID_YAW.D * gyr_in->Z;                                  
       
        if(rc_in->THROTTLE<1150)
        {               
                pit_i=0;
                rol_i=0;
                yaw_p=0;
        }



        PID_YAW.OUT = PID_YAW.pout + PID_YAW.iout + PID_YAW.dout;

        if(rc_in->THROTTLE>1150&&armed)
        {
                Moto_PWM_1 = rc_in->THROTTLE - 1000 - PID_PID_2.OUT + PID_YAW.OUT;
                Moto_PWM_2 = rc_in->THROTTLE - 1000 + PID_PID_1.OUT - PID_YAW.OUT;
                Moto_PWM_3 = rc_in->THROTTLE - 1000 + PID_PID_2.OUT + PID_YAW.OUT;
                Moto_PWM_4 = rc_in->THROTTLE - 1000 - PID_PID_1.OUT - PID_YAW.OUT;
        }
        else
        {
                Moto_PWM_1 = 0;
                Moto_PWM_2 = 0;
                Moto_PWM_3 = 0;
                Moto_PWM_4 = 0;
        }
        Moto_PwmRflash(Moto_PWM_1,Moto_PWM_2,Moto_PWM_3,Moto_PWM_4);                       
}

代码附上,内环P=1.0 D=0.05;
飞机飞行稳定,但是遥控手感不好。不知道怎么搞的

whq5234970 发表于 2014-5-31 00:29:32

pxpx601 发表于 2014-5-19 17:10
这个是用内环PD,外环PID调的。真的很难调

这个视频的,转动,是你遥控给定让他转动的么?不是自己震荡的吧

whq5234970 发表于 2014-5-31 00:33:52

pxpx601 发表于 2014-5-19 17:10
这个是用内环PD,外环PID调的。真的很难调

兄弟,你内环用PID,外环PD的视频能不能也拍这样一个视频哇?

xuefei 发表于 2014-5-31 11:14:24

mazhenyu 发表于 2014-3-29 12:02
本来我也觉得内环用d不合适,会放大噪声,但实际试了试貌似可以用,问题不大,不过还是最好不用 ...

在噪声量小的时候,或者说噪声频率不大时,可以加上d环节,若噪声频率很大时,最好别用或者是进行有效滤波后再使用。

SMC 发表于 2014-5-31 12:51:23

a457738242 发表于 2014-4-12 20:26
楼主的想法没错 , 从理论上来说控制会更平稳,不过对于D项的处理,个人觉得用融合之后角度的微分以及微分 ...

你测试过这种方法没?

SMC 发表于 2014-5-31 12:54:50

小号 发表于 2014-3-29 09:35
昨晚去测试了你的这个方法,角度环pid后给角速度pid(这里的d我以前试过,是不可取的,拿含有噪音的数据去微 ...

把内环的d滤下波应该可以用了

SMC 发表于 2014-5-31 13:00:16

本帖最后由 SMC 于 2014-5-31 13:12 编辑

小号 发表于 2014-3-30 00:04
图片很模糊啊,那具体实现程序呢?还有一种不同的,就是角度的pid中的d,不要直接使用角速度,而是真正的d ...

我尝试过使用角度的微分而不是角速度,结果就是一直没稳定过,具体原因还不确定,当时使用的电池也不给力,满电压起飞就报警。

SMC 发表于 2014-5-31 13:01:19

小号 发表于 2014-3-30 00:04
图片很模糊啊,那具体实现程序呢?还有一种不同的,就是角度的pid中的d,不要直接使用角速度,而是真正的d ...

你说的衰减是乘以一个小于1的系数吗?

SMC 发表于 2014-5-31 13:03:00

小号 发表于 2014-3-31 10:04
系统辨识中需要用到传感器微分的数据,都让噪音给搅乱了

直接测定电机以及桨机架的各种参数,这样建模可能会好点。

a457738242 发表于 2014-6-4 16:21:13

SMC 发表于 2014-5-31 13:00
我尝试过使用角度的微分而不是角速度,结果就是一直没稳定过,具体原因还不确定,当时使用的电池也不给力 ...

是不是出现怎么调都很软 感觉D项的阻尼效果几乎没有的感觉,,.我认为是直接对融合角度微分存在滞后的问题..

SMC 发表于 2014-6-4 19:45:39

a457738242 发表于 2014-6-4 16:21
是不是出现怎么调都很软 感觉D项的阻尼效果几乎没有的感觉,,.我认为是直接对融合角度微分存在滞后的问 ...

现在想想就是你说的这样,没办法解决滞后,微分之后必须滤波,一滤波就带来滞后了

a457738242 发表于 2014-6-5 22:24:08

SMC 发表于 2014-6-4 19:45
现在想想就是你说的这样,没办法解决滞后,微分之后必须滤波,一滤波就带来滞后了 ...

不是滤波的问题..是融合的角度本身就是滞后的...

SMC 发表于 2014-7-4 01:52:20

小号 发表于 2014-3-28 11:35
你这种最原始的串级pid,和经典pid在控制效果上没有太大区别,应该说只是参数表达方式变了,最后的输出曲线 ...

我以前跟你一样的理解,不过我现在不这么认为了,不能仅仅从数学公式上看问题。

SMC 发表于 2014-7-4 02:53:17

qwe2231695 发表于 2014-5-3 00:11
我用这种PID做了 大中小 差不多5中四轴机型。都效果显著,如果只用单环基本上只能做到悬停,

简单说一下...

请教下,你内环和外环控制频率一样吗?不知道内外环控制频率对系统有没有影响。

praiseslow 发表于 2014-7-4 03:23:43

我建议楼主要从理论上抽象分析,不要一上来就贴代码。

praiseslow 发表于 2014-7-4 03:37:16

楼主是在哪里,是在北京吗,如果是在北京的话,我们可以交流。

有明吗 发表于 2014-8-3 16:14:48

我的用的PID就是lz所说的

默默七 发表于 2014-8-8 10:05:05

内环不适合用D的,陀螺仪敏感,D会放大误差,很容易造成震荡发散。

QuadRotor 发表于 2014-8-25 21:57:27

Gyro_Gr 是什么?内环反馈增益?为什么取值为0.0010653f ?

2013的弹子球 发表于 2016-1-24 09:14:15

小号 发表于 2014-3-30 00:04
图片很模糊啊,那具体实现程序呢?还有一种不同的,就是角度的pid中的d,不要直接使用角速度,而是真正的d ...

居然还有这种效果啊。。。我去试试。。用陀螺仪做反馈严格上来讲是复合控制了
页: [1]
查看完整版本: 匿名四轴的控制算法的角速度内环的讨论