Планировщик пути обучения с подкреплением для робота 6DOF в ROS2

В этой статье я приведу пример создания симуляции робота в ROS2 (Foxy).
Частью нашего проекта станет коллаборативный робот Doosan. Мы собираемся использовать агент обучения с подкреплением, чтобы найти оптимальный путь. Мы используем числовую инверсную кинематику для расчета положения суставов робота. Наконец, набор соединений робота будет отправлен на контроллер робота для выполнения движения, избегающего препятствий.
Робот будет двигаться в соответствии с планировщиком пути (который находит оптимальный путь между точками A и B, минуя препятствие). Есть много алгоритмов, которые находят оптимальный путь. Обычно оптимальный путь движения робота ищется, например, по алгоритму А* (см. мою статью и реализацию на C++), который находит оптимальный путь в координированном пространстве совместного пространства. В этой статье мы используем декартово пространство. Агент обучения с подкреплением использует уравнение Беллмана для вычисления пути (см. мою предыдущую статью).

Подробности проекта

Для простоты в этом проекте путь вычисляется в 2D (XY), плоскость Z считается постоянной. Идею обучения с подкреплением я описал в своей предыдущей статье. Здесь этот метод используется повторно. Считая ось Z постоянной, агент ищет оптимальный путь в лабиринте 3х3. Обратите внимание, что в папке src вы найдете реализацию 3D-планировщика, в котором агент взаимодействует с 27 состояниями (матрица 3x3x3).
Каждая точка лабиринта считается позицией XYZ. Таким образом, для 3D лабиринт в нашем случае может быть представлен как куб с 27 узлами (как я упоминал выше, в этом проекте мы считаем, что ось Z постоянна, поэтому наш агент находит путь в 9 пространственных средах).
Когда путь к целевому положению робота удовлетворяется (путь между стартом и целью). Позиции отправляются в диспетчер обратной кинематики, чтобы вычислить (численно) совместное зелье робота (для узла в лабиринте). Диспетчер обратной кинетики вычисляет положение робота для определенной ориентации, но вы легко меняете ее (учитывайте комментарии в коде). Симуляцию можно увидеть в Gazebo. Рассмотрим ниже «сигнальный» поток между узлами ROS2.
Проект представляет собой упрощение общей задачи планирования движения робота. В реальности совместное пространство робота моделируется тысячами или миллионами узлов, покрывающих рабочее пространство робота.
В этом проекте мы используем упрощенный подход, чтобы ознакомиться с этим алгоритмом, который можно использовать в качестве планировщика пути. Для среды со многими узлами (положение робота) мы применяем глубокое обучение с подкреплением, где наша Q-таблица (мозг робота) заменяется нейронной сетью (см. предыдущие статьи о глубоком обучении с подкреплением).

Решение в ROS2

В следующем разделе я опишу шаги, которые позволят вам создать симуляцию ROS2 с нуля. Вы также найдете полные рабочие пакеты на моем GitHub.
Примечание. Я не буду предустановлять архитектуру ROS2 и то, как она работает внутри. Есть отличная документация: ROS2, Moveit, Control.
Рекомендую также проверить URDF в туториале Gazebo.

Для начала создайте рабочее пространство. Здесь я создал robotPP (после команды «colcon build»)

Как вы можете видеть на изображении ниже, в src есть 4 папки (пакета), которые вы собираетесь создать шаг за шагом.
ai_path_planner_pkg — это основной пакет, в котором вы запускаете свою основную функцию. .
gazebo_ros2_control — это пакет, отвечающий за управление роботом, которого мы собираемся использовать. Этот пакет мы собираемся клонировать из официального репозитория.
ik_interface — это сервисный пакет, который управляет данными между узлами. В этом проекте основная программа в (ai_path_planner_pkg) взаимодействует с ним ik_manager через сервисный пакет (в данном случае ik_iterface).
Пожалуйста, проверьте файл в ik_interface/srv/XYZJoints.srv. Первые три строки — это параметры запроса ( отправить менеджеру), а под тире ответ (вычисленный косяк).

float32 x
float32 y
float32 z
---
float32 j1
float32 j2
float32 j3
float32 j4
float32 j5
float32 j6

robot_ik — это «ясли» обратной кинематики робота. Менеджер численно вычисляет соединения робота. Входными данными для этих вычислений являются позиции XYZ XYZ, которые «основаны» агентом обучения с подкреплением. Позиции XYZ и вычисленные соединения передаются через определенный выше сервис (IK_interface).

В папке src выполните следующие «действия»:

// 1. 
ros2 pkg create --build-type ament_python ai_path_planner_pkg --dependencies rclpy
// 2.
ros2 pkg create --build-type ament_cmake ik_interface
cd ik_interface/
mkdir srv
// 3.
ros2 pkg create --build-type ament_python robot_ik
// 4.
git clone -b foxy https://github.com/ros-simulation/gazebo_ros2_control.git

Выполнив приведенную выше команду, вы должны иметь аналогичную настройку папки на своем компьютере. Пожалуйста, загляните на мой gitHub, чтобы проверить настройку проекта.

Теперь я сосредоточусь на пакете ai_path_planner_pkg, поскольку он включает в себя определение робота, файлы запуска и настройку управления.
Папка выглядит следующим образом.

Папка /description включает в себя все файлы, необходимые для построения виртуальной модели робота. Вложенные папки и файлы создаются робототехникой Doosan (см. здесь). Папка запуска содержит скрипт Python, который запускает симуляцию Gazebo. В скрипте Python мы вызываем первый файл xacro, который определяет робота (кинематику робота и физические параметры, такие как: масса, инерция, тип звеньев, скорость и т. д.).
Чтобы повлиять на движение робота, вам нужно вызвать контроллер (см. macro.gazebo_config_control.xacro), который, как вы понимаете, можно рассматривать как интерфейс между командой роботу (например, moveL или moveJ) и физическим роботом ( здесь симулятор в Беседке). Контроллер принимает команды и вычисляет совместные траектории для достижения целей.

Теперь вам нужно собрать и получить:

colcon build

Теперь откройте свой терминал (или терминатор) и выполните следующие команды (выполнить команду в отдельном экземпляре терминала)

ros2 run robot_ik doosan_inverse
ros2 launch ai_path_planner_pkg ai_gazebo_controller.launch.py
ros2 run ai_path_planner_pkg reach_target

Ожидаемое движение робота.

Ссылки:

[1] Давид Валенсия

[2] Казуальная робототехника