Создание интуитивно понятного управления роботом-манипулятором с помощью повязки Myo

Создание интуитивно понятного управления роботом-манипулятором с помощью повязки Myo

4 февраля 2023 г.

Недавно мне подарили повязку Myo, и в этой статье я хочу описать, как такое устройство можно использовать для интуитивного управления роботом-манипулятором. То есть мы будем двигать нашей рукой так, как если бы это была настоящая рука робота. Реализация основана на операционной системе роботов (ROS), в частности, на rospy API. Я оставляю вам ссылку на репозиторий основного проекта, репозиторий набора данных распознавания жестов и сам набор данных.


Что в мио

Повязка Myo представляет собой электронный браслет производства Thalmic Labs, который позволяет владельцу удаленно взаимодействовать с другими устройствами. Загляните в репозиторий Thalmic Labs, чтобы понять, что с ним можно сделать.

Устройство оснащено акселерометром, гироскопом и магнитометром, объединенными внутри чипа под названием MPU-9150. Эти датчики предоставляют ценные данные, которые можно использовать, чтобы понять, где находится устройство в пространстве и даже как оно ориентировано.

Но Myo, вероятно, больше всего известен своим 8-канальным датчиком EMG, дающим ему возможность ощущать мышечную активность руки того, кто его носит. Затем можно обработать такие данные, чтобы распознать текущий жест руки пользователя. Машинное обучение является популярным выбором здесь. Например, люди создавали приложения, позволяющие переключать каналы на смарт-телевизоре, поднимая и опуская руку, или включать умный свет, щелкая пальцами.

