robossembler.org/docs/software/shalenikol_commits_4th_milestone.md

21 KiB
Raw Blame History

id title
report4part 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.
Пример описания навыка:

{
    "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.

Пример реализации такого навыка в дереве поведения:

<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 (файл описания навыков, используемых в дереве поведения)
{
  "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, которое предполагает использование стандарта создания и публикации датасетов для этих целей. Нами была разработана, протестирована и добавлена конвертации исходного формата "rbs_ros2bag" в lerobot-датасет - см. lerobot/common/datasets/push_dataset_to_hub/rbs_ros2bag_format.py.

Пример команды:

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.
Эти данные передаются в качестве параметров при старте интерфейсной ноды (в виде пути к вышеуказанным файлам). Пример команды запуска интерфейсной ноды:

ros2 launch rbs_bt_executor interface.launch.py bt_path:=/path/to/bt&skills

Модуль запуска также парсит файл skills.json, составляя список пользовательских навыков и передавая его для запуска в ROS2. Интерфейсная нода при создании создаёт сервер действий (ActionServer) для выполнения узлов действий (RbsAction) дерева поведения и сервис для проверки условий (RbsCondition).
Затем возможно выполнение команды запуска дерева поведения:

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

Сбор данных о потреблении ресурсов компьютера следует производить отдельно от сбора данных непосредственно об метриках обучения. Необходимо ограничить запуск шагов обучения 5-ю эпохами (первая - пропускается, вторая - сбор данных производится, но результаты отбрасываются, три последующих - происходит накопление и сохранение данных). При увеличении количества шагов, при которых накапливается информация о производительности, рост затрат на этот процесс не позволяет ему завершиться и, чаще всего, приводит к сбоям в работе и зависанию компьютера.