1

我正在使用 pytransitions 创建具有许多嵌套子 FSM 的分层状态机。当子 FSM 进入临界状态时,我想抑制父级的转换,直到子级完成它的活动为止。我找不到这种行为的任何参考示例,并希望有人可以就实现这一目标的最佳方法提供建议。

图像嵌套 FSM 示例提供了一个简单的场景。这里父 FSM 处于运行状态,这有一个子 FSM 处于顶部状态。该状态本身有一个子 FSM,它具有关闭或开启状态。我想抑制或忽略第一个孩子和父母 FSM 上的所有转换,在这种情况下,当孩子两个处于“开启”状态时,第一个孩子的“向下”转换和父母的“停止”。您可以想象在更复杂的场景中,父状态或子状态可能会有大量的转换。

关于实现这一目标的好方法的任何想法?

提前致谢,

4

1 回答 1

0

根据我的经验,将转换(或更好的触发器)视为应根据当前状态进行处理的事件是一种很好的做法。例如,当您的机器处于该init状态时,stopping将不会处理该事件,并且 - 根据您的配置 - 甚至可能引发异常。

因此,与其“抑制”转换,不如将您的用例改写为“我的机器应该在状态下处理事件stop并且以不同的方式处理”。 按以下顺序评估潜在转换:downrunning_top_onPytransitions

  • 在子级中定义的转换将在父级中定义的转换之前进行评估
  • 状态中的转换按照它们添加的顺序进行评估
  • conditions只有在所有返回True和所有unless回调都返回时才会进行转换False

策略一:Handle down/ stopevents inrunning_top覆盖父母中的处理策略。

例如,您可以添加基本上什么都不做的内部转换:

state_config = {
    'name': 'top',
    'children': ['on', 'off'],
    'initial': 'off',
    'transitions': [['begin', 'off', 'on'],
                    ['end', 'on', 'off'],
                    ['down', 'on', None],
                    ['stop', 'on', None]]
    }

在此处输入图像描述

但是,当您的机器被指示停止时,即使它处于临界状态,您可能希望向转换添加一个回调以记录事件。

unless策略二:在你的过渡中引入。

transitions = [  # ...,
    {'trigger': 'stop', 'source': 'running', 'dest': 'stopping', 'unless': 'is_running_top_on'}

在此处输入图像描述

很方便,在这种情况下,我们不必编写自定义条件回调,因为我们的模型已经装饰了状态检查功能。

策略 3:在通用转换之前添加处理特殊情况的转换。

transitions = [['start', 'init', 'running'],
               ['stop', 'running_top_on', None],
               ['stop', 'running', 'stopping']]

该图看起来像第一个图,但转换实际上将在根级别定义,这意味着仅当事件尚未由子状态处理时才会评估它。这意味着如果我们在这里添加,当处理在状态中定义为时['bottom', 'running_top_up', Nome]不会被调用。bottomrunning['bottom', 'top', 'down']

于 2021-01-22T12:05:44.883 回答