• 沒有找到結果。

第七讲 机器人距离探测

在文檔中 基础机器人制作与编程 (頁 91-103)

表(Panasonic PNA4602M)的频率特性图。这个特 性图显示了红外线传感器在接收到不同于38.5 kHz 在区域3。也就是说,当机器人发送37500 Hz和38250Hz频率的红外线时能发现物体,发送39500 Hz 、40500 Hz 以及41500 Hz频率的红外线就不能发现物体。如果你移动物体到区域2,那么发 送37500 Hz、 38250 Hz以及39500Hz的红外线可以发现物体,而发送40500Hz和41500Hz频率的 红外线就不能发现物体。

基础机器人制作与编程

© 2008 Open-Tech. All rights reserved. 88 令LOOKUP的用法定义如下:

LOOKUP Index, [Value0, Value1, …ValueN], Variable

如果变量Index的取值为0,那么方括号中Value0的值将被赋给变量Variable。如果变量Index 的取值为1,那么方括号中Value1的值将被赋给变量Variable。列表中可以储存256个数值,但对 于下面的例程而言,你只需要5个数值。下面是怎样使用它的例子:

FOR freqSelect = 0 TO 4

LOOKUP freqSelect,[37500,38250,39500,40500,41500],irFrequency FREQOUT 8,1, irFrequency

irDetect = IN9

' Commands not shown...

NEXT

在FOR…NEXT 循环语句第一次执行时,freqSelect 的值为0,所以LOOKUP 命令把37500 赋予变量 irFrequency 。因为在执行命令LOOKUP 之后,变量irFrequency值为37500, 所以 FREQOUT 发送该频率到与P8连接的红外线发光二极管上。和前面章节中一样,数值IN9 保存 到变量irDetect 。在FOR…NEXT 循环语句第二次执行时,freqSelect 的值为1,所以LOOKUP 命 令把38250赋予变量 irFrequency 。第三次重复上述工作时,把39500赋予变量 irFrequency , 依次类推。

例程――TestLeftFrequencySweep.bs2

TestLeftFrequencySweep.bs2 要做两件事情。首先,它测试左边的IR LED/探测器(与P8和 P9连接)以确认它们的距离探测功能正常。然后,它也演示如何完成如图7-2所示的频率扫描。

当你运行该程序时,调试终端将会显示你所测量的区域。会有很多可能的“yes”或“no”

排列模式出现,如图7-3所示是其中的两个。测试模式将由探测器内部的滤波器特性决定。

程序通过计算 “No” 出现的数量,就可以确定目标在哪个区域。注意即使图7-3所示的两 个调试终端的测试结果不同,但它们都有三个“Yes”和两个“No”出现,所以在两个例子中“Zone 2”都是探测到的目标区域。

紧记,这种距离测量方法显然不是非常地精确。然而,它为机器人跟随,跟踪和其他行为 提供了一个足够好的探测距离的能力。

z 输入、保存并运行程序TestLeftFrequencySweep.bs2。

z 用一张纸或卡片面对IR LED/探测器测试距离探测。

z 开始时把纸片贴近IR LED/探测器,大概1cm距离远。调试终端中显示区域应该为0或1。

z 逐渐把纸片远离IR LED,并记录每一个让zone值增大的距离。

图7-2 机器人红外频率探测区域

基础机器人制作与编程

© 2008 Open-Tech. All rights reserved. 89 '[ Title ]--- ' TestLeftFrequencySweep.bs2

' Test IR detector distance responses to frequency sweep.

' {$STAMP BS2} ' Stamp directive.

' {$PBASIC 2.5} ' PBASIC directive.

'[ Variables ]--- freqSelect VAR Nib

irFrequency VAR Word irDetect VAR Bit distance VAR Nib

'--[ Initialization ]--- DEBUG CLS," OBJECT", CR,"FREQUENCY DETECTED", CR,"--- ---"

'[ Main Routine ]--- DO

distance = 0

FOR freqSelect = 0 TO 4

LOOKUP freqSelect,[37500,38250,39500,40500,41500], irFrequency FREQOUT 8,1, irFrequency

irDetect = IN9

distance = distance + irDetect

DEBUG CRSRXY, 4, (freqSelect + 3), DEC5 irFrequency DEBUG CRSRXY, 11, freqSelect + 3

IF (irDetect = 0) THEN DEBUG "Yes" ELSE DEBUG "No "

PAUSE 100 NEXT

DEBUG CR,"--- ---", CR,"Zone ", DEC1 distance LOOP

该你了――测试右边的IR LED/探测器

尽管还有许多标注,但你只需通过替换下面两行代码来修改该程序来测试右边的IR LED/

探测器:

图7-3 距离探测测试输出示例

