双感光探头实现复杂路况巡线的程序实例探究
2019-09-10傅文昊张悦
傅文昊 张悦
摘 要:在高中创新活动中,为完成机器人复杂路线寻迹,通常使用三个或以上多感光探头。我们在仅有两个探头的情况下,通过巧妙的程序设计,完成了复杂路线循迹,并就出现的多個复杂路况问题进行了针对性算法设计,做到了创新。
关键词:高中创新;机器人巡线;复杂路线;双感光探头;程序设计
一、问题背景
在2018年暑假举行的宁港台三地青少年科技交流活动中,举行了一次科创机器人大赛,内容为自主设计机器人巡线,并在自制编钟上敲奏一首乐曲。其中机器人巡线问题较为复杂。本次图纸为定量+变量1+变量2。定量、变量1、变量2实物分别为三张独立的写真纸,根据抽签结果,临时将两个变量摆放于定量底图的写真纸上,变量1将在定量的A、B场地随机出现,变量2则在定量的C、D场地随机出现。起点位于图的最右侧一条竖线中点右侧,终点位于图的最左侧一条横线中点。
大赛要求机器人尺寸不超过50CM立方,我们小组制作的机器人实际尺寸约为30CM立方。
通常,在出现这种复杂路线图的情况下,会用3个或3个以上感光探头进行同时检测,通过调整各个感光探头之间的距离,将所有不同的岔道口的特征都覆盖到,然后根据不同的特征对机器人发出指令。然而,我校的机器人小组只有两个感光探头,只能通过程序设计来实现。
在实验中,我们以如图所示的其中一种,变量1出现在D场地,变量2出现在A场合,对此进行分析。
二、关于程序的初步设想
思路如下:主探头GrayA负责引路,副探头GrayB检测是否为岔路口;同时加入计次变量Ci,GrayB每检测到一次黑线,则认为经过一个岔路口,同时Ci+1;预估所经过的每一个岔路口的情况,根据Ci的数值,以一定角度转弯。最终到达终点。根据地图,预计期间一共经过8个岔路口,下文分别用岔路1-岔路8来表示。
第一次伪代码算法如下:
Ci=0
循环,时间间隔0.2秒
IfCi=8then向后1圈,停止所有电机
else
GrayA=True,跟随该轨迹走
IfGaryB=TrueThenCi=Ci+1
IfCi=2then右拐90度
IfCi=3then左拐225度
IfCi=4then左拐45度
IfCi=5then右拐45度
IfCi=6then右拐135度
IfCi=7then左拐90度
Endif
三、程序烧录被机器人执行后产生的问题与解决过程
理论上完全可行的程序在烧录后出现了数个问题,经过大家的讨论,我们将其现象与解决过程例如入如下:
问题1现象:在岔路3处,发生转弯动作完成后,严重偏离主路线。
原因探究:我们发现,由于机器人转弯半径较大,在现有程序指令下,无法避免偏离问题。
问题解决:将GrayB在岔路3处第一次探测到的黑线(对角线)抛弃,继续前行,在该处探测到的第二次黑线(上边线)记录为有效数值,指示左转弯,这样就较好地解决了上述问题。
程序实现:GrayB第一次探测到的黑线记录为Ci=N,无指令;
ifCi=N+1,then左拐225度
问题2现象:Ci变量在某些岔路口写入的数值与预期不符(GrayB探测判断的实际岔路超过预期数量),例如,第一次在经过岔路2之后,我们预期Ci=2,但是实际上Ci=3。
原因探究:在达到岔路2时,GrayB扫过一根竖线,Ci=2,转弯;较大的身躯在转动时,GrayB又扫到一根横线,记录为Ci=3,因此,虽然只经过一个岔路口,但是GrayB实际经过两根黑线。值得提出的是,后来我们在实验过程中发现,在转弯动作发生过程中GrayB探测到的黑线不被记录到Ci中。
问题解决:我们通过调整GrayB与GrayA的距离解决了这个问题,缩短距离,使得GrayB的第二次探测黑线被抛弃。
程序实现:程序不变。
问题3现象:行程的后半段遭遇了最难解决的问题。非常意外的,每次在到达岔路5时,机器人就出现了动作紊乱。
原因探究:我们设置了Ci变量在机器人的小显示屏上实时输出。观察发现,每次到达岔路5时,Ci的值瞬间增加,进退间,Ci变化记录的数值与预期严重不符(GrayB探测判断的实际岔路远远超过预期数量),且数额每次都不定!变化范围检测到了13-26,导致机器人无法按照Ci的数值执行相应指令。再经过仔细研究,我们发现,问题出在了这里各条边之间的距离上。由于该路口机器人的尺寸有超出最下侧边界,且这个路口动作大,且GrayA也在反复探测调整线路,因此GrayB会多次在该区域微动多次来回探测到黑线;且变量1图纸与定量底图的重合边界上,GrayB在扫过两张图组合的复杂岔路时,将会把它视为两种不同的黑色路径,甚至在探测过程中,因为光线的变化,而出现不同的Ci变化。
经过讨论,我们决定,在经过复杂路口之后,将Ci赋值为一个大数值,即GrayB在该路口肯定达不到的数值,掩盖掉了这个矛盾。同理,在经过岔路6时,我们遇到同样问题,同样处理。
程序实现:在经过岔路5的时候,做这样的语句调整(在经过岔路4之后,Ci=6)
IfCi=7then左拐45度,Ci=50
IfCi=51then右拐135度
四、最终算法呈现
经过多次测试之后,最终我们用如下算法实现了功能,在仅有两个感光探头的情况下,准确地完成了这个复杂线路的循迹功能。伪代码如下:
Ci=0
循环,时间间隔0.2秒
IfCi=52then向后1圈,停止所有电机
else
GrayA=True,跟随该轨迹走
IfGaryB=TrueThenCi=Ci+1
IfCi=2then右拐90度
IfCi=4then左拐225度
IfCi=5then左拐45度
IfCi=7then左拐45度,Ci=50
IfCi=51then右拐135度
Endif
五、探究心得
在这次参加宁港台青少年科创大赛的高中机器人队伍中,我们学校成立时间比较短,与南京市的几家名校相比,设备比较简陋。诚然,在设备先进的情况下,机器人的设计与制作会更简单。但是,在我们设备有限的情况下,队友们能够另辟蹊径,通过程序设计来完成一样的功能,我们觉得非常开心,这才是编程的乐趣,创新的意义。