реагируя на все ортогональные состояния, закончив в Boost.statechart - PullRequest
1 голос
/ 07 июня 2011

Я работаю над программой управления роботом, которая основана на автомате.Хотя программа использует Qt State Machine Framework, я также пытался реализовать ее, используя Boost.statechart (BS) в качестве теоретического упражнения и способ изучения / оценки библиотеки.

В версии Qt я использовал следующий шаблонв нескольких местах: составное состояние имеет параллельные вложенные подграфы, каждый из которых в конечном итоге достигает конечного состояния.Когда все параллельные подсостояния завершаются, родительское состояние испускает сигнал «done ()», который заставляет компьютер переходить в следующее состояние верхнего уровня.Например (Осторожно: псевдо-диаграмма):

Idle -calibRequest-> Calibrate( calibrate_camera | calibrate_arm ) -finished-> Idle

и calibrate_* состояния в свою очередь имеют вложенные состояния внутри них, такие как S -trigger[calibrated?]-> F, где F - конечное состояние.Когда оба calibrate_* состояния достигают своих соответствующих F состояний finished, сигнал заставляет конечный автомат переходить в Idle.

Параллельные дочерние состояния Qt аналогичны ортогональным вложенным состояниям BS.Сначала я, хотя «завершение» было аналогом BS для конечных состояний, но на самом деле это не так.Это больше похоже на «завершить работу конечного автомата, если где-то еще не движется какая-то ортогональная вещь» - как только вы завершаете все ортогональные состояния, родительское состояние также завершается без какой-либо возможности пройти.Публикация событий после завершения также не помогает, поскольку нет состояния, в которое эти события могли бы быть доставлены.

В итоге я реализовал «конечные состояния», которые публикуют событие уведомления при достижении, и реагировал на это событие в родительском состоянии - проверяя, все ли ортогональные состояния достигли своих конечных событий, и затем проходил.Что в основном является повторной реализацией подхода Qt State Machine, но которое нужно переделывать каждый раз, когда мне нужен этот шаблон.Но, может быть, я настолько привык к одному из способов достижения этого эффекта, что не вижу альтернативы?

1 Ответ

1 голос
/ 27 мая 2012

Не знаю, поможет ли это вам, но я реализовал альтернативную платформу состояний C ++: STTCL Класс sttcl :: ConcurrentCompositeState <> отслеживает завершенные (ортогональное состояние) области и будетавтоматически завершать, когда все они завершены.Завершение может быть перехвачено классом реализации.

WBR Günther

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...