Заархивировано - Управление роботизированной рукой с помощью камер Intel® RealSense™

Выпуск комплекта Intel® RealSense™ SDK прекращен. Его поддержка и обновления более недоступны.

Аннотация

Роботизированная рука Roy компании Roemotion* была создана в результате успешно профинансированного проекта на портале Kickstarter, начатого в 2012 году. Описание гласило: «Проект создания движущегося персонажа размером с человека с использованием только механических деталей, полученных способом лазерной резки, и сервоприводов, доступных в широкой продаже в магазинах товаров для хобби и моделирования». В этом эксперименте с помощью пакета Intel® RealSense™ SDK для Windows* было разработано программное обеспечение для управления рукой Roy. Для управления используются API-интерфейсы отслеживания рук, доступные в составе SDK (рис. 1).

Figure 1. Robotic hand control software.

Рисунок 1.Программа для управления роботизированной рукой

Код для этого проекта был разработан на C#/XAML с помощью Microsoft Visual Studio* Community 2015. Программное обеспечение может использовать камеры Intel RealSense F200 и SR300 (скоро будет доступна). Чтобы увидеть роботизированную руку, управляемую программным обеспечением, в действии, посмотрите следующее видео на сайте YouTube*: https://youtu.be/VQ93jw4Aocg

О руке Roy

Набор для сборки руки Roy в настоящее время можно приобрести на веб-сайте компании Roemotion, Inc. в виде комплекта для сборки. Комплект включает:

  • детали, изготовленные методом лазерной резки;
  • все необходимые крепежные элементы;
  • 8 сервоприводов (таких же, какие используются в управляемых моделях);
  • 6 удлинительных кабелей для сервоприводов.

Как указано на веб-сайте Roemotion, этот комплект не включает электронику для управления. Это обусловлено тем, что изначально смысл проекта заключался в предоставлении людям интересных механических систем для использования с любыми контроллерами. В самом эксперименте используется сторонний сервоконтроллер для управления моторами в роботизированной руке (рис. 2).

Figure 2. Roy robotic arm.

Рисунок 2. Роботизированная рука Roy

В руке установлено 6 сервомоторов: по одному для указательного пальца, среднего пальца, безымянного пальца и мизинца и два для большого пальца. (Примечание. Еще два сервомотора установлены в основании руки для управления движением запястья, но в этом эксперименте мы ими не управляем.)

API-интерфейсы отслеживания рук в Intel® RealSense™ SDK

Как указано в документации к Intel RealSense SDK, модуль отслеживания рук предоставляет трехмерное отслеживание движения рук в реальном времени и может отслеживать одну или две руки, предоставляя данные о точном расположении всех суставов. В рамках этого эксперимента по управлению устройством в реальном времени особый интерес для нас представляют значения сгиба пальцев, полученные с помощью вызовов метода QueryFingerData().

Электроника для управления

В этом эксперименте мы использовали 6-канальный USB-сервоконтроллер Pololu Micro Maestro* (рис. 3) для управления шестью моторами, установленными в руку Roy. Это устройство включает достаточно сложный SDK для разработки управляющих приложений, предназначенных для разных платформ, с использованием разных языков программирования.

Figure 3. Pololu Micro Maestro* servo controller.

Рисунок 3.Сервоконтроллер Pololu Micro Maestro*

Настройка сервоконтроллера

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

К счастью, в состав пакета Pololu Micro Maestro SDK входит приложение Control Center, с помощью которого пользователь может настраивать параметры на уровне микропрограммы и сохранять их во флеш-память на плате контроллера. Параметры, определенные опытным путем для этого приложения, показаны на рис. 4.

Figure 4. Pololu Maestro Control Center app.

Рисунок 4.Приложение Pololu Maestro Control Center

