robossembler.org/docs/software/ros2/prepare-and-execute-skill.md

156 lines
10 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.

---
title: Пример обучения и запуска навыка Object Detection
---
## Унифицированное API
Вначале попытаемся описать полную последовательность действий по подготовке и использованию навыка обнаружения объектов. Задача обнаружения объектов сенсорами робота (в частности, RGB камерой в нашем случае) ставится в случае, например, когда необходимо в заданном окружении (сцене) определить наличие или отсутствие необходимых деталей для сборки изделия. Такие детали представлены в информационной среде в виде ассетов, хранимых в базе данных с заданными характеристиками. Поэтому входным параметром навыка обнаружения объектов является список ассетов, экземпляры которых в текущей задаче необходимо обнаруживать. Результатом использования навыка в информационной системе будет являться получение данных о заданном ассете на конкретном изображении, полученном с помощью RGB камеры.
Начальным этапом навыка является создание датасета, состоящего из синтетических изображений, полученных с использованием пакета [BlenderProc](https://github.com/DLR-RM/BlenderProc). Этот датасет представляет из себя набор файлов изображений и файлов меток к ним, а также файл аннотации, описывающий весь датасет в целом. Он имеет определённую структуру папок и будет использован для обучения нейросетевой модели обнаружения объектов на реальных изображениях в работе (runtime-режим). После создания такой датасет должен быть помещён в базу данных, как единый объект, с заданными характеристиками. В дальнейшем датасет может быть пополнен другими изображениями (например, фото из реального окружения робота), позволяющими произвести дообучение нейросети и улучшить качество работы навыка.
На втором этапе происходит обучение нейросетевой модели [YOLOv8](https://github.com/ultralytics/ultralytics). На выходе получаем файл весов модели, который также помещается в базу данных, с указанием версии этого файла и параметров обучения.
Теперь мы имеем всё необходимое для использования навыка обнаружения объектов (Object Detection) в реальном сценарии при управлении роботом в режиме runtime.
Рассмотрим наиболее общий вариант использования этого навыка в среде ROS2.
Первым шагом будет являться первоначальный запуск lifecycle-узла ROS2, отвечающего за работу навыка. Чтобы начать процесс обнаружения конкретной детали на изображении нужно выполнить стартовые действия по шаблону в дереве поведения, задав необходимые параметры процесса (топики получения изображения и выдачи результатов обнаружения, режим работы и другие). После решения поставленной задачи обнаружения конкретного объекта выполняются действия по шаблону приостановки работы навыка. Данные шаблоны деревьев поведения выполняются с помощью исполнителя [BehaviorTree](https://github.com/BehaviorTree/BehaviorTree.ROS2). Затем можно начать обнаружение другого объекта, вновь выполнив стартовый шаблон действий и подготовив новые параметры процесса.
Теперь перейдём к полному описанию данного API.
## Этап 1. Создание датасета
См. раздел [Генерация датасетов](../dataset-generator#датасет-для-обучения-обнаружению-в-формате-bop-challenge)
## Этап 2. Обучение модели Yolov8
Для обучения модели используется модуль на Python. Внешним параметром для модуля является:
- каталог с датасетом, сгенерированный на первом этапе.
Пример запуска модуля обучения:
```bash
python train_Yolo.py --path /home/user/path/to/dataset --epoch 11 --outpath /home/user/path/to/weights
```
- path: путь к каталогу с датасетом
- epoch 11: количество эпох обучения (пока рекомендуем 30-50)
В результате работы создается файл весов нейросети с лучшими характеристиками обнаружения best.pt
## Этап 3. Использование навыка в ROS2 для обнаружения объекта на изображении (runtime)
### Подготовить папку с файлами BT v.4
* Папка /path/to/bt/
* bt.xml
```xml
<root BTCPP_format="4">
<BehaviorTree ID="Main">
<Sequence>
<Action ID="RbsAction" do="ObjectDetection" command="odConfigure" sid="a"></Action>
</Sequence>
</BehaviorTree>
</root>
```
* skills.json
```json
{"skills": [
{
"sid": "a",
"SkillPackage": {
"name": "Robossembler", "version": "1", "format": "1.0"
},
"Module": {
"node_name": "lc_yolo", "name": "ObjectDetection", "description": "Object detection skill with YOLOv8"
},
"BTAction": [
{
"name": "odConfigure",
"type": "run",
"param": [
{
"type": "weights",
"dependency": {"object_name": "board", "weights_file": "/home/shalenikol/0_rbs/w_od_board.pt"}
},
{
"type": "topic",
"dependency": {
"type": "topic",
"topicType": "sensor_msgs/msg/Image",
"sid": "7b832b17-3030-4758-aab5-96a5046797f7",
"topicOut": "/robot_camera/image"
},
"isFilled": true
}
],
"result": [],
"typeAction": "ACTION"
}
],
"topicsOut": [
{
"name": "lc_yolo/object_detection",
"type": "rbs_skill_interfaces/msg/BoundBox"
}
],
"Launch": {
"executable": "od_yolo_lc.py",
"package": "rbss_objectdetection"
}
}
]}
```
### Запуск интерфейсной ноды с сервером навыка, реализующего алгоритм обнаружения объектов.
```bash
ros2 launch rbs_bt_executor interface.launch.py bt_path:=/path/to/bt
```
### Запуск процесса обнаружения заданного объекта через дерево поведения.
Выполняется командой:
```bash
ros2 launch rbs_bt_executor rbs_executor.launch.py bt_path:=/path/to/bt
```
После этого узел начинает публиковать в выходной топик информацию об обнаружении объекта на каждом полученном с камеры изображении.
### Прекращение процесса обнаружения объекта.
Для завершения навыка нужно выполнить дерево поведения:
```xml
<root BTCPP_format="4">
<BehaviorTree ID="Main">
<Sequence>
<Action ID="RbsAction" do="ObjectDetection" command="odStop" sid="b"></Action>
</Sequence>
</BehaviorTree>
</root>
```
Файл skills.json
```json
{"skills": [
{
"sid": "b",
"SkillPackage": { "name": "Robossembler", "version": "1", "format": "1.0" },
"Module": {"node_name": "lc_yolo", "name": "ObjectDetection", "description": "Object detection skill with YOLOv8"},
"BTAction": [
{
"name": "odStop",
"type": "stop",
"param": [],
"result": [],
"typeAction": "ACTION"
}
],
"topicsOut": [
{
"name": "lc_yolo/object_detection",
"type": "rbs_skill_interfaces/msg/BoundBox"
}
],
"Launch": {
"executable": "od_yolo_lc.py",
"package": "rbss_objectdetection"
}
}
]}
```
Команда запуска этого дерева та же, что и в пункте 3.
После выполнения этих действий lifecycle-узел навыка перейдёт в начальное состояние и можно, повторив пункт 1-3, вновь запустить процесс обнаружения уже с другим объектом.