天天看点

《机器人编程实战》一一3.3 目标和机器人状态图

3.3 目标和机器人状态图

状态图是状态机的一种可视化方式。

注释

状态机是在一个环境中单一机器人或物体的行为模型。状态是当某事发生时机器人或物体所经历的转换。

例如,“状态改变”可以简单看作位置的改变。机器人从它的初始位置走到桌子旁边的位置就是一个机器人的状态改变。另外一个例子是生日蜡烛从未点燃状态到点燃状态的改变。状态机捕捉事件、转换并响应。状态图是这些活动的一个图解。状态图用于捕获目标在场景中的可能态势。正如你在第2章所学到的,一个态势是场景中一个事件的快照。br-1可能的态势为:

态势1:br-1等待信号移动到新位置

态势2:br-1走到蛋糕桌

态势3:br-1接近尚未点燃蜡烛的桌上蛋糕

态势4:br-1定位打火机至蜡烛的距离,等等。

所有这些态势代表了机器人状态的变化。当某事发生时,机器人或目标的状态发生变化。事件可以是一个信号、一个操作结果或只是时间的流逝。当一个事件发生时,根据对象的当前状态,发生某个动作。当前状态决定了事件可能是什么。事件作为产生一个条件的触发或刺激,在这个条件里状态可能发生变化。这种从一个状态到另一个状态的变化被称为转换。目标从源状态即状态a,向目标状态即状态b转换。图3-12展示了br-1的一个简单状态机。

《机器人编程实战》一一3.3 目标和机器人状态图

图3-12显示了br-1的两种状态:空闲或行走。当br-1处于空闲状态,它在等待一个事件发生,该事件是一个包含机器人新位置的信号。一旦机器人接收到这个信号,它就从空闲状态向行走状态转换。br-1继续前进直到它到达目标位置。一旦到达,机器人从行走状态回到空闲状态。信号、动作和活动可能由对象或外部力量执行或控制。例如,新的位置将不是由br-1产生,而是其他的作用者。br-1在行走时具有检查其位置的能力。

开发状态图

正如前文所述,状态是一个对象的条件或态势,代表对象生命过程中的一个转换。状态机展示了状态和状态之间的转换。表示状态机的方式很多,在本书中,我们将状态机表示为使用统一建模语言(unified modeling language,uml)的状态图。状态图用额外的符号表示事件、动作、条件、转换部分、状态部分和类型。

三种状态类型:

初始:状态机的默认起点。用一个实黑点来表示转换的第一个状态。

最终:结束状态,意味着对象到达了生命周期的终点,用内嵌实心点的圆表示。

复合状态和子状态:一个状态包含另外一个状态就被称为超级状态或复合状态。

状态具有不同的部分,表3-5列出了状态部分的简短描述。一个显示其名字的状态节点也可以表示本表列出的状态部分。这些部分可以用来表示对象转换到新状态时发生的过程。一旦对象进入和离开状态可能要采取动作。当对象处于一个特定状态时,可能必须要采取动作。所有这些都可以在状态图中进行标记。

《机器人编程实战》一一3.3 目标和机器人状态图
《机器人编程实战》一一3.3 目标和机器人状态图

图3-13展示了状态节点和动作、活动和内部转换的语句格式。

在一个状态图中,节点是状态,弧线是转换。状态表示为圆或圆角矩形,图形里面显示状态名。转换是连接源状态和目标状态的弧线,箭头指向目标状态。

进入和退出动作语句使用下列格式:

entry/action or activity

exit/action or activity

这是一个称为“验证”状态的进入和退出动作语句示例:

进入动作:entry/validate(data)

退出动作:exit/send(data)

当进入“验证”状态时调用“validate(data)”函数。当退出此状态时调用退出动作“exit/send(data)”函数。

内部转换在状态内部发生,如果有的话,它们是在进入动作之后和退出动作之前发生的事件。自我转换不同于内部转换。对于自我转换,要执行进入和退出动作。状态在左边,执行退出动作。然后再进入同样的状态并且执行进入动作。在退出动作之后和进入动作之前执行自我转换的动作。自我转换表示为一个回环并指向同一状态的有向直线。

内部转换或自我转换语句格式为:

name/action or function

例如:

do/createchart(data)

“do”是活动标签,函数“createchart(data)”是执行。

一个转换有多个部分,两个状态之间有联系。我们知道触发导致发生转换,动作可以与触发耦合。满足条件也可以导致一个转换。表3-6列出了一个转换的部分。

《机器人编程实战》一一3.3 目标和机器人状态图

守护条件是一个评估“真”或“假”的布尔数值或表达式,用方括号括起来。守护条件必须满足,函数才会执行。它可以在一个状态或转换语句中使用。

validated是一个布尔值。对于createchart( )执行,它是一个必须满足的条件。

作为一个状态动作语句,事件触发有以下类似格式:

name[guard]/action or function

例如,对于一个内部转换语句,可以添加一个守护条件:

do[validated]/createchart(data)

图3-14为br-1的状态图。

该图有5个状态:空闲、行走、点燃蜡烛、等待和拿掉盘子。当从空闲向行走转换时,br-1获得新的位置并且知道其任务:

do[getposition]/setmission( )

行走状态有两个转换:

行走至点燃蜡烛

行走至清除盘子

当目标实现且任务是蜡烛时,行走转换为点燃蜡烛。当目标实现且任务是盘子时,行走转换为清除盘子。从点燃蜡烛转换,“蜡烛”任务必须完成。从拿掉盘子向最终状态转换,所有任务必须完成。

点燃蜡烛是一个复合状态,包含两个子状态:定位烛芯和点燃烛芯。当进入点燃蜡烛状态时,已计算出唱歌的布尔值。如果唱歌,则准备点燃蜡烛。首先必须定位烛芯位置,然后将手臂移动到该位置,最后点燃烛芯。在定位烛芯状态中,进入动作计算出下面表达式:

candles > 0

如果“真”,当检索到第一个或下一个蜡烛位置时状态退出,然后机器人的手臂移动到该位置。

检索到烛芯位置,br-1转换到“点燃烛芯”。进入后,检查打火机是否点着。如果点着,点燃烛芯(一个内部状态),退出该状态。如果candles > 0,则再次进入“定位烛芯”状态。如果candles = 0,则br-1转换到“等待”状态。一直等到聚会结束,然后br-1可以清除所有盘子。在“等待”状态,有一个“聚会没有结束”的自转换。记住,对于自转换,当状态处于退出和再进入时,才执行退出和进入动作。在这种情形里,没有退出动作,但有一个“等待5分钟”的进入动作。检查守护条件“聚会没有结束”,如果聚会没有结束,则再次进入该状态并执行进入动作,br-1等待5分钟。一旦聚会结束,则br-1转换到“清除盘子”,这是最后一个状态。如果布尔值“所有任务完成”为真,br-1转换到最终状态。但是,有些对象可能没有到最后状态,则br-1继续工作。状态图有利于处理在生命周期内形势不断变化的对象。它展示了对象从一个状态到另外一个状态的控制流。

《机器人编程实战》一一3.3 目标和机器人状态图

继续阅读