这里特地给出了Kp Ki Kd这三个参数,这三个参数就是大家最常看到的那个离散的PID公式,也就是说你在这里既可以使用Kp Ti Td的参数来建模也可以使用Kp Ki Kd的参数来建模,到这里就总算是可以把我们的传递函数放在系统中用自控原理的相应工具来分析了。分析之前要先声明一个事情,有人发现(比如在MWC和其他许多飞控中)用陀螺仪的输出来当做PID中的微分项,会取得比标准PID更好的控制效果,乍一看这么做与用前后两次欧拉角作差没有区别(因为角速度整好就是角度的微分),控制效果不一样就说不通了。
其实是这个样子的,如果我们在程序中做了非常好的线程安全的处理并且控制频率和姿态解算读陀螺的频率是一样的的情况下二者确实是没有任何差别的,但是大家的飞控都写的非常简单,姿态解算频率都高于控制频率,于是读到的陀螺仪的数据并不是‘当前使用的姿态前一时刻’的数据而是‘后一时刻’的数据,这时候PID控制的微分部分就不再是‘后项差分’而是‘前向差分’了(这就是我前面要强调使用后项差分法的原因),那这个时候就尴尬了,我们不能全部使用前向差分模型来建模(因为积分还是使用的后向模型)两边分开用又会出现模型阶次不匹配的问题,所以这时候是无法使用PID模型来考虑接下来的问题的,你使用的其实是两个独立的控制器并联,一个是角度的PI控制器,而另一个是角速度的P控制器,二者采样时间不一样,于是得当做两个独立的控制回路调整参数,这是使用这种控制器时的参数调整方法。也就道出了为什么部分情况下使用角度微分和角速度控制效果不一样的问题,这种方法固然是很好的(可以有效的降低振动),当然前提是你按照二者独立控制的思路来设计参数。但是很不幸,大家都没有这么做,依然是把整体作为PID控制器来考虑,那么,我只能说这是个近似的PID控制器了,手调固然可以(万能的实验调参啊)但是通过建模的方式算出优化的参数就不可能了。我们接下来看会怎样: 从系统的零极点图理解PID控制的原理 有了上面的PID传递函数的离散系统模型我们就可以开始下一步了,将上面的分式上下做因式分解可以得到系统的零极点,在自控原理中我们知道,系统的极点确定系统的稳定性情况,零点不影响系统稳定性,零点和极点共同决定系统的响应。这里说的有些模糊,在现代控制理论中会提到一种控制器叫零极点配置控制器,能更好的阐述零点的作用:系统中的零点可以用来与系统中的不稳定(或者不想要)的极点对消来设计出理想的控制器(数学上),工程中我们考虑的是让零点与我们不想要的极点尽可能的靠近,就能削弱这个不想要的极点对系统的影响。下面我们用极点配置的方法来设计PID控制器,这里提前声明我们使用的并不是最标准的闭环极点配置方法,因为我们的PID控制器只有两个零点可以配置(如果使用PI控制器的话就只有一个零点可以自由配置了)而且还多了一个临界稳定的极点,反馈又使用的是单位负反馈……极大的限制了极点配置的自由度,于是我们为了简单起见仅从开环部分进行极点配置,这么做有许多不严谨的地方,但是会简化许多工程上的应用(在做自适应PID控制器的时候会用到完整的极点配置方法,到那里就会发现是多么复杂的一件事儿了……)。
上图是PID控制器开环部分(就是上面推导的数学模型)常见的零极点分布情况,有两个固定在(0,0)和(1,0)位置的极点,两个对称分布的零点(手调参数时很难出现两个零点都在实轴上的情况而且我们也不希望那样),这两个零点的位置是可调的,微分时间常数Td主管零点位置的左右移(注意是‘主管’,也就是说对虚轴的位置还是有影响的),常数越大越靠右(也就是说临界稳定极点的影响越弱,抗噪声性能越好但到达0误差的稳态也就越困难,因为这个临界稳定的极点是在闭环系统中让系统到达稳态0误差的关键但很影响稳定性),积分常数Ti越大零点越靠近实轴,Ti在实际控制中的作用不好说明,留在后面再说,但是到这里大家也就看出我为什么要使用标准的Kp Ti Td参数而不是Kp Ki Kd参数了,因为使用这种参数时Kp对开环系统的稳定性(注意仅指开环系统)没有影响,我们就可以降低系统对这个参数的敏感性而主要考虑另外两个参数就好。大家在手调参数的看到的图形和这个都应该没有多少区别
接下来我们看一下我们被控系统的数学模型: 被控系统的小范围线性化模型 正如我前面所述,想要分析PID的控制性能必须得得到被控系统的线性近似模型(非线性系统下的分析工具没个正经能用的),这里大家可以通过动力学建模得到系统的非线性模型(像几乎所有的硕士博士论文那样)再泰勒展开,但是这样做往往得到的模型跟实际情况差异太大以至于没有参考价值,这里我推荐使用系统辨识的方法来得到系统的线性模型,因为这么做如果能做到正确的辨识的话还能得到系统的误差模型,于是现在在控制界很流行,只是实际用的时候就发现难度颇高,尽管有许多现成的工具但是依然特别难掌握,也难怪很多热会把这个当做是看家本领,作者在这方面也算是连皮毛都没摸全,不敢乱讲,这里就为了解释PID方便直接把我的大四轴辨识出来的Pitch轴模型拿出来当做例子来讲了:
哟,完美嘛,0.5s即可到达稳态,0稳态误差,超调量也不过10%而已,相当的理想,而且从这里可以看出使用Kp Ti Td参数的优势:随意调整Kp,可以提高系统性能而且对闭环稳定性几乎没有影响,甚至对开环系统的稳定性完全没有影响,我想,这也就是MWC飞控用Kp(角速度的)作为动态参数的原因。那么好吧,令人沮丧的部分终于要来了,把这个参数烧到飞控里面,运行,哇塞,不错哦,不动摇杆它平衡的很好,那我们遥控下……我擦,越抖越大,控制不住了,翻了,打到人了,鲜血汩汩而出……………………
这是为什么呢?来看下我们这时的开环系统阶跃响应:
咦?怎么是一条直线呢?没错,它就是这样一个不稳定的状态,在我们高兴的做极点配置的时候,忘记了PID控制器本身还会引入一个临界稳定的极点,这个极点带来的好处0稳态误差,但是却对噪声非常敏感,也就是说,如果我们的飞机在气流平稳的地方飞行,飞机的电机性能又极佳,建模也准,最关键的,是姿态解算的精度又出奇的高的话,用这种方法得到的PID参数肯定是非常完美的。但是现实总是残酷的,具体为什么会对噪声这么敏感应该可以从系统的噪声辨识模型中得到解释,但是很遗憾到文章这里我并没有对噪声进行建模,有兴趣的可以尝试下。
这里就是使用PID控制的弊端了,它只提供了两个零点用来对极点进行抑制,但是又同时引入了一个不稳定的极点,不得已,我们只能让零点从那两个极点上向那个临界稳定的极点移动,企图用两个零点来牵制三个极点,这自然没办法达到良好的控制效果,但也就成了没有办法的办法了……大家在搜索PID参数整定方法的时候一定都听说过Ziegler-Nichols整定法则,这几乎是PID基于模型的参数整定唯一的方法了,但是为什么没人把这个如此著名的整定方法(这里指第一方法)应用在四轴的PID整定中呢?因为使用该法则有个铁打的前提:控制对象中既不能包含积分器,又不包含主导共轭复数极点,也就是说阶跃响应应该是一个S型…………………………很不幸,我们的四轴这两条都占了……积分器是在从角速度到角度转换的过程中,在与其他好多极点的共同作用中最终在我们的参数辨识中表现为了那两个讨厌的共轭复数极点,重新看一遍我的解释流程,就明白为什么不能用Ziegler-Nichols整定第一法则了,也就是为什么光用PID不能达到足够好的控制效果。
那么,既然非要用PID飞又既然缺少极点的情况下我们只能让零点右移,这么做的理由也是可以从另一个方面来佐证的:
调过PID的都知道增加微分可以提高系统的抗噪性能,减小积分会减小噪声积累(这里指Ki增加而不是Ti)反映到零点的移动中刚好就是零点向右侧的(1,0)点移动。所以可以得知,我们经过权衡能得到的PID最佳的控制参数的零点应该是落在了开环主导极点和(1,0)点连线所在的那一片区域内了,那么我们对PID的分析是否到此就结束了呢?显然没有,我还没有论证为什么大家在数年的总结中会得到“先调P,再调D,最后调I就能飞了”的实验整定方法能够凑效,并且还要提出个理论指导实践的方法来……
自控原理的书上有提到“串联响应频率校正”的设计方法,但是该方法屡试都不爽,有兴趣可以从这个方向走走,说不定能为我们的四轴PID控制器设计找到一条出路。
之前我曾说过,用Kp Ti Td型的参数设计的PID控制器稳定性对Kp并不敏感,那么我们是不是可以利用这点来优化我们的控制器设计呢?答案是肯定的。我们先来看下按照上面的‘向右看齐’参数调整方法会发生什么:
我们随便选一个在连线上的点作为参数查看它的开环零极点和闭环阶跃响应(这里Kp去1):