星际探索
1、M6—RCU控制器
2、传感器与执行器
3、RoboEXP
4、拼装积木分类盒使用示意
5、问题合集
6、地址数据
7、PID控制说明
BE-9264 2.4G智控手柄(专业版)
汝城县职业中等专业学校知识库-信息中心朱老师编辑
-
+
首页
7、PID控制说明
#### PID,就是“比例(proportional)、积分(integral)、微分(derivative)”,是一种很常见的控制算法。在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。 ## 以光电巡线为例 使用1个光电传感器,让机器人维持在线上。要实现这个功能非常简单,光电传感器识别是一个范围,从白色到黑色之间读值会随之减小。  那么对应程序逻辑就是:处在白色时,机器人左转;处在黑色时,机器人右转,使机器人保持在**线的边缘**。  虽然能实现功能,但是显然程序效果过于“粗暴”,相当于全程只有两个状态,势必会让机器人在线边缘处不停地摆动。  >i **信息提示** > >坐标轴以**转弯速度**和与阈值2000偏**差值**为轴,其中M1马达速度与转弯速度相同,M2马达速度则和转弯速度相反。 解决这个问题,我们就要引入PID中的P(比例)。 ## PID中的P比例 我们期望效果是“机器人能维持在线边缘”对应的就是希望“光电传感器读值能保持在2000”。 因此我们就有两个对应值,分别是现在光电读值的『当前值』,也有我们期望的光电读值『目标值』(如这里是2000)。 * **当两者差距不大时,就让机器人“轻轻地”转弯。** * **当前光电传感器读值比2000差比较多,就让机器人“稍稍提高速度”转弯。** * **当前光电传感器读值比目标值2000差特别多,就让机器人“加大力度”转弯,尽快让机器人回到线的附近。**  这样的过程就是按一定**比例**控制机器人的速度,偏差值越大机器人反应越大,偏差值越小机器人反应越小。 最终我们把速度和偏差值E组成坐标轴,就是一条穿过坐标轴原点的“比例函数”:y(转弯速度turn)=k(系数kp)\*x(偏差值E)。  **Turn转弯速度=kp系数*E偏差值** #### Kp是调节比例控制力度,随着kp增加,机器人对数值变化的反应力度就越大。 #### kp特别大时,即时机器人很接近线边缘,转弯力度依旧很大。 #### kp特别小时,即时机器人很远离线边缘,机器人转弯力度依旧很小。 ## PID中的I积分 比例P虽然起到的作用很大,但是程序比较“死板”,例如机器人已经很接近线,这时转弯力度逐渐降低到接近0。 这个过程理论上是可行的,但是实际上会产生一些问题。 比如机器人在线边缘附近,此时因为偏差值非常小,对应的转弯速度也很小。而转弯过程的摩擦力会使实际机器人即时具有速度,但实际效果是静止的。这样就出现一个情况,机器人虽然能不断接近但是无法到达目标值。 (举个例子,我们现在用比例P控制要让一壶水加热到50度,一开始我们输入较大热量能让水温快速上升,而当水温45度时已经接近目标值,我们降低输入热量。而水在常温下会散热,假设降低后输入热量和散热相同的话,只用比例P控制的话水温就会保持在45度不动了。) 让我们来驾驶机器人的话,这个问题也很好解决,我们就慢慢加大速度直到抵消摩擦力就好了。这个慢慢叠加的过程就是积分起到的作用。 积分会累计每一次的偏差值(I=I+E偏差值),逐渐产生一个较大的作用。例如偏差值是 5,3,2,5,2,3,在第一次偏差只有5时积分I校正作用很小,而经过多次累计变为20(5+3+2+5+2+3),校正作用就会变大。 如果机器人持续在线边缘的一侧,会导致偏差值不断累计。 只有当机器人在线边缘徘徊时,偏差值会相互抵消不会产生较大的作用。如偏差值为-5,2,-2,5,-2,3,虽然每次都有些许偏差,但是正负抵消,累计的积分I只有1,不会产生较大作用。  **公式:Turn转弯速度=kp系数\*E偏差值+Ki系数\*I积分值** ## PID中的D微分 有了PI的控制,基本能稳定让机器人保持在线边缘,但是每当线的位置有突变时,机器人常常会伴随着相当长时间的“震荡”。 再次以控制水温为例,我们向控制的水中加入大量的冰块使水温突然减低,可以想象一下温度变化情况。首先温度会急速上升,直到接近目标值,在PI作用下温度在目标值上下摆动,温度变化就像一条波浪线在目标值徘徊。 我们想要的效果就是尽量把这条波浪线“压平”让波浪线更平缓,更贴合目标值。压平的过程就是让温度每个瞬间的变化率减小。  但是波浪线是一条曲线变化率不是固定的,不像一条直线每次增加/减少数量都是确定的。 这里就要提到微分的想法,我们很容易就能计算出直线的变化率(每隔一段时间的变化数值是固定的),但是没法计算曲线的变化率。 那就把曲线“**微分**”成无数多的直线就好了。分得越细就越接近曲线。  >i **信息提示** > > 计算这个过程,在数学有更明确定义,计算某一点导数。 那么直线变化率就很简单了。 例如上一次偏差值是5,这时偏差值是10,那么这一瞬时变化率就是5。(距离上一次变化了5) 例如上一次偏差值是100,这时偏差值是10,那么这一瞬时变化率就是-90。(距离上一次变化了-90) 转到机器人中,微分D就是使机器人回到线边缘时的摆动现象减少,在机器人速度突增或突减(变化率高)时,增加一个阻力速度。 而这个阻力的速度肯定是和变化率相关,随变化率改变而改变。 最终实现公式就是,kd系数\*D=kd系数\*(E这一次偏差值-LE上一次偏差值)。  **Turn转弯速度=kp系数\*E偏差值+Ki系数\*I积分值+Kd系数\*D微分值** ## 适用范围 基本所有需要快速且稳定的系统都可以用到PID。例如超声波传感器停车功能,随着障碍物靠近调整马达速度。没有震荡地使马达快速转180度,让马达随着越靠近180度时速度逐步降低。根据姿态传感器数值,调整马达功率实现自平衡。 ## 实现PID巡线 在机器人保持在线边缘的基础上,增加一个前进的速度**Speed**。  ``` import rcu VAR_Speed = 0 VAR_offset = 0 VAR_Kp = 0 VAR_Ki = 0 VAR_Kd = 0 VAR_light = 0 VAR_I = 0 VAR_E = 0 VAR_D = 0 VAR_turn = 0 VAR_LE = 0 def task1(): global VAR_Speed,VAR_offset,VAR_Kp,VAR_Ki,VAR_Kd,VAR_light,VAR_I,VAR_E,VAR_D,VAR_turn,VAR_LE VAR_Speed = 30 #设定速度 VAR_offset = 2000 #光电传感器目标值 VAR_Kp = 0.007 #设定比例系数 VAR_Ki = 0.002 #设定积分系数 VAR_Kd = 0.002 #设定微分系数 while True: VAR_light = rcu.GetLightSensor(1) #光电传感器数值 VAR_E = (VAR_light - VAR_offset) #计算偏差值 VAR_I = (VAR_I + VAR_E) #积分:累计偏差值 VAR_D = (VAR_E - VAR_LE) #微分:计算偏差值变化率 VAR_turn = (((VAR_Kp * VAR_E) + (VAR_Ki * VAR_I)) + (VAR_Kd * VAR_D)) #计算转弯速度 rcu.SetMotor(1,(30 + VAR_turn)) #M1马达最终速度 rcu.SetMotor(2,(30 - VAR_turn)) #M2马达最终速度 VAR_LE = VAR_E #将此时的偏差值记录为上一次偏差值 task1() ``` ## 调节顺口溜 比例作用顺口溜 比例州节器,像个放大器; 一个偏差来,放大送出去; 放大是多少,旋钮看仔细; 比例度旋大,放大倍数低。 积分作用顺口溜 重定调节器,累积有本领; 只要偏差在,累积不停止; 累积快与慢,旋钮看仔细; 积分时间长,累积速度低。 微分作用顺口溜 说起微分器,一点不神秘; 阶跃输入来,输出跳上去; 下降快与慢,旋钮看仔细; 微分时间长,下降就慢些。
admin
2026年5月21日 20:08
转发
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
分享
链接
类型
密码
更新密码
有效期
Markdown文件
Word文件
PDF文档
PDF文档(打印)
AI