--- id: plansys2 title: 'PlanSys2 & PDDL' --- [PlanSys2](https://github.com/IntelligentRoboticsLabs/ros2_planning_system) - это система планирования для ROS2 от создателей ROSPlan (система планирования для ROS1). PlanSys2 не ограничивается планированием в рамках одного устройства, а поддерживает распределение задач между _многими взаимодействующими агентами_ в реальном времени. Исполнение планов реализовано на базе _Деревьев поведения_. Планы и задачи описываются на Lisp-подобном языке PDDL (Planning Domain Definition Language). PlanSys2 поддерживает PDDL версии 2.1, текущая версия PDDL - 3.1. Видео-презентация [1](https://www.youtube.com/watch?v=SQoN79BBQno), [2](https://www.youtube.com/watch?v=58pvI8rgUvk) ## Архитектура фреймворка Архитектура PlanSys2 модульная и каждый отдельный компонент может быть заменён. ![](img/plansys2_architecture.png) Описание компонентов * __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. * Устанавливает и удаляет экземпляры, свойства, функции и цели. * Визуализирует, исполняет и отслеживает планы. * Проверяет статус узлов, исполняющих действия. ## Пример сборки автомобиля тремя роботами Сначала формируется план в PDDL-формате: ``` 0 (move rb1 assembly_zone body_car_zone) 0 (move rb2 assembly_zone steerwheel_zone) 0 (move rb3 assembly_zone wheels_zone) 5.001 (transport rb1 bc_1 body_car_zone assembly_zone) 5.001 (transport rb2 stwhl_1 steerwheel_zone assembly_zone) 5.001 (transport rb3 whl_1 wheels_zone assembly_zone) 10.002 (assemble rb1 assembly_zone whl_1 bc_1 stwhl_1 car_1) 10.002 (move rb2 assembly_zone body_car_zone) 10.002 (move rb3 assembly_zone steerwheel_zone) 15.003 (move rb1 assembly_zone wheels_zone) 15.003 (transport rb2 bc_2 body_car_zone assembly_zone) 15.003 (transport rb3 stwhl_2 steerwheel_zone assembly_zone) 20.004 (transport rb1 whl_2 wheels_zone assembly_zone) 20.004 (move rb3 assembly_zone body_car_zone) 25.005 (assemble rb2 assembly_zone whl_2 bc_2 stwhl_2 car_2) 25.005 (move rb1 assembly_zone steerwheel_zone) 25.005 (transport rb3 bc_3 body_car_zone assembly_zone) 30.006 (move rb2 assembly_zone wheels_zone) 30.006 (transport rb1 stwhl_3 steerwheel_zone assembly_zone) 35.007 (transport rb2 whl_3 wheels_zone assembly_zone) 40.008 (assemble rb1 assembly_zone whl_3 bc_3 stwhl_3 car_3) ``` Данный план преобразуется в Дерево поведения, где заданы узлы для параллельного и последовательного выполнения задач: ![](img/behaviour_tree_from_pddl.png) Структура отдельного действия: ![](img/action.png) При определении порядка исполнения плана используется т.н. _Аукцион действий (action auction)_. Когда наступает очередь для выполнения действия (например, из схемы выше), формируется новая запись _ActionPerformerClient_ в таблице _ActionMap_. ![](img/action_execution_flow.png) Протокол работает так: * Когда ActionPerformerClient запись создана, посылается сообщение-запрос с описанием действия и его параметров * Ноды, находящиеся в состоянии ожидания и способные выполнить этот запрос, отвечают, подтверждая или отвергая данный запрос * После подтверждения ноды приступают к исполнению * Периодически ноды отправляют сообщения с обратной связью о действиях, которые они исполняют. Пример: ![](img/action_execution_flow_example.png) ## Симуляция и полевые испытания PlanSys2 был проверен сначала в симуляции, а потом и на реальной системе, состоящей из 3-ёх роботов. Исходные коды проекта опубликованы на [Github](https://github.com/IntelligentRoboticsLabs/plansys2_cooking_experiment). ## Planning Domain Definition Language (PDDL) Согласно [спецификации](https://planning.wiki/ref) PDDL содержит следующие базовые сущности планируемой задачи: * __Объекты__ (Objects) * __Свойства__ (Predicates) объектов (True/False) * __Начальное состояние__ (Initial state) * __Спецификация целей__ (Goal specification): то, что мы хотим, чтобы было правдой * __Действия/Операторы__ (Actions/Operators): способы изменения состояния мира. ### Основные классы алгоритмов планирования ![pddl_planners](img/pddl_planners.jpg) ### Плагины и утилиты для работы с PDDL * Плагины для редакторов [VSCode](https://github.com/jan-dolejsi/vscode-pddl) ![vscode-pddl](https://img.shields.io/github/stars/jan-dolejsi/vscode-pddl.svg) ([video-tutorial](https://www.youtube.com/watch?v=BFlCz49ETcA&list=PL1Q0jeuU6XppflOPFx1qQVuWbXTcjxevU)), [Sublime Text](https://github.com/Pold87/myPDDL) ![myPDDL](https://img.shields.io/github/stars/Pold87/myPDDL.svg) * [vPlanSim](https://github.com/mastrogiorgis/vPlanSim) - графический интерфейс для визуализации и симуляции PDDL-планирования на базе Python3.7, VTK8.2, PyQt5. ![vPlanSim](https://img.shields.io/github/stars/mastrogiorgis/vPlanSim.svg) * Парсеры PDDL - [Julia](https://github.com/JuliaPlanners/PDDL.jl), [python](https://github.com/pucrs-automated-planning/pddl-parser), [C#](https://github.com/hfoffani/pddl-lib), [Java](https://github.com/gerryai/PDDL4J), [С++](https://github.com/wisdompoet/universal-pddl-parser) * [planutils](https://github.com/AI-Planning/planutils) - библиотека общего назначения для разработки, запуска и оценки планировщиков. ![planutils](https://img.shields.io/github/stars/AI-Planning/planutils.svg) * [blockly-pddl](https://github.com/AI-Planning/blockly-pddl) - транслятор PDDL-файлов в язык Blockly и обратно. ![blockly-pddl](https://img.shields.io/github/stars/AI-Planning/blockly-pddl.svg) ### PDDL-фреймворки * [pddlstream](https://github.com/caelan/pddlstream) - фреймворк для планирования, состоящий из языка действий и набора алгоритмов для AI-планирования при наличии процедур выборки. PDDLStream расширяет PDDL, вводя потоки и декларативные спецификации процедур выборки. Алгоритмы PDDLStream не зависят от предметной области и решают проблемы PDDLStream только с описанием каждого сэмплера как черного ящика. Мотивом появления PDDLStream был Task and Motion Planning (TAMP) - [paper](https://arxiv.org/pdf/1802.08705.pdf). ![pddlstream](https://img.shields.io/github/stars/caelan/pddlstream.svg) * [pddlgym](https://github.com/tomsilver/pddlgym) - фреймворк, который автоматически создает среду OpenAI-Gym из спецификаций PDDL - [paper](https://arxiv.org/pdf/2002.06432.pdf). ![pddlgym](https://img.shields.io/github/stars/tomsilver/pddlgym.svg) * [LAPKT](https://github.com/LAPKT-dev/LAPKT-public) - набор легковесных инструментов для автоматизированного планирования (Lightweight Automated Planning Toolkit). Предлагает независимый от конкретных языков планирования абстрактный интерфейс для расчёта планов. Легко интегрируется с PDDL/STRIPS. ### Расширения PDDL * [HDDL](https://www.uni-ulm.de/fileadmin/website_uni_ulm/iui.inst.090/Publikationen/2020/Hoeller2020HDDL.pdf) - расширения PDDL для поддержки иерархических задач. Использовался для создания планировщика [PANDA Planning Framework](https://panda-planner-dev.github.io/), где реализован [парсер HDDL](https://github.com/panda-planner-dev/pandaPIparser) * [Universal PDDL Parser - Multiagent Extension](https://github.com/aig-upf/universal-pddl-parser-multiagent) - расширение [universal-pddl-parser](https://github.com/aig-upf/universal-pddl-parser), поддерживающие multi-agent расширение PDDL 3.1 для спецификаций Crosby, Jonsson and Rovatsos, 2014 и Kovacs, 2012.