daner » 26 окт 2013, 18:22
1. можно и автомат применять.
В нем главное как можно полнее описать ВСЕ возможные состояние системы. в этом и сложность и минус FSM. Тут правдо надо отметить, что состояния можно и нужно обобщать друг с другом везде где это возможно. Но если они все описанны, то вы в принципе не можете попасть в не состояния. При попадании в определенное состояние, включается определенный алгоритм, кторый управляет роботом в этом состоянии, пока состояние не поменяется.
Переходы, тоже в общем не сложно. На них должно висеть все, что отличает одно состояние от другого.
2. можно использовать иерархическую FSM.
практически тоже, что и обычная FSM, только в нутри состояния, можно запускать другие FSM (т.е. спец алгоритмом обработки будет новый автомат). Таким образом можно декомпозировать задачу несколькими автоматами, и так как автомат более высокого уровня имеет более абстрактные состояния общее число состояний значительно уменьшается по сравнению с простым FSM.
3. можно использовать деревья решений.
ну тут все просто (это наиболее старая технологуя). строится логическое дерево (но это чисто для оптимизации), где терминальные узлы, это действия. вообще, если упростить, то это обычный список правил типа
IF CONDITION[1] THEN ACTION[1]
IF CONDITION[2] THEN ACTION[2]
....
IF CONDITION[N] THEN ACTION[N]
этот список проверяется при каждом цикле принятия решения.
4. можно использовать деревья поведений
Очень похоже на FSM, т.е. так же есть состояния в которых срабатывает какой-то алгоритм занимающийся обработкой этого состояния. Только состояние -- это не состояние самой системы, а поведенческие состояния робота, т.е. какое-то поведение.
И переходы между поведениями происходят не когда меняется состояние системы, а когда поведение "решает" прекратить свое выполнение и возвращает причины этого решения (в простейшем случае это ОК/Ошибка). На основе причины прекращения выбирается следующее поведение.
Методы отбора строго регламентированны. Существует sequencer, selector, parallel. Первый аналог for i in count(behs); do if behs[i].run() == FAIL; then break; done. Второй, аналог for i in count(behs); do if behs[i].run() == OK; then break; done.
Третий просто запускает все поведения параллельно, пока одно из них не остановится. Есть еще декораторы, т.е. правила модифизирующие одно поведение (т.е. одну ветку). Например меняющие результат поведения (типа НЕ), или организующие циклы (типа ПОКА). Все это организуется иерархически. Если добавить возможность возвращать не только результат остановки, но и динамически созданный план, можно реализовать полноценную архитектуру 3-Т (т.е. три уровня : планировщик, дривера и между ними sequencer который ими управляет). Еще можно сказать про эту архитектуру, что на отлично подходит по иерархические планировщики, так как реализует идею иерархической логики.
На мой взгляд это наиболее удобный инструмент для реализации алгоритмов чуть более сложных чем вы описали. Хотя... короче, я бы посоветовал вам либо его, лиго HFSM.