智能车制作

标题: PID控制经验,回复别人问题时不小心写的,觉得有必要以自己名义发帖 [打印本页]

作者: 淡定戈    时间: 2015-3-17 10:59
标题: PID控制经验,回复别人问题时不小心写的,觉得有必要以自己名义发帖
本帖最后由 淡定戈 于 2015-3-17 11:12 编辑

   在回复别人问题时不小心写了这么多,觉得有必要以自己名义发帖.
   PID控制很简单,但初学者可能比较晕.
   控制转向一般用位置式PD(也有用PID的,建议不用I), 控制速度一般用增量式PI(也可以加D). 注意别忘了限制最大最小输出!!!

参数设置要根据具体对象而定. 一般原则如下:
这里先假设系统参数如下:
   输入数据(如温度值,速度,代表被控对象的指标)范围[InMin,InMax] = [0,1]
   输出数据范围[OutMin,OutMin] = [-1,1]
   控制周期dt=1ms
   系统时间常数为T=3s

---------------------------------------------------------------------------------------------------------
对于位置式PD,  OutVal = P*(InNew-InSet) + D*(InNew-InOld);
参数调节:
   1. 一般先调P, 初次设参数时, 估计单独的"P*(InMax-InMin)"能使输出达到最大. 此处建议初始值P = (OutMax-OutMin)/(InMax-InMin). 然后修改参数P已达到一个较好效果, 很可能达不到要求, 调到效果无法明显改善为止.
   2. 接着调D, 先注意InOld很可能不是上一次采集的值, 可能是10次甚至20次前的值(视情况而定), 以削弱随机误差的影响.  若采用上面的计算式, D一般设置成P的好几倍, 初始设定, 可设置成3P.
   最后, 修改轮流修改PD参数,调到效果无法明显改善为止.
   PS:一般经过几次修改后, 再改参数效果就不明显, 这种情况,可能的原因有两种:   1. 参数改的幅度太小.   2. 确实到极限了,这就需要从其他方面想办法.

---------------------------------------------------------------------------------------------------------
对于增量式PI,  这种方式一般用于控制大滞后的系统(如速度/温度控制), OutVal += P*(InNew-InOld) + I*(InNew-InSet) ;
注意:
   1. P后面乘的是偏差的微分(差分), I后面乘的是偏差, 这是因为这个方程本质上是实现积分(累加)功能,  偏差的微分(差分)经过积分(累加)后就是偏差(对应参数P), 而偏差经过积分(累加)后就对应I.
   2. 后续代码记得限制OutVal∈[OutMin,OutMax]
   3. 此处的InOld一般是上一次采集的数据,不必是多次前的, 用多次之前的数据反而会降低系统的实时性, 因为理论上积分可以削弱随机误差的影响.  然而控制系统实际情况难以完全用理论概括, 具体实现视情况而定!!!
参数调节:
   1. 先调I参数,  关于初始值的设置, 一般I*(InMax-InMin)能使OutVal在T内达到最大值(T为被控对象的时间常数). 则初始值可设置为I=(OutMax-OutMin)/(InMax-InMin)*dt/T=[1-(-1)]/(1-0) * 0.001/3=0.00066666666666667!
   2. 接着P参数, 类似位置式P, 初始值P=(OutMax-OutMin)/(InMax-InMin).
   最后就是以PI参数为基础, 进行调节, 而调节的各种技巧, 实在是太多, 总之一句话 "好看的就是好的".  另外调参数还得看具体指标.
   注意:对于飞思卡尔竞赛速度控制宁愿反应稍慢,也别冒险产生震荡, 震荡(即便看起来不明显)会减小车轮的摩擦力, 进而减小弯道速度.



X, 不小心写了这么多, 以上仅代表个人经验&观点, 如有雷同纯属巧合!!!


补充内容 (2015-3-18 15:23):
有朋友说我PID参数符号反了.
我确实忘了说符号问题, 对于一般的控制系统(能用PID控制的系统一般可用这个原则),举例说下:
如果OutVal(如PWM)增大会使InNew(如电机转速)增大,则P<0,因为这样一来才能形成负反馈.

补充内容 (2015-3-18 15:26):
InNew(测速)增大->P*(InNew-InSet)减小->OutVal(如PWM)减小->InNew(测速)减小
测量值得增大,通过控制后,有减小的效果.
作者: Quixote    时间: 2015-3-17 11:18
单就盲调来讲,还是不错哒
作者: HDT    时间: 2015-3-17 11:18
:lol:lol
作者: 玩意Tc    时间: 2015-3-17 11:56
我之前控制周期调得不好。。。结果一直调不出来
作者: 空有一人    时间: 2015-3-17 12:29
赞            
作者: 冷技    时间: 2015-3-17 16:01
玩意Tc 发表于 2015-3-17 11:56
我之前控制周期调得不好。。。结果一直调不出来

