【中学生创客.虚拟机器人】5.4汽车总动员-陡坡飞车

第四节 陡坡飞车

一、任务初探

我们总能在电影里看到这么一幕,主人公驾驶着汽车在路上飞驰,路过一座桥的时候,  桥中间断了,于是主人公猛地一踩油门,车飞了起来,在空中飞行一段距离后,降落在桥的另一端。想想,要完成汽车在空中飞行的动作,驾驶员应该如何操作?如果现在我们的机器人小车也要完成这样一个任务,应该怎么编写程序呢?需要额外增加什么配件吗?

5-4-1 任务示意图

这次,我们的机器人小车终于迎来了赛道的最后一段。在这一段赛道中,小车会遇到一处陡坡。比赛规则规定,小车在经过这段陡坡的时候,必须完成一个飞车的动作,才能获得20 分的飞车分数。而为了让参赛选手能够清楚地辨别出用于飞车的陡坡,比赛举办方给陡坡附近的路面配置了一个与其余路面不同的灰度值,这样参赛的机器人小车就可以通过灰度值的变化判断是否到达飞车的陡坡。我们可以把这次任务分为两部分:一是沿着赛道行走,   二是完成飞车动作。而飞车动作的完成,主要是通过上坡阶段的加速来获得一个较大的速度,  使得小车在离开坡的最高点后能够在空中飞行一段距离。这里需要注意的是,由于小车的飞行是依靠惯性完成的,因此小车在空中飞行的时候无法改变方向。所以小车在离开上坡之前的方向选择尤其重要,这个方向会直接影响小车在空中飞行的轨迹以及落地的位置。

二、知识汲取

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

三、实践验证

(一)搭建机器人

这里我们的机器人小车,要用两个障碍传感器来靠左(右)行驶,用两个灰度传感器来探测是否到达飞车的陡坡。因此,机器人小车的搭建可以参考第三节,如图 5-4-2。

5-4-2 搭建示意图

安装完成后,为传感器分别命名。两个用来靠右行驶的障碍传感器分别命名为障碍传感器_右远与障碍传感器_右近,两个灰度传感器分别命名为灰度传感器_左外与灰度传感器_右外。

 

表 5-4-1 障碍传感器与灰度传感器的属性设置

 

序号

设备

端口

检测距离

1

障碍传感器_右远

43

450

2

障碍传感器_右近

42

450

3

灰度传感器_左外

31

-

4

灰度传感器_右外

32

-

 

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

(二)设计程序

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

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

 

2.程序编写

下面,我们开始进行程序的编写。首先,按照流程图完成主程序,如图。与第三节中一样,这里为了使程序更加清晰,我们可以将是否遇到陡坡的判断模块和靠右行驶子程序当做一个整体,打包成另一个子程序,并命名为“判断是否靠右行驶”子程序。第一个子程序结束后,进入第二个“陡坡飞车”子程序。最后,在一个 while 永远循环模块中调用“靠右行驶”子程序,用来控制小车在最后一段路程行驶。

接着,我们进入子程序的编写。首先完成“判断是否靠右行驶”子程序。这个程序的思路与第三节中一样,只是具体的灰度判断条件需要同学们自己通过对场地各个部分灰度的测试来决定。

 

5-4-5“陡坡飞车”子程序

第二个子程序“靠右行驶”,与前面章节一样,这里也不再赘述。

接着,我们要编写第三个子程序“陡坡飞车”,如图。首先,进入陡坡范围后,为了防止车开歪,我们还是要靠右行驶一段距离。这个可以用计时模块和 while 条件循环来完成, 当计时时间小于某个数值的时候,调用靠左行驶子程序。计时时间到达后,机器人小车应该已经到达陡坡的底部。这时候,为了保证机器人小车飞在空中的时候能够有一个足够大的速度,小车需要以一个较大的速度上坡。因此接下来应该是一个多直流电机驱动模块,让四个直流电机都以一个较大的速度运转,并延时一定时间。为了完美地完成陡坡飞车的动作,同学们需要对这段程序里的几个数值仔细地调试。

程序编写完成后,以“机器人_汽车总动员_5_4”为文件名进行保存。

(三)进入仿真

接下来,我们进入最后的仿真阶段,打开任务场景、机器人与程序后,进入仿真界面,  同学们就可以验收刚刚的成果了。

四、课后提升

1.这里我们在陡坡飞车前是不断判断是否到达陡坡,从而决定是否继续靠边行驶。而在陡坡飞车后,是通过使用一个 while 无限循环调用靠边行驶的子程序来达到靠边行驶的目的。全部的程序里,前后两次分别调用靠边行驶的子程序,不免显得累赘。想想,能否在一个判断语句里完成本次任务的全部程序,若到达陡坡则运行陡坡飞车子程序,否则靠边行驶?

网友留言(0 条)

发表评论

验证码