本帖最后由 James.Yang 于 2012-12-5 19:46 编辑
第12章 决策,决策本章将介绍公用模块中的最后一个模块。当你完成本章后,你将具有可以给你的机器人创建一些复杂程序的能力,以使机器人移动,说话,听讲,碰撞,停止,等待及其它更多的动作。(但是还是有大量的NXT-G模块需要学习,所以不要停止学习!) 让我给你的机器人另一个智能——进行决策及从一堆可能的行为中进行选择。选择对你的机器人是非常重要的;随着机器人具有在2个或者更多选项中进行选择的能力,你的机器人可以完成更复杂的行为。 左或右?1号门还是2号门?让我给SPOT的下一个任务一些伪代码: [我:SPOT我要你向前转动3圈,然后停止。如果你的光线传感器检测到光线值大于30,则向左转。否则向右转。 到现在,你已经知道如何使用移动模块编程让SPOT向前移动3圈。但你如何使用光线传感器的光线值来帮助SPOT作出向左或向右转的决定? 回答很简单。你将使用如图12-1所示的开关模块。 图12-1 开关模块让你的机器人作出选择 开关模块使用一个输入值来决定要执行的路径。这个值可能是一个数字,一些文本,或者是一个逻辑值(真或假)。且你也不限于两个路径。你可以配置开关模块来处理以下伪代码: [我:SPOT,从1到5挑选一个随机数。 [我:如果是数字1,向左转。 [我:如果是数字2,向右转。 [我:如果是数字3,旋转180度。 [我:如果是数字4,旋转360度。 [我:如果是数字5,继续前进。 在这个例子中,我让SPOT选择一个随机数。这将使用到第14章将要介绍的随机模块。但对目前来说,我们假定SPOT自己能够选择一个数字。现在,由于有5个潜在的数字(1,2,3,4,5),它可以采取5个潜在的动作。在本章的剩余的部分,我将会使用路径这个术语来代替动作,因为开关模块允许你的机器人可以从它们所具有的不同路径中进行选择。 根据机器人选择的不同路径,将会有不同的动作发生。一个路径让你的机器人向前移动,并用超声传感器检测它前面的物体。选择不同的路径可能让同一个机器人作相反方向的运动,等待它的触摸传感器被按下,并记下电机旋转的圈数。这就是开关模块的强大之处。每个可能的路径选择可以拥有独特的编程模块,让你的机器人更加强大。(你可以在某一路径中再添加另一个开关模块,为你的机器人创建另一个路径选择!这就像嵌套循环模块,只不过这里用一个新的开关模块嵌入另一个已有的开关模块。) 平面视图和选项卡视图现在,在我告诉你开关模块如何工作之前,我将提一下在开关模块配置面板中的一个特殊项目。请见图12-2。 图12-2 开关模块的平面视图 当使用开关模块时,你需要在平面视图和选项卡视图之间进行选择。当使用平面视图时,你需要选中平面视图的复选框(如图12-2所示)。 然而,必须注意,平面视图有一个限制。当使用平面视图时,你只有两条路径可供选择。注意图12-2中,有两条路径:一条路径带有“√”和另一条路径带有“X”。带有“√”的路径也被称为默认路径(稍后会作详细说明)。然而,如果使用传感器作为控制,默认路径和另外路径的图标会发生改变。我随后会展示一个简短的例子。 现在,在图12-3中,我已经取消平面视图的复选框,你现在可以看到,在开关模块顶部边缘有一些选项卡。 图12-3 开关模块的选项卡视图 在选项卡视图,你必须点击一个选项卡以查看已放在它里面的程序模块(如果有的话)。然而,这是提供两个以上的选项能力所需要花的小代价。还记得上面提到的伪代码让SPOT挑选1到5之间的随机数?图12-4显示了一个包含5个选项卡的开关模块,每个选项卡对应于我要求SPOT完成的动作之一。 图12-4 开关模块拥有5个不同路径的5个选项卡 选择现在是时候向你介绍如何配置开关模块,以便于你用它来给你机器人一些选择。 在图12-5中,我已经放置一个开关模块,使用平面视图。这意味着我只能给我的机器人两种可能的路径。第一条路径(带有小花图标)在上部和第二条路径(带有小山图标)在底部。 图12-5 开关模块有两个可能的路径。 这个例子也显示开关模块的功能。在控制部分,有一个能提供两个选项的下拉菜单:传感器和数值。选择传感器选项将配置为根据你所选择的传感器及其触发值来决定正确的路径。 在这个例子中,我选择了超声波传感器。我已经将超声波传感器配置为检测机器人面前小于64厘米(但不等于64)的地方是否有物体或障碍物。如果这一条件得到满足(真),开关模块将执行真路径上的所有模块(上部顺序条,小花图标)。如果条件没有得到满足(假),开关模块将执行假路径上的所有模块(下部顺序条,小山图标)。 目前,让我们假设SPOT安装了超声波传感器和声音传感器。我给SPOT以下的伪代码: [我:SPOT,当你的超声波传感器在你面前小于64厘米的地方检测到一个物体时,如果你的声音传感器检测到的声级大于20,请左转。 我已经向你介绍了如何配置使用超声波传感器的第一个开关模块。让我们假设SPOT的超声波传感器在他的面前小于64厘米的地方检测到了物体。这意味着,在上部顺序条内的任何模块(真路径)将被执行。从伪代码知道,如果第一个条件得到满足,你要SPOT左转,必须在他的声音传感器探测到的声音大于20。你将如何做到这一点?简单 ——你将使用另一个开关模块! 首先,你拖放另一个开关模块到上部顺序条,并对其进行配置,如图12-6所示。 接着,配置第二个开关模块,使用声音传感器并检测声音是否大于20。如果条件得到满足,将执行第二个开关模块真路径(上部顺序条)上的任何模块。这里将是你放置移动模块并使SPOT左转的地方(如图12-7所示)。 图12-6 使用声音传感器的第二个开关模块 图12-7 当第一个和第二个开关模块的条件得到满足,SPOT将左转 这就是开关模块的嵌套。你还可以继续将开关模块嵌套下去。这将使你的机器人具有优秀的决策控制能力! 两个以上的条件但是,如何编程让你的机器人测试多个条件?并非所有的情况下都只有两个选项,不是吗?让我们给SPOT另外一个例子。请见图12-8所示。 图12-8 SPOT需做出几个决定 下面是伪代码: [我:SPOT,当你到达走廊里的十字路口时,从1到3选一个数字。如果数字是1,向左转。如果数字是2,向右转。如果数字是3,继续向前。 要编程做到这一点,还记得若要使用两个以上条件时,不要选中开关模块平面视图的复选框。这是第一个要求。第二个要求是,当配置两个以上路径的开关模块时,开关模块必须被配置为使用数值选项。这可以在控制部分的下拉菜单中的找到,如图12-9所示。 图12-9 开始一个不选平面视图的开关模块并使用数值选项 现在的开关模块拥有一个小的输入数据接头。此数据接头可以接受一个数字数据类型,一个文本数据类型,或一个逻辑数据类型,可以在类型部分的下拉菜单中选择数据类型。 使用伪代码,你可以看到三种可能的情况: Ÿ 如果SPOT选择1,向左转。 Ÿ 如果SPOT选择2,向右转。 Ÿ 如果SPOT选择3,继续向前。 在这个例子中,我将使用将在第14章中讨论的随机模块。现在,不用操心它是如何工作的,只要从模块共用区内拖放一个随机模块到顺序条,并将其放置在开关模块前面,如图12-10所示。(如果你确实想知道随机模块是如何工作的,就跳到第14章进行阅读,我会在这里等你。) 图12-10 随机模块将生成1,2或3数值。 对于随机模块的配置面板,只需在最小值文本框内输入数值1,在最大值文本框中输入数值3,如图12-10所示。 从随机模块拖一根数据线到开关模块(如图12-11所示)。 图12-11 用数据线将随机模块与开关模块连接 接下来,你需要对开关模块配置为可以接受两个以上条件。要做到这一点,再次点击一下开关模块(如果尚未选中),并看一下配置面板。在配置面板的左侧,你将看到条件部分(如图12-12所示)。 图12-12 开关模块的条件部分 让我来解释一下你目前看到的内容。这是包含路径数值的路径列表。每个路径拥有一个开关模块要检查的默认值。在这个例子中,你会看到以下内容: 1. 0 2. 1 左边的1和2是可能条件,这个与你在开关模块上部边缘看到的选项卡数量是相匹配的。右边的0和1值是开关模块将用来选择路径的默认数字值。例如,如果输入到开关模块数据接头的数值是0,那么将选择第一个条件,并且执行第一个选项卡内的任何模块。 但是,你需要三个条件——对应于随机模块产生的数值1、2和3。要做到这一点,点击图12-12中的小小的加号按钮(+)。它将增加第三个条件,并自动配置它的默认值2。如图12-13所示。如果你单击新条件,你可以将默认值2改变为你喜欢的任意数字。下面你将要做这个动作。 图12-13 有三种可能路径的开关模块 请注意,现在条件部分有一个新行: 1. 0 2. 1 3. 2 现在开关模块有三个选项卡。如果开关模块检测到数值2,将执行第3个选项卡内的模块。 这里有一个小问题:SPOT将只挑选数值1,2或3。但是,路径选项是0,1和2。你可以怎样改变它呢?如果你单击其中某一个条件,你可以在条件部分下部的文本框内改变它的值。首先,点击你想改变其值的条件(如图12-14所示)。 图12-14 点击一个条件,改变它的值。 在这个例子中,选择了第三个条件,拥有一个默认值为2。在条件下面的文本框中输入数值3,如图12-15所示,然后按回车键。 图12-15 点击你要改变数值的条件 你也可改变第一和第二个条件,分别将他们的值改为1和2,如图12-16所示。 图12-16 更改所有条件的数值。 默认的决策最后,你也许已经注意到条件旁边的钩。在图12-16中,它是在第二个条件(由数值2表示)旁边。“√”标记表示在开关模块不能做出决定时,该条件作为开关模块使用的默认值并选择它相对应的选项卡(以及它的模块)。例如,假设我已经配置随机模块选择1到5之间的一个值。但如果随机选择了4或5,没有配置特定的条件让他们做什么。假设你想让4或5同3一样处理。在这种情况下,将执行第三个选项卡上模块,因为你已经点击小星号(*)按钮选择了条件3,如图12-17所示。 图12-17 配置开关模块的默认设置
注意:当遇到一个开关模块时,必定会发生一些动作。程序中必须有一个条件得到满足以便继续运行。因此,在大多数情况下,必须指定一个默认条件。你可以对某一个条件给条空路径,不包含任何NXT-G模块。当对某个条件不需要动作时,可以设置一条空路径并将其设为默认路径。因此,当一个传感器或随机模块或其它模块没有触发开关模块中指定的条件,默认条件就会被选中,没有模块被执行,结束开关模块并继续运行程序。
警告:必须注意,对同一个数字不能有两个或者两个以上的条件。这是因为开关模块会被搞混,不知道该走哪条路径。理解了吧?如果条件1对应数值1,条件2也对应数值1,如果随机模块发送数字1,开关模块将选择哪条路径?幸运的是,开关模块很聪明,不会让你犯这样的错误。 执行!现在,你已经配置了三个条件以及默认条件(条件3),你可以放置让SPOT左转、右转及继续向前的移动模块。 如果SPOT选择1,他就左转。因此,点击第一个选项卡(如图12-18所示),放置一个可以让SPOT左转的移动模块。 图12-18 如果SPOT选择1,将执行第一个选项内的移动模块 我会对第二个和第三个选项卡做相同的操作。当随机模块生成一个1到3的数字,这个数字传递到开关模块。开关模块取得这个数字,并与其条件部分中的数值进行比较。如果随机模块发送一个数字3,开关模块取得这个数字,并知道与第三个条件的3相等,然后执行第三个选项卡上所有模块。简单! 然而还有最后一个警告——如果随机模块发疯似的发送了一个数字4或5给开关模块,将会发生什么?没有条件与数字4或5相匹配,因此会发生什么?不错,还记得当你选择了一个条件,并点击了*键,条件旁边出现一个“√”标记吗?“√”标记指定了默认的条件。再回头看一下图12-17。“√”标记在第三个条件旁边。这意味着,如果随机模块提供了一个数字4或5,就会选择默认路径。因此,对数字4,5,100,或任何其他非1或2的数字,将执行第三个选项卡内的模块。 开关模块是给你的机器人具有强大的决策能力的一个非常有用的模块。开关模块可以使用逻辑值(真或假),数字,文字,和传感器,由机器人来选择执行哪些路径。请记住,当你需要机器人具有根据不同类型的输入,做出不同决策能力时,需要使用开关模块。 随着编程技能的提高,你会发现开关模块是你最喜欢使用的工具之一。 现在,在结束本章内容进入一些更高级的NXT-G模块之前,我想让你尝试创建一个满足练习12-1要求的NXT-G程序。如果你有问题,我在本章末尾提供了答案。 练习12-1 向左还是向右?编程让SPOT检查他的周围并根据传感器输入做出一些决定。SPOT应按以下规则在室内走动: Ÿ 向前移动直到颜色传感器检测到地板上有红色或黄色胶带。 Ÿ 如果检测到红色胶带,左转90度并向前移动10圈。 Ÿ 如果检测到黄色胶带,右转90度并向前移动10圈。 下一步内容?在接下来的几章中,你将会学习一些特殊模块。你将学习到停止机器人程序执行的模块。不管你相信与否,停止及什么都不做,有时就是机器人要做的事情。学习完停止模块后,将学习随机模块。随后还有很多模块,所以不要停止。 练习解决方案练习12-1的解决方案可以参见图12-19至图12-24。请注意,第一个等待模块是用来检测是否有有色胶带(红色或黄色),通过在颜色传感器等待模块配置面板上拖动条件滑动条来指定颜色。一旦发现一个红色或黄色的胶带,开关模块将检测胶带以确定它是否是红色。如果是红色,图12-21指定的条件为真,在开关模块上部的移动模块将被执行(见图12-22)。如果胶带不是红色,那么它必定是黄色的(因为颜色传感器等待模块只有是红色或黄色时才中止),这将导致开关模块底部的移动模块被执行,如图12-23所示,(机器人向右旋转)。当转弯结束后,最后一个移动模块将使机器人向前移动10圈(如图12-24所示)。 图12-19 完整的程序和第一个移动模块的配置面板 图12-20 颜色传感器等待模块的配置面板 图12-21 开关模块的配置面板 图12-22 真路径上的移动模块的配置面板 图12-23 假路径上的移动模块的配置面板 图12-24 最后一个移动模块的配置面板 |