您的位置 首页 资料

PID非常好的光感巡线思路

在这篇文章里所有的代码都不是真正的程序代码,只是作者对编程的示意,或者说是用类似程序代码的方式对编程的内容进行解释。作者希望读者能

在这篇文章里一切的代码都不是真实的程序代码,仅仅作者对编程的暗示,或许说是用相似程序代码的办法对编程的内容进行解说。作者期望读者能自行挑选程序语言,自己完结PID操控器的编程。

PID操控器是一种常用的操控技能,常用于多种机械设备(如车辆、机器人、火箭)中。用数学办法来描绘PID操控器是十分复杂的。本文描绘了如安在运用NXT-G编程的LEGO机器人上创立PID操控器。
文中将以实例来阐明怎么创立PID来完结机器人巡线使命。PID创立完结后,通过简略的批改就能够使用到其他当地,如,让机器人跑直线,做两轮平衡机器人。其实学过微积分的人很简略了解PID的典型描绘,本文是写给那些对PID简直没有任何概念的读者,比方参与FLL竞赛的3~8年级的孩子们。考虑到咱们或许不了解微积分,因而我尽量不运用微积分,从十分低的起点开端制作整个概念。先来看看一个适于巡线的机器人是什么样的结构。看下图,这个机器人用两个马达驱动,别离与车轮A、C衔接,前端装有笔直向下的光电传感器,红圈标出的部分便是光电传感器能“看到”的部分。带箭头的大长方形标明机器人的其余部分,箭头指示机器人的运动方向。

巡线是机器人的根本技能,也是咱们学习机器人时最早要做的。能够巡线的主动设备具有机器人的悉数特色:运用传感器搜集周围环境的信息,并据此调整机器人的运动状况。巡线机器人能够运用1个光电传感器、2个光电传感器、一打光电传感器或许装上你一切的光电传感器。实践上,你运用的光电传感器越多,巡线的作用越好。只运用1个光电传感器也能够让机器人准确的巡线(即便线条是有弧度的),可是机器人移动过快时简略“飞线”(“飞线”——指机器人脱离线条,不能持续沿着线移动)。一般来说,运用的传感器越多,巡线的速度越快。现在咱们来实验第一个办法(非PID办法)。巡线其实是让机器人沿着线的边际走,由于假如沿着黑线自身走,当机器人违背黑线,传感器“看到白色”时,咱们不知道机器人究竟在线的哪一边,是在线的右边仍是左面?假如沿着线的边际走,当光电传感器“看到白色”,咱们知道机器人在线边际(线)的左面,当光电传感器“看到黑色”,咱们知道机器人在线边际的右边(在线上)。由于机器人跟从的是线条的左面,因而这种办法被称为“左手规律”。咱们需求知道当光电传感器“看到白色”和“看到黑色”时回来的读数值。一个典型的非校准传感器(数值0~100)“看到白色”会回来50,“看到黑色”会回来40。咱们能够在一条数据线段上标出光电传感器的读值,来协助咱们了解怎么将光电传感器的读值改动转变为机器人的运动改动。以下是咱们画出的从“白”到“黑”的光电传感器读值。

咱们把这个数值线段平分为两部分:当光电传感器值小于45,让机器人左转;当光电传感器值大于45,让机器人右转。在这儿,咱们不考虑机器人的转向动作的准确性。在相对较直的线上,机器人的转向动作能够比较细微;在有许多弯的线上,机器人一般要有显着的转向动作。做动作细微的转向时,你能够把速度快的轮子的马力值设置为50%,速度慢的轮子的马力值设置为20%。有许多弯的现上做显着转向动作时,你能够在快的轮子上设置30%的马力值,在慢的轮子上运用缓停或中止。不管你在轮子上设置什么数值的马力值,在做左右不同转向时,这个设置应该是相同的,即在一侧的轮子上设置较大的马力值,在另一侧轮子上设置较小的马力值(或设置为中止)。
这种巡线办法能够完结巡线使命,但作用并不是很好。在比较直的线上完结巡线使命,在编程中设置动作细微的转弯办法,全体巡线作用看起来还算不错;可是假如线上有较大的弯度,你又选用显着的转向动作让机器人完结巡线,机器人就会来回摇摆,横向穿过线条。机器人只“知道”两件作业:转左和转右。用这种办法巡线,一般机器人的速度不会很快,并且看起来很糟糕。即便线是直的,这种办法也不能使机器人走直线,乃至不能彻底对准线的边际。怎么使巡线更有功率呢?