FREQOUT 2,1, irFrequency irDetect = IN0

FREQOUT 8,1, irFrequency

irDetect = IN9 改为

基础机器人制作与编程

© 2008 Open-Tech. All rights reserved. 90 z 修改程序TestLeftFrequencySweep.bs2 ,对右边的IR LED/探测器做距离探测测试。

z 运行该程序,检验这对IR LED/探测器能否测量到同样的距离。

同时显示两个距离

用一个快捷的程序让机器人的两个探测器同时进行距离探测,有时是非常有用的。下面的 程序由子程序组成,这些子程序可以方便的拷贝和粘贴到其它需要距离探测的程序中。

例程――DisplayBothDistances.bs2

z 输入、保存并运行程序DisplayBothDistances.bs2 。

z 用纸片重复对每个IR LED进行距离探测,然后对两个IR LED同时进行测试。

' --[ Title ]--- ' DisplayBothDistances.bs2

' Test IR detector distance responses of both IR LED/detector pairs to ' frequency sweep.

' {$STAMP BS2} ' Stamp directive.

' {$PBASIC 2.5} ' PBASIC directive.

' --[ Variables ]--- freqSelect VAR Nib

irFrequency VAR Word irDetectLeft VAR Bit irDetectRight VAR Bit distanceLeft VAR Nib distanceRight VAR Nib

'--[ Initialization ]--- DEBUG CLS,"IR OBJECT ZONE", CR,"Left Right", CR,"--- ---"

' ---[ MainRoutine ]--- DO

GOSUB Get_Distances GOSUB Display_Distances LOOP

'--[ Subroutine – Get_Distances ]--- --- Get_Distances:

distanceLeft = 0 distanceRight = 0

FOR freqSelect = 0 TO 4

LOOKUP freqSelect,[37500,38250,39500,40500,41500], irFrequency FREQOUT 8,1,irFrequency

irDetectLeft = IN9

distanceLeft = distanceLeft + irDetectLeft FREQOUT 2,1,irFrequency

irDetectRight = IN0

distanceRight = distanceRight + irDetectRight PAUSE 100

NEXT RETURN

'--[ Subroutine – Display_Distances ]--- Display_Distances:

DEBUG CRSRXY,2,3, DEC1 distanceLeft, CRSRXY,9,3, DEC1 distanceRight

RETURN

该你了――更多的距离测试

z 尝试测量不同距离的物体,弄清物体的颜色和(或)材质是否会造成距离测量的差异。

基础机器人制作与编程

© 2008 Open-Tech. All rights reserved. 91 任务2:机器人尾随控制

本任务要你让一个机器人跟随另一个机器人行走。跟随的机器人,也叫尾随机器人,它必 须知道距离引导车有多远。如果尾随机器人落在后面,它必须能察觉并加速。如果尾随机器人 距离引导车太近,它也要能察觉并减速。如果当前距离正好合适,它会等待直到测量距离变远 或变近。

距离仅仅是机器人和其它自动化机器需要控制一种变量之一。当一个机器被设计用来自动 维持某一数值,比如距离、压力或液位时,它一般都包含一个控制系统。这些系统有时由传感 器和阀门组成,有时由传感器和电机组成。在本书使用的机器人里面,控制系统由传感器和连 续旋转电机组成。除此之外,控制系统还必须有某些处理器可以接受传感器的测量结果并把它 们转化控制指令输出给电机,由电机转化为机械运动。你必须对处理器编程来基于传感器的输 入作出决定,从而控制机械输出。对本书使用的机器人而言,处理器就是BASIC Stamp 2 。

闭环控制是一种常用的维持控制目标的方法,它很好地帮助机器人保持与一个物体之间的 距离。闭环控制算法类型多种多样,最常用的有滞后、比例、积分以及微分控制。所有这些控 制方法都将在后续教材《过程控制》中详细介绍。

绝大部分控制算法都可以用很少的几行PBASIC代码来实现。事实上,如图7-4所示的比例 控制环的主要部分可以精简为一行PBASIC代码。这个图称为方框图,它描述机器人用到的比例 控制过程的步骤,即机器人用右边的IR LED/探测器探测距离并用右边的伺服电机调节机器人之 间的位置以维持适当的距离。

