用于乐高机器人的PID控制器 下载本文

次循环时,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 。

改变Kp, Ki, 和 Kd的值对机器人运行情况的影响

在优化PID的过程中,上面说明的方法和表格是一个好的开始。有时,了解一下增加(或降低)三个K值中的一个会有怎样的结果,也是非常有帮助的。下表在很多网页上都能找到,这个版本来源于wiki——PID控制器的网页。

增加参数值的影响 Parameter 参数 Kp Ki Kd

“响应时间”是指机器人确定误差的时间,在我们的例子中,是指机器人在离线以后,需要多少时间能回到线的边缘。响应时间主要由Kp控制。Kp值变大,机器人返回线的速度变快,响应时间就减少。Kp过大,会造成机器人超调。

“超调”是指机器人在响应误差时,会越过线的边缘多远。例如,如果超调较小,当机器人想回到线的左边时,就不会摆动到线的右边去。如果超调较大,机器人在纠正误差时,就会摆动过大,超过线的边缘。超调受 Kd影响最大,但 Ki 和Kp对它的影响也颇强。通常情况下,纠正很大的超调,你需要增大Kd值。还记得我们第一个非常简单的巡线机器人吗,除了左转和右转,它不会做任何事,这个巡线机器人就会产生非常大的超调现象。

“稳定时间”是指机器人在发生一个大的变化时,需要多长时间才能稳定下来。在

Rise time 响应时间 减少 减少 不确定(小的增加或减小) Overshoot 超调 加 增加 减少 Settling time 稳定时间 变化小 增加 减少 Error at equilibrium 静态误差 减少 消除 无

我们巡线的例子中,机器人遇到一个转弯就会发生较大的变化。当机器人对曲线做出响应,它会纠正误差,并产生一些超调,然后机器人会以另一个方向的超调来纠正当前的超调,然后再纠正这个超调......你明白了吧。当机器人对误差进行响应时,它会围绕期望位置进行摆动。“稳定时间”就是这个摆动被抑制到0的时间。Ki 和 Kd都对稳定时间有很强的影响,Ki越大,稳定时间越长;Kd越大,稳定时间越短。

“静态误差”是指系统在不受干扰的情况下运行所保持的误差。对于我们的巡线机器人来说,当机器人走了很长一段直线后,这个误差会被抵消掉。P控制器和PD控制器经常会被这种误差搞垮。增加Kp 值会降低它的影响,但会加大机器人的摆动。P控制器和PD控制器在平衡状态下会有一个恒定的误差,因此经常会在其中增加I控制,和加大Ki的值。(这是假定,当机器人巡线时,你更关注小的系统误差。这就意味着,机器人会稍微向一边或另一边偏移)

运行情况怎样?

这里有一个乐高NXT机器人在巡线测试纸上用PID方法巡线的视频,视频效果不是很好。

光电传感器距离巡线测试纸的高度大约为1/2英寸,Tp (功率目标值)设置为70%。机器人的平均速度为每秒钟8英寸。机器人沿着椭圆型黑线的内侧,采用左手法则巡线,沿着内侧巡线要比沿着外侧巡线稍微难一点。(见 视频01)

在整个过程中,巡线机器人似乎表现相当不错。如果你仔细观看视频,就会发现,机器人在离开转弯的地方有一点―摇尾巴‖。那是PID有一点振荡。当机器人向镜头方向运行时,你可以看到机器人光电传感器的LED在场地垫上照射出的红点,看上去在追踪线的边缘方面,做的非常好。

基本PID控制器可以适用于不同的控制难题(当然也可以用P控制器或者PI控制器代替PID控制器),你无需提出一个新的―误差‖定义,但是针对特定的任务,要重新调整PID。

那么,程序代码在哪儿?

因为这篇文章是为年龄较大的FLL参赛孩子写的,我真的不想给出我的程序代码。他们都可以自己写出来。

在程序代码中,你所需要的只是PID本身。你可以增加一些设置代码,和一个适宜的停止巡线循环的方法。

作为一个小小的帮助,这里有一个MyBlock模块,控制两个马达,有两个输入—— Tp (目标马达功率) 和Turn(转向)值。这个MyBlock可以处理负的马达功率。当一个马达反转时,会发出滴滴声,马达反转会使转向更容易。一个调整合适的PID是不会出现马达反转情况的。

(见程序 PID_LF_MotorControl.rbt)

关于PID的一些认识

1. 当误差超出比例范围时,导数会变成0. 2. 导数对噪声很敏感。

3. 误差精度高时,导数的作用就好。对于我们的巡线机器人来说,这个误差是在+5到-5之间的整数。这是相当低的精度。也许可以使用马达轴速率的导数来替代?