robossembler.org/docs/software/shalenikol_commits_4th_milestone.md

231 lines
21 KiB
Markdown
Raw Normal View History

---
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-ю эпохами (первая - пропускается, вторая - сбор данных производится, но результаты отбрасываются, три последующих - происходит накопление и сохранение данных). При увеличении количества шагов, при которых накапливается информация о производительности, рост затрат на этот процесс не позволяет ему завершиться и, чаще всего, приводит к сбоям в работе и зависанию компьютера.