请问你之前是调直立的pid吗?换了控制周期之后变好了是怎么换控制周期的?


作者: 玩意Tc    时间: 2015-3-17 16:16
冷技 发表于 2015-3-17 16:01
请问你之前是调直立的pid吗?换了控制周期之后变好了是怎么换控制周期的?

不是 我只是闭环而已

作者: 淡定戈    时间: 2015-3-17 17:18
冷技 发表于 2015-3-17 16:01
请问你之前是调直立的pid吗?换了控制周期之后变好了是怎么换控制周期的?

呵呵 这不是直立控制的PID, 直立控制PID可参考, 哥的论文   http://www.znczz.com/forum.php?mod=viewthread&tid=215037&fromuid=105521


作者: 旋风麦林    时间: 2015-3-18 11:22
OutVal = P*(InNew-InSet) + D*(InNew-InOld);输出反了吧?OutVal = P*(InSet-InNew) + D*(E-E‘);
作者: 淡定戈    时间: 2015-3-18 15:09
旋风麦林 发表于 2015-3-18 11:22
OutVal = P*(InNew-InSet) + D*(InNew-InOld);输出反了吧?OutVal = P*(InSet-InNew) + D*(E-E‘);

哦 my God,  我是没注意符号
作者: _clearlove    时间: 2015-3-18 16:44

作者: 玩意Tc    时间: 2015-3-18 16:58
话说系统时间常数一般是多少呢 没理解哈
作者: 淡定戈    时间: 2015-3-18 17:28
玩意Tc 发表于 2015-3-18 16:58
话说系统时间常数一般是多少呢 没理解哈

时间常数视具体情况而定, 飞思卡尔智能车速度控制, 大概就是1秒数量级. (当然,可能换车模后,参数和当年不一样了)

作者: 玩意Tc    时间: 2015-3-18 19:38
淡定戈 发表于 2015-3-18 17:28
时间常数视具体情况而定, 飞思卡尔智能车速度控制, 大概就是1秒数量级. (当然,可能换车模后,参数和当年不 ...

我B车模 之前采集周期和控制周期5ms  100线的编码器  发现闭环很不好调   后来加大控制周期和采样周期 发现好调点了 不太懂什么原因哎·
作者: diandian    时间: 2015-3-18 19:43
顶一个

作者: 淡定戈    时间: 2015-3-19 09:45
玩意Tc 发表于 2015-3-18 19:38
我B车模 之前采集周期和控制周期5ms  100线的编码器  发现闭环很不好调   后来加大控制周期和采样周期 发 ...

可能是因为控制周期太短, 导致单独一次的速度和加速度测量误差很大, 导致控制结果不理想

作者: 玩意Tc    时间: 2015-3-19 12:01
淡定戈 发表于 2015-3-19 09:45
可能是因为控制周期太短, 导致单独一次的速度和加速度测量误差很大, 导致控制结果不理想

采样和控制周期的选取,我觉得也是一门大学问了。

作者: FAruba611    时间: 2015-3-19 13:56
收藏了
作者: 三下五除二    时间: 2015-3-19 22:27

作者: Stan克    时间: 2015-3-20 12:33
初始设定, 可设置成3P
作者: 小小草    时间: 2015-3-20 23:39
:):)
作者: 杨洋02    时间: 2015-3-21 09:21
转向PD不是应该P是D的几倍吗?
作者: 淡定戈    时间: 2015-3-22 20:04
杨洋02 发表于 2015-3-21 09:21
转向PD不是应该P是D的几倍吗?

那要看偏差和偏差的微分是如何计算的, 采用我列的方式计算的话, D是P的几倍一般,转向控制是这样的.

作者: 淡定戈    时间: 2015-3-22 20:04
Stan克 发表于 2015-3-20 12:33
初始设定, 可设置成3P

你懂的 , 我本来想写4P的

作者: 微光刺眼    时间: 2015-3-29 13:23
:):):):)
作者: shine稻草人    时间: 2015-3-29 14:19
你说的d项为3p,这得根据周期定,而且每种车不一样
作者: 淡定戈    时间: 2015-5-8 16:55
shine稻草人 发表于 2015-3-29 14:19
你说的d项为3p,这得根据周期定,而且每种车不一样

只是初值, 根据经验设定, 后期还要调的, 以不震荡为原则





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2