PID算法从入门到放弃

PID 算法简介

  PID算法是一种控制算法,是 Proportional(比例)、Integral(积分)、Derivative(微分)的缩写。该控制算法广泛的应用于工业控制当中。应用场景:温度控制、流量控制、液位控制等。

PID算法历史简介

  PID控制算法是基于控制理论发展起来,控制理论的历史可以追溯到古代,如我国古代的指南车、地动仪、水位仪等,都是用到了控制理论。
  最早提出PID控制理念的是瑞典裔美国人奈奎斯特,他在一篇论文当中写到了采用图形的方法来判断系统的稳定性,在他的基础上,伯德等人建立了一整套在频域范围设计反馈放大器的方法,后被用于自动控制系统的分析和设计,
  直到1922年PID控制理论才首次由俄罗斯籍美国科学家尼古拉斯-米诺斯基使用在了船舶自动转向装置上的研究。
  在1936年后,PID开始广泛的用于工业控制,从洗澡水的控制到神七上天,从空调控温到导弹制导,从能源、化工到家电、环保、制造、加工、军事、航天等等,都有它的影子,都可以看到它在发挥作用。

什么是算法?

  算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制(摘自百度百科)
我以为算法简单来说就是解决一个问题所采用的方法。举例:

  • 百度地图搜索坐地铁去一个地方,这其实是一个图论中的最短路径问题。
  • 大象的重量
  • 地球的重量

PID原理

位式控制算法

工业上会有一些需求,比如将液体的温度加热控制在某个温度。传统的位式控制算法是这样做的。

PID算法从入门到放弃_第1张图片
特点:

  1. 位式控制算法的输出信号只有H L 两种状态。
  2. 算法输出信号out的依据是sv、pv,既用户设定值和传感器接受到的值的比较。当pv < sv 时 输出L ,当pv >= sv时输出H。
  3. 只考察控制对象当前的状态。
  • 开放回路控制系统
    开环控制(Open Loop Control System):不将控制的结果反馈回来影响当前控制的系统。
  • 闭环回路控制系统
    闭环控制(Closed Loop Control System):需要将控制的结果反馈回来与希望值比较,并根据它们的误差调整控制作用的系统。

PID控制算法

为了解决位式控制算法的问题,于是我们就是用了PID控制算法,PID控制算法的原理如下:
PID算法从入门到放弃_第2张图片
位式控制算法当中,我们知识考虑当前值与观测到的值的偏差。 而在PID算法中,又引入了历史偏差和最近偏差。将3个值共同相加作用于控制对象。这是一个比较综合的算法,能够有效的解决上面所说的问题。

PID算法的分析:

当前偏差

指的是传感器观测到的值,与用户设置的值之间的差。E = SV - PV 。这里要注意的是当前偏差是有正有负的。
E 有3种情况:
E > 0 , 表明还未达到用户设置的值
E = 0 , 正好达到
E < 0 , 超过了用户设置的值
我们用E乘以一个系数KP来作为输出值,Pout = E * KP。KP系数的作用就是增加或缩小当前偏差的比例。这种控制就称之为比例控制,也就是PID中的P控制。特点是偏差越大输出的功率就越大,偏差越小输出的功率就越小。

  • 缺点
    就是当E = 0 时,Pout = E * 0 ,输出功率就变成了0,系统也就不工作了,温度就会又降下来。 解决方法是增加一个常数项 Pout = E * KP + out0 , 保证当偏差为0的时候,还有一定的功率作用于控制对象。
    但偏差的问题还是存在,还是会产生震荡。

历史偏差

指的是从该系统启动开始,一直到此时此刻所产生的偏差之和。
历史偏差之和integral = E1 + E2 + … + Ek。 (k表示当前时刻)
历史偏差表示的是历史上达标与否的一个情况。integral也有3种情况:
integral > 0 ,累计的越大,表明长时间未达标。
integral = 0 , 非常理想的状态,几乎很少见。
integral < 0 ,表明长时间是超标的。
Iout = integral * KI 作为输出。KI就是积分系数 (类似于数学上的积分,累加求和)

  • 缺点
    单纯的积分控制,表明历史上的状态,而不考虑当前偏差的状态。这会导致当前实际情况其实未达标。所以要考虑历史和当前两方面的原因, 于是就将Pout + Iout 的和作为输出。

历史偏差还有一个作用就是纠正稳态误差。稳态误差是当系统状态稳定时,实际值与用户设定值之间的误差。

最近偏差

指的是最近两次采样值偏差的偏差,这里有点不太好理解。 比如上一时刻离目标值差了70,用Ek-1表示,当前时刻离目标值差了50,用Ek表示, 那么最近一次的偏差derivative = Ek - Ek-1 。套用刚才的值就是derivative = 50 - 70 = -20 。
这里其实表示的是变化的速度, 如果此刻离目标值差了10 ,那么derivative = 10 - 70 = -60 。 说明温度急剧上升。 起到防止过冲的作用。derivative也有3种情况,
derivative > 0,
derivative = 0,偏差趋势没有变化。也就是保持一个恒定的变化率。
derivative < 0,
这是一个有预见性的一个算法。会根据速度的变化而调整输出,当变化速度过就会抑制out。将derivative也乘以一个系数作为输出,
Dout = derivative * KD。 KD就叫做微分系数。(类似于数学上的求导数,表示此刻的变化率)。

