robossembler.org/docs/technologies/plansys2.md

171 lines
No EOL
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: plansys2
title: 'PlanSys2 & PDDL'
---
Для описания задач (task planning) в фреймворке Робосборщик используется язык PDDL и основанная на нём система планирования и управления задачами Plansys2.
## Planning Domain Definition Language (PDDL)
PDDL (Planning Domain Definition Language) - Lisp-подобный язык для логического планирования. PlanSys2 поддерживает PDDL версии 2.1, текущая версия PDDL - 3.1.
Описание технологического процесса для автоматического планирования на языке PDDL состоит из двух частей:
- Описание предметной области - __Domain__ (какие в принципе существуют типы объектов, условий, функций и действий)
- Описание конкретной задачи - __Problem__ (какие объекты и какие стартовые условия представлены в конкретном техпроцессе - т.е. что у нас есть вообще в сцене/установке/производстве)
### PDDL Domain
Согласно [спецификации](https://planning.wiki/ref) PDDL Domain содержит следующие базовые сущности планируемой задачи:
#### Объекты (Objects)
Какие типы/подтипы объекты фигурируют в технологическом процессе.
Примеры
- Движитель (Подтипы - Робот-манипулятор, поворотный стол, конвеер)
- Приспособление (Подтипы - Захват, Пинцет и т.д.)
- Пробирка (Подтипы - Большая, маленькая и т.д.)
- Посадочный материал (Подтипы - Корешок, листок, черенок)
- Навык робота, программа (Подтипы - Захват, разрез, распознавание)
#### Условия (Predicates)
Типы условий, при которых начинаются те или иные действия. Это вопросы, подразумевающие ответ Да или Нет.
Примеры:
- Посадочный материал в пробирке?
- Робот свободен для задачи?
- Объект распознан?
- Посадочный материал поврежён?
#### Функции (Functions)
Функции похожи на условия - это тоже вопросы. Разница в том, что это вопросы, подразумевающие ответ в виде числа.
Примеры:
- Какой заряд у аккумуляторной батареи?
- Какая масса у посадочного материала X?
#### Действия (actions)
Действия, производящиеся в рамках технологического процесса. Состоят из:
- __Параметров__ (parameters) - задействованные объекты
- __Длительности__ (duration) - продолжительность действия
- __Условий__ (condition) - условия, при которых действие начинается/продолжается/завершается
- __Эффектов__ (effect) - результаты после начала и завершения
Пример:
- Действие ахват-пробирки_
- Параметры _робот_, ахватное-устройство_, _пробирка_
- Условия
- начала: _робот-свободен_, ахватное-устройство-подключено_, _пробирка-в-наличии_
- продолжения - _в-комнате-нет-людей_
- завершения - _робот-не-движется_, _пробирка-в-захвате_
- Эффекты
- в начале: _робот-занят_
- при завершении - _робот-свободен_, _пробиркаахвачена_
### PDDL Problem
Проблема описывает конкретную задачу с исходными условиями на момент начала задачи. Исходных условий может быть много. Problem обычно генерируется автоматически для подбора оптимальной конфигурации. Планировщик сам генерирует план исполнения в зависимости от описания задачи.
Описание задачи/проблемы выглядит следующим образом
- __Объекты__ (objects) - наличествующие объекты, обязательно должны соответствовать типам из PDDL Domain
- __Начальное состояние__ (init) - текущие значения условий на момент начала
- __Спецификация целей__ (goal) - условия выполнения задания
## ROS2 Planning System (PlanSys2)
[PlanSys2](https://github.com/IntelligentRoboticsLabs/ros2_planning_system) - это система планирования для ROS2 от создателей ROSPlan (система планирования для ROS1). PlanSys2 не ограничивается планированием в рамках одного устройства, а поддерживает распределение задач между _многими взаимодействующими агентами_ в реальном времени. Исполнение планов реализовано на базе еревьев поведения_.
Видео-презентация [1](https://www.youtube.com/watch?v=SQoN79BBQno), [2](https://www.youtube.com/watch?v=58pvI8rgUvk)
### Архитектура фреймворка PlanSys2
Архитектура 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).
## Другие полезные ссылки
### Основные классы алгоритмов планирования
![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.
* [Fast Downward](https://github.com/aibasel/downward) - система планирования, поддерживающая PDDL. На конкурсе Classical Planing в 2018 году заняла первое место в двух треках ([подробнее](https://ipc2018-classical.bitbucket.io/#results)).
### Расширения 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.