Реагируя на все ортогональные состояния, закончив в Boost.statechart

Я работаю над программой управления роботом, которая основана на автомате. Хотя программа использует 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 ответ

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

WBR Günther

Другие вопросы по тегам