在这篇文章里一切的代码都不是真实的程序代码,仅仅作者对编程的暗示,或许说是用相似程序代码的办法对编程的内容进行解说。作者期望读者能自行挑选程序语言,自己完结PID操控器的编程。
文中将以实例来阐明怎么创立PID来完结机器人巡线使命。PID创立完结后,通过简略的批改就能够使用到其他当地,如,让机器人跑直线,做两轮平衡机器人。其实学过微积分的人很简略了解PID的典型描绘,本文是写给那些对PID简直没有任何概念的读者,比方参与FLL竞赛的3~8年级的孩子们。考虑到咱们或许不了解微积分,因而我尽量不运用微积分,从十分低的起点开端制作整个概念。先来看看一个适于巡线的机器人是什么样的结构。看下图,这个机器人用两个马达驱动,别离与车轮A、C衔接,前端装有笔直向下的光电传感器,红圈标出的部分便是光电传感器能“看到”的部分。带箭头的大长方形标明机器人的其余部分,箭头指示机器人的运动方向。
巡线是机器人的根本技能,也是咱们学习机器人时最早要做的。能够巡线的主动设备具有机器人的悉数特色:运用传感器搜集周围环境的信息,并据此调整机器人的运动状况。巡线机器人能够运用1个光电传感器、2个光电传感器、一打光电传感器或许装上你一切的光电传感器。实践上,你运用的光电传感器越多,巡线的作用越好。只运用1个光电传感器也能够让机器人准确的巡线(即便线条是有弧度的),可是机器人移动过快时简略“飞线”(“飞线”——指机器人脱离线条,不能持续沿着线移动)。一般来说,运用的传感器越多,巡线的速度越快。现在咱们来实验第一个办法(非PID办法)。巡线其实是让机器人沿着线的边际走,由于假如沿着黑线自身走,当机器人违背黑线,传感器“看到白色”时,咱们不知道机器人究竟在线的哪一边,是在线的右边仍是左面?假如沿着线的边际走,当光电传感器“看到白色”,咱们知道机器人在线边际(线)的左面,当光电传感器“看到黑色”,咱们知道机器人在线边际的右边(在线上)。由于机器人跟从的是线条的左面,因而这种办法被称为“左手规律”。咱们需求知道当光电传感器“看到白色”和“看到黑色”时回来的读数值。一个典型的非校准传感器(数值0~100)“看到白色”会回来50,“看到黑色”会回来40。咱们能够在一条数据线段上标出光电传感器的读值,来协助咱们了解怎么将光电传感器的读值改动转变为机器人的运动改动。以下是咱们画出的从“白”到“黑”的光电传感器读值。
这种巡线办法能够完结巡线使命,但作用并不是很好。在比较直的线上完结巡线使命,在编程中设置动作细微的转弯办法,全体巡线作用看起来还算不错;可是假如线上有较大的弯度,你又选用显着的转向动作让机器人完结巡线,机器人就会来回摇摆,横向穿过线条。机器人只“知道”两件作业:转左和转右。用这种办法巡线,一般机器人的速度不会很快,并且看起来很糟糕。即便线是直的,这种办法也不能使机器人走直线,乃至不能彻底对准线的边际。怎么使巡线更有功率呢?
让咱们来调整一下。把光电传感器的读值线段分红三部分。当光电传感器值低于43时,咱们让机器人转左。光电传感器值在44到47之间时,咱们让机器人直行。光电传感器值大于47时,咱们让机器人转右。这在NXT-G程序中,能够在判别模块中挑选yes/no来完结。你实践上只需做两次判别,而不是三次。
第二种巡线办法作用比第一种办法好的多。至少机器人有时会直接向前走了。与第一种巡线办法相同,你仍然要依据线的是曲特色来决议运用哪种转向办法(细微或许显着的转向动作)。机器人仍旧会有适当数量的来回摇摆。精明的读者或许会想“假如运用3个光电传感器是不会比2个光电传感器要好些呢?在添加更多的光电传感器会怎样?”这便是PID的开端了。
Turn= m*error咱们还没有对转向轴做出界说,所以现在咱们确认转向的规模是从-1(最大左转)到+1(最大右转),0转向的意思便是直行。上面图形中直线的斜率就能够用标为赤色的两个点核算出来(其实直线上恣意两点均可运用)。
斜率= m = (y值的改动量)/(x值的改动量) = ( 1- (-1)) / (-5- 5 ) = 2/10 = 0.2斜率是一个份额常量,用它乘以(x值)就可得到“(转向)”(y值)。请必定记住这一点。在各种PID文献中,斜率(也叫做份额常数、直线表达式中的m)被称作”K”。林林总总的Ks出现在PID文献中。你能够把K(或m,或斜率,或份额常数)看做是一个换算系数,用K把一个数字(光电传感器读值或咱们比如中的error(差错))转化成别的一个数字(如Turn(转向))。这便是K的作用,十分简略也十分强壮。
那么在咱们的直线表达式中运用这些新的变量姓名:
Turn=K*(error)
用语言表达便是:将差错值error乘以份额常数K得到所需的转向值Turn。这个Turn值便是P操控器的输出成果,由于它只触及份额操控,被称为“份额操控部分”。
“error”的取值规模是由光电传感器的设置、巡线测验纸的色彩等要素决议的。你或许现已留意到了,在最终一个图形里,直线没有延伸到error(差错)值-5 到 +5 的规模以外。在-5 到 +5 的规模以外,咱们就不能判别光电传感器究竟离线有多远了。当光电传感器彻底看不到任何黑线时,它看到的一切“白色”都是相同的。当光电传感器离线的边际太远时,光电传感器读取到的光值变成稳定的数值,这就意味着光电传感器的读与error(差错)不再是份额联系。咱们只能在光电传感器适当挨近黑线时,判别光电传感器离线的边际有多远间隔,在十分小的数值规模内,光电传感器的读值与这个间隔是成份额的,因而,咱们的光电传感器值要设置在能给出份额联系的有限的规模内。超出这个规模,就只能给出机器人调整的正确方向,但数量巨细是过错的,光电传感器读值或是差错会小于实践状况,这样在批改差错时,就不会有很好的作用。在PID文献中,把传感器能给出份额呼应的规模称为“份额规模”。在PID操控中,份额规模是另一个十分重要的概念。在咱们巡线机器人的使用中,光电传感器读值的份额规模是40到50,差错的份额规模是-5 到+5 ,马达的份额规模是-100(全马力撤退)到 +100(全马力行进)。以下是有关份额规模的两个重要内容:
(1)咱们期望份额规模尽或许的宽。光电传感器的份额规模是适当小的,便是说,光电传感器有必要很挨近线的边际,才干取得份额信息。份额规模的宽度首要取决于光电传感器间隔巡线测验纸的高度有多少。假如光电传感器十分挨近巡线测验纸,如1/16英寸(约0.16厘米),那么光电传感器在巡线测验纸上看到规模仅仅一个很小的圆圈。光电传感器的一个很小的移动就会产生-5到+5 规模的error(差错),也便是份额规模。你或许会说,光电传感器的视界狭隘,只能看到巡线测验纸的很小的一部分,光电传感器要十分挨近线的边际,读取的光电传感器值既不是“黑”,也不是“白”。假如光电传感器间隔巡线测验纸的高度高一些,那么光电传感器在巡线测验纸上看到的规模便是一个大一些的圆圈。光电传感器间隔巡线测验纸的高度大约为1/2英寸(大约1.27厘米)时,在巡线测验纸上能看到的规模是一个直径大约1/2英寸的圆圈。光电传感器处于这个高度上,份额规模更大,由于光电传感器在间隔线的边际+/-1/2英寸宽度的规模内,就能够坚持份额输出。将光电传感器方位进步有两个缺陷,光电传感器方位进步后更简略对环境光做出过错呼应;在区别黑和白时,也与方位较低的光电传感器有些差异。光电传感器间隔巡线测验纸的高度足够大时,对黑色和白色所读取的值是相同的。(2)在份额规模之外,操控器只能把机器人向正确的方向移动,但也仅仅趋向于正确。操控器的份额呼应是受份额规模约束的。
常数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的值设置的小一些,使机器人的转向动作(批改)更细微。