调整PID控制器,不使用复杂的数学方法
(但是我们还是要做一些计算)
在本文中,我使用了其他人总结出来的PID控制器调整的方法,测量几个系统参数就可以让你非常好地计算出 Kp,Ki 和 Kd的值。有几种技术可用于计算Ks,其中之一就叫做 "Ziegler–Nichols方法" 。通过谷歌搜索可以找到很多讲述这种技术的网页。我所使用的版本几乎是直接使用了维基网页——PID控制器中的内容(在很多其他的地方也可以找到相同的内容),我只做了一点小小的改动,包括下表中所示计算过程中的循环时间。
按以下步骤调整PID控制器:
- 将 Ki 和 Kd 的值置为0,即关闭控制器中的这些部分,将控制器作为一个简单的比例控制器。
- 把Tp(目标功率值)设置的小一点。对于我们使用的马达来说,可以设为25.
- 将 Kp 设置为一个“合理”的值,什么是合理的?
1)用我们想让马达功率达到的最大值(100)除以能使用的最大误差值。对于我们的巡线机器人,我们假定这个最大误差是5,所以推测出Kp值为 100/5=20。当误差为+5,马达的功率将达到100。当误差为0,马达的功率会在 Tp (目标功率值)上。
2)或者,将Kp 值设为 1 (或100),看看会发生什么。
3)如果你要把 K's的值乘以100,在这里,1就要记成100,20记成2000,100记成10000.
- 运行机器人,观察运行状态。如果它不能巡线,从线上脱离开,就提高Kp值;如果它剧烈摆动,就降低Kp 值。调整Kp值,直到机器人能够巡线,并且没有明显的摆动为止。我们称这时的Kp 值为"Kc" (在PID文献中,被称为临界值)
- 使用Kc值作为Kp,运行机器人,试着找出机器人运行时的“振荡周期”是多少。这个测试不需要非常准确。振荡周期(Pc)是指机器人从线的一侧开始,摆动到另一侧,再回到开始点的时间长短。对于典型的乐高机器人来说,Pc 大约是在0.5秒到1或2秒之间。
- 你还需要知道,机器人控制系统的循环周期是多少。我将循环设置为一个固定的次数(如10,000),测量机器人完成全部循环次数的总时间(从开始到结束的时间,或机器人显示出结果的时间),每个循环的周期是测量时间除以循环次数。对于一个完整的PID控制器来说,使用NXT-G编程(在程序中不要使用发声、显示等模块,这些模块的使用会占用程序运行时间,影响测试结果),dT值应该在每个循环0.015秒到0.020秒之间。
- 使用下表计算 Kp, Ki, 和 Kc 的值。如果你只想要一个P控制器,使用表中标注了P的那一行来计算Kp (Ki' 和 Kd' 均为0)。如果你想要一个PI控制器,就使用第二行来计算。如果你想要一个完整的PID控制器,就使用最后一行来计算。
- 在实际操作时,那些K值都要用100乘以它们实际的值,但是在计算中你不需要考虑这个问题。这个因数100 ,在确定Kp = Kc 临界值时,就已经考虑在内了。
- 运行机器人,看看它的表现。
- 你可以调整Kp, Ki 和 Kd 的值直到获得最佳的性能。你可以从相当大的调整开始,如30%,然后尝试较小的调整,以获得最佳的(或者至少是可以接受的)效果。
- 一旦你确定了一组好的K值,提高TP值,提高机器人的直线速度。
- 对于新的TP值,要重新的调整K值,也许甚至要回到第1步,重复整个过程,
- 不断地重复,直到机器人的表现是可以接受的。
Ziegler–Nichols方法给出的K'值
(循环时间恒定并等于 dT) | 控制类型 | Kp | Ki' | Kd' | P | 0.50Kc | 0 | 0 | PI | 0.45Kc | 1.2KpdT/ Pc | 0 | PID | 0.60Kc | 2KpdT / Pc | KpPc / (8dT) |
Ki' 和 Kd' 上的符号只是要提醒你——Ki' 和 Kd'已经考虑了时间的因素,即ki'= ki*dt,kd’=kd/dt (假定dT为恒定值)。
这里有一个我自己做机器人测试的测量数据。Kc为300,当Kp=Kc时,机器人的摆动周期大约为0.8秒,因此Pc为0.8。我测量Pc的方法是,每当机器人摆动到一个特定的方向,就大声数出来。循环时间dT为0.014秒/每个循环,用程序运行10,000次循环时,NXT上显示的程序运行时间和循环次数相除所获得。使用上表中PID控制器的各计算公式,我们得到:
Kp = (0.60)(Kc) =(0.60)(300) = 180 Ki = 2(Kp)(dT) / (Pc) =2(180)(0.014) / (0.8) = 6.3 (which is rounded to 6)(四舍五入为6) Kd = (Kp)(Pc) / ((8)(dT)) =(180)(0.8) / ((8)(0.014)) = 1286
在进一步的反复试验后,最终的Kp, Ki 和Kd值分别为220,7 和500。别忘了所有这些K值均已乘以100,因此,它们的实际值为 2.2 ,0.07和5 。 |