【中学生创客.虚拟机器人】5.2汽车总动员-紧急让道随行

第二节 紧急让道随行

一、任务初探

大家一定在马路上见过一路响着警铃呼啸而过的救护车,车上往往载着濒临死亡的病人,为了挽救这些生命,交通规则赋予了他们先行的权利。当我们的机器人小车遇到了救护车,为了生命,同样需要让道。但是在让道的同时,为了保证我们自己的事情不被耽误,我们可以紧跟着救护车行驶。那么,在搭建机器人小车的时候,需要用哪些传感器才能实现这个功能呢?传感器的安装位置又该如何选择?跟随救护车行驶的程序又该如何编写?

上节课,我们的机器人小车已经在赛道上开了一段路程并获取了一些得分物体。这节课,  我们的机器人将从上节课的终点开始,继续它的赛车生涯。这次,我们的赛车又将面临新的挑战。在这段新的赛道中,会随机地在我们的小车前方出现一辆救护车来带走在比赛中发生事故的赛车。我们的小车在发现救护车后,必须遵守交通规则让救护车先行;另一方面,为了最大限度地节省时间,我们要让小车紧紧跟随救护车行驶。在救护车离开赛道后,小车可以继续前进。

这里为了防止对比赛产生太大的干扰,比赛的举办方规定了救护车在赛道中的停留时间不得超过 9 秒。因此,驾驶技术炉火纯青的救护车驾驶员每次停留在赛道上的时间正好是 9 秒。

二、知识汲取

这次,我们的机器人小车需要学会一个飞车的动作。

电影中绚丽的飞车特技,其实操作方法并不复杂,大家可以回忆一下物理中学过的抛物线:上坡的过程中,小车以一个较大的速度行驶;到达坡顶部的时候,小车有一个较大的初速度;在这个初速度的作用下,小车不会沿着下坡的道路行驶,而是在空中“飞行”一段时间再落到地面。这样,小车就以一个抛物线的轨迹完成了飞车动作。

(一)计时模块

之前的学习中,当有单个程序动作需要保持一段时间的时候,我们用的是延时模块。但是,如果有一长段的程序或者一个子程序需要延时呢?这时候我们就要用到“驱动”类别中的 “开始计时”与“获取计时”两个模块。

开始计时”模块的作用是,将计时时间清零,并从当前时刻开始计时。

获取计时”模块的作用是,获取当前的计时时间,即, 从开始计时到当前时刻所经过的时间。值得一提的是,我们在使用“获取计时”模块之前,一般要先使用一个“开始计时” 模块来把计时时间清零。否则,“获取计时”模块得到的值将失去意义。

三、实践验证

(一)搭建机器人

这里我们的机器人小车与前一段赛道的小车类似,也是用两个障碍传感器来靠左(右)行驶。不同之处在于,这里我们不需要获取得分物体,因此小车上不需要安装红外探测器,而是要在机器人小车前方正中间安装三个障碍传感器来监测前方的救护车。同之前一样,我们将五个障碍传感器通过长方体安装柱固定在小车上,并分别命名。最左边两个用来靠左行驶的障碍传感器分别命名为障碍传感器_左远与障碍传感器_左近,中间三个用来监测前方救护车的障碍传感器分别命名为障碍传感器_左内、障碍传感器_前中与障碍传感器_右内。

表 5-2-1 障碍传感器的属性设置

 

序号

设备

端口

检测距离

1

障碍传感器_左远

35

450

2

障碍传感器_左近

34

450

3

障碍传感器_左内

31

300

4

障碍传感器_前中

32

300

5

障碍传感器_右内

33

300

 

 

安装完成后,与前面的章节一样,我们需要设置障碍传感器的属性以及直流电机的端口。  障碍传感器的属性设置如表 5-2-1 所示;直流电机的端口设置可参考第一节。最后将机器人小车以“机器人_汽车总动员_5_2”为文件名进行保存。

(二)设计程序

1.任务动作分析并绘制流程图

根据前面我们对这次任务的分析,可以将本次任务分为三个阶段:遇到救护车前的靠左行驶阶段、跟随救护车阶段以及救护车走后的靠左行驶阶段。与前面一样,我们可以先编写两个子程序:靠左行驶子程序和跟随救护车子程序。第一阶段和第三阶段,调用靠左行驶子程序;第二阶段,调用跟随救护车子程序。整个程序的流程图如图所示。