PID算法的数学模型

再回看PID算法图,将三者相加作为输出。就是我们的PID算法,
out = E * KP + integral * KI + derivative * KD + out0
他的数学模型是:
PID算法从入门到放弃_第3张图片
定积分的几何意义是求面积,如不规则梯形的面积。这是一种近似的求解方法。
导数的意义是表明在某一点的变化率。如变速直线运动下某时刻的速度。温度变化的速度等。

这是一个连续量公式,计算机不能处理连续量,所以要将他它离散化。

  • 连续
    连续型随机变量是指如果随机变量X的所有可能取值不可以逐个列举出来,而是取数轴上某一区间内的任一点的随机变量。例如,一批电子元件的寿命、实际中常遇到的测量误差等都是连续型随机变量
  • 离散
    如果随机变量X只可能取有限个或至多可列个值,则称X为离散型随机变量。如硬币的两面,骰子,开关灯。

离散化后的公式为:
离散化后的PID数学模型
用程序表示就是上面所得到的公式
out = E * KP + integral * KI + derivative * KD + out0

积分中存在的两个问题

问题1

当误差值达到0时,也就是时间值达到了目标值时,这个时候积分值可能已经累积了足够大的值。 当我们不需要任何额外的power来保持位置,这种情况下积分所累积的power将会带来一些麻烦。比如如果是在一个平面上驾驶,当到达目标距离时,车辆的轮子还在继续动,那么这就是一个问题。
在这些情况下,一旦误差超过了设定值,我们就可以将积分重置为零,比如:

if (error = 0 or passes setpoint)
 	integral = 0;

注意:如果这个PID控制算法是对于需要一点power来保持位置的系统(例如:机械臂举起一个重物),你绝对不要这样尝试。当你的误差超过了设定值时,积分值将会逐渐的减小并且稳定下来。也就是会仍然保持一定的力,然后慢慢的稳定下来。
这种情况只适用于power保持传感器为0时的系统(例如:车辆在平面上移动)。

问题2

在达到目标值时,积分值可能会产生一个巨大的变化,这将是一个问题,这个值将会对power产生很大的影响。当你真正想用这个积分值的时候(比如接近目标点时),积分值将变成一个不可用的很高的值。那么我们有几种方法来解决这个问题。
方案1:限制积分值所能达到的值

if (integral is huge)
 	integral = maximum value;

方案2:限制积分值的范围(一旦积分低于某个值,或一旦当前的输出功率少于某个值,如100%)

if (error is outside useful range)
	integral = 0;

方案3:在前一个值和当前值之间,逐渐的增加error。这对于代码来说是比较困难的。

PID程序代码

void myPID(int setpoint)
{
 while ( some condition )
 {
 	error = setpoint – sensor value;
 	integral = integral + error;
 	if (error = 0 or passes setpoint)
 		integral = 0;
	if (error is outside useful range)
 		integral = 0;
 	derivative = error – prevError;
	prevError = error;
 	power = error*kP + integral*kI + derivative*kD;
 	wait 15 mSec;
 } 
}

KP、KI、KD参数的整定

为了让我们的使用pid的机器正常的工作,我们更多的时间和精力是在调整KP、KI、KD的常数值上,这个过程通常是令人沮丧和乏味的。对于这三个常数值的确定有不同的方法,从计算机到数学运算。
这里列举一种方法,也是机器人比赛中常见的方法。其他方法大家可以参考我在文章最后所列举的参考资料。在我们调整的任何时候,都应该密切关注传感器或error的值,而不是仅仅依赖视觉来判断它看起来是对的。

性能与指标

首先,我们将研究一些在现实中决定我们的PID控制器的行为和性能的因素
• 上升时间 – 从起始点到目标点的时间。
• 超载– 当你的系统运行时,超过目标点多远的error。
• 稳定时间 – 稳定到目标值附近所需要的时间。
• 稳态误差 – 当error稳定时,与我们所期望的error之间的误差。
• 稳定性 – 运动的曲线是否平滑。error值稳定过程中是否平滑。
现在,让我们来看看我们的三个常数的增加是如何影响这些因素的:
PID算法从入门到放弃_第4张图片
如果Kd很小。太多的kd会使系统变得更糟。因为微分项的作用方向与比例分量和积分分量相反,如果微分量产生的power过大,那么它将超过比例和积分的分量,这样将会造成机器缓慢下降,并且会在不应该停止的地方停止。当机器缓慢下降时,微分项将会变弱,并且机器将会再次继续下去,直到微分项再次变得足够强大,以不必要地减缓机器人的速度。最总的运动效果看起来将会是间歇性的或紧张的。

