231 lines
21 KiB
Markdown
231 lines
21 KiB
Markdown
|
---
|
|||
|
id: report4part
|
|||
|
title: work for the 4 reporting period
|
|||
|
---
|
|||
|
|
|||
|
## Общий список работ
|
|||
|
1) перевод навыков компьютерного зрения на работу через интерфейсную ноду (Object Detection, Pose Estimation)
|
|||
|
2) тестирование и отладка интерфейсов веб-сервиса для создания деревьев поведения
|
|||
|
- добавление новых деталей в проект
|
|||
|
- разработка новой схемы описания зависимостей, основанной на применении топиков ROS2
|
|||
|
- использование цифровых двойников (Digital Twins)
|
|||
|
- получение интерфейсов ROS2: GetInterfaces
|
|||
|
- переход на новую версию деревьев поведения (с 3 на 4)
|
|||
|
- добавление условий в деревья поведения (Condition)
|
|||
|
- сохранение и использование файла описания навыков, используемых в BT (json)
|
|||
|
- тестирование форм-билдера - универсального web-модуля ввода параметров и зависимостей пользователем
|
|||
|
3) разработка навыка BT для записи демонстрации rosbag во время симуляции действий робота
|
|||
|
4) модуль конвертации файлов rosbag в формат обучения lerobot
|
|||
|
5) разработка пользовательского навыка BT (клиента) движения робота в заданную точку (move to pose)
|
|||
|
- для cartesian-контроллера
|
|||
|
- для MoveIt
|
|||
|
6) рефакторинг:
|
|||
|
- перенос интерфейсного узла в пакет запуска деревьев поведения
|
|||
|
- выделение навыков компьютерного зрения в отдельные пакеты (rbss_objectdetection, rbss_poseestimation)
|
|||
|
|
|||
|
|
|||
|
## Перевод навыков компьютерного зрения на работу через интерфейсную ноду (Object Detection, Pose Estimation)
|
|||
|
При разработке интерфейсной ноды, которая позволила упростить обмен данными между испольнительной системой деревьев поведения и конкретными навыками, появилась потребность в адаптации навыков компьютерного зрения для работы с новым API.
|
|||
|
В имплементации навыка Object Detection для YoloV8 теперь необходимо все параметры для его работы сохранить в json-описании до его использования с деревом поведения, а зависимости (такие как наименование объекта распознавания, веса модели, имя топика получаемого изображения), задаваемые в узле дерева поведения, встроить в вышеуказанное json-описание. При выполнении дерева поведения для активации распознавания необходимо передать lifecycle-узлу навыка всё json-описание одним пакетом через интерфейсную ноду.
|
|||
|
Схожим образом была настроена работа навыка Pose Estimation (методом DOPE).
|
|||
|
|
|||
|
|
|||
|
## Тестирование и отладка интерфейсов веб-сервиса для создания деревьев поведения
|
|||
|
Для того, чтобы полноценно разрабатывать алгоритмы поведения робота в различных сценариях использования, нам потребовалось создать механизм создания, редактирования и запуска деревьев поведения, основанный на управляющей программе веб-сервиса. Веб-сервис, в свою очередь, должен взаимодействовать с пакетами ROS2, реализующими конкретные навыки управления роботом (в режиме симуляции, а также в реальной обстановке) для их запуска и получения обратной связи.
|
|||
|
Для этого мы разработали стандарт описания пользовательских навыков в виде json.
|
|||
|
[Пример описания навыка](https://gitlab.com/robossembler/robossembler-ros2/-/blob/main/rbss_movetopose/rbs_package.json?ref_type=heads):
|
|||
|
```json
|
|||
|
{
|
|||
|
"SkillPackage": { "name": "Robossembler", "version": "1.0", "format": "1" },
|
|||
|
"Module": { "name": "MoveToPose", "description": "Move to Pose skill with cartesian controllers", "node_name": "mtp_cartesian" },
|
|||
|
"Launch": { "package": "rbss_movetopose", "executable": "mtp_cartesian.py" },
|
|||
|
"BTAction": [
|
|||
|
{
|
|||
|
"name": "move",
|
|||
|
"type": "action",
|
|||
|
"param": [
|
|||
|
{
|
|||
|
"type": "move_to_pose",
|
|||
|
"dependency": { "robot_name": "arm0",
|
|||
|
"pose": { "position": {"x":0.0, "y":0.0, "z":0.0}, "orientation": {"x":0.0, "y":0.0, "z":0.0, "w": 1.0} } }
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"Settings": {
|
|||
|
"result": "{\n \"params\": \\${ITEM:Array<ITEM>:[]}\n}",
|
|||
|
"context": "type ITEM = {\n\"name\": \\${NAME:string:default},\n\"value\": \\${VALUE:string:default}\n};",
|
|||
|
"form": [
|
|||
|
"{\"name\":\"ITEM\",\"type\":\"Array\",\"id\":\"767a59ff-3d25-4c34-84a2-fa5baf074394\"}"
|
|||
|
],
|
|||
|
"output": {
|
|||
|
"params": [
|
|||
|
{
|
|||
|
"name": "server_name",
|
|||
|
"value": "cartesian_move_to_pose"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "end_effector_velocity",
|
|||
|
"value": "1.0"
|
|||
|
},
|
|||
|
{
|
|||
|
"name": "end_effector_acceleration",
|
|||
|
"value": "1.0"
|
|||
|
}
|
|||
|
]
|
|||
|
},
|
|||
|
"type": "formBuilder"
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### добавление новых деталей в проект
|
|||
|
### разработка новой схемы описания зависимостей, основанной на применении топиков ROS2
|
|||
|
### использование цифровых двойников (Digital Twins)
|
|||
|
### получение интерфейсов ROS2: GetInterfaces
|
|||
|
### переход на новую версию деревьев поведения (с 3 на 4)
|
|||
|
### добавление условий в деревья поведения (Condition)
|
|||
|
Условия в деревьях поведения (Condition) отличаются от действий лишь тем, что возвращают, по итогу, булево значение - true / false.
|
|||
|
Для наших целей мы установили, что такие функции должны быть достаточно быстрыми и выполняться в синхронном режиме вопрос-ответ. Поэтому для их реализации в интерфейсной ноде мы их выделили в отдельный класс RbsCondition, а их обработчик - в виде сервиса. По итогам отладки пришли к выводу, что такой подход упрощает проектирование навыков и уменьшает накладные расходы при реализации нашего API.
|
|||
|
|
|||
|
### сохранение и использование файла описания навыков, используемых в BT (json)
|
|||
|
### тестирование форм-билдера - универсального web-модуля ввода параметров и зависимостей пользователем
|
|||
|
|
|||
|
|
|||
|
## Разработка навыка BT для записи демонстрации rosbag во время симуляции действий робота
|
|||
|
|
|||
|
Положение робота определяется положением его составляющих частей, что в ROS2 описывается сообщениями типа "sensor_msgs/msg/JointState". Если к ним добавить изображения с камер, имеющихся в сцене с роботом, то мы получим полное представление о том, что происходило при прохождении заданного деревом поведения сценария. Поэтому решено было в целях демонстрации, а также в целях получения датасетов для обучения робота создать навык, позволяющий включать и выключать запись таких данных в формат rosbag.
|
|||
|
|
|||
|
Пример реализации такого навыка в дереве поведения:
|
|||
|
```xml
|
|||
|
<root BTCPP_format="4">
|
|||
|
<BehaviorTree ID="Main">
|
|||
|
<Sequence>
|
|||
|
<Action ID="RbsAction" do="RecordingDemo" command="rdConfigure" sid="a"></Action>
|
|||
|
<Action ID="RbsAction" do="MoveToPose" command="move" sid="c"></Action>
|
|||
|
<Action ID="RbsAction" do="RecordingDemo" command="rdStop" sid="a"></Action>
|
|||
|
</Sequence>
|
|||
|
</BehaviorTree>
|
|||
|
<TreeNodesModel>
|
|||
|
<Action ID="RbsAction">
|
|||
|
<input_port name="do"/>
|
|||
|
<input_port name="command"/>
|
|||
|
<input_port name="sid"/>
|
|||
|
</Action>
|
|||
|
</TreeNodesModel>
|
|||
|
</root>
|
|||
|
```
|
|||
|
* skills.json (файл описания навыков, используемых в дереве поведения)
|
|||
|
```json
|
|||
|
{
|
|||
|
"skills": [
|
|||
|
{
|
|||
|
"sid": "a",
|
|||
|
"SkillPackage": { "name": "Robossembler", "version": "1.0", "format": "1" },
|
|||
|
"Module": { "name": "RecordingDemo", "description": "Recording a demo via RosBag", "node_name": "lc_record_demo" },
|
|||
|
"Launch": { "package": "rbs_utils", "executable": "recording_demo_via_rosbag.py" },
|
|||
|
"BTAction": [
|
|||
|
{
|
|||
|
"name": "rdConfigure",
|
|||
|
"type_action": "action",
|
|||
|
"type": "run",
|
|||
|
"param": [],
|
|||
|
"result":[]
|
|||
|
},
|
|||
|
{ "name": "rdStop", "type_action": "action", "type": "stop", "param": [], "result": [] }
|
|||
|
],
|
|||
|
"Settings": [
|
|||
|
{ "name": "output_path", "value": "rbs_testbag" }
|
|||
|
]
|
|||
|
},
|
|||
|
{
|
|||
|
"sid": "c",
|
|||
|
"SkillPackage": { "name": "Robossembler", "version": "1.0", "format": "1" },
|
|||
|
"Module": { "name": "MoveToPose", "description": "Move to Pose skill with cartesian controllers", "node_name": "mtp_cartesian" },
|
|||
|
"Launch": { "package": "rbss_movetopose", "executable": "mtp_cartesian.py" },
|
|||
|
"BTAction": [
|
|||
|
{
|
|||
|
"name": "move",
|
|||
|
"type_action": "action",
|
|||
|
"type": "action",
|
|||
|
"param": [
|
|||
|
{
|
|||
|
"type": "move_to_pose",
|
|||
|
"dependency": { "robot_name": "arm0",
|
|||
|
"pose": { "position": {"x":0.1, "y":0.1, "z":0.9}, "orientation": {"x":0.55, "y":0.0, "z":0.45, "w": 1.0} } }
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
],
|
|||
|
"Settings": [
|
|||
|
{ "name": "server_name", "value": "cartesian_move_to_pose" },
|
|||
|
{ "name": "end_effector_velocity", "value": 1.0 },
|
|||
|
{ "name": "end_effector_acceleration", "value": 1.0 }
|
|||
|
]
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
```
|
|||
|
В процессе отладки навыка выяснилось, что в используемой нами версии ROS2 - Humble в питоновских нодах не работает функция writer.close(), закрывающая текущий сеанс записи. Выяснили, что этот bug исправлен в последующих релизах (в частности, в Jazzy). Пока вышли из ситуации перезапуском ноды навыка.
|
|||
|
|
|||
|
## модуль конвертации файлов rosbag в формат обучения lerobot
|
|||
|
С целью облегчить внедрение роботов нами принято решение создать подход, использующий имитационное обучение и обучение с покреплением, который можно применять даже не имея реального робота, а в имитационной среде. Для этого мы воспользовались актуальным на данный момент, довольно широко поддерживаемым решением [lerobot](https://github.com/huggingface/lerobot), которое предполагает использование стандарта создания и публикации датасетов для этих целей.
|
|||
|
Нами была разработана, протестирована и добавлена конвертации исходного формата "rbs_ros2bag" в lerobot-датасет - см. `lerobot/common/datasets/push_dataset_to_hub/rbs_ros2bag_format.py`.
|
|||
|
|
|||
|
Пример команды:
|
|||
|
```bash
|
|||
|
python push_dataset_to_hub.py \
|
|||
|
--raw-dir /home/user/rbs_bag_to_lerobot \
|
|||
|
--local-dir data/lerobot/rbs_tst_episode \
|
|||
|
--repo-id lerobot/rbs_tst_episode \
|
|||
|
--raw-format rbs_ros2bag \
|
|||
|
--push-to-hub 0 \
|
|||
|
--video 0 \
|
|||
|
--force-override 1
|
|||
|
```
|
|||
|
## разработка пользовательского навыка BT (клиента) движения робота в заданную точку (move to pose)
|
|||
|
- для cartesian-контроллера
|
|||
|
- для MoveIt
|
|||
|
|
|||
|
## Рефакторинг.
|
|||
|
### Перенос интерфейсного узла в пакет запуска деревьев поведения
|
|||
|
Интерфейсная нода выполняет 3 основных задачи:
|
|||
|
- парсинг зависимостей дерева поведения при старте интерфейсного узла для выделения списка навыков и их запуск,
|
|||
|
- передача параметров и зависимостей при выполнении узлов дерева поведения нужным навыкам,
|
|||
|
- синхронизация выполнения узлов дерева поведения исполнительной системой behaviortree_cpp и выполнением этих операций через пользовательские навыки в ROS2.
|
|||
|
|
|||
|
Остановимся подробнее на описании этих функций в интерфейсной ноде.
|
|||
|
При создании дерева поведения в редакторе веб-сервиса (bt.xml) каждому узлу присваивается уникальный идентификатор (sid), который позволяет связать эти узлы при выполнении с их описанием (включающим параметры, вводимые пользователем, статичные настройки навыков и зависимости, указывающие на объекты и артефакты среды): skills.json.
|
|||
|
Эти данные передаются в качестве параметров при старте интерфейсной ноды (в виде пути к вышеуказанным файлам).
|
|||
|
Пример команды запуска интерфейсной ноды:
|
|||
|
```bash
|
|||
|
ros2 launch rbs_bt_executor interface.launch.py bt_path:=/path/to/bt&skills
|
|||
|
```
|
|||
|
Модуль запуска также парсит файл skills.json, составляя список пользовательских навыков и передавая его для запуска в ROS2.
|
|||
|
Интерфейсная нода при создании создаёт сервер действий (ActionServer) для выполнения узлов действий (RbsAction) дерева поведения и сервис для проверки условий (RbsCondition).
|
|||
|
Затем возможно выполнение команды запуска дерева поведения:
|
|||
|
```bash
|
|||
|
ros2 launch rbs_bt_executor rbs_bt_web.launch.py bt_path:=/path/to/bt&skills
|
|||
|
```
|
|||
|
Рассмотрим стандартный алгоритм исполнения одного узла дерева поведения на примере RbsAction (т.е. действия).
|
|||
|
Вначале в интерфейсную ноду через обратный вызов сервера действий приходит запрос с целью, в которой указан конкретный идентификатор (sid) узла BT, наименование запрашиваемой у навыка команды и её тип. Интерфейсная нода находит в описании параметров дерева нужный блок с этим sid, записывает этот блок в параметр ноды навыка с заранее предопределённым именем (имя ноды навыка + суффикс "_cfg"). В случае с lifecycle-нодой навыка производится процедура конфигурирования и активации этой ноды, либо обратная процедура деактивации и очистки состояния.
|
|||
|
Нода навыка, получив нужный параметр, выполняет заданное действие, а интерфейсная нода ожидает выполнения для передачи ответа в исполняющую систему BT.
|
|||
|
Аналогично происходит процесс выполнения проверки условия RbsCondition, с той лишь разницей, что происходят обратные вызовы сервиса интерфейсной ноды.
|
|||
|
|
|||
|
Нужно обратить внимание, что параметр, передаваемый навыку, представляет собой json-строку, в которой передаются все установки и зависимости, необходимые для выполнения запрашиваемого действия или проверки заданного условия.
|
|||
|
|
|||
|
Таким образом, схема построения пользовательского навыка выглядит следующим образом:
|
|||
|
- для lifecycle-узла: обработка вызовов конфигурирования, активации, деактивации и очистки состояния с использованием данных, передаваемых через предопределённый параметр,
|
|||
|
- для обычного узла: обработка обратного вызова установки предопределённого параметра, соответственно, с выполнением операций, определяемых этим параметром.
|
|||
|
|
|||
|
### выделение навыков компьютерного зрения в отдельные пакеты (rbss_objectdetection, rbss_poseestimation)
|
|||
|
|
|||
|
|
|||
|
## Имплементация средств контроля используемых ресурсов
|
|||
|
Весьма значительное время и ресурсы компьтерного оборудования используются в процессе подготовки и использования нейросетевых моделей. Мы решили для целей оптимизации и профилирования этих процессов внедрить оценку на основе пакета [TensorBoard](https://www.tensorflow.org/tensorboard?hl=ru) для сбора данных и их представления в веб-сервисе.
|
|||
|
При отладке этого модуля выявили некоторые особенности, влияющие на работоспособность данного пакета.
|
|||
|
|
|||
|
Сбор данных о потреблении ресурсов компьютера следует производить отдельно от сбора данных непосредственно об метриках обучения.
|
|||
|
Необходимо ограничить запуск шагов обучения 5-ю эпохами (первая - пропускается, вторая - сбор данных производится, но результаты отбрасываются, три последующих - происходит накопление и сохранение данных). При увеличении количества шагов, при которых накапливается информация о производительности, рост затрат на этот процесс не позволяет ему завершиться и, чаще всего, приводит к сбоям в работе и зависанию компьютера.
|
|||
|
|