cnc-graver-assist/docs/bt_example_with_tasks.md

165 lines
No EOL
8.6 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.

Для реализации обработки очереди задач в сценарии, описанном вами, можно использовать **Behavior Tree (BT)** — дерево поведения. Это мощный инструмент для управления сложными последовательностями действий, особенно в робототехнике и автоматизированных системах. Давайте разберем, как это можно сделать.
---
### **Основные компоненты Behavior Tree**
1. **Action Node**:
- Выполняет конкретное действие.
- Например: "Добавить задачу в очередь", "Выполнить гравировку".
2. **Control Node**:
- Управляет выполнением дочерних узлов.
- Примеры:
- **Sequence**: Выполняет дочерние узлы по порядку. Если один узел завершается неудачно, вся последовательность останавливается.
- **Selector**: Пытается выполнить дочерние узлы по порядку. Если один узел завершается успешно, остальные игнорируются.
- **Parallel**: Выполняет несколько узлов одновременно.
3. **Condition Node**:
- Проверяет условие (например: "Есть ли задачи в очереди?").
- Возвращает успех или неудачу в зависимости от результата проверки.
4. **Decorator Node**:
- Модифицирует поведение дочернего узла.
- Например: "Повторять действие, пока условие истинно".
---
### **Алгоритм работы системы**
1. Оператор вводит данные в веб-интерфейс, создавая спецификацию задачи.
2. Спецификация добавляется в очередь задач.
3. Управляющая программа РТК (роботизированный технологический комплекс) обрабатывает задачи из очереди.
4. Для каждой задачи выполняется алгоритм гравировки:
- Подготовка оборудования.
- Гравировка шильдика.
- Проверка качества выполнения.
---
### **Реализация в Behavior Tree**
#### 1. **Основная структура дерева**
Мы можем разделить процесс на две основные части:
- **Обработка очереди задач**.
- **Выполнение гравировки**.
#### 2. **Control Nodes**
- **Selector**: Используется для выбора между "обработкой очереди" и "выполнением гравировки".
- **Sequence**: Используется для выполнения последовательных шагов внутри каждой задачи.
- **Parallel**: Может быть использован, если нужно одновременно мониторить состояние очереди и выполнять текущую задачу.
#### 3. **Action Nodes**
- **Добавление задачи в очередь**: Получает данные из веб-интерфейса и добавляет их в очередь.
- **Проверка очереди**: Проверяет, есть ли задачи в очереди.
- **Подготовка оборудования**: Настройка оборудования для гравировки.
- **Гравировка**: Выполнение гравировки на основе данных задачи.
- **Проверка качества**: Проверка результатов гравировки.
#### 4. **Condition Nodes**
- **Есть ли задачи в очереди?**: Возвращает `true`, если очередь не пуста.
- **Задача выполнена успешно?**: Проверяет, завершилась ли гравировка без ошибок.
#### 5. **Decorator Nodes**
- **Repeat Until Fail**: Повторяет проверку очереди, пока она не станет пустой.
- **Retry**: Повторяет выполнение гравировки в случае ошибки.
---
### **Пример Behavior Tree**
```plaintext
Root
├── Selector (Выбор между обработкой очереди и выполнением гравировки)
│ ├── Sequence (Обработка очереди задач)
│ │ ├── Condition: Есть ли задачи в очереди?
│ │ └── Action: Добавить задачу в очередь
│ │
│ └── Sequence (Выполнение гравировки)
│ ├── Action: Подготовка оборудования
│ ├── Action: Гравировка
│ ├── Condition: Задача выполнена успешно?
│ └── Action: Проверка качества
└── Decorator: Repeat Until Fail (Повторять, пока очередь не пуста)
```
---
### **Пошаговое объяснение работы дерева**
1. **Selector**:
- Проверяет, есть ли задачи в очереди.
- Если очередь пуста, ничего не делает.
- Если очередь не пуста, переходит к выполнению гравировки.
2. **Sequence (Обработка очереди задач)**:
- Убедиться, что задачи есть в очереди.
- Добавить новую задачу в очередь (если оператор ввел данные).
3. **Sequence (Выполнение гравировки)**:
- Подготовить оборудование.
- Выполнить гравировку.
- Проверить качество выполнения.
4. **Decorator: Repeat Until Fail**:
- Повторяет весь процесс, пока очередь задач не станет пустой.
---
### **Преимущества такого подхода**
1. **Модульность**: Каждый узел отвечает за конкретную задачу, что упрощает отладку и расширение.
2. **Гибкость**: Можно легко добавить новые условия или действия.
3. **Надежность**: Дерево может обрабатывать ошибки и повторять действия при необходимости.
---
### **Пример кода (псевдокод)**
```python
class BehaviorTree:
def __init__(self):
self.queue = []
def check_queue(self):
return len(self.queue) > 0
def add_task_to_queue(self, task):
self.queue.append(task)
def prepare_equipment(self):
print("Equipment prepared.")
def engrave(self, task):
print(f"Engraving task: {task}")
def check_quality(self):
print("Quality check passed.")
def run(self):
while True:
if not self.check_queue():
print("Queue is empty. Waiting for tasks...")
break
task = self.queue.pop(0)
self.prepare_equipment()
self.engrave(task)
self.check_quality()
# Пример использования
bt = BehaviorTree()
bt.add_task_to_queue("Task 1")
bt.add_task_to_queue("Task 2")
bt.run()
```
---
### **Итог**
Для реализации обработки очереди задач в вашем сценарии можно использовать следующие узлы:
- **Control Nodes**: `Selector`, `Sequence`, `Parallel`.
- **Action Nodes**: Добавление задачи, подготовка оборудования, гравировка, проверка качества.
- **Condition Nodes**: Проверка наличия задач в очереди, проверка успешности выполнения.
- **Decorator Nodes**: Повторение действий до определенного условия.
Этот подход обеспечивает четкое разделение логики и позволяет легко масштабировать систему.