[PlanSys2](https://github.com/IntelligentRoboticsLabs/ros2_planning_system) - это система планирования для ROS2 от создателей ROSPlan (система планирования для ROS1). PlanSys2 не ограничивается планированием в рамках одного устройства, а поддерживает распределение задач между _многими взаимодействующими агентами_ в реальном времени. Исполнение планов реализовано на базе _Деревьев поведения_.
Планы и задачи описываются на Lisp-подобном языке PDDL (Planning Domain Definition Language). Согласно спецификации PDDL содержит следующие базовые сущности планируемой задачи:
* __Объекты__ (Objects)
* __Свойства__ (Predicates) объектов (True/False).
* __Начальноесостояние__ (Initial state)
* __Спецификация целей__ (Goal specification): то, что мы хотим, чтобы было правдой
* __Действия/Операторы__ (Actions/Operators): способы изменения состояния мира.
PlanSys2 поддерживает PDDL версии 2.1, тогда как последняя версия PDDL - 3.1.
## Архитектура фреймворка
Архитектура PlanSys2 модульная и каждый отдельный компонент может быть заменён.

Описание компонентов
* __Planner Node__ - основной узел. Содержит алгоритм планирования и использует разные т.н. plan solvers - POPF, TFD. При генерации планов Planner Node обращается к узлам Domain Expert и Problem Expert, содержащими описания соответствующих предметным областям в формате PDDL.
* __Domain Expert__ считывает PDDL-файлы и размещает их во внутренней памяти. Этот компонент содержит общее описание предметной области.
* __Problem Expert__ содержит описание проблемы(задачи), которую нужно решить, включая конкретные экземпляры классов, предикаты, функции и цели, которые валидируются Domain Expert. то есть Problem Expert содержит динамическое знание приложения. Этот узел создаёт описания задач для Planner Node в формате PDDL.
* __Executor Node__ запрашивает у Planner Node план и, если тот существует, то выполняет его. План превращается в _Дерево поведения (Behaviour Tree)_. Для исполнения действий используется протокол аукциона, который выбирает наиболее подходящий узел, реализующий выполняемое действие.
* __Applications__ - приложения роботов, использующие PlanSys2. Содержат узлы, реализующие действия(__Actions__), и модель PDDL, которая их реализует. Любое приложение также включает в себя узел Controller Node, который
обращается к знаниям Problem Expert для консультаций и установления экземпляров, предикатов и целей. Этот контроллер также запрашивает Executor Node для выполнения или отмены планов.
* __Terminal__ - среда исполнения команд для управления и мониторинга PlanSys2.
* Визуализирует структуру сущностей PDDL и информацию Problem Expert.
* Показывает подробности о свойствах и действиях в терминах PDDL.
* Устанавливает и удаляет экземпляры, свойства, функции и цели.
Данный план преобразуется в Дерево поведения, где заданы узлы для параллельного и последовательного выполнения задач:

Структура отдельного действия:

При определении порядка исполнения плана используется т.н. _Аукцион действий (action auction)_. Когда наступает очередь для выполнения действия (например, из схемы выше), формируется новая запись _ActionPerformerClient_ в таблице _ActionMap_.

Протокол работает так:
* Когда ActionPerformerClient запись создана, посылается сообщение-запрос с описанием действия и его параметров
* Ноды, находящиеся в состоянии ожидания и способные выполнить этот запрос, отвечают, подтверждая или отвергая данный запрос
* После подтверждения ноды приступают к исполнению
* Периодически ноды отправляют сообщения с обратной связью о действиях, которые они исполняют.
Пример:

## Симуляция и полевые испытания
PlanSys2 был проверен сначала в симуляции, а потом и на реальной системе, состоящей из 3-ёх роботов. Исходные коды проекта опубликованы на [Github](https://github.com/IntelligentRoboticsLabs/plansys2_cooking_experiment).