После настройки параметров для положений Min и Max микропрограмма сервоконтроллера не позволит сервомоторам выйти за разрешенный диапазон перемещения. Это очень важно для применения в данном случае, поскольку в роботизированной руке подвижность всех суставов ограничена механическими упорами. Если при движении сустав дойдет до упора, а сервомотор при этом не остановится, это может привести к перегреву и перегоранию электромотора и к повреждению шестерней.

Еще один важный параметр в данном случае называется On startup or error. Благодаря ему все пальцы по умолчанию (и в случае ошибок) занимают выпрямленное положение, чем исключается возможность зацепления большого и указательного пальцев, если они были согнуты.

Еще два параметра, на которые следует обратить внимание, — параметры Speed и Acceleration, управляющие скоростью и ускорением. С помощью этих параметров можно делать движение более плавным на уровне микропрограммы. Такой подход предпочтительнее, чем высокоуровневые алгоритмы фильтрации, из-за которых увеличиваются задержки и повышается нагрузка на основное программное приложение.

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

Собственная программа для управления

В этом эксперименте мы разработали собственную программу (рис. 5), исполь­зующую множество функций отслеживания рук, доступных в образцах кода в SDK.

Figure 5. Custom Control Software.

Рисунок 5. Собственная программа для управления

В пользовательском интерфейсе есть данные об отслеживании кончиков пальцев в реальном времени, но в этом конкретном эксперименте мы использовали три следующих параметра для управления рукой Roy:

  • Данные оповещений.
  • Данные о сгибании.
  • Данные масштаба.

Данные оповещений

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

В этом эксперименте приложение отслеживает следующие данные оповещений:

  • Рука обнаружена.
  • Рука откалибрована.
  • Рука находится внутри границ.

Используемое программное приложение предотвращает управление сервомеханизмами роботизированной руки в случае срабатывания любого из этих оповещений. Для того чтобы программа могла управлять роботизированной рукой, рука пользователя должна быть правильно откалибрована и находиться в пределах дальности действия камеры.

Как показано в приведенном ниже фрагменте кода, приложение циклически получает количество сработавших оповещений и задает три логические переменные: detectionStatusOk, calibrationStatusOk и borderStatusOk (обратите внимание, что handOutput является экземпляром PXCMHandData).

for (int i = 0; i < handOutput.QueryFiredAlertsNumber(); i++)
{
  PXCMHandData.AlertData alertData;
  if (handOutput.QueryFiredAlertData(i, out alertData) != 
         pxcmStatus.PXCM_STATUS_NO_ERROR) { continue; }
 
  switch (alertData.label)
  {
         case PXCMHandData.AlertType.ALERT_HAND_DETECTED:
               detectionAlert = "Hand Detected";
               detectionStatusOk = true;
               break;
         case PXCMHandData.AlertType.ALERT_HAND_NOT_DETECTED:
               detectionAlert = "Hand Not Detected";
               detectionStatusOk = false;
               break;
         case PXCMHandData.AlertType.ALERT_HAND_CALIBRATED:
               calibrationAlert = "Hand Calibrated";
               calibrationStatusOk = true;
               break;
         case PXCMHandData.AlertType.ALERT_HAND_NOT_CALIBRATED:
               calibrationAlert = "Hand Not Calibrated";
               calibrationStatusOk = false;
               break;
         case PXCMHandData.AlertType.ALERT_HAND_INSIDE_BORDERS:
               bordersAlert = "Hand Inside Borders";
               borderStatusOk = true;
               break;
         case PXCMHandData.AlertType.ALERT_HAND_OUT_OF_BORDERS:
               bordersAlert = "Hand Out Of Borders";
               borderStatusOk = false;
               break;
  }
}

Перед любой попыткой программы управлять сервомеханизмами руки проводится проверка: все три переменные, то есть detectionStatusOk, calibrationStatusOk и borderStatusOk, должны иметь значение True. Если в любой момент времени какой-либо из этих трех флагов получает значение False, то все пальцы переводятся в положение Open по умолчанию для безопасности.

Данные о сгибании

