《机器人编程实战》一一3.2 伪代码和绘制RSVP流程图

时间:2024-05-18 12:39:47

3.2 伪代码和绘制RSVP流程图
流程图绘制是一个用来制定目标对整个系统控制流程的RSVP,是一个可以包括任何一种循环、选择或决策的指令行线性序列。通过使用表示某种工作类型的特殊框符号,流程图解释了这个过程。方框内显示的文本描述了一个任务、过程或指令。
流程图是一种状态图(本章稍后会进行讨论),因为它们也包含被转换为动作和活动的状态。决策和重复的事情很容易表示,并且作为一个分支的结果也可以简单描述。有些人建议在写伪代码之前进行流程图绘制。伪代码具有易于转换为一种编程语言或用于编制一个程序的优势。流程图很容易更改,使用流程图软件修改流程图只需要增加一点工作量即可完成。
表3-4列出了伪代码和流程图绘制各自的优缺点。两者都是制定步骤的有力工具。在一个特定时间内、一个项目里,具体选用哪个属于个人喜好问题。
《机器人编程实战》一一3.2 伪代码和绘制RSVP流程图

流程图绘制中常用的四种符号为:
开始和停止:开始符号表示流程图的开始,标签是出现在符号里的“开始”。停止符号表示流程图的结束,标签是出现在符号里的“停止”字样。它们是唯一以关键词为标签的符号。
输入和输出:输入和输出符号包含用于输入的数据(例如用户提供)和处理结果的数据(输出)。
决策:决策符号包含一个问题或一个必须做出的决定。
过程:过程符号包含一个规则或某个动作发生的简短描述(几句话)。《机器人编程实战》一一3.2 伪代码和绘制RSVP流程图

图3-4展示了流程图绘制的常用符号。
每个符号有一个入站或出站箭头指向一个符号或来自另一个符号。开始符号只有一个出站箭头,停止符号只有一个入站箭头。“开始”符号表示流程图的开始,以出现在符号的里的“开始”字样为标签。“停止”符号表示流程图的结束,以出现在符号的里的“停止”字样为标签。它们是唯一以关键词为标签的符号。决策符号包含一个问题或一个必须做出的决定。过程符号包含一个规则或某个动作发生的简短描述(几句话)。决策符号有一个入站箭头和两个出站箭头,每个箭头表示一个经由过程的决策路径,该过程始于此符号:
真/是
假/否
过程、输入和输出符号有一个入站箭头和一个出站箭头。符号包含描述规则或动作、输入或输出的文本。图3-5给出了“点燃蜡烛”的流程图。
注意,流程图的开始,在“开始”符号下面,BR-1等待直到唱歌开始。对唱歌是否已经开始做出决定。两种选择:如果唱歌还没有开始,“假/否”为问题答案,BR-1继续等待;如果唱歌开始进行,“真/是”为问题答案,BR-1进入一个循环或决定。
如果有蜡烛点燃,那就是决策。如果“是”,获得下一根蜡烛的位置,定位机器人手臂至点燃蜡烛芯合适位置的距离,然后点燃蜡烛芯。一个输入符号用于接收点燃下一根蜡烛的位置。BR-1准备点燃所有的蜡烛,一旦完成任务就停止。
3.2.1 控制流程和控制结构
机器人执行的任务可以是一系列逐步进行的步骤,是一个顺序控制流。控制流术语详细说明了过程进行的方向,即程序控制“流”。控制流决定了当给定一定的条件和参数时一个计算机将如何响应。图3-6给出了一个顺序控制流的例子。在生日场景的另外一个机器人是BR-3,它的任务是为来宾开门,图3-6展示了这项任务的顺序控制流。
  
《机器人编程实战》一一3.2 伪代码和绘制RSVP流程图
流程图
机器人走向门,打开,说“欢迎”,然后关门并回到“原始位置”。这看起来像一个相当草率的主人。给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.2 伪代码和绘制RSVP流程图