2.程序编写

下面,我们开始进行程序的编写。首先,按照流程图完成主程序,如图。首先,在while 条件循环中查询障碍传感器_前中的值是否为 0。若障碍传感器_前中的值为 0,说明前方没有救护车,于是调用“靠左行驶”子程序;若障碍传感器_前中的值为 1,说明前方出现了救护车,于是程序进入第二阶段。这时候先使用一个“开始计时”模块将计时时间归零,接着就要进入 9 秒的“跟随救护车”过程。这里我们在 while 条件循环模块中放置一个“获取计时”模块,当计时时间小于 9 秒的时候,调用“跟随救护车”子程序。当计时时间大于9 秒,跳出循环。

这时候我们的程序进入了第三阶段,首先让电机停止 2 秒钟,等待救护车离开赛道。接着,依旧调用“靠左行驶”子程序,直到到达终点。

表 5-2-2 第一个判断模块利用障碍传感器判断前方是否有救护车

序号

功能模块

参考值

1

判断条件为前中障碍传感器的

等于 1

2

值等于 1

调用“靠左行驶”子程序

3

值不等于 1

进入下一个判断模块

 

表 5-2-3 第二个判断模块利用计时模块判断是否跟随救护车

序号

功能模块

参考值

1

判断条件为当前计时时间

小于 9

2

小于 9

调用“跟随救护车”子程序

3

大于 9

电机停止 2 秒

 

 

接下来,要编写两个子程序。首先是“跟随救护车”子程序。这里我们通过查看障碍传感器_左内和障碍传感器_右内的值来判断救护车的方位,从而决定我们的机器人小车应该如何行驶。两个障碍传感器的值与救护车位置的关系,以及小车应该做何动作,可以参考表格。表 5-2-4 第一个判断模块利用计时模块判断救护车是否在正前方

序号

功能模块

参考值

1

判断条件为左右障碍传感器的值

左内障碍传感器= 1, 且,右内障碍传感器= 1

2

左内障碍传感器= 1, 且,右内障碍传感器= 1

慢速直行

3

左右两个障碍传感器不全等于 1

进入下一个判断模块

 

表 5-2-5 第二个判断模块利用计时模块判断救护车是否在左前方

序号

功能模块

参考值

1

判断条件为左右障碍传感器的值

左内障碍传感器= 1,

且,右内障碍传感器= 0

2

左内障碍传感器= 1,

且,右内障碍传感器= 0

向左偏转

3

左内障碍传感器= 1,右内障碍传感器= 0,

两者不能同时满足

进入下一个判断模块

 

表 5-2-6 第三个判断模块利用计时模块判断救护车是否在左前方

序号

功能模块

参考值

1

判断条件为左右障碍传感器的值

左内障碍传感器=0,

且,右内障碍传感器=1

2

左内障碍传感器=0,

且,右内障碍传感器=1

向右偏转

3

左内障碍传感器=0,右内障碍传感器= 1,

两者不能同时满足

快速直行

接着,另一个子程序“靠左行驶”,其实与上节课中的“靠右行驶”子程序是原理相同的,只是左右方向相反而已,同学们可以参考上节课的程序。

最后将程序以“机器人_汽车总动员_5_2”为文件名进行保存。

(三)进入仿真

接下来,我们进入最后的仿真阶段,打开任务场景、机器人与程序后,进入仿真界面,  同学们就可以验收刚刚的成果了。仿真的过程中,同学们也可以做以下尝试,看看小车的运行会发生什么变化:

1.改变“跟随救护车”子程序中,小车的转弯幅度。

2.将主程序中第二阶段的计时时间改为 6 秒钟。

3.将主程序中第二阶段的计时时间改为 10 秒钟。

四、课后提升

1.这里主办方限制了救护车在赛道上逗留的时间。那么,如果现在救护车在赛道上逗留的时间没有限制,那么“跟随救护车”子程序中也就不需要限定 9 秒钟了。这时候,当救护车向右转弯离开赛道,如果还用原来的“跟随救护车”子程序,小车就会跟着救护车向右转弯离开赛道了。想一想,这时候,“跟随救护车”子程序应该怎么修改才能使我们的小车在救护车离开赛道后不再跟随,而是继续在赛道上“靠左行驶”?小车需要额外添加零件吗?

网友留言(0 条)

发表评论

验证码