Программа, разработанная в ходе этого эксперимента, вызывает метод QueryFingerData(), который возвращает значение сгиба пальца и радиус кончика пальца. Значение сгиба может составлять от 0 (палец полностью согнут) до 100 (палец выпрямлен).

Приложение получает данные о сгибании каждого пальца в цикле получения и высвобождения кадра, как показано в следующем фрагменте кода (где handData является экземпляром PXCMHandData.IHand).

PXCMHandData.FingerData fingerData;
 
handData.QueryFingerData(PXCMHandData.FingerType.FINGER_THUMB, out fingerData);
thumbFoldeness = fingerData.foldedness;
lblThumbFold.Content = string.Format("Thumb Fold: {0}", thumbFoldeness);
 
handData.QueryFingerData(PXCMHandData.FingerType.FINGER_INDEX, out fingerData);
indexFoldeness = fingerData.foldedness;
lblIndexFold.Content = string.Format("Index Fold: {0}", indexFoldeness);
 
handData.QueryFingerData(PXCMHandData.FingerType.FINGER_MIDDLE, out fingerData);
middleFoldeness = fingerData.foldedness;
lblMiddleFold.Content = string.Format("Middle Fold: {0}", middleFoldeness);
 
handData.QueryFingerData(PXCMHandData.FingerType.FINGER_RING, out fingerData);
ringFoldeness = fingerData.foldedness;
lblRingFold.Content = string.Format("Ring Fold: {0}", ringFoldeness);
 
handData.QueryFingerData(PXCMHandData.FingerType.FINGER_PINKY, out fingerData);
pinkyFoldeness = fingerData.foldedness;
lblPinkyFold.Content = string.Format("Pinky Fold: {0}", pinkyFoldeness);

 

 

Данные масштаба

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

// Index finger
public const int INDEX_OPEN = 1808;
public const int INDEX_CLOSED = 800;
public const int INDEX_DEFAULT = 1750;
.
.
.

Индивидуальные константы определяются для каждого пальца роботизированной руки, они сопоставляются с параметрами положений Min и Max сервопривода, которые были записаны во флеш-память платы контроллера Micro Maestro (рис. 4). Аналогичным образом в программе определяется и полномасштабное значение для диапазона данных сгиба пальцев.

int fingerMin = 0;
int fingerMax = 100;

Поскольку диапазон сгиба пальцев одинаков для всех пальцев (т. е. от 0 до 100), достаточно задать диапазон только один раз, после чего его можно использовать для операций масштабирования данных для всех пальцев, как показано ниже.

// Index finger
int indexScaled = Convert.ToInt32((Servo.INDEX_OPEN - Servo.INDEX_CLOSED) * 
   (index - fingerMin) / (fingerMax - fingerMin) + Servo.INDEX_CLOSED);
                
lblIndexScaled.Content = string.Format("Index Scaled: {0}", indexScaled);
Hand.MoveFinger(Servo.HandJoint.Index, Convert.ToUInt16(indexScaled));
.
.
.

Видео

Чтобы увидеть роботизированную руку в действии, посмотрите следующее видео на сайте YouTube*: https://youtu.be/VQ93jw4Aocg

Заключение

Для реализации этого программного эксперимента потребовалось лишь несколько часов после того, как мы протестировали сервомоторы и поняли принцип управления ими. Классическое приложение для Windows 10 было разработано на C#/XAML. В нем используются многие функции, доступные в API-интерфейсах и в образцах кода Intel RealSense SDK.

О технологии Intel® RealSense™

Дополнительные сведения о пакете Intel RealSense SDK для Windows см. по адресу https://software.intel.com/ru-ru/intel-realsense-sdk.

Об авторе

Брайан Браун (Bryan Brown) — инженер по разработке программных приложений в подразделении Developer Relations корпорации Intel.

Для получения подробной информации о возможностях оптимизации компилятора обратитесь к нашему Уведомлению об оптимизации.
Возможность комментирования русскоязычного контента была отключена. Узнать подробнее.