请你仔细观察一下图7-4中的数字,学习一下比例控制是如何工作的。这个特殊的例子是右 边的IR LED/探测器和右边的伺服电机的比例控制方框图。设定位置为2,说明你想机器人维持 它和任何它探测到的物体之间的距离是2。测量的距离为4,距离太远。误差是设定值减去测量 值的差,即2 - 4 = - 2 ,这在圆圈的左方以符号的形式指出,这个圆圈叫求和点。接着,误差传 入一个操作框。这个操作框显示,误差将乘以一个比例常数Kp。Kp的值为35。该操作框的输出 显示为–235 = –70,这叫输出校正。这个输出校正结果输入到另一个求和点,这时它与电机的零 点脉冲宽度750相加。相加的结果是680,这个脉宽可以让电机大约以3/4全速顺时针旋转。这让 机器人右轮向前、朝着物体的方向旋转。这个修正值加入到由机器人、以及距离为4的目标物体 组成的整个系统中,

第二次经过闭环,测量距离可能发生变化,但是没有问题,因为不管测量距离如何变,这 个控制环路将会计算出一个数值,让电机旋转来纠正任何误差。修正值与误差总是成比例关系,

该误差就是设定位置和测量位置的关系的偏差。

图7-4 右边伺服电机及 IR LED/探测器的比例控制方框图

基础机器人制作与编程

© 2008 Open-Tech. All rights reserved. 92 控制环都有一组方程来主导系统行为。图7-4中的方框图是对该组方程的可视化描述方法。

下面是从方框图中归纳出来的方程关系及结果:

Error = Right distance set point – Measured right distance

= 2 – 4 Output adjus = error ⋅ Kp

= –2 ⋅ 35

= – 70

Right servo output = Output adjust + Center pulse width

= – 70 + 750

= 680

通过一些置换,上面三个等式可被简化为一个,提供你相同的结果:

Right servo output = (Right distance set point – Measured right distance) ⋅ Kp + Center pulse width

代入数值,你可以得到一致的结果:

Right servo output = ((2 – 4) ⋅ 35) + 750

= 680

左边的IR LED/探测器以及左边的伺服电机的控制框图如图7-5所示,与右边的运算法则类 似。不同的是比例系数Kp的值由35替换为-35。假设与右边的测量值一样,输出修正的脉冲宽度 应该为820。下面是该框图的计算等式:

Left servo output = (Left distance set point – Measured left distance) ⋅ Kp + Center pulse width

= ((2 – 4) ⋅ –35) + 750

= 820

这个控制环的值让电机大约以3/4全速逆时针旋转。这个对机器人的左轮来讲是一个向前旋 转的脉宽。反馈的意思是,系统的输出被尾随机器人重新采样做另一个距离探测。控制环一次 又一次的重复运行,大概每秒40次。

对尾随机器人编程

记住右边伺服电机的输出方称为:

Right servo output = (Right distance set point – Measured right distance) ⋅ Kp + Center pulse width

下面的例子说明如何用PBASIC语言求解上面的方程。右边距离设置为2,测量距离由变量 distanceRight存储,Kp为35,零点脉冲宽度为750:

pulseRight = (2 – distanceRight) * 35 + 750

图7-5 机器人左伺服电机及 IR Led/探测器的比例控制方框图

基础机器人制作与编程

© 2008 Open-Tech. All rights reserved. 93 左伺服电机的比例系数Kp为-35:

pulseLeft =(2 – distanceLeft) * (-35) + 750

既然数值 -35, 35, 2, 和 750 全都有命名,干脆对这些常数声明如下:

Kpl CON -35 Kpr CON 35 SetPoint CON 2 CenterPulse CON 750

由于程序中有这些常数声明,你可以用Kpl代替-35,Kpr代替35, SetPoint 代替2,CenterPulse 代替750。在常量声明之后,比例控制计算式现在看起来象这样:

pulseLeft = (SetPoint – distanceLeft) * Kpl + CenterPulse pulseRight =(SetPoint – distanceRight) * Kpr + CenterPulse

声明变量后者常量的便利在于,你只需在程序的开始部分对变量做一次改变。程序的开始 部分的修改会反映到所有你用到该常量的地方。例如把Kpl CON指令由-35改为-40,那么程序中 所有Kpl的值都会由-35更改为-40。对于左、右比例控制系统的调试试验来讲,这是非常有用的。

例程―FollowingRobot.bs2

FollowingRobot.bs2重复刚才讨论过的各个伺服脉冲比例控制环。换句话说,在每个脉冲发 送之前,需要测量距离,决定误差信号,然后将误差值乘以比例系数Kp,再将结果加上(或减 去)发送到左(或右)伺服电机的脉冲宽度值。

z 输入、保存并运行程序 FollowingRobot.bs2。

z 把大小为8.5×11英寸的纸片置于机器人的前面,就象障碍物墙。机器人应该维持它和 ' FollowingRobot.bs2

' Robot adjusts its position to keep objects it detects in zone 2.

' {$STAMP BS2} ' Stamp directive.

' {$STAMP BS2} ' Stamp directive.

在文檔中 基础机器人制作与编程 (頁 91-103)