PID非常好的光感巡线思路
从P到实际的马达功率值 我们应该如何设置转向时的马达功率值呢?做转向的一个方法是:定义一个“目标功率”,我称之为"Tp"。Tp是当error(误差)=0时,机器人做直行得两个马达功率值。当error(误差)不为0时,我们用表达式Turn=K*(error)来计算如何改变两个马达的功率,一个马达的功率为Tp+Turn,另一个马达的功率为Tp-Turn。注意,因为我们的error(误差)范围是-5 到 +5,Turn(转向)的值也会有正值和负值,相当于做不同方向的转向。这正是我们所需要的,它能自动地正确设置马达功率值,确定哪一个马达速度快,哪一个马达速度慢。我们假定左侧的马达接入端口A,其功率值为Tp+Turn的值;右侧马达接入端口C,其功率值为Tp-Turn的值。当error为正时,Turn值为正,Tp+Turn的值比Tp大,左侧的马达速度加快,右侧的马达速度减慢。当error改变符号变为负值时(这就意味着机器人已经越过线的边缘,看到“黑色”了),此时Tp+Turn的值比Tp小,左侧的马达速度减慢,Tp-Turn的值比Tp大,右侧的马达速度加快。简单吗?希望我们继续往下进行时,你会理解得更清楚一点。 P控制器的虚拟代码 首先我们要测出光电传感器读取黑色和白色时的光电传感器读值。根据这两个数值,我们能够计算出offset(补偿量),将光电传感器读值减掉这个数值就可转换成error(误差)值。offset(补偿量)是白色和黑色光电传感器值的平均值。为简单起见,我假定offset(补偿量)已经测量完毕,并存储在叫做offset的变量里。(让机器人自己测量白和黑的光电传感器读值,并计算offset,会更好) Kp = 10 !初始化变量 offset = 45 Tp = 50 Loop forever LightValue = read light sensor !当前光电传感器的读值 error = LightValue - offset !减去offset(补偿量)计算error(误差) Turn = Kp * error ! “比例控制部分”, 我们希望马达的功率值改变多少? powerA = Tp + Turn ! A马达的功率值 powerC = Tp - Turn ! C马达的功率值 MOTOR A direction=forward power=powerA !在马达模块中设置这个功率值 MOTOR C direction=forward power=powerC !设置另一个马达的功率值 end loop forever !结束这个循环,返回,进行下一次循环 复制代码 如果机器人在运行时,表现出的状态是远离线的边缘,而不是寻找线的边缘,你需要改变一下转向的方向。把Kp的值变为-10,看看会怎样。如果这样做可以纠正机器人的转向方向,就把Kp的值变回+10,将设置马达功率的两行代码做如下改动:
常数K被称为Kp(比例控制器中恒量K)。要为Kp设定一个初始的推测值,然后通过反复试验来修正它。我们可以根据机器人和传感器的特性估算出一个值:将Tp(目标功率)设为50,当误差为0时,两个马达都以50的功率值转动;误差范围为-5 到 +5。我们期望当误差从0变化到-5时,马达的功率值从50变化到0,就是说Kp(斜率——y的变化量除以x的变化量)为:
Kp= (0 - 50)/(-5 - 0)= 10
我们用Kp=10 将error (误差)值转换为turn(转向)值。这句话中,转换的意思是“error”(误差)每发生1个单位的变化,我们就将一个马达的功率值提高10,另一个马达的功率降低10.
虚拟代码如下:
powerA = Tp - Turn
powerC = Tp + Turn
在这个P控制器里有两个“可调参数”和一个恒量。恒量就是offset(补偿量)(黑色和白色光电传感器读值的平均数)。你需要编写一小段程序,在巡线测试纸上用你的机器人来测量光电传感器读值。你需要测量出“black(黑)”和“white白”的光电传感器读值,然后计算平均值,并把平均值写入P控制器程序中的offset变量。几乎所有的巡线机器人都要做这一步工作,你可以人工进行,也可以通过编写程序代码让机器人自动完成。
Kp值和Tp(目标功率)值是可调参数。可调参数必须经过反复试验才能确定。Kp决定了当机器人渐渐离开线的边缘时,控制器让机器人返回线的边缘的速度有多快;Tp决定了机器人沿着线向前移动的速度有多快。
如果线比较直,你可以将Tp的值设置的高一些,提高机器人的运行速度;将Kd的值设置的小一些,使机器人的转向动作(修正)更细小。
如果线比较弯曲,尤其是有锐角弯时,要限制Tp的最大值。如果Tp超过了最大值,无论怎样设置Kp,机器人在遇到曲线时,都会因为移动过快而“飞线”(机器人脱离线条)。如果Tp值很小,机器人移动速度就会很慢,此时无论将Kp设置成任何数值,机器人都会完成巡线任务。而我们的目标就是在保证机器人能够完成巡线的情况下,让它尽可能地跑的快一点。
我们推测出了Kp的一个初始值——Kp=10。对于Tp(目标功率值),你可以从一个比较低的值开始,比如15(机器人会移动的非常慢)。试一试,看看它的运行情况。当机器人因转向过慢而出现“飞线”情况,就增大Kp,并继续尝试。如果机器人因来回摆动、过于活跃而出现“飞线”情况,就减小Kp。如果机器人巡线的状态非常好,就提高Tp,观察机器人在更快速度下的巡线情况。尽管Kp通常不会有太大的变化,对于每一个新的Tp值,你都需要确定新的Kp值。
沿着一条较直的线做巡线,通常比较简单。沿着一条弯度不大的曲线巡线,有一点难。沿着一条有急遽弯度的曲线巡线,是最难的。如果机器人移动地很缓慢,那么即便是使用非常基本的控制器,机器人也几乎可以完成任何巡线任务。我们想要的是机器人能够以非常好的速度完成巡线,能够处理有普通弯度的巡线任务(有着非常尖锐转角的巡线任务,通常需要采用更专业的巡线机器人)。
对于各种不同类型的巡线任务(线的宽度不同,转弯的尖锐程度不同等)来说,最好的P控制器很可能是不同的。换句话说,为一条特定的线和特定的机器人而调整出来的P控制器(或者PID控制器),对其他的线和机器人来说,不一定适用。程序代码可以在很多机器人(和很多巡线任务)上使用,但是Kp,Tp和offset等参数必须要针对每一个机器人和每一种应用情况重新进行调整。
PID光感巡 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)