The Myo armband. Photo from Adafruit (https://learn.adafruit.com/assets/30334)


Давайте возьмем роботизированную руку

Наша цель — управлять роботом с помощью Myo. Так что, похоже, нам нужен робот, который в наше время довольно дорог :(

К счастью, симуляторы существуют, и мы действительно будем управлять роботом в моделируемой среде с помощью Gazebo. Какой робот? Мы выбрали манипулятор с 7 степенями свободы (DoFs) от Franka Emika. Это очень популярный выбор в академических исследованиях, но он также находит применение в некоторых промышленных средах. Мы придерживаемся Franka, особенно потому, что, будучи избыточным манипулятором, он способен на очень ловкие движения, что делает его подходящим для нашего интуитивного управления.

Теперь, когда у нас каким-то образом появился робот, нам нужен способ поговорить с ним. Для этой цели существует Robot Operating System (или просто ROS), вероятно, стандарт де-факто, когда речь идет о проектах робототехники с открытым исходным кодом. В частности, мой код основан на rospy, который, как вы могли догадаться, представляет собой пакет Python, позволяющий писать код для взаимодействия с ROS. Существует множество библиотек для работы с Franka с ROS, и вы также можете найти хорошие рабочие библиотеки для повязки Myo. В частности, я использовал ros_myo «поговорить» с браслетом и libfranka для взаимодействия с Franka. Давайте поблагодарим авторов, они сняли с нас много работы.

The Franka Emika manipulator. Source: Ims, CC BY-SA 4.0 , via Wikimedia Commons (https://commons.wikimedia.org/wiki/File:Franka_Emika2.jpg)


Как мы управляем роботом

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

Conceptual scheme of the implemented resolved-velocity control. Photo by the author

Этот контроллер задаст манипулятору ориентацию Myo (т. е. нашей руки), тогда как разгибание и сгибание руки при обнаружении запускают линейную скорость +0,1 м. /с и -0,1 м/с соответственно в направлении подхода рабочего органа (например, захвата Franka). Естественно, всякий раз, когда рука устойчиво находится в нейтральном положении, линейная скорость рабочего органа будет равна нулю.

На изображении выше вы можете видеть блок, отмеченный как 1/s. Это внутренний контур управления манипулятором, который напрямую общается с суставами робота и заставляет их двигаться. Он предоставляется API Franka и совместим с интерфейсом управления ROS. Он отмечен как 1/s, потому что это символ интегратора в частотной области. Действительно, здесь мы предполагаем, что внутренний контур управления работает очень хорошо и ведет себя как идеальный интегратор (скорость в пространстве, пунктирная q, интегрирован для обеспечения желаемого положения суставного пространства, q). В зависимости от контекста это предположение может быть слишком оптимистичным.

Control algorithm. Photo by the author


Извлеките ориентацию из Myo

Существует несколько способов описания ориентации тела в пространстве относительно данной системы отсчета. Например, популярным выбором является использование углов крена, тангажа и рыскания. Таким образом, у нас есть тройка чисел, каждое из которых представляет угол относительно. оси x, y и z соответственно. В частности, в робототехнике и ROS обычной практикой является использование единичных кватернионов для представления ориентации .

Учитывая, что у Myo есть встроенный магнитометр, он уже может дать нам текущую ориентацию. К сожалению, я обнаружил большую проблему с этим. А именно, неясно, к какой системе отсчета относится предоставленная ориентация. Хуже того, при записи нескольких ориентаций одной и той же позы Мио результаты иногда были разными. Это может быть проблема с прошивкой или самим магнитометром, потому что это устройство может сильно пострадать от присутствия рядом других электрических устройств. Дело в том, что я не мог доверять ориентации Myo таким образом.

Чтобы решить проблему надежной ориентации, мы используем пакет ROS imu_filter_madgwick. Он обеспечивает готовую реализацию фильтра Мэджвика, алгоритм, который объединяет угловые скорости (от гироскопа) и линейные ускорения (от акселерометра) для вычисления ориентации относительно магнитного поля Земли. Вкратце, фильтр сначала вычисляет ориентацию, интегрируя показания гироскопа. Одно только это со временем быстро накапливало бы ошибки, делая его бесполезным. С этой целью фильтр также обеспечивает вторую ориентацию, вычисленную с помощью алгоритма градиентного спуска, примененного к данным акселерометра. Эта вторая ориентация служит для исправления долговременной ошибки первой.

Когда у нас есть надежный источник ориентации, нам нужно описать его относительно базовой ссылки нашего манипулятора. Здесь мы предполагаем, что нам известна ориентация базовой системы координат по отношению к глобальной системе координат Земли. Поскольку мы работаем в симуляции, мы можем произвольно выбрать, чтобы глобальная система отсчета в виртуальном мире совпадала с земной. В частности, учитывая, что наш мир-беседка также имеет базовую рамку связи, выровненную с рамкой мира, мы можем прямо сказать, что фильтр Мэджвика дает нам ориентацию Мио, связанную с базовой связью Франки. Именно то, что нам нужно.


Предварительная обработка для фильтра Мэджвика

Поскольку мы стремимся управлять манипулятором, как если бы это была наша рука, легко подумать, что наша рука действует как захват. Отсюда следует, что наше предплечье должно быть выровнено с направлением приближения (ось Z) концевого эффектора Franka. Акселерометр и гироскоп Myo ориентированы по-другому, так как их ось Z ортогональна нашему предплечью. Поэтому нам нужно изменить кадр, чтобы учесть это, как показано ниже.

left: original Myo frame | center: rotated Myo frame | right: Franka end-effector frame. Photos by the author

Затем мы должны понимать, что и гироскоп, и акселерометр являются очень шумными датчиками. С этой целью я считаю целесообразным фильтровать их данные с помощью детектора Оптимальная оценка гипотезы стойки¹ (SHOE), прежде чем передавать их алгоритму Мэджвика. Это простая формула, которая вычисляет оценку на основе показаний угловой скорости и линейного ускорения, взвешенных по их отклонениям. Мы говорим, что гипотеза о стойке подтверждена (т. е. устройство неподвижно) или отклонено (т. е. устройство движется), когда оценка ниже или выше заданного порога. Идея состоит в том, чтобы передавать данные фильтру Мэджвика только в том случае, если мы обнаружим, что устройство (наша рука) движется. Это не позволяет алгоритму продолжать вычислять бесполезные микроизменения ориентации из-за подсознательных движений или вибраций нашей руки.

The formula of the SHOE detector. Photo by the author

Effects of the SHOE detector. Photo by the author

В приведенном выше видео мы просто регистрируем угловую скорость и ускорение Myo. Не важно читать значения. Важно то, что, как вы можете видеть, данные в левой части экрана непрерывно меняются, даже когда моя рука не двигается значительно. Напротив, в правой части экрана показаны те же данные, отфильтрованные с помощью детектора SHOE. На этот раз значения времени обновляются гораздо более согласованно с истинными движениями моей руки.


Распознавание жестов

Кратко: мы хотим использовать датчик ЭМГ Myo для распознавания жестов. Нам нужно 2 разных жеста, чтобы задать скорость +0,1 м/с или -0,1 м/с вдоль оси Z рабочего органа. Кроме того, мы хотим, чтобы захват закрывался, когда мы сжимаем руку в жесте кулака. Наконец, нам нужно распознавать, когда наша рука находится в нейтральной позе, чтобы не отправлять роботу ни одну из предыдущих команд.

The 4 gestures used in this project. neutral (upper left) | fist (upper right) --> close gripper | extension (bottom left) --> move forward | flexion (bottom right) --> move backward. Images from myo-readings-dataset (https://github.com/aljazfrancic/myo-readings-dataset)

В этом проекте используется реализация scikit-learn Машина опорных векторов (SVM ), обученный распознаванию жестов. Я попробовал несколько других классификаторов машинного обучения, но SVM оказался лучшим. Кроме того, он включает в себя только скалярные произведения, быструю операцию для современных машин. Скорость алгоритма имеет для нас решающее значение, поскольку мы будем работать в режиме реального времени.

Конечно, любой алгоритм машинного обучения требует правильного набора данных для обучения. Есть даже несколько наборов данных хорошего качества, доступных в Интернете для распознавания жестов с помощью повязки Myo. К сожалению, большинство из них принимают показания ЭМГ в виде 8-битного целого числа без знака (он же байт). Мое устройство предоставляет данные в виде 16-битных целых чисел со знаком. Это может быть связано с другой версией прошивки или пакетом ROS, используемым для взаимодействия с браслетом. В любом случае, я не добился удовлетворительных результатов при обучении этим наборам данных.

В итоге я собрал свой собственный небольшой набор данных, попросив кучу друзей и родственников выполнять жесты руками, надевая Myo. Протокол был очень простым: для каждого кандидата я записал по 2 сеанса для каждого из трех целевых жестов (кулак, сгибание и разгибание). Один сеанс длился минуту, в течение которого кандидата просили чередовать нейтральный и целевой жест каждые 5 секунд. Тем временем записывались все показания ЭМГ, поступающие от Myo. Затем окончательный набор данных был разбит на образцы в режиме скользящего окна. Один образец включает 30 последовательных показаний ЭМГ по 8 каналам. Два последующих образца имеют перекрытие в 10 показаний. Этот выбор должен включать примерно 2 предсказания жестов в секунду.

Когда у меня были данные, зная продолжительность (60 секунд) сеанса, целевой жест, выполняемый в каждом сеансе, продолжительность каждого жеста (5 секунд) и частоту датчика ЭМГ (около 50 герц), я мог аннотируйте каждый образец соответствующей меткой жеста. Такой подход теоретически оптимален, но на деле таковым быть не может. ЭМГ не всегда работает на частоте 50 Гц, а кандидатом является человек, а не идеальная машина, поэтому иногда жест длится более 5 секунд, иногда меньше. Таким образом, вы будете накапливать ошибки при аннотировании сэмплов таким образом во время сеанса записи. Оказалось, что лучшим решением было аннотировать данные с помощью алгоритма кластеризации, в частности, я выбрал популярный К-средних. Хотя SVM является контролируемым классификатором машинного обучения, этот принадлежит к семейству неконтролируемых алгоритмов обучения. Это означает, что он может делать выводы из данных без контролируемого сигнала (т. е. меток). Поэтому я просто запускаю K-средние для всего набора данных, разделяя его на 4 разных кластера. Метка кластера задавалась как метка для каждой из его выборок. Затем я обучил SVM на этом наборе данных.

Набор данных был загружен и доступен бесплатно на Kaggle. Там вы найдете быстрый блокнот, на котором вы можете проверить производительность SVM на данных, аннотированных как метками «вручную», так и метками, предоставленными K-средними. Тест выполняет 5-кратную перекрестную проверку. Как видите, при использовании самодельных этикеток SVM работает достаточно хорошо. Мы приближаемся к 0,9 как по точности, так и по оценке F1 (лучше учитывать последнее, поскольку набор данных сильно несбалансирован по отношению к нейтральному классу жестов). Но если мы обучим классификатор на том же самом наборе данных, но с использованием меток классов, предоставленных K-средними, мы поднимем его почти до 0,98 по обеим метрикам. Этот разрыв не должен нас удивлять. Кластеризация действительно аннотирует данные на основе шаблонов, которые естественным образом присутствуют в самих данных, и именно так вы должны использовать машинное обучение. С другой стороны, метки, которые я поставил, зависят только от времени, но на практике мы знаем, что это приведет к ошибкам, поэтому классификатор будет учиться на плохих данных.

Теперь я должен подчеркнуть одну вещь: то, что я сделал здесь, то есть использование алгоритма кластеризации для аннотирования данных для контролируемого обучения, не может быть сделано в большинстве случаев. В противном случае машинное обучение было бы намного проще. Дело в том, что метки кластеров, предоставленные K-средними, вообще не имеют семантического значения! Например, вы знаете, что образец x принадлежит кластер "3", но на самом деле вы не знаете, какой класс "3". К счастью, в этом проекте, учитывая, что у нас есть только 4 возможных метки и классификатор работает довольно хорошо, было просто экспериментально найти ассоциации от меток кластеров к связанным жестам. Но в целом это невозможно сделать. Представьте, что у вас есть 1000 разных кластеров, и вам нужно сопоставить 1000 разных меток классов…

Ниже приведена попытка визуализировать весь набор данных. Два красноватых круга представляют собой метки классов, и вы можете видеть, что действительно существуют различия между теми, которые я предоставил (внутренние), и теми, которые были даны K-средними (внешними). Голубоватый кружок — это показания ЭМГ: чем больше он приближался к желтому, тем мощнее была зарегистрированная мышечная активность.

Whole dataset. Photo by the author

Здесь мы находим только подмножество набора данных. На этот раз вы можете лучше понять, что голубоватый круг разбит на множество круглых секторов, каждый из которых представляет собой единый образец. Обратите также внимание на ортогональное разделение на 8 различных частей. Это потому, что Myo EMG имеет 8 разных каналов.

A subset of the dataset. Photo by the author

Как мы уже говорили ранее, один образец влечет за собой 30 последовательных показаний ЭМГ. Если вы знакомы с numpy, мы можем сказать, что образец представляет собой пустой массив с формой [30, 8]. Теперь мы можем сгладить его в одномерный массив формы [150] и передать его SVM. Однако с небольшой предварительной обработкой мы добьемся лучших результатов. Действительно, я не обучал классификатор на этих необработанных данных. Каждый образец подвергается операции сокращения по оси времени (первое измерение массива). В частности, я беру медиану временного ряда, представленного выборкой. Таким образом, мы переключаемся с массива [30, 8] просто на массив [8]. Это выгодно, потому что у нас меньше данных для обработки, и это позволяет нам лучше обобщать, делая классификатор более надежным, особенно в отношении выбросов. Кроме того, мы также нормализуем результирующий вектор признаков между 0 и 1.

Data preprocessing. Photo by the author


Controlling the manipulator. Photos by the author.


Об особенностях кинематики

Последний пункт нашего проекта. Напомним, что Франка — это избыточный манипулятор. Это означает, что он может достичь желаемого положения исполнительного органа потенциально более чем в одной конфигурации. Это желательное свойство в целом, но оно не дается бесплатно. Действительно, есть некоторые конфигурации суставов, которые делают дальнейшее движение очень неудобным для нашего манипулятора. Это называется кинематические особенности .

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

Второй режим реализует переработанный контур управления с разрешенной скоростью, представленный в Чисто реактивный контроллер движения с максимальной манипулируемостью². Вкратце, он направлен на максимизацию измерения манипулируемости (MoM). Вы можете думать об этом как о показателе того, насколько легко манипулятор может уйти от своей текущей конфигурации соединения. Таким образом, если мы максимизируем это количество во время нашего цикла управления, мы держим Франку вдали от ее сингулярностей. Изображения ниже могут помочь вам визуализировать, что такое кинематическая особенность.

left: singular configuration | right: singularity has been avoided. Photos by the author

Чтобы управлять роботом в этих позах, я делал то же самое движение рукой, но это приводило к двум разным действиям. Слева мы находим Франку в одной из ее уникальных конфигураций, с 6-м суставом, выровненным по вертикали с основным звеном. Справа сингулярность удалось избежать благодаря усовершенствованному контуру управления, и робот готов к переходу в любую другую конфигурацию.


Выводы и ограничения

Конечно, этот проект далек от совершенства и ни в коем случае не готов к использованию в любой реальной среде. Предполагается, что это будет доказательство концепции для дальнейших разработок, хотя я признаюсь, что даже сейчас довольно забавно использовать Myo для управления Franka :) Один из наиболее критических моментов касается сложности выполнения всех вычислений, необходимых для поддержания нашей код запущен и работает.

Для сравнения, номинальная частота манипулятора Franka составляет 1 кГц. Понизив версию и отключив некоторые функции физического движка Gazebo, я могу запускать программу на частоте около 100–200 Гц. И это при использовании простого контура управления без избежания сингулярности. Внедряя расширенный контроль разрешенной скорости, частота падает примерно до 5 Гц. Это в 200 раз меньше частоты, на которой должен работать робот.

Алгоритм включает в себя решение каждый раз задачи квадратичного программирования, и моя машина не может справиться с ней в режиме реального времени. Я предпринял несколько попыток улучшить это, на самом деле без существенного выигрыша. Одна из идей может заключаться в том, чтобы использовать простой контроллер по умолчанию, прибегая к расширенному, когда мы приближаемся к сингулярности. В более широком смысле я думаю, что переход с Python на C++ может иметь огромное значение. Естественно, если у вас мощная машина, вы уже можете получать удовольствие, даже не замечая этих проблем.

В любом случае, если вы зашли так далеко, позвольте мне поблагодарить вас. Я знаю, что я только что сообщил краткое описание проекта, не обсуждая подробно ни код, ни теорию, стоящую за ним. Цель состояла в том, чтобы просто вызвать ваше любопытство и дать вам представление о том, чего можно достичь с помощью робототехники и науки о данных. Если у вас есть время, желание и повязка Myo под рукой, смело продлевайте этот проект!


Ссылки

[1] И. Ског, П. Гендель, Дж.-О. Нильссон и Дж. Рантакокко, «Обнаружение нулевой скорости — оценка алгоритма", в IEEE Труды по биомедицинской инженерии, вып. 57, нет. 11, стр. 2657–2666, ноябрь 2010 г., doi: 10.1109/TBME.2010.2060723.

[2] Хэвиланд, Дж. и Корк, П., 2020. Чисто-реактивный контроллер движения с максимальной манипулируемостью. препринт arXiv arXiv:2002.11901.


:::информация Это сообщение изначально было опубликовано здесь.

:::


Оригинал