精华内容
下载资源
问答
  • 介绍了喷射电沉积快速成形技术的基本原理,分析了金属零件成形过程中,定域性对零件成形精度的重要性,并对影响定域性的因素进行了基础实验研究。结果表明:喷嘴口径、喷嘴与阴极间的距离对定域性有密切关系,喷嘴...
  • 用基于密度泛函理论的第一性原理方法计算了金属铝中方向的广义层错能曲线,并用其详细讨论了广义层错能的定域性,结果表明广义层错能主要来自于滑移面上、下最近邻原子层的贡献。此外,(111)面上广义层错能具有...
  • 信赖算法原理

    千次阅读 2019-09-29 13:31:16
    沿着上述的问题,我们提出几个问题,根据这几个问题,展开描述信赖方法的实现原理: 信赖法在求得步长范围内空间的最小值点时,求的是什么函数的最小值点,是原始的损失函数的最小值点吗? 2.确定完步长之后,...

    提到最优化方法,常见的有梯度下降法(衍生出来的有批梯度下降,随机梯度下降)、牛顿法(衍生出来了拟牛顿)等。我们知道,最优化在机器学习中,是为了优化损失函数,求得其最小值,即为(mathop {min }limits_theta f({x_theta })),其中 (theta) 为损失函数的参数,最优化的目的就是找到最佳的(theta)使得损失函数最小。梯度下降的方法是求出损失函数在某一点的梯度,然后沿着负梯度方向走一小步,然后继续求新点的梯度,继续的迭代,直到达到迭代限定的次数,或者梯度极小,则迭代结束,求得最小值。对于牛顿法的原理,这里简单推导下: 先用泰勒展开去逼近目标函数(f(x))即为 [varphi (x) = f({x_k}) + f’({x_k})(x - {x_k}) + frac{1}{2}f’’({x_k}){(x - {x_k})^2}] (phi (x))是二阶展开式,高阶项被略去,既然我们把其当做目标函数的逼近式,则我们对该函数求最值,那么采用的方法就是求出展开后的二次逼近式的导数,然后另其等于0,即如下: [varphi ‘(x) = 0,] [f’({x_k}) + f’’({x_k})(x - {x_k}) = 0] 然后得出 [x = {x_k} - frac{f’({x_k})} {f’’({x_k})}] 这里我们感性的理解下这种思路,我们知道,当函数在点(x_k)泰勒展开时,取其前几阶式(牛顿法取的是二阶)用于逼近原始的函数,那么只有在展开的那个点附近,才能用泰勒展开的式子作为近似原始函数,因为我们取的毕竟是有限的阶数(高阶的我们已省略),那么展开的函数离(x_k)点较远的点可能会有较大的误差,那么上述的式子中,我们对展开函数进行求极值,求出的只是我们的近似函数的极值,并非原始函数的极值,但跟原始的极值很接近,那么我们继续在新的点上展开,然后继续求极值,那么就会越来越接近原始函数的极值。想象一下,如果原始函数在展开的点较为平滑,那么其二次逼近式在那一点附近就会很接近原始的函数,那么每次求得的近似函数的极值会跟原始的函数的极值很接近,那么牛顿法收敛的就会很快。但是如果原始函数在站开点处是一个极其不平滑,坑坑洼洼的函数,那么我们在那一点展开的二次逼近式,就可能会跟原始函数相差很远,那么求得的极值可能会跟原始函数的极值不是很接近,甚至会变得更远,这也许就是牛顿法的一些局限性的原因吧。 在上面提到的方法中我们发现,梯度下降是先确定方向,然后沿着方向走,牛顿法也很类似,展开逼近函数后,沿着逼近函数的极值,其实就是沿着一个二阶的方向走。那么本文要说的是另外的一种思路,如果我们先不确定方向,而是先确定下一步我们要走的长度,从初始点开始,确定下一步要走的长度,然后以该长度为半径的空间区域内,寻找最小的一个点,走到该点,然后再从新的点确定长度,接着依次的按照这种方法进行迭代,直到找到函数的最小值点。接下来我们详述下该方法的原理。

    信赖域方法原理
    沿着上述的问题,我们提出几个问题,根据这几个问题,展开描述信赖域方法的实现原理:

    信赖域法在求得步长范围内空间的最小值点时,求的是什么函数的最小值点,是原始的损失函数的最小值点吗?
    2.确定完步长之后,在步长范围内空间是怎样求得最小值点的?

    3.步长是怎样确定的?

    下面一一展开。

    问题一
    信赖域法在求得步长范围内空间的最小值点时,求的是什么函数的最小值点,是原始的损失函数的最小值点吗?
    求的不是原始函数的极值点。信赖域法跟牛顿法有一点很相似,同样是在初始点进行泰勒展开,取的同样是二阶式,即如下

    [f(x) approx f({x_k}) + nabla f{({x_k})^{rm T}}(x - {x_k}) + frac{1}{2}{(x - {x_k})^{rm T}}{nabla ^2}f({x_k})(x - {x_k})]

    然后进行化简,令(d=x-x_k)得

    [varphi (d) = f({x_k})nabla f{({x_k})^{rm T}}d + frac{1}{2}{d^{rm T}}{nabla ^2}f({x_k})d]

    我们把原始的损失函数在(x_k)处展开取得二阶式用于逼近原始的损失函数,然后按照一定的规则,确定一个步长,把展开的逼近函数在该空间内求最小值,实际的数学公式如下,

    [ begin{cases} varphi (d) = f({x_k})nabla f{({x_k})^{rm T}}d + frac{1}{2}{d^{rm T}}{nabla ^2}f({x_k})d\ ||d|| le {h_k}\ end{cases} ]

    解释下,为什么是限制(||d||),我们知道(d=x-x_k),那么可以理解为我们要找到的最佳点为(x),距离我们当前展开点的长度。

    问题二
    确定完步长之后,在步长范围内空间是怎样求得最小值点的?
    在第一个问题的解答,我们知道信赖域法把损失函数在某一点展开后,取二阶式,然后再确定一个步长,然后求其最小值。很明显,这是一个带有约束条件的最优化问题,求带有约束条件尤其是不等式约束条件的最优化问题我们常用到的就是KKT条件,这里我们简单讲述下KKT条件,详细的请看我总结的另一篇:KKT条件推导(还未更新)。KKT条件专门用于求解带有不等式约束条件的最优化问题,它把待最优化问题中的目标函数、不等式以及等式约束条件,转化为可求解的方程组,也就是说如果原始问题存在极值解,那么极值解一定满足KKT的条件(即为必要条件),其中满足的条件可写为一个方程组,解这个方程组即可。

    问题三
    步长是怎样确定的?
    当我们求得在步长空间范围内的最小值点时,就要确定下一步的步长范围(注意,在算法的初始,我们会给出一个初始的步长和初始点)。确定下一步步长的原则是,看在求得的最小值点处,实际的损失函数的下降值与二次逼近式的预测下降值进行对比,如果实际的下降值满足预期的,则使得函数走到该点(更新(x_k+1)),并且继续使用上一步的步长,甚至扩大步长,如果实际的下降不满足预期,则缩小步长,如果非常不满足,甚至不会更新(x_k+1),下面使用公式描述下。 假设函数求得的最佳值为(d_k),即为我们要更新的向量,那么实际的下降值为 (f({x_k}) - f({x_k} + {d_k})) 我们预测的下降值为原始的值,减去我们逼近函数的最小值,即为 (f({x_k}) - varphi ({d_k})) 二者的比值为
    [{rho _k} = frac{f({x_k}) - f({x_k} + {d_k})}{f({x_k}) - varphi ({d_k})}] 我们根据这个比值可以来自定义步长更新规则,下面举例说明。 假设初始信赖域半径为 (h_1) ,初始点为 (x_1) ,求得的最佳的极值点为 (d_1) ,那么我们假设两个参数 (0 < mu < eta < 1) 更新迭代点如果比值 (rho_1 le mu) 时,则不更新 (x_2) ,即为 (x_2 = x_1) ,如果 (rho_1 > mu) ,则 (x_2 = x_1+d_1) 。 更新信赖域半径如果 (rho_1 le mu) 时,则缩小信赖域半径,(h_2=frac{1}{2}h_1) ,如果 (mu < rho_1 < eta) ,则令 (h_2=h_1) ,如果 (rho_1 ge eta) ,则令 (h_2=2h_1) 依次迭代下去。

    信赖域算法的步骤:
    (1)从初始点 (x_0) ,初始信赖域半径 (h_0) 开始迭代

    (2)到第 k 步时,求出二次逼近式

    (3)解信赖域模型,求出位移 (d_k) ,计算 (rho_k)

    (4)若 (rho_k≤0.25) ,说明步子迈得太大了,应缩小信赖域半径,令 (h_k+1=frac{1}{2}h_k) ,这时不应该走到下一点,而应“原地踏步”,即 (x_k+1=x_k)

    (5)若 (rho_k≥0.75) 且 (||d_k||=h_k) ,说明这一步已经迈到了信赖域半径的边缘,并且步子有点小,可以尝试扩大信赖域半径,令 (h_k+1=2h_k) ,可以走到下一点,即 (x_k+1=x_k+d_k)

    (6)若 (0.25<rho_k<0.75) ,说明这一步迈出去之后,处于“可信赖”和“不可信赖”之间,可以维持当前的信赖域半径,令 (h_k+1=h_k) ,且可以走到下一点,即 (x_k+1=x_k+d_k)

    感性的理解信赖域算法
    最优化算法中迭代的思想:
    由于目标函数过于复杂,无法一次性的求出函数的极值点,我们随机的找一个点,并且在该点处的附近用一个稍微简单的函数作为近似函数来代替目标函数,因为在一个点附近可以认为函数是平滑的,然后求出近似函数的极值,即为接近目标函数极值的点,然后更新该点,继续在该点处用近似函数代替目标函数,再次求出新的极值,一次次的逼近原始的目标函数的极值点。

    信赖域半径更新规则的原因
    当实际的下降量远小于预测的下降量时,说明了我们选的步长太大,为何这么说呢?因为我们知道逼近函数只有在展开点处附近接近目标函数,但是步长太大,我们的逼近函数在较远处与目标函数就会相差很大,这样逼近函数认为下降较大的点,实际目标函数并不会下降很多,所以我们要缩小步长,保证逼近函数与原始函数相差不大,这样保证下降的方向是对的。 同样的如果下降的很符合预期,说明什么,说明我们的逼近函数非常接近目标函数,两种可能,一种是目标函数在该点处的较大范围附近是平滑的,一种是,我们的步长选的太小了,在很小步长的范围内逼近函数非常接近目标函数,无论是哪种可能,我们都要扩大步长,来加快收敛。

    泰勒展开的重要性
    感觉泰勒展开就是这些最优化算法的基础,把复杂的目标函数在某一点处展开作为近似的目标函数是整个最优化算法精髓。

    展开全文
  • 当片断产生于多键断裂时,在确保目标轨道单占据的同时,Kost定域破坏了轨道基组的对称。为此,在Kost定域化后,必须对单占据轨道作2×2对称化旋转后,再作有条件的RHF运算。以乙烯基片断CHCH(波二烯分子中的一...
  • 数字图像处理-频率滤波原理

    千次阅读 2018-06-23 22:53:18
    频率的概念 频率是指从函数的频率角度出发分析函数,和频率相对的是时间。简单说就是如果从时间分析信号时,时间是横坐标,振幅是纵坐标。而在频率分析的时候则是频率是横坐标,振...

    转自:http://blog.csdn.net/forrest02/article/details/55510711

    频率域

    在介绍频率域图像处理之前,先提几个问题。 
    1.什么是频率域? 
    2.为什么要在频率域中进行图像处理?

    频率域的概念 
    频率域是指从函数的频率角度出发分析函数,和频率域相对的是时间域。简单说就是如果从时间域分析信号时,时间是横坐标,振幅是纵坐标。而在频率域分析的时候则是频率是横坐标,振幅是纵坐标。 
    举个例子,我们认为音乐是一个随着时间变化的震动。但是如果站在频域的角度上来讲,音乐是一个随着频率变化的震动,这样我们站在时间域的角度去观察你会发现音乐是静止的。同理,如果我们站在时间域的角度观察频率域的世界,就会发现世界是静止的,也是永恒的。这是因为在频率域是没有时间的概念的,那么也就没有了随着时间变化着的世界了。 
    另外,我们需要借助傅立叶变换,才能够在得到函数在频率域中的信息。

    为什么要在频率域中进行图像处理? 
    1). 可以利用频率成分和图像外表之间的对应关系。一些在空间域表述困难的增强任务,在频率域中变得非常普通; 
    2). 滤波在频率域更为直观,它可以解释空间域滤波的某些性质; 
    3).可以在频率域指定滤波器,做反变换,然后在空间域使用结果滤波器作为空间域滤波器的指导

    傅里叶变换

    谈到频率域,就不得不说傅里叶变换了。傅里叶是18世纪法国的一位伟大的数学家。他最大的贡献在于指出任何周期函数都可以表示为不同频率的正弦和或者余弦和的形式,每个正弦或者余弦乘以不同的系数(也就是被大家所熟知的傅里叶级数)。无论函数有多复杂,只要它是周期性的,并且满足一定的数学条件,就一定可以用这样的正弦和或者余弦和的形式来表示。甚至在有些情况下,非周期函数也可以用正弦和或者余弦和的形式来表示。用傅里叶级数或变换表示的函数特征可以完全通过傅里叶反变换来重建,而不会丢失任何信息。而正是所谓的“傅里叶变换”使得我们可以工作于频率域。

    一维连续函数的fourier变换

    这里写图片描述 
    其中,f(x)表示原函数,F(u)表示变换之后的函数。u为频率域变量。这里写图片描述

    一维连续函数的fourier反变换 
    这里写图片描述 
    这里写图片描述

    。。。公式编辑有点小麻烦,暂时先用截图吧。请允许我小小的偷懒。。。

    注意前面讲过任何周期函数都可以被写成若干个正弦波(余弦波)的叠加。为了便于理解,在网上找了几张图片。 
    这里写图片描述 
    第一幅图是一个郁闷的余弦波cos(x) 
    第二幅图是2个卖萌的余弦波的叠加cos(x)+a.cos(3x) 
    第三幅图是4个“可爱”的余弦波的叠加 
    第四幅图是10个“难受”的余弦波的叠加 
    随着余弦波数量逐渐的增长,最终叠加成一个标准的矩形,大家从中体会到了什么?

    这里写图片描述 
    这里写图片描述 
    f为原图像, 傅里叶变换函数。傅里叶变换将函数的时域(红色)与频域(蓝色)相关联。频谱中的不同成分。频率在频域中以峰值形式表示。 
    //这里原图是一幅动态图,想看效果的朋友,请自行google傅立叶变换,weki上有动态图。

    二维离散傅立叶变换

    图像尺寸为M*N的函数f(x,y)DFT为

    这里写图片描述 
    其中,u=0,1,2,…,M-1;v=0,1,2,…,N-1 
    给出F(u,v)由反DFT反变换可得到f(x,y)

    这里写图片描述

    傅立叶变换的基本概念:

    1.频谱

    这里写图片描述 
    2.相位角

    这里写图片描述

    傅立叶变换的性质:

    1. 共轭对称性

      如果f(x,y)是实函数,则它的傅里叶变换具有 共轭对称性

    这里写图片描述 
    2 . 周期性

    这里写图片描述

    复习:当两个复数实部相等,虚部互为相反数时,这两个复数叫做互为共轭复数.

    周期性和共轭对称性 
    对于一维变换F(u),周期性是指F(u)的周期长度为M,对称性是指频谱关于原点对称

    这里写图片描述 
    通过将原点的变换值移动到频率矩形的中心位置,可简化频谱的 
    视觉分析。这可以通过在计算一维傅立叶变换之前将f(x)乘以 (-1)^x 来完成。

    周期性和共轭对称性举例 
    这里写图片描述 
    通过将原点的变换值移动到频率矩形的中心位置,可简化频谱的视觉分析。这可以通过在计算二维傅立叶变换之前将f(x,y)乘以这里写图片描述![这里写图片描述来完成。 
    3. 平均值

    由二维傅里叶变换的定义

    这里写图片描述 
    所以在原点的傅立叶变换等于图像f(x,y)的平均灰度级 
    4. 卷积定理

    空间域和频率域的基础都是卷积定理

    大小为M×N的两个函数f(x,y)和h(x,y)的离散卷积

    这里写图片描述 
    卷积定理

    这里写图片描述 
    说明 第一个表达式表明: 
    两个空间函数的卷积可以通过计算两个傅立叶变换函数的乘积的逆变换得到。 
    相反,两个空间函数卷积的傅立叶变换恰好等于两个函数的傅立叶变换的乘积

    频率域滤波

    低通滤波器:使低频通过而使高频衰减的滤波器 
    1.被低通滤波的图像比原始图像少尖锐的细节部分而突出平滑过渡部分 
    2.对比空间域滤波的平滑处理,如均值滤波器

    高通滤波器:使高频通过而使低频衰减的滤波器 
    1.被高通滤波的图像比原始图像少灰度级的平滑过渡而突出边缘等细节部分 
    2.对比空间域的梯度算子、拉普拉斯算子

    低通滤波器

    这里写图片描述 
    原图像的频谱 
    这里写图片描述 
    低通滤波器示意图 
    这里写图片描述 
    滤波效果 
    这里写图片描述

    说明:这里的低通滤波,意思就是把频率低的波留下,把频率高的波过滤掉。示意图是经过居中处理的频谱,就是从频谱的中心到四周频率由低到高。示意图表示的是,留下中间低频的,过滤点中心周围高频的部分。我们知道,低频对应的图像中变化不明显的部分,于是,图像就变的非常模糊。这在图像处理中也叫平滑滤波。再介绍一个概念:图像的锐化。就是与平滑化相对,即下面高通滤波器所达到的效果。很明显,图像边缘增强了。

    高通滤波

    原图 
    这里写图片描述 
    原图的频谱 
    这里写图片描述 
    高通滤波器示意图 
    这里写图片描述 
    效果图 
    这里写图片描述 

    展开全文
  • 给四轴调了好久的PID,总算是调好了,现分享PID参数整的心得给大家,还请大家喷的时候手下留情。  首先说明一下,这篇文章的主旨并不是直接教你怎么调,而是告诉你这么调有什么道理,还要告诉大家为什么‘只’...

    给四轴调了好久的PID,总算是调好了,现分享PID参数整定的心得给大家,还请大家喷的时候手下留情。

          首先说明一下,这篇文章的主旨并不是直接教你怎么调,而是告诉你这么调有什么道理,还要告诉大家为什么‘只’使用PID的四轴会在飞行中震荡,告诉大家为什么光使用PID并不能实现对四轴姿态‘足够好’的控制。文章中还是涉及了不少自控原理和其他控制相关的姿势,没有一点底子的话确实会看着很困惑(不然那么些人花好几年学控制还有什么意义?)。如果你只想知道结论的话,直接看文章开头和结尾部分就好了(作者也支持大家这么做,这样被喷的几率就小了=_=)。

          本人是刚刚转行学控制,思考错误的地方还请各位大神批评指正。

          Ps:用wps画系统框图太费劲了,于是就一个豆没有画……,大家不会怪罪我吧?

    PID控制器是什么?

          我想每一个看到这里的人都对PID的概念有了足够的了解,我一遍遍叽歪比例积分微分没有任何意义。这里我只想说一些大家提的较少的‘重点’内容:

          PID控制器是一个线性的控制器!从这里开始我们进入正题了,虽然若干年来PID已然成为了世界上使用最普遍的控制方法,也逐渐被人们神话到几乎可以控制一切………………但是,从理论上来说,只有‘线性的,符合要求的’被控系统才能在PID控制下实现良好的控制效果。

          所以说,我们首先第一步,要保证我们的被控系统在被PID控制的区域‘表现为’一个线性系统才行。于是这里有人会说了,现实中没有哪个系统是线性的,自然,我们的四轴飞行器在大范围内是一个非常典型的非线性系统(随便按照理论推推模型就会出现漫天的三角函数),也就是说,我们‘仅’使用标准PID控制的话是不可能让四轴从各个姿态回到目标状态的过程都能保持稳定。于是这里出现我们使用PID时要注意的第一个问题:

          我们的PID控制只能工作在四轴角度偏移不大的一个近似线性的区域内。这个区域没有定论,不过你要是飞机偏了90°的话想用PID调回到水平状态指定是非常危险的事情。PID的模型相关问题非常重要也比较费口舌,我们等下认真讨论,现在要先说另一个非常重要的非线性问题:

          要保证我的控制通道与电机的输出力矩是线性的。如果我们的控制通道与电机输出力矩都不是线性的的话,我们的PID控制就很难起作用了,节省时间不举例子了,不明白的自行补脑吧,于是我这里要提醒大家的事情是:我们的航模电调调整的都是力矩而不是转速(虽然它叫做电子调速器),这是我们的福音,因为大家知道,螺旋桨产生的升力与转速的平方成正比,而角加速度与力矩成正比,正是因为我们的电调让电机产生的升力与我们输出的油门量成正比了我们才能使用PID控制器对四轴的姿态进行控制。这里可以看下我的四轴使用的四合一电调输出的升力与油门的对应曲线:

          图中横坐标是输出油门的百分比,纵坐标是四个电机产生的总拉力(单位暂定kg),可以看到,具有非常好的线性关系,所以我们可以使用PID对大四轴实现比较好的控制。于是我们首先发现了第一个问题,有人反映小四轴不好调参数,因为小四轴没有专用的电子调速器,所以油门与输出力矩并不是严格线性的(这里我没有实践过,请大家随意批评指正),这时使用PID控制性能就会明显下降,当你的电机输出力矩与你的控制信号不是线性关系的时候,请先使用软件补偿的方法对油门做一下分段的线性仿射变化,再设计PID控制器。

          不过对于大四轴而言貌似就不用那么麻烦了,那我们直接进入PID的控制模型环节。

    PID控制器的数学模型

          在标准的控制类书籍上PID算法是这么定义的:

          这个公式是连续系统用的,我们单片机的控制是用不了的,我们的单片机使用的是离散的控制模型也叫0阶保持器的离散系统,就是需要把上面的公式离散化,而这个离散化的过程我们使用的是后项差分法。首先把上面的积分传递函数转化为连续的s域模型:

          使用后向差分法可以得到s域到z域的映射关系:

          于是可以得到:

          这里特地给出了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轴模型拿出来当做例子来讲了:

          画出来的系统阶跃响应是这个样子的:

          检验系统建模的相似程度就靠这个了,给我的飞机一个阶跃信号反映出来的情况和这个确实差不多。关键是下面,它的零极点分布情况:

          可以看到辨识出来的结果又两个很靠近不稳定边界的主导极点(气泡框那里)表现明显的零点又和这几个极点8杆子打不着,如果我们消灭那两个主导极点,我们的四轴理论上就可以控制的非常完美了,众所周知,主导极点越靠近0则系统稳定性越好,那么按照极点配置的方法(当然我这里指的还是开环的极点配置),那么我们接下来开始看用这种建模的方法怎么实现PID参数的配置:

    用极点配置PID实现对系统的控制

          那么按照上面的介绍我们来尝试消除这两个主导极点,前面说过,PID模型中两个对称零点的位置是可以任意调整的,不用计算,直接手试出如下的参数:

          那么得到的开环零极点图是这样的:

          那么闭环响应是这个样子的:

          看着很漂亮啊,我们加大Kp到4试试,其他参数都不变

           哟,完美嘛,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):

          可以看到,积分的效果明显减弱了,系统先在0.几秒的时候迅速的达到了稳态(0.3左右)然后在以后漫长的时间内在积分作用的影响下以指数逼近最终的稳态1,大家看着这个图应该很快就想到该怎么做了,就是增大Kp,让系统的‘第一个’稳态在1附件,那问题就解决了,不错,我们这里把Kp设为4(不设置为3是为了等下验证另一个东西):

          瞧,这个很丑的怪物出现了,比刚才好了不少,而且你最终得到的PID控制器输出效果会和这个差不了许多(之所以在视频上看不出来是因为人很少会从0----Pitch角0°突然给飞机一个1----Pitch角57°)另外要说的是为什么我用了4依然没有让它的第一步就稳定到1,这是因为闭环降低了系统总增益,但是这里给再高的增益会让系统不稳定,原因就在下面了:

          为了更直观的说明不稳定的原因,这里要用Bode图来看一下系统闭环的频域响应:

          可以看到在频域响应有个很尖的尖峰,这个尖峰就是我们说的PID在这种情况下没法达到优良控制性能的关键,你会发现,使用纯PID控制的飞控,都会在空中来回抖动,频率基本是固定的,就是这个尖峰的缘故,尤其当Pitch轴和Roll轴使用同样的控制参数的时候,抖动会叠加,你经常会看到视频里用纯PID控制的四轴在两个控制轴交界的方向上抖啊抖抖啊抖抖啊抖抖啊抖…………于是这里就是我们需要用实验来权衡的地方,这个尖峰通过减小Kp的值可以得到一定的抑制,也可以让零点向左少许移动,二者都会延长到达稳态的时间,比较明智的做法是保证有足够的响应速度的前提下适当减小增益,毕竟在PID没法很好的完成控制任务的情况下,人的操作就显得非常重要了。这里给出我使用的一组PID参数:

          也就是说,我提出的整定方法,在可以建模的情况下:

    ①建立被控系统的模型

    ②根据上述的原则确定PID的开环0点应该出现的区域(就是在那个连线上)

    ③给一个开环情况下稳态误差较小的Kp

    ④看着阶跃响应微调Ti和Td使得在保证Td足够大的情况下超调量较小且积分效果打到稳态的时间又足够的长(2~3s以上依据个人口味)

    ⑤最后看着Bode图适当减小增益Kp

    ⑥回头再检查下阶跃响应是否满足心意就完事儿了………………

          看到这儿,不知道有多少人会和我一样苦苦的一笑(这TM繁琐的步骤有意思吗?),这么做确实是一件非常不值得的事情,只是如我这般不服气的孩子凭着一股刨根问底的冲劲花了2个月用自己的方式来调PID的真实记录而已,好了,现在再来介绍不建模的情况下怎么通过试验整定四轴的PID参数…………

          其实试验方法整定PID参数使用的依然是Ziegler-Nichols整定法则,不过这次使用的是第二法则,而且做完以后要按照我接下来给的步骤微调

          鉴于该整定法则在阿莫上没有人提过(至少我没有找到),这里先贴上完整的Ziegler-Nichols整定第二法则:

          首先,该法则使用Ti Td的参数形式(现在更理解为什么要用Ti Td参数格式了吧?)先仅使用Kp进行控制(取Ti为无穷大,比如32767,取Td为0,等价于Ki=0 Kd=0)从0开始慢慢增大Kp直到第一次出现临界稳定的情况记录下当前的Kp值计作Kc……

          这里暂停一下,注意这里的临界稳定的含义,调参时请用一根圆杆子横穿四轴的重心,这个时候四轴会在杆子上等幅摆动,这个时候可不是临界稳定啊!四轴风扇油门推到很大的时候气流是会给一定旋转的阻力的,如果你Kp调到没过5它就等幅震荡了那绝对是不对的,要把油门推到飞机平时刚好起飞的位置(既杆子与飞机接触面基本不受力)。另外就是等幅震荡并不是说你把它放在那儿它慢慢岳震越大了,而是你给个阶跃响应它按照那个幅度等幅震荡,比如你用手轻轻拨了一下,它就在那个范围等幅震荡了。这个点很精确,多一小点就发散,少一小点就能慢慢停下来,比如我的四轴测完是11.6

          …………继续,则这时你需要测量它震荡一个周期的时间(单位为s)计做Pc,那我们就可以得到用Ziegler-Nichols整定第二法则得到的PID参数:

    Kp = 0.6Kc

    Ti = 0.5Pc

    Td = 0.125Pc

          我们看下这个参数的阶跃响应和开环零极点:

          你会发现它只有一个零点,其实这并不是一个零点,而是两个零点重合了,但是你把这个参数烧到四轴上以后出现的情况和我前面的极点配置方法得到的情况非常相像,因为它的微分系数太小了,抵抗扰动的能力很弱,这里要说明为什么他要用一个重合的零点,大家在做控制的时候很少遇到这种震荡特性很强的系统,大家遇到的基本都是一阶的系统(阶跃函数表现为单调增到达稳态),这时候用这种无虚部的零点可以让超调量最小。

          那么,也许有很多人跟我一样,刚开始调PID的时候两次调到这里,一次是应为震荡点没选对,Kc小了太多导致控制完全不起作用于是放弃了。第二次调对了Kc但是发现稳态效果很差,在Ki Kd的参数下折腾了好久越调越烂最终把这个方法放弃了。我估计到现在坛子里没见到这个整定方法很有可能就是这个原因吧。

          那么好了,我这里要告诉你到了这一步该怎么继续调,不要动Kp和Ti,增大Td直到你觉得快速用手转动你的四轴的时候有了足够的阻力(注意是快速转动的过程中,而不是你压着它不动的时候的阻力),这时候你的四轴应该就已经调好了,想进一步微调就是你自己的事情了,让我们来看下这个时候系统是什么样子的,我们仅给这时的Td参数加上0.5(取个比较整的数而已,要是取1就更明显了)

          有没有发现和我前面得到的参数非常接近?看着这个图,结合前面我提到的内容,又有什么感悟呢?

          维基百科上有个词条《齐格勒-尼科尔斯方法》,里面用的是Ki Kd的参数形式,需要用我前面提到的Ki Kd和Ti Td的转换关系转换一下。

    总结:PID该怎么调,我们该注意什么

    ①先要保证电机的输出是线性的,微型四轴等没有电调的最好先对电机的油门行程和供电电压进行矫正,保证对电机的控制输入和电机输出的力矩程线性关系。

    ②严格注意自己控制程序中的每一步是否有线程安全的问题,不要让四轴的一次控制运算中使用了不是同一时间的状态测量值。

    ③用陀螺作为微分项能减少姿态解算误差带来的干扰,但要小心有可能会破坏了PID的控制模型导致控制效果变坏。

    ④作者强烈建议你使用Kp Ti Td的PID参数形式。

    ⑤记住Kp Ti Td参数变化对系统产生的影响是什么样的。

    ⑥注意调参的时候你是怎么固定你的四轴的。

    ⑦选择我上面提到的我的两种调参方法的一种整定参数。

    ⑧不要相信仅用PID能调出完美的四轴控制器,PID仅仅能让你的四轴飞起来而已,更不要相信增量式PID能在四轴的姿态控制中有所作为,牛逼的开源不开源四轴都不仅仅使用了PID控制器。

    ⑨不要手贱报控制专业

    这里附上MATLAB的仿真代码

    [plain] view plaincopy

    1. %% lynx的四轴飞行器PID调试模型  
    2. clc,clear  
    3. %被控线性模型  
    4. TfPitchNum = [-0.00004584 0.0001312 0.0009171 0.000228];  
    5. TfPitchDen = [1 -2.514 2.087 -0.5657];  
    6. sysPitch = tf(TfPitchNum,TfPitchDen,0.04);  %重新构造无噪声输入的模型  
    7. %ltiview(sysPitch)  
    8. sysPitchZpk = zpk(sysPitch);  
    9. %使用标准PID参数的柿子,这个是一个可用的参数  
    10. Kp = 6.5;   
    11. Ti = 0.8;    
    12. Td = 1.1;   
    13. % %临界稳定增益  
    14. % Kp = 11.6;   
    15. % Ti = 1000;   
    16. % Td = 0;   
    17. % %齐格勒-尼克尔思整定方法  
    18. % Kp = 11.6*0.6;   
    19. % Ti = 0.5*1.1;   
    20. % Td = 0.125*1.1+0.5;   
    21. Ts = 0.04  
    22. Ki = Kp*Ts/Ti; %0.3  
    23. Kd = Kp*Td/Ts; %17  
    24. p2 = Kd;  
    25. p1 = -Kp-2*p2;  
    26. p0 = Kp+Ki+p2;  
    27. ControlSys1Num = [p0 p1 p2];  
    28. ControlSys1Den = [1 -1 0];  
    29. ControlSys1 = tf(ControlSys1Num,ControlSys1Den,0.04);  
    30. SysOpen = series(ControlSys1,sysPitchZpk);  
    31. SysSum = feedback(SysOpen,1)  
    32. ltiview(SysSum)  
    33. ltiview(SysOpen)  
    34. %ltiview(ControlSys1)  
    35. tf(ControlSys1) 
    展开全文
  • 目录 PID控制器是什么 ...给四轴调了好久的PID,总算是调好了,现分享PID参数整的心得给大家,还请大家喷的时候手下留情。  首先说明一下,这篇文章的主旨并不是直接教你怎么调,而是告

    目录

    • PID控制器是什么
    • PID控制器的数学模型
    • 从系统的零极点图理解PID控制的原理
    • 被控系统的小范围线性化模型
    • 用极点配置PID实现对系统的控制
    • 总结:PID该怎么调,我们该注意什么

    给四轴调了好久的PID,总算是调好了,现分享PID参数整定的心得给大家,还请大家喷的时候手下留情。

          首先说明一下,这篇文章的主旨并不是直接教你怎么调,而是告诉你这么调有什么道理,还要告诉大家为什么使用PID的四轴会在飞行中震荡,告诉大家为什么光使用PID并不能实现对四轴姿态足够好的控制。文章中还是涉及了不少自控原理和其他控制相关的知识,没有一点底子的话确实会看着很困惑(不然那么些人花好几年学控制还有什么意义?)。如果你只想知道结论的话,直接看文章开头和结尾部分就好了(作者也支持大家这么做,这样被喷的几率就小了=_=)。

          本人是刚刚转行学控制,思考错误的地方还请各位大神批评指正。

          Ps:用wps画系统框图太费劲了,于是就一个都没有画……,大家不会怪罪我吧?


    PID控制器是什么?

          我想每一个看到这里的人都对PID的概念有了足够的了解,我一遍遍叽歪比例积分微分没有任何意义。这里我只想说一些大家提的较少的重点内容:

          PID控制器是一个线性的控制器!从这里开始我们进入正题了,虽然若干年来PID已然成为了世界上使用最普遍的控制方法,也逐渐被人们神话到几乎可以控制一切…………但是,从理论上来说,只有线性的,符合要求的被控系统才能在PID控制下实现良好的控制效果。

          所以说,我们首先第一步,要保证我们的被控系统在被PID控制的区域表现为一个线性系统才行。于是这里有人会说了,现实中没有哪个系统是线性的,自然,我们的四轴飞行器在大范围内是一个非常典型的非线性系统(随便按照理论推推模型就会出现漫天的三角函数),也就是说,我们使用标准PID控制的话,是不可能让四轴从各个姿态回到目标状态的过程都能保持稳定。于是这里出现我们使用PID时要注意的第一个问题:

          我们的PID控制只能工作在四轴角度偏移不大的一个近似线性的区域内。这个区域没有定论,不过你要是飞机偏了90°的话想用PID调回到水平状态,肯定是非常危险的事情。PID的模型相关问题非常重要,也比较费口舌,我们等下认真讨论,现在要先说另一个非常重要的非线性问题:

          要保证我的控制通道与电机的输出力矩是线性的。如果我们的控制通道与电机输出力矩都不是线性的的话,我们的PID控制就很难起作用了,节省时间不举例子了,不明白的自行补脑吧。于是我这里要提醒大家的事情是:我们的航模电调调整的都是力矩而不是转速(虽然它叫做电子调速器),这是我们的福音,因为大家知道,螺旋桨产生的升力与转速的平方成正比,而角加速度与力矩成正比,正是因为我们的电调让电机产生的升力与我们输出的油门量成正比了,我们才能使用PID控制器对四轴的姿态进行控制。这里可以看下我的四轴使用的四合一电调输出的升力与油门的对应曲线:

    电调输出的升力与油门的对应曲线 

          图中横坐标是输出油门的百分比,纵坐标是四个电机产生的总拉力(单位暂定kg),可以看到,具有非常好的线性关系,所以我们可以使用PID对大四轴实现比较好的控制。于是我们首先发现了第一个问题,有人反映小四轴不好调参数,因为小四轴没有专用的电子调速器,所以油门与输出力矩并不是严格线性的,有刷电机更是如此(这里我没有实践过,请大家随意批评指正),这时使用PID控制性能就会明显下降,当你的电机输出力矩与你的控制信号不是线性关系的时候,请先使用软件补偿的方法对油门做一下分段的线性仿射变化,再设计PID控制器。

          不过对于大四轴而言,貌似就不用那么麻烦了,那我们直接进入PID的控制模型环节。


    PID控制器的数学模型

          在标准的控制类书籍上PID算法是这么定义的:

    PID标准控制模型 
          这个公式是连续系统用的,我们单片机的控制是用不了的,我们的单片机使用的是离散的控制模型也叫 0 阶保持器的离散系统,就是需要把上面的公式离散化,而这个离散化的过程我们使用的是后项差分法。首先把上面的积分传递函数转化为连续的 s 域模型:
    离散PID控制模型 
          使用后向差分法可以得到 s 域到 z 域的映射关系:
    s域到z域的关系 
          于是可以得到:
    结论 

          这里特地给出了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控制器开环部分数学模型 

          上图是PID控制器开环部分(就是上面推导的数学模型)常见的零极点分布情况,有两个固定在(0,0)和(1,0)位置的极点,两个对称分布的零点(手调参数时很难出现两个零点都在实轴上的情况而且我们也不希望那样),这两个零点的位置是可调的,微分时间常数Td主管零点位置的左右移(注意是‘主管’,也就是说对虚轴的位置还是有影响的),常数越大越靠右(也就是说临界稳定极点的影响越弱,抗噪声性能越好但到达0误差的稳态也就越困难,因为这个临界稳定的极点是在闭环系统中让系统到达稳态0误差的关键,但很影响稳定性),积分常数Ti越大零点越靠近实轴,Ti在实际控制中的作用不好说明,留在后面再说,但是到这里大家也就看出,我为什么要使用标准的Kp、Ti、Td参数而不是Kp、Ki、Kd参数了,因为使用这种参数时Kp对开环系统的稳定性(注意仅指开环系统)没有影响,我们就可以降低系统对这个参数的敏感性,而主要考虑另外两个参数就好。大家在手调参数的看到的图形和这个都应该没有多少区别

          接下来我们看一下我们被控系统的数学模型:


    被控系统的小范围线性化模型

          正如我前面所述,想要分析PID的控制性能,必须得得到被控系统的线性近似模型(非线性系统下的分析工具没一个正经能用的),这里大家可以通过动力学建模,得到系统的非线性模型(像几乎所有的硕士、博士论文那样)再泰勒展开,但是这样做往往得到的模型跟实际情况差异太大,以至于没有参考价值,这里我推荐使用系统辨识的方法来得到系统的线性模型,因为这么做如果能做到正确的辨识的话,还能得到系统的误差模型,于是现在在控制界很流行,只是实际用的时候就发现难度颇高,尽管有许多现成的工具,但是依然特别难掌握,也难怪很多热会把这个当做是看家本领,作者在这方面也算是连皮毛都没摸全,不敢乱讲,这里就为了解释PID方便,直接把我的大四轴辨识出来的Pitch轴模型拿出来当做例子来讲了:

    Pitch轴模型 
         画出来的系统阶跃响应是这个样子的:
    阶跃响应 
          检验系统建模的相似程度就靠这个了,给我的飞机一个阶跃信号反映出来的情况和这个确实差不多。关键是下面,它的零极点分布情况:
    零极点分布 
          可以看到辨识出来的结果又两个很靠近不稳定边界的主导极点(气泡框那里)表现明显的零点又和这几个极点8 杆子打不着 ,如果我们消灭那两个主导极点,我们的四轴理论上就可以控制的非常完美了,众所周知,主导极点越靠近0 则系统稳定性越好,那么按照极点配置的方法(当然我这里指的还是开环的极点配置),那么我们接下来开始看用这种建模的方法怎么实现 PID 参数的配置:

    用极点配置PID实现对系统的控制

          那么按照上面的介绍我们来尝试消除这两个主导极点,前面说过,PID模型中两个对称零点的位置是可以任意调整的,不用计算,直接手试出如下的参数:

    Kp=1;
    Ti=0.12;
    Td=0.7;
         那么得到的开环零极点图是这样的:
    开环零极点 
          那么闭环响应是这个样子的:
    闭环响应01 
          看着很漂亮啊,我们加大Kp 4 试试,其他参数都不变
    闭环响应02 
           哟,完美嘛, 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并不敏感,那么我们是不是可以利用这点来优化我们的控制器设计呢?答案是肯定的。我们先来看下按照上面的‘向右看齐’参数调整方法会发生什么:

          我们随便选一个在连线上的点作为参数查看它的开环零极点和闭环阶跃响应(这里Kp1):

    Kp=1;
    Ti=1;
    Td=2;
    20130506124735562.png 
    20130506124750343.png 
         可以看到,积分的效果明显减弱了,系统先在0. 几秒的时候迅速的达到了稳态( 0.3 左右)然后在以后漫长的时间内在积分作用的影响下以指数逼近最终的稳态 1 ,大家看着这个图应该很快就想到该怎么做了,就是增大 Kp ,让系统的‘第一个’稳态在 1 附件,那问题就解决了,不错,我们这里把 Kp 设为 4 (不设置为 3 是为了等下验证另一个东西):
    Kp=4;
    Ti=1;
    Td=2;
    20130506124948183.png 

          瞧,这个很丑的怪物出现了,比刚才好了不少,而且你最终得到的PID控制器输出效果会和这个差不了许多(之所以在视频上看不出来是因为人很少会从0----Pitch角0°突然给飞机一个1----Pitch角57°)另外要说的是为什么我用了4依然没有让它的第一步就稳定到1,这是因为闭环降低了系统总增益,但是这里给再高的增益会让系统不稳定,原因就在下面了:

          为了更直观的说明不稳定的原因,这里要用Bode图来看一下系统闭环的频域响应:

    Bode.png 
          可以看到在频域响应有个很尖的尖峰,这个尖峰就是我们说的PID 在这种情况下没法达到优良控制性能的关键,你会发现,使用纯 PID 控制的飞控,都会在空中来回抖动,频率基本是固定的,就是这个尖峰的缘故,尤其当 Pitch 轴和 Roll 轴使用同样的控制参数的时候,抖动会叠加,你经常会看到视频里用纯 PID 控制的四轴在两个控制轴交界的方向上抖啊抖抖啊抖抖啊抖抖啊抖…………于是这里就是我们需要用实验来权衡的地方,这个尖峰通过减小 Kp 的值可以得到一定的抑制,也可以让零点向左少许移动,二者都会延长到达稳态的时间,比较明智的做法是保证有足够的响应速度的前提下适当减小增益,毕竟在 PID 没法很好的完成控制任务的情况下,人的操作就显得非常重要了。这里给出我使用的一组 PID 参数:
    Kp=5.5
    Ti=0.8
    Td=1.1
    20130506125210616.png 
    20130506125233787.png 
    bode02.png 

          也就是说,我提出的整定方法,在可以建模的情况下:

    ①建立被控系统的模型

    ②根据上述的原则确定PID的开环0点应该出现的区域(就是在那个连线上)

    ③给一个开环情况下稳态误差较小的Kp

    ④看着阶跃响应微调Ti和Td使得在保证Td足够大的情况下超调量较小且积分效果打到稳态的时间又足够的长(2~3s以上依据个人口味)

    ⑤最后看着Bode图适当减小增益Kp

    ⑥回头再检查下阶跃响应是否满足心意就完事儿了………………

          看到这儿,不知道有多少人会和我一样苦苦的一笑(这TM繁琐的步骤有意思吗?),这么做确实是一件非常不值得的事情,只是如我这般不服气的孩子凭着一股刨根问底的冲劲花了2个月用自己的方式来调PID的真实记录而已,好了,现在再来介绍不建模的情况下怎么通过试验整定四轴的PID参数…………

          其实试验方法整定PID参数使用的依然是Ziegler-Nichols整定法则,不过这次使用的是第二法则,而且做完以后要按照我接下来给的步骤微调

          鉴于该整定法则在阿莫上没有人提过(至少我没有找到),这里先贴上完整的Ziegler-Nichols整定第二法则:

          首先,该法则使用Ti Td的参数形式(现在更理解为什么要用Ti Td参数格式了吧?)先仅使用Kp进行控制(取Ti为无穷大,比如32767,取Td为0,等价于Ki=0 Kd=0)从0开始慢慢增大Kp直到第一次出现临界稳定的情况记录下当前的Kp值计作Kc……

          这里暂停一下,注意这里的临界稳定的含义,调参时请用一根圆杆子横穿四轴的重心,这个时候四轴会在杆子上等幅摆动,这个时候可不是临界稳定啊!四轴风扇油门推到很大的时候气流是会给一定旋转的阻力的,如果你Kp调到没过5它就等幅震荡了那绝对是不对的,要把油门推到飞机平时刚好起飞的位置(既杆子与飞机接触面基本不受力)。另外就是等幅震荡并不是说你把它放在那儿它慢慢岳震越大了,而是你给个阶跃响应它按照那个幅度等幅震荡,比如你用手轻轻拨了一下,它就在那个范围等幅震荡了。这个点很精确,多一小点就发散,少一小点就能慢慢停下来,比如我的四轴测完是11.6

    20130506125339769.png 
    20130506125402253.png 

    …………继续,则这时你需要测量它震荡一个周期的时间(单位为s)计做Pc,那我们就可以得到用Ziegler-Nichols整定第二法则得到的PID参数:

    Kp = 0.6Kc

    Ti = 0.5Pc

    Td = 0.125Pc

          我们看下这个参数的阶跃响应和开环零极点:

    Kp=11.6×0.6;
    Ti=0.5×1.1;
    Td=0.125×1.1;
    20130506125536297.png 
    20130506125602655.png 

          你会发现它只有一个零点,其实这并不是一个零点,而是两个零点重合了,但是你把这个参数烧到四轴上以后出现的情况和我前面的极点配置方法得到的情况非常相像,因为它的微分系数太小了,抵抗扰动的能力很弱,这里要说明为什么他要用一个重合的零点,大家在做控制的时候很少遇到这种震荡特性很强的系统,大家遇到的基本都是一阶的系统(阶跃函数表现为单调增到达稳态),这时候用这种无虚部的零点可以让超调量最小。

          那么,也许有很多人跟我一样,刚开始调PID的时候两次调到这里,一次是应为震荡点没选对,Kc小了太多导致控制完全不起作用于是放弃了。第二次调对了Kc但是发现稳态效果很差,在Ki、Kd的参数下折腾了好久越调越烂最终把这个方法放弃了。我估计到现在坛子里没见到这个整定方法很有可能就是这个原因吧。

          那么好了,我这里要告诉你到了这一步该怎么继续调,不要动Kp和Ti,增大Td直到你觉得快速用手转动你的四轴的时候有了足够的阻力(注意是快速转动的过程中,而不是你压着它不动的时候的阻力),这时候你的四轴应该就已经调好了,想进一步微调就是你自己的事情了,让我们来看下这个时候系统是什么样子的,我们仅给这时的Td参数加上0.5(取个比较整的数而已,要是取1就更明显了)

    20130506125627530.png 
    20130506125645310.png 

          有没有发现和我前面得到的参数非常接近?看着这个图,结合前面我提到的内容,又有什么感悟呢?

          维基百科上有个词条《齐格勒-尼科尔斯方法》,里面用的是Ki Kd的参数形式,需要用我前面提到的Ki Kd和Ti Td的转换关系转换一下。

    总结:PID该怎么调,我们该注意什么

    ①先要保证电机的输出是线性的,微型四轴等没有电调的最好先对电机的油门行程和供电电压进行矫正,保证对电机的控制输入和电机输出的力矩程线性关系。

    ②严格注意自己控制程序中的每一步是否有线程安全的问题,不要让四轴的一次控制运算中使用了不是同一时间的状态测量值。

    ③用陀螺作为微分项能减少姿态解算误差带来的干扰,但要小心有可能会破坏了PID的控制模型导致控制效果变坏。

    ④作者强烈建议你使用Kp Ti Td的PID参数形式。

    ⑤记住Kp Ti Td参数变化对系统产生的影响是什么样的。

    ⑥注意调参的时候你是怎么固定你的四轴的。

    ⑦选择我上面提到的我的两种调参方法的一种整定参数。

    ⑧不要相信仅用PID能调出完美的四轴控制器,PID仅仅能让你的四轴飞起来而已,更不要相信增量式PID能在四轴的姿态控制中有所作为,牛逼的开源不开源四轴都不仅仅使用了PID控制器。

    ⑨不要手贱报控制专业


    这里附上MATLAB的仿真代码
    1. %% lynx的四轴飞行器PID调试模型
    2. clc,clear

    3. %被控线性模型
    4. TfPitchNum = [-0.00004584 0.0001312 0.0009171 0.000228];
    5. TfPitchDen = [1 -2.514 2.087 -0.5657];

    6. sysPitch = tf(TfPitchNum,TfPitchDen,0.04);  %重新构造无噪声输入的模型
    7. %ltiview(sysPitch)
    8. sysPitchZpk = zpk(sysPitch);

    9. %使用标准PID参数的柿子,这个是一个可用的参数
    10. Kp = 6.5; 
    11. Ti = 0.8;  
    12. Td = 1.1; 
    13. % %临界稳定增益
    14. % Kp = 11.6; 
    15. % Ti = 1000; 
    16. % Td = 0; 
    17. % %齐格勒-尼克尔思整定方法
    18. % Kp = 11.6*0.6; 
    19. % Ti = 0.5*1.1; 
    20. % Td = 0.125*1.1+0.5; 

    21. Ts = 0.04

    22. Ki = Kp*Ts/Ti; %0.3
    23. Kd = Kp*Td/Ts; %17
    24. p2 = Kd;
    25. p1 = -Kp-2*p2;
    26. p0 = Kp+Ki+p2;
    27. ControlSys1Num = [p0 p1 p2];
    28. ControlSys1Den = [1 -1 0];
    29. ControlSys1 = tf(ControlSys1Num,ControlSys1Den,0.04);

    30. SysOpen = series(ControlSys1,sysPitchZpk);

    31. SysSum = feedback(SysOpen,1)
    32. ltiview(SysSum)
    33. ltiview(SysOpen)
    34. %ltiview(ControlSys1)
    35. tf(ControlSys1)
    复制代码
    原著参考链接:http://blog.csdn.net/lynx2/article/details/8888063
    展开全文
  • 我的四轴专用PID参数整方法及原理---超长文慎入

    万次阅读 多人点赞 2013-05-05 21:44:35
    给四轴调了好久的PID,总算是调好了,现分享PID参数整的心得给大家,还请大家喷的时候手下留情。  首先说明一下,这篇文章的主旨并不是直接教你怎么调,而是告诉你这么调有什么道理,还要告诉大家为什么‘只’...
  • 在Oracle Forms客户化开发中,如果遇到有在Form上提供关键弹性(以下简称“键弹性”)功能支持的时候,我们可以利用FND_KEY_FLEX.DEFINE函数来轻松完成所有的初始化工作。其中也包括键弹性的组合描述字段的...
  • 给四轴调了好久的PID,总算是调好了,现分享PID参数整的心得给大家,还请大家喷的时候手下留情。  首先说明一下,这篇文章的主旨并不是直接教你怎么调,而是告诉你这么调有什么道理,还要告诉大家为什么‘只’...
  • 首先了解一下并发编程的一些内容...原子 可见: 有序: 开始介绍volatile关键字的作用: 但是!! volatile(应用场景)和synchronized关键字的区别:(volatile修饰变量,synchro...
  • 6.1 数据完整、安全、事务 6.1.1 事务及完整约束 事务定义: 由查询和更新语句的序列组成。SQL标准规定当一条SQL语句被执行,就隐式地开始了一个事务。 事务的性质: 原子 一致 隔离 持久 ...
  • session的根本原理及安全

    万次阅读 多人点赞 2014-05-25 09:47:07
    yunnysunny ... 当前文档  删除文档 导出 Markdown 导出 PDF ... 设置 下载离线客户端... session的安全对于vireio若干问题的解答直播登录验证文档关于淘宝同学接入的若干问题flashvar参数设置flashvar参数设置
  • 本书系统介绍了量子信息论的物理原理。全局内容包括量子测量问题,双态系统,量子纠缠与纠缠分析,bell型空间非定域性及分析,退相干分析,纯化与相干性恢复,不可克隆定理与量子zeno效应等等
  • 冲突与广播

    千次阅读 多人点赞 2019-06-11 08:51:01
    冲突是一种物理分段,指连接到同一导线上所有工作站的集合、同一物理网段上所有节点的集合或是以太网上竞争同一带宽节点的集合。冲突表示冲突发生并传播的区域,这个区域可以被认为是共享段。在OSI模型中,冲突...
  • 浅析C++类的作用

    千次阅读 2018-05-14 22:23:55
    明确一点,一个类就是一个独立的作用,这也是为什么在类外定义函数或静态变量需要加上类名和作用符号(类似void Complex::get() {})。如果不加,那么这个get函数默认就是定义在全局范围中,如果你在类中使用了get...
  • 频率图像增强

    千次阅读 2018-08-03 17:59:26
    1频率滤波与空间滤波殊途同归 空间图像增强与频率图像增强是两种截然不同的技术,实际上在相当程度上说它们是在不同的领域做相同的事情,是殊途同归的,,只是有些滤波更适合在空间完成,而有些则更适合...
  • 3、渗透详解

    千次阅读 2018-06-10 13:15:17
    在渗透测试过程中,我们经常会遇到以下场景:某处于中的服务器通过路由做端口映射,对外提供web服务,我们通过web脚本漏洞获得了该主机的system权限,如果甲方有进一步的内网渗透测试需求,以证明企业所面临的巨大...
  • 详解广播和冲突的区别

    千次阅读 多人点赞 2020-09-30 11:35:23
    1、广播可以跨网段,而冲突只是发生的同一个网段的。以太网中,冲突是由hub组织的。一个hub就是一个冲突。交换机的每个端口都是一个冲突。网段,又叫潜在冲突。 2、冲突在同一个冲突中的每一个节点...
  • 冲突和广播的区分

    万次阅读 多人点赞 2018-07-03 17:37:47
    一、概念理解:1、冲突(物理分段):连接在同一导线上的所有工作站的集合,或者说是同一物理网段上所有节点的集合或以太网上竞争同一带宽的节点集合。这个代表了冲突在其中发生并传播的区域,这个区域可以被...
  • 冲突广播

    千次阅读 2007-03-29 19:29:00
    网络互连设备可以将网络划分为不同的冲突、广播。但是,由于不同的网络互连设备可能工作在OSI模型的不同层次上。因此,它们划分冲突、广播的效果也就各不相同。如中继器工作在物理层,网桥和交换机工作在...
  • 哈希表原理

    千次阅读 2019-07-08 18:05:07
    哈希表是最常用的数据结构之一,对于其用法,大家都非常熟悉,这里详细探讨一下其原理。哈希表的底层实际上是基于数组来存储的,当插入键值对时,并不是直接插入该数组中,而是通过对键进行Hash运算得到Hash值,然后...
  • SIFT算法原理

    万次阅读 多人点赞 2019-03-16 21:33:58
    1、具有较好的稳定和不变,能够适应旋转、尺度缩放、亮度的变化,能在一定程度上不受视角变化、仿射变换、噪声的干扰。 2、区分好,能够在海量特征数据库中进行快速准确的区分信息进行匹配 3、多量,就算...
  • 编译原理学习基本概念汇总

    千次阅读 多人点赞 2015-07-22 14:04:10
    对于计算机专业的学生来说,肯定听说过或者上过一门课,叫做——编译原理,被称为计算机专业的天书,反正不管是学习这门课的时候,还是现在,我都是没搞懂其中的技术和知识。但就期末考试而言,提前做了几道题目,...
  • 空间图像增强

    万次阅读 2015-12-26 12:58:28
    空间图像增强   1.基本概念:   ...图像增强可分成两大类:频率法和空间法。...后者空间法中具有代表的算法有局部求平均值法和中值滤波(取局部邻域中的中间像素值)法等,它们可用于去除或
  • 分布式系统原理

    千次阅读 2017-01-20 16:00:16
    分布式系统原理 一、分布式系统基础重要要点:  对外提供无状态节点,内部实现具体有状态或者无状态节点逻辑,节点即可以是提供服务,也可以是存储数据。 拜占庭问题,在分布式系统中的使用,目的是保证服务...
  • volatile原理 使用条件

    千次阅读 2016-08-28 15:23:26
    有时仅仅为了读写一个或者两个实例就使用同步的话,显得开销过大,volatile关键字为实例的同步访问提供了免锁的机制。如果声明一个为volatile,那么编译器和虚拟机就知道该是可能被另一个线程并发更新的。再...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 127,860
精华内容 51,144
关键字:

定域性原理