注意:对于稳态误差,一般情况下稳定性要比精确性更重要。通过这个,如果你总是确切的超过目标10个单位,总比稳态误差在-5和5之间要好,因为你总能预测出你超过10个单位,并因此作出适当的调整。

整定过程

方法一: 调试与错误(手动调试)

这个调试你pid的方法完全由你来完成,不需要额外的其他基础知识和理解来帮助你。这个方法将会是反复调试并且是比较乏味的过程。但通常被认为是最简单的。
首先你需要将3个常数(kp、ki、kd)设置为0。使它们失效。然后我们将一个一个的调试它们,而不是直接跳过。我们通常调试的顺序是比例,微分,积分。即按照KP, KI, KD 的顺序进行调试。整个过程都依赖于对你的常数的做出预测。然后在它(error)没有按照计划运行时调整它。准备去停止你的机器运行也是很有必要的(通过从你的程序或开关中禁用它,并在必要时通过物理捕获它),因为你很可能做出一个离期望值很远的一个值。只要你准备好了,通常将不会对实验造成很大的伤害。

  1. 增加KP至到机器有轻微的摆动,我们对快速完成一个运动到指定的位置感兴趣。但不要太暴力——它需要在合理的时间内得到沉降
  2. 增加KD直到稳态误差开始减小到合适的范围。这将允许我们从比例部分中维持一个快速的移动,同时最小化超调。你可能需要重新调整KP。
  3. 开始添加kI,直到考虑到任何较小的稳态误差和干扰为止。与此同时,你可能需要重新调整KD。
  4. 使用上一页的知识,不断的调整KP,KD,KI常数,直到得到一个你满意的好的快速的平滑移动的效果。

对于前几次的调试,这将是困难和令人沮丧的,不过通过一些练习你将能够准确的猜出你所需要的常数值。

方法二: 数学调整

数学运算方法可以被用来为你的PID控制提供一个合适的估计。之后你仍然需要做一些手动的调整,不过数学模型能够提供给你一个适合大部分工作的情况。为此,我们将看看齐格勒-尼科尔斯的方法,在计算的开始阶段也需要一些手动调整的工作。
就像试错方法一样,首先禁用所有三个常量(将它们设置为零)。

  1. 增加KP直到你得到一个连续稳定的震荡。需要是稳定和一致的。记录这个值作为KU。
  2. 测量由步骤1引起的振荡的周期。也就是说从一个点到回到它自身所需要的的时间。你可以通过程序或者秒表来进行测量。然后用这个时间除以震荡周期数得到一个均值,将这个值记录为PU。
  3. 从下表当中粗略计算常数值。这取决于您的控制器类型。
    PID算法从入门到放弃_第5张图片
    如前所诉,你很有可能需要通过手动做一些调整以完善运动,上表中的KI和KD值不考虑DT。所以在你的计算当中也需要考虑这一点。

PID调参口诀

参数整定找最佳,从小到大顺序查;
先是比例后积分,最后再把微分加;
曲线振荡很频繁,比例度盘要放大;
曲线漂浮绕大湾,比例度盘往小扳;
曲线偏离回复慢,积分时间往下降;
曲线波动周期长,积分时间再加长;
曲线振荡频率快,先把微分降下来;
动差大来波动慢。微分时间应加长;
理想曲线两个波,前高后低4比1;
一看二调多分析,调节质量不会低;
若要反应增快,增大P减小I;
若要反应减慢,减小P增大I;
如果比例太大,会引起系统振荡;
如果积分太大,会引起系统迟钝。

结论

这篇博客简单介绍了下PID算法的一些基本概念、历史,另外讲解了PID的基础知识,及PID参数的整定方法,其中涉及到PID的性能相关的问题。
需要注意的是,您可能需要在代码中实现其他特性来改进控制器。另外需要注意的一点是你不一定需要将3个参数都用上才能得到一个好的控制效果,这需要跟实际情况相结合,P,PI,PD,控制也可以创造出一个好的控制效果。
理解了PID的原理,及PID是如何工作的将会很大的帮助我们去编程。在网上去搜索一些相关应用的案例,对于你理解相关知识是很有帮助的。
如有错误或遗漏欢迎指出,不胜感谢。希望这篇博客对你有帮助。

祝福

合抱之木,生于毫末;
九层之台,起于累土;
千里之行,始于足下。

最后送给你祝福,祝你前程似锦

参考资料

  • An Introduction to PID Controllers :http://georgegillard.com
  • PID专题课程
  • PID算法温控项目
  • PID算法的数学推导
  • PID控制算法介绍
  • 深入浅出PID算法 : https://www.jianshu.com/p/6118f6dfbf8c
  • PID算法 : https://www.bilibili.com/video/BV1cE411n7Ef?spm_id_from=333.880.my_history.page.click&vd_source=21f86fbb5dec75882ef4e695aaec9ba6

你可能感兴趣的:(算法,人工智能,机器学习,PID,控制算法)