AI & Robotics Lab
19 subscribers
78 photos
30 videos
9 files
130 links
Explore AI code generation, robotics, and ROS with original projects and hands-on guides. Follow along as I share my experience, code samples, and tips for building intelligent systems.
Download Telegram
🏗 MoveIt Task Constructor: структурирование сложных задач

Завершаем погружение в архитектуру MoveIt. Предыдущие посты:
Обзор архитектуры
Кинематика
Планирование движения
Гибридное планирование
Центральный узел move_group
Сцена планирования

Для решения комплексных задач, таких как "взять объект со стола и положить его в коробку", простого планирования движения из точки А в точку Б недостаточно. Требуется разбить задачу на последовательность шагов: подойти, открыть захват, опуститься, схватить, поднять, переместиться к коробке, разжать захват. Именно для такого структурированного подхода и используется MoveIt Task Constructor (MTC). Он раскладывает сложную задачу на набор более простых, взаимосвязанных подзадач, которые называются "стадиями" (Stages). Эти стадии выстраиваются в иерархическую структуру, образуя полный план решения.

Стадии

Каждая стадия представляет собой определенный шаг в конвейере планирования. По тому, как они обрабатывают и передают информацию (решения), стадии делятся на три основных типа:

Генераторы (Generators): создают исходные состояния и не зависят от соседних стадий. Они являются отправными точками для планирования.
Пример: cамая важная стадия-генератор CurrentState, которая просто получает текущее положение суставов робота. Другой пример - Generate Grasp Pose: генерация множества возможных поз для захвата объекта.

Распространители (Propagators): получают решение от одной соседней стадии, выполняют свою подзадачу и распространяют результат дальше, на другую сторону. Они могут работать как "вперед" от начального состояния, так и "назад" от целевого.
Пример: cтадия относительного движения, такая как Move Relative, которая вычисляет траекторию подхода к объекту, начиная с уже известной позы робота.

Соединители (Connectors): не создают новых состояний, а пытаются соединить два существующих, предоставленных им соседними стадиями.
Пример: планирование движения в свободном пространстве. Соединитель получает начальную и конечную конфигурации суставов и пытается найти между ними беспрепятственную траекторию.

Контейнеры: организация стадий

Чтобы управлять сложными иерархиями, стадии помещаются в контейнеры. Контейнеры сами являются стадиями и определяют логику их совместного выполнения.

• Последовательный контейнер (Serial Container): Организует стадии в линейную цепочку. Каждая следующая стадия начинается из состояния, в котором закончилась предыдущая. Весь процесс "взятия и переноса" объекта является классическим примером последовательного контейнера. По умолчанию, вся задача MTC — это один большой последовательный контейнер.

Параллельный контейнер (Parallel Container): Позволяет рассматривать альтернативные решения или выполнять действия одновременно.
Пример 1 (Альтернативы): поместить в параллельный контейнер две подзадачи: "взять объект левой рукой" и "взять объект правой рукой". MTC найдет решение для обеих (если это возможно) и выберет лучшее (например, по длине траектории).
Пример 2 (Одновременность): одновременно планировать движение руки к цели и открытие захвата.

Обертка (Wrapper): тип контейнера, который инкапсулирует одну дочернюю стадию, чтобы изменить или отфильтровать ее результаты.
Пример: стадия генерации поз захвата производит набор декартовых поз (положение + ориентация). Чтобы робот мог их достичь, нужны конкретные углы суставов. IK Wrapper (решатель обратной задачи кинематики) оборачивает стадию генерации поз и преобразует ее декартовы решения в углы суставов.
🔥1
Оценка Стоимости Решений: CostTerm

Когда MTC находит несколько возможных решений для одной и той же задачи (например, несколько траекторий обхода препятствия), ему нужен способ выбрать "лучшее". Для этого используется концепция стоимости. Каждому решению присваивается числовое значение стоимости, и MTC, как правило, выбирает решение с наименьшей стоимостью.

Интерфейс CostTerm позволяет определять, как именно будет рассчитываться эта стоимость. Доступны различные реализации:
Constant: присваивает каждому решению фиксированную, постоянную стоимость.
PathLength: стоимость зависит от длины траектории в пространстве суставов. Чем длиннее путь, тем выше стоимость.
TrajectoryDuration: стоимость основана на времени выполнения траектории.
LinkMotion: стоимость зависит от длины пути, который проходит определенное звено робота.
DistanceToReference: стоимость определяется тем, насколько конфигурация суставов далека от некой эталонной конфигурации.
Clearance: стоимость обратно пропорциональна минимальному расстоянию до столкновения. Чем ближе робот к препятствию, тем выше стоимость.
LambdaCostTerm: позволяет задать собственную функцию расчета стоимости с помощью лямбда-выражения.

Порядок решения задачи

1. Инициализация: cоздается объект Task, который является корневым контейнером.
2. Построение: в Task добавляются стадии и контейнеры, формируя полную логику задачи.
3. Настройка: для стадий задаются решатели (OMPL, CartesianPath) и, при необходимости, калькуляторы стоимости (CostTerm).
4. Планирование: запускается метод plan(). MTC проходит по всей иерархии стадий, генерируя и соединяя решения, и ищет сквозные пути с наименьшей итоговой стоимостью.
5. Выполнение: после нахождения успешного решения, оно передается контроллеру (ros2_control) для физического выполнения на роботе или симуляции.

Поиграться с конструктором задач можно в tutorial. Я, в свою очередь, также планирую сделать о нем ролик )

#ros2 #moveit
1
🧸 Друг, с которым можно поболтать обо всем

Взять мягкую игрушку, прикрутить к ней ChatGPT и немного заработать на ИИ для детей - что может пойти не так? Да, буквально, все 🤣

Беседа с мишкой или кактусом очень легко может перейти в плоскость вредных советов: где найти спички и ножи и как их пустить в дело, чтобы скоротать время в ожидании родителей. Или потолковать о БДСМ - тоже неплохой сценарий.

Двигаться, пить и курить как в фильме Ted подобные игрушки (пока) не могут, но по части поддержать разговор - то, что 13 лет назад выглядело как абсолютная фантастика, сегодня уже вполне доступно.

Понятно, что удержать детей в стороне от ИИ - тупиковый путь. Остается только разбираться самому и учить их не доверяться его советам, какими бы умными они не казались.
👾1