Pull to refresh
0

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

Reading time 7 min
Views 5.9K
Original author: Bryan Brown

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

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



О руке Roy


Набор для сборки руки Roy в настоящее время можно приобрести на веб-сайте компании Roemotion, Inc. в виде комплекта для сборки. Комплект включает:
  • детали, изготовленные методом лазерной резки;
  • все необходимые крепежные элементы;
  • 8 сервоприводов (таких же, какие используются в управляемых моделях);
  • 6 удлинительных кабелей для сервоприводов.

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


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

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

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


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

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


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


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

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


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

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


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

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

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

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

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

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


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


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

В пользовательском интерфейсе есть данные об отслеживании кончиков пальцев в реальном времени, но в этом конкретном эксперименте мы использовали три следующих параметра для управления рукой 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 (рис. 3). Аналогичным образом в программе определяется и полномасштабное значение для диапазона данных сгиба пальцев.

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));
.
.
.


Заключение


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

Дополнительные сведения о пакете Intel RealSense SDK для Windows см. на сайте Intel.
Tags:
Hubs:
+6
Comments 0
Comments Leave a comment

Articles

Information

Website
www.intel.ru
Registered
Founded
Employees
5,001–10,000 employees
Location
США
Representative
Анастасия Казантаева