3.2.1 控制流程和控制结构
机器人执行的任务可以是一系列逐步进行的步骤,是一个顺序控制流。控制流术语详细说明了过程进行的方向,即程序控制“流”。控制流决定了当给定一定的条件和参数时一个计算机将如何响应。图3-6给出了一个顺序控制流的例子。在生日场景的另外一个机器人是BR-3,它的任务是为来宾开门,图3-6展示了这项任务的顺序控制流。
图3-5 点燃蜡烛的流程图
图3-6 BR-3执行任务的流程图
机器人走向门,打开,说“欢迎”,然后关门并回到“原始位置”。这看起来像一个相当草率的主人。给BR-3表示来宾在门口的信号的门铃响了吗?如果有人在门口,说“欢迎”后,BR-3在关门之前让来宾进来了吗?BR-3生日聚会上应该能够以一种可预测方式行事。这意味着基于事件做出决定,做重复的事情。决策符号用于为其他流控制构建分支,用来表达决定、重复和选择语句。一个简单的决策是一个if-then或if-then-else语句的结构。
图3-7a展示了一个针对BR-3的简单if-then决策。“如果门铃响了,则走到门的位置并打开门”。现在,在说“欢迎”之前,BR-3将等待直到来宾进门。注意,如果来宾还未进门可以采取可选择动作,BR-3将等待5秒然后检查来宾是否已经进门。如果“是”,则BR-3说“欢迎”并关门。这种if-then-else决策在图3-7b给出,可选择动作是等待。
图3-7 如果-则和如果-则-否则决策的流程图
在图3-7中,需要回答的问题(或条件测试)是门铃是否已经响了。在BR-3准备开门之前,如果确定会遇到超过一个问题/条件测试会怎样?关于BR-1,在点燃蜡烛之前,如果一定会遇到多个条件将会怎样:
·“如果唱歌并且打火机打着了则点燃蜡烛”。
·在这种情况下,两个条件都要满足,这就是所谓的嵌套决策或条件。
如果一个问题或情况有很多不同的可能的答案,并且每个答案或情况都有不同的动作要执行,将会怎样?例如,当BR-1或BR-3经过房间时遇到一个物体,它必须绕开物体而到达目的地,这将如何处理。它可以检测路径上物体的距离以决定采取何种规避物体的动作。如果物体在一定距离范围内,BR-1和BR-3向左转90°或45°,选择物体周围另外一个路径,然后再继续原来前往它们目的地的路径,如图3-8所示。
图3-8 机器人避障
该流程图可以表示为一系列决策或一个选择语句。一种情况是在一个问题上有几个可能答案的决策。对于这一系列决策,同样的问题被问了三次,每一个都有不同的答案和动作。对于选择语句,问题仅表达一次。图3-9对比了这一系列决策和选择语句,阅读和理解起来更加简单。
图3-10给出了重复和循环。在一个循环中,一个简单的决策伴随一个条件测试之前或之后执行的动作。根据结果,再次执行动作。在图3-10a中,动作将至少执行一次。如果条件没有满足(唱歌没有开始-也许每个人玩得太开心了),机器人必须继续等待。这是一个do-until循环的例子,“do”这个动作“until”条件为真。while循环首先执行条件测试,如果满足则执行动作。这在图3-10b中给予描述,唱歌还没有开始时,等待,BR-1将循环和等待直到唱歌开始;和do-until循环相比,差异是在条件满足后执行等待。另外一种类型是for循环,如图3-10c所示,其中条件测试控制循环执行的特定次数。
图3-9 对比选择语句和系列决策