图3-7 如果-则和如果-则-否则决策的流程图
在图3-7中,需要回答的问题(或条件测试)是门铃是否已经响了。在BR-3准备开门之前,如果确定会遇到超过一个问题/条件测试会怎样?关于BR-1,在点燃蜡烛之前,如果一定会遇到多个条件将会怎样:
“如果唱歌并且打火机打着了则点燃蜡烛”。
在这种情况下,两个条件都要满足,这就是所谓的嵌套决策或条件。
如果一个问题或情况有很多不同的可能的答案,并且每个答案或情况都有不同的动作要执行,将会怎样?例如,当BR-1或BR-3经过房间时遇到一个物体,它必须绕开物体而到达目的地,这将如何处理。它可以检测路径上物体的距离以决定采取何种规避物体的动作。如果物体在一定距离范围内,BR-1和BR-3向左转90°或45°,选择物体周围另外一个路径,然后再继续原来前往它们目的地的路径,如图3-8所示。
《机器人编程实战》一一3.2 伪代码和绘制RSVP流程图

图3-8 机器人避障
该流程图可以表示为一系列决策或一个选择语句。一种情况是在一个问题上有几个可能答案的决策。对于这一系列决策,同样的问题被问了三次,每一个都有不同的答案和动作。对于选择语句,问题仅表达一次。图3-9对比了这一系列决策和选择语句,阅读和理解起来更加简单。
图3-10给出了重复和循环。在一个循环中,一个简单的决策伴随一个条件测试之前或之后执行的动作。根据结果,再次执行动作。在图3-10a中,动作将至少执行一次。如果条件没有满足(唱歌没有开始-也许每个人玩得太开心了),机器人必须继续等待。这是一个do-until循环的例子,“do”这个动作“until”条件为真。while循环首先执行条件测试,如果满足则执行动作。这在图3-10b中给予描述,唱歌还没有开始时,等待,BR-1将循环和等待直到唱歌开始;和do-until循环相比,差异是在条件满足后执行等待。另外一种类型是for循环,如图3-10c所示,其中条件测试控制循环执行的特定次数。
《机器人编程实战》一一3.2 伪代码和绘制RSVP流程图

图3-9 对比选择语句和系列决策
3.2.2 子程序
当考虑机器人在一个场景或态势中扮演什么角色时,角色分解为一系列动作。BR-1的角色是一个生日聚会上的主人,该角色分解为4个状态:
《机器人编程实战》一一3.2 伪代码和绘制RSVP流程图

图3-10 重复流程图:(a)do-until循环,(b)while循环,(c)for循环
空闲
行走
点燃蜡烛
等待
拿走盘子
这些状态可以分解为一系列动作或任务:
1.?等待直到唱歌开始。
走到生日蛋糕桌。
点燃蛋糕上的蜡烛。
回到原始位置。
2.?等待直到聚会结束。
拿走蛋糕桌上的盘子。
回到原始位置。
这些都是任务的简短描述。每个任务可以进一步分解为一系列的步骤或子程序。“点燃蜡烛”是一个复合状态,可以分解为其他的子状态:
定位烛芯
点燃烛芯
实际上,“从蛋糕桌上拿走盘子”和“回到初始位置”也应该分解为一些子程序。从蛋糕桌上拿走盘子需要拿走每个盘子和杯子的机器人手臂定位子程序,行走则需要电机转动的子程序。
图3-11给出了点燃蜡烛及其定位烛芯和点燃烛芯子程序的流程图。
《机器人编程实战》一一3.2 伪代码和绘制RSVP流程图

图3-11 点燃蜡烛、定位烛芯和点燃烛芯子程序的流程图
子程序符号和过程符号一样,但是它包含子程序的名字,名字两边各有一条垂直线。子程序的名字可以是一个描述子程序意图的短语。
然后将流程图开发为这些子程序。使用子程序的优势是不必马上弄明白细节,可以暂时不用考虑搞清楚机器人具体如何执行一个任务。可以先制定*别的过程,然后对动作(任务)进行分解。
在机器人的设计过程中,如果在不同地方使用了类似的步骤,可以提取为一个子程序并用通式表达。这个过程可以用通式表达并放置在子程序中,以备需要时调用,而非重复一系列步骤或开发不同子程序。例如,行走过程分为BR-1行走到蛋糕桌的一系列步骤(TabelTravel)和随后返回原始位置的一系列步骤(OriginTravel),这些都是具有不同开始和结束位置的相同任务。需要一个使用机器人当前和最终位置的Travel子程序,而非两个使用开始和结束位置的子程序。