让咱们来调整一下。把光电传感器的读值线段分红三部分。当光电传感器值低于43时,咱们让机器人转左。光电传感器值在44到47之间时,咱们让机器人直行。光电传感器值大于47时,咱们让机器人转右。这在NXT-G程序中,能够在判别模块中挑选yes/no来完结。你实践上只需做两次判别,而不是三次。
第二种巡线办法作用比第一种办法好的多。至少机器人有时会直接向前走了。与第一种巡线办法相同,你仍然要依据线的是曲特色来决议运用哪种转向办法(细微或许显着的转向动作)。机器人仍旧会有适当数量的来回摇摆。精明的读者或许会想“假如运用3个光电传感器是不会比2个光电传感器要好些呢?在添加更多的光电传感器会怎样?”这便是PID的开端了。

“PID”中的“P”:份额操控是要害
假如咱们把光电传感器读值的数据线段分红更多的段,会怎样呢?咱们要处理的第一件作业是,当光电传感器读值的数据线段的分段数超越3段时,要怎么确认“turn(转向)”的取值。在咱们的第一种巡线办法啊中,机器人只做两件作业,转左或转右,“turn(转向)”的数值是相同的,仅仅方向不同。在第二种巡线办法中,咱们在左右两个转向的基础上加上了“直行”。在光电传感器读值的数据线段分段超越3个时,咱们需求更多“品种”的“turn(转向)”。为了协助了解“更多品种的turn(转向)”,咱们从头画出光电传感器读值的数据线段,并把它转化为图形。X轴(水平线)为光电传感器读值值,与上面的光电传感器读值的数据线段相同。Y轴(笔直线)是“turn(转向)”轴。
左面的图形标明的是咱们第一种巡线办法——将光电传感器读值分红两段的状况,机器人只能做两件事(用蓝色的线标明),转左或转右,除了方向以外,转向值是相同的。中心的图形是第二种巡线办法——将光电传感器读值分红三段的状况,中心添加的一段是机器人直行的部分(turn=0),转向部分与前面的第一种巡线办法是相同的。右侧的图形是一个份额操控的巡线机器人,在两个极限点之间的转向改动很滑润。假如光电传感器读取的光值标明机器人离线很近,机器人就做小的转弯;假如读取的光值标明机器人离线很远,机器人就做较大的转弯。份额是一个重要的概念。份额的意思便是在两个变量之间存在线性联系,简略的说,便是变量之间的联系呈现为一条直线(如右侧图形所示)。
直线的表达式为:
y= mx + b
这儿,x,y是指直线上恣意一点的坐标值(x,y),m是这条直线的斜率,b是直线在Y轴上的截距(当x=0时,直线通过Y轴上的点,该点在Y轴上的坐标值)。直线斜率的界说为直线上恣意两点y值的改动量除以x值的改动量。我来把图形和表达式变得简略一些。首要,咱们将光电传感器读值线段(X轴)的中心点定为0,由于咱们的光电传感器读值规模是40到50,咱们把一切光电传感器读数都减掉45(这是40和50的平均值,(40+50)/2),得到的成果称为“error(差错)”。当光电传感器读数为47时,可得到error=47-45=2。这个error(差错)标明晰机器人的光电传感器离线的边际有多远。当光电传感器正好在线的边际上,“error(差错)”为0(由于此刻光电传感器的读值为45,而咱们要从光电传感器读值中减掉45)。假如光电传感器悉数处在白色的当地,“error(差错)”为 +5,假如光电传感器悉数处在黑色的当地,“error(差错)”为 -5。
2011-8-28 21:39 上传
下载附件(3.71 KB)
在上面的图形中,我现已用“error(差错)”来标明X坐标轴。由于这条直线正好在原点处通过Y轴,因而b的取值为0,这样表达式会变得简略一些:
y = mx
或许运用咱们的办法:
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)在份额规模之外,操控器只能把机器人向正确的方向移动,但也仅仅趋向于正确。操控器的份额呼应是受份额规模约束的。
从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,会更好)
常数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.
虚拟代码如下:
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,将设置马达功率的两行代码做如下改动:
powerA = Tp – Turn
powerC = Tp + Turn
在这个P操控器里有两个“可调参数”和一个恒量。恒量便是offset(补偿量)(黑色和白色光电传感器读值的平均数)。你需求编写一小段程序,在巡线测验纸上用你的机器人来丈量光电传感器读值。你需求丈量出“black(黑)”和“white白”的光电传感器读值,然后核算平均值,并把平均值写入P操控器程序中的offset变量。简直一切的巡线机器人都要做这一步作业,你能够人工进行,也能够通过编写程序代码让机器人主动完结。

Kp值和Tp(方针功率)值是可调参数。可调参数有必要通过重复实验才干确认。Kp决议了当机器人逐渐离开线的边际时,操控器让机器人回来线的边际的速度有多快;Tp决议了机器人沿着线向前移动的速度有多快。
假如线比较直,你能够将Tp的值设置的高一些,进步机器人的运转速度;将Kd的值设置的小一些,使机器人的转向动作(批改)更细微。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/318078.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部