3.2.2 子程序
当考虑机器人在一个场景或态势中扮演什么角色时,角色分解为一系列动作。BR-1的角色是一个生日聚会上的主人,该角色分解为4个状态:
图3-10 重复流程图:(a)do-until循环,(b)while循环,(c)for循环
·空闲
·行走
·点燃蜡烛
·等待
·拿走盘子
这些状态可以分解为一系列动作或任务:
1.等待直到唱歌开始。
·走到生日蛋糕桌。
·点燃蛋糕上的蜡烛。
·回到原始位置。
2.等待直到聚会结束。
·拿走蛋糕桌上的盘子。
·回到原始位置。
这些都是任务的简短描述。每个任务可以进一步分解为一系列的步骤或子程序。“点燃蜡烛”是一个复合状态,可以分解为其他的子状态:
·定位烛芯
·点燃烛芯
实际上,“从蛋糕桌上拿走盘子”和“回到初始位置”也应该分解为一些子程序。从蛋糕桌上拿走盘子需要拿走每个盘子和杯子的机器人手臂定位子程序,行走则需要电机转动的子程序。
图3-11给出了点燃蜡烛及其定位烛芯和点燃烛芯子程序的流程图。
图3-11 点燃蜡烛、定位烛芯和点燃烛芯子程序的流程图
子程序符号和过程符号一样,但是它包含子程序的名字,名字两边各有一条垂直线。子程序的名字可以是一个描述子程序意图的短语。
然后将流程图开发为这些子程序。使用子程序的优势是不必马上弄明白细节,可以暂时不用考虑搞清楚机器人具体如何执行一个任务。可以先制定最高级别的过程,然后对动作(任务)进行分解。
在机器人的设计过程中,如果在不同地方使用了类似的步骤,可以提取为一个子程序并用通式表达。这个过程可以用通式表达并放置在子程序中,以备需要时调用,而非重复一系列步骤或开发不同子程序。例如,行走过程分为BR-1行走到蛋糕桌的一系列步骤(TabelTravel)和随后返回原始位置的一系列步骤(OriginTravel),这些都是具有不同开始和结束位置的相同任务。需要一个使用机器人当前和最终位置的Travel子程序,而非两个使用开始和结束位置的子程序。