Quantcast
Channel: Статьи Intel Developer Zone
Viewing all articles
Browse latest Browse all 357

Разработка интеллектуального автономного дрона с помощью смартфона Android*

$
0
0

Забавляться с компактными радиоуправляемыми микровертолетами-беспилотниками (так называемыми дронами) очень весело. Но строить такие дроны еще интереснее! Для тех, кто интересуется разработкой собственных «интеллектуальных» беспилотников-дронов, в этой статье приводятся инструкции по созданию интеллектуального автономного дрона с использованием смартфона с Android*, OpenCV*, C++ и Java*. И это только начало. Освоив эти инструкции, вы сможете использовать и другие доступные программы, чтобы расширить возможности вашего дрона. Посетите сайт Intel® Software Academic Program [1] для получения дополнительной информации об учебных материалах Intel® OpenCourseWare для самостоятельно изучения.

Материалы и методы

Автономный и умный?

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

Вы видели рекламу дронов, созданных компаниями Lexus и KMEL Robotics [2], где выступает целый рой маленьких сверхточных дронов? Движениями этих дронов в пространстве можно было управлять со столь высокой точностью благодаря мощным датчикам, размещенным по всему помещению. Поскольку в последнее время дронам уделяется немало внимания в СМИ, вы, возможно, уже знаете, что для их навигации можно использовать GPS. GPS — это очень удобная и простая в использовании система, поскольку она полностью цифровая. Она используется, к примеру, самолетами для навигации во время полетов на большой высоте. Но точность плюс-минус 2,5 м при существующих задержках не позволит автоматическому микровертолету-дрону доставить, к примеру, коробку с пиццей к порогу вашего дома: на 2,5 м ближе — и дрон врежется в ваш дом, на 2,5 м в сторону — и дрон столкнется с каким-либо другим препятствием. Да, эти микровертолеты оснащены независимой навигационной системой, но они не очень «умные».

Чтобы быть действительно «умным», ваш микровертолет должен обладать достаточной вычислительной мощностью, чтобы, к примеру, снимать видео и в реальном времени анализировать такие заснятые объекты, как QR-коды (это просто), фигуры или движения (это уже сложно). Можно также измерять объем помещений и строить модель пространства в реальном времени, как это было сделано в «умном» микровертолете Массачусетского технологического института [3]. Тем не менее для всех этих возможностей требуется довольно мощный процессор, различные датчики (акселерометры и GPS), а также возможность периодической передачи данных по сетям 3G/4G. Кроме того, все это также должно быть легким, удобным при программировании и получать электроэнергию от хорошего аккумулятора. В сухом остатке мы получаем, по сути, очень мощный мобильный телефон, который управляет полетом микровертолета.

Недавно мы разработали устройство дистанционного управления микровертолетом на основе смартфона на Android. В нашем случае это был смартфон ZTE V975 Geek с процессором Intel® Atom Z2580. Использование Android упрощает разработку программного обеспечения и обмен кодом между ПК и смартфоном. Даже собственные библиотеки, такие как Intel® Integrated Performance Primitives (Intel® IPP) [4] или OpenCV [5], можно использовать и на смартфонах с Intel Android, и на ПК. Нет необходимости изобретать велосипед, поскольку смартфон уже оборудован всеми необходимыми компонентами: на нем есть камера, датчик GPS, акселерометр и модуль передачи данных 3G.

Управление моторами

Приняв решение о выборе бортового компьютера, мы были уже готовы к подключению электромоторов. Мы выбрали сервоконтроллер Pololu Maestro*, который стоит около 5 евро, подключается через USB и даже оснащен модулем Bluetooth* с дополнительным интерфейсом Bluetooth с последовательным портом. Эта плата используется для управления стандартными сервомоторами. Если нужно управлять квадрокоптером (четырехмоторным микровертолетом) или другим типом дрона, просто замените блок радиоуправления на смартфон с Android и эту плату Pololu, чтобы превратить микровертолет из радиоуправляемого в автономный и «умный». Этот рецепт исключительно универсален. Правда, ничего сложного?

С помощью нескольких строк кода и стандартного пакета Android USB мы можем управлять сервомоторами и, следовательно, управлять движением нашего летательного аппарата. Еще несколько строк кода — и мы можем получать доступ к GPS, делать фотоснимки и отправлять их по сети 3G. На программном уровне работа с Android позволяет быстро развивать возможности проекта.

Вызовите controlTransferиз UsbDeviceConnection:

import android.hardware.usb.UsbDeviceConnection;
// …
private UsbDeviceConnection connection;
// …
connection.controlTransfer(0x40, command, value, channel, null, 0, 5000);

Эта плата позволяет переместить сервопривод, задав конечное положение, скорость и ускорение. Это все, что необходимо для плавного движения. Аргумент command может быть одним из этих трех значений:

	public static final int USB_SET_POSITION = 0x85;
	public static final int USB_SET_SPEED = 0x87;
	public static final int USB_SET_ACCELERATION = 0x89;

Нужно выбрать соответствующее значение и направить его на нужный сервопривод, выбрав его канал. Полный исходный код и конфигурацию доступа USB в манифесте приложения см. в ZIP-файле [1].

Особенность квадрокоптеров

Пока все в порядке. Все оборудование поддерживает стандарт plug-n-play, код несложен, все делается в Android. Но при разработке встроенных систем существуют определенные особенности, как мы сейчас увидим на примере квадрокоптеров. Существует принципиальная разница между многомоторными дронами и простыми моделями, такими как радиоуправляемые автомобили или самолеты. Если вы управляете радиоуправляемым автомобилям, вам нужен лишь сервопривод электронного управления скоростью (ЭУС) и еще один сервопривод для управления направлением (т. е. для поворота руля). Многомоторному дрону требуется система постоянной балансировки, чтобы удерживать нужное положение. К счастью, квадрокоптеры оснащаются собственной платой стабилизации. Вместо подключения напрямую к плате Pololu и к четырем моторам с ЭУС квадрокоптера (с написанием сложной программы стабилизации на C/C++ или Java на Android), намного проще подключить плату стабилизации к плате Pololu и предоставить управление всеми четырьмя моторами этой плате стабилизации. Управлять всем остальным (высотой, скоростью, наклоном и направлением) можно с помощью простых команд Java: +/- altitude, +/- speed/, +/- inclination, +/- directionи т. п. Мы управляем всеми функциями с помощью смартфона с Android, поскольку у него мощный процессор, но балансировку моторов мы предоставили небольшой отдельной плате стоимостью несколько евро. Вам как разработчику было бы полезно знать об этой плате и о том, почему мы решили ее использовать. Кроме того, плата требуется лишь для начальной калибровки, а после этого про нее можно забыть.

Завершение первого этапа

В конце начального этапа разработки автономного четырехмоторного микровертолета аппаратная «цепочка» выглядит так:

мобильный телефон <> хост-адаптер micro USB-USB <> кабель USB-mini USB <> плата Pololu Maestro <>
 4 кабеля JR <> плата стабилизации <> кабели JR <> ЭУС <> моторы вертолета

Для сравнения у более простых дронов аппаратная «цепочка» устроена так:

мобильный телефон <> хост-адаптер micro USB-USB <> кабель USB-mini USB <> плата Pololu Maestro <>  кабели JR <> ЭУС <> моторы вертолета

В качестве бонуса вы также можете управлять другими сервоприводами, например двухканальной трехмерной камерой, присоединенной к вертолету. Также при необходимости можно управлять закрылками, шасси и т. п. Платы Pololu Maestro могут управлять 6–24 моторами; это гораздо больше, чем требуется для данного проекта, но это дает высокую гибкость.

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

Компьютерное зрение

Мы установили, что нашему дрону требуется мощный бортовой процессор для автономного управления, но пока отсутствует код, способный воспользоваться этой вычислительной мощностью. Итак, давайте сделаем нашего дрона «зрячим».

Зачем?

 

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

В реальных условиях важно, чтобы наш автономный летательный аппарат мог «видеть», например распознавать и отслеживать маркеры или же визуально определять людей. Необходимо получать изображения из Android и анализировать их с помощью OpenCV.

Каким образом?

 

OpenCV— это библиотека функций программирования с открытым исходным кодом для анализа изображений. Она служит основой для многочисленных проектов, посвященных компьютерному зрению и виртуальной реальности. Библиотека OpenCV была изначально разработана корпорацией Intel, а теперь доступна для множества аппаратных платформ и ОС. Можно разрабатывать код на ПК и развертывать его на серверах, смартфонах или интернет-устройствах.

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

Навигация с помощью смартфона

Проект Java

OpenCV не входит в состав библиотек, доступных напрямую из Java на платформе Android. Это собственная библиотека, используемая обычно из C++, поэтому потребуется использовать Android NDK. Сегменты кода, отвечающие за получение изображений и за их показ, будут написаны на Java, а обмен данными между Java и C++ будет осуществляться с помощью JNI. Нужно установить Android NDK, Android SDK, создать описанный выше проект «Круги», добавить компонент C/C++, а затем изменить параметры проекта, чтобы использовать библиотеку OpenCV. Параметры см. на следующих снимках экрана Eclipse:


Параметры проекта Java*

 


Параметры проекта C/C++

 


Параметры парсера для проекта C/C++

 


Включает параметры для STL, OpenCV* и NDK

 

В конечном итоге наш проект будет содержать следующее:

Главный файл JavaSrc/MainActivity.java
Файл разметки XMLRes/layout/activity_main.xmlи манифест
Два сборочных файла Jni/Android.mkи Jni/Application.mk
Код cppJni/ComputerVision_jni.cppи заголовок Jni/ComputerVision_jni.h

Архитектура оборудования

В отличие от Java, код на C++ необходимо компилировать для определенной архитектуры процессоров. Это настраивается путем редактирования переменной APP_ABIв файле Application.mk. Для процессора Intel Atom, который установлен в нашем смартфоне, этой переменной нужно присвоить значение x86; остальную работу сделает NDK.

Развертывание

Библиотека OpenCV используется тысячами приложений для Android, и все приложения могут использовать разные версии этой библиотеки. Будучи разработчиком приложения, вы могли бы объединить нужную версию OpenCV в пакет вместе с вашим приложением, но есть и более интересный способ: использовать диспетчер зависимостей под названием OpenCV Manager. Это приложение Android определяет, когда вам требуется OpenCV, какой именно версии, нужна ли помощь с установкой, и загружает OpenCV. Ваше приложение должно будет подключиться к OpenCV Manager, а остальные действия будут выполнены автоматически.

Взаимодействие между C++ и Java, алгоритм

Нужно определять круги в OpenCV, определять их центр и радиус, затем отображать команды оператору смартфона, чтобы добиться идеальной центровки и нужного размера круга. Следующий код Java получает изображение с камеры с помощью API Java для Android. Он осуществляет вызов C++ через JNI и присоединяет указатель к изображению в памяти. Затем код C++ обрабатывает изображение, чтобы распознать круги. Происходит обратный вызов Java для отображения обнаруженных кругов и комментариев.

Дистанционная работа

При тестировании я поместил телефон перед печатным листом бумаги. Для имитации нужного положения микровертолета я выбрал определенное расстояние, чтобы оценить, насколько большим кажется круг через оптику камеры моего телефона. Например: я нарисовал на бумаге круг диаметром 10 см, поместил телефон на расстоянии 20 см от бумаги. Диаметр круга при этом составил 300 пикселей. Вот какого размера он должен быть виден с нужного расстояния. Если круг слишком большой, нужно отодвинуться назад, если слишком маленький — приблизиться. В конечном итоге наш вертолет окажется на нужном расстоянии от круга.

Наш первый тестовый случай очень простой: 1 круг = 1 расстояние. Можно пройти дальше и использовать несколько концентрических кругов. Крупный круг удобно обнаруживается с большого расстояния; средние круги будут использоваться, когда дрон будет уже слишком близко, чтобы «разглядеть» крупный круг, а в конечном итоге дрон должен приземлиться на самый маленький круг. Если круги не обеспечивают достаточную точность, можно использовать и более сложные фигуры, например стрелки.

Поместите круг в центре изображения смартфона, чтобы смоделировать расположение микровертолета прямо над посадочным знаком. Управление такого типа работает достаточно просто. В сочетании с другими данными, такими как цвет, координаты GPS и, возможно, глубина, это несложно реализовать в виде программного кода.

Код Java

…
// capture images from the camera
import org.opencv.Android.CameraBridgeViewBase;
// load OpenCV native dependancy
import org.opencv.Android.OpenCVLoader;
…
public void onResume()
{
super.onResume();
// OpenCV loading with a callback
// non typical code specific to OpenCV
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback);
}
…
// once the OpenCV manager link established,
// we can load the dynamic library
System.loadLibrary("jni_part");
…

Код С++

…
// typical for JNI : Java class method name
// pointer to RGB image as argument
JNIEXPORT int JNICALL Java_com_example_circles_MainActivity_process
(JNIEnv *jenv, jobject obj, jlong addrGray, jlong addrRgba)
…
// Get the bitmap from pointer
Mat& mRgb = *(Mat*)addrRgba;
// blur, required before detecting circles
medianBlur(mGr,mGr,5);
// OpenCV detection – Hough transformation
HoughCircles(mGr, //grayscale input image
*circles, //output vector
CV_HOUGH_GRADIENT, //detection method to use
4, //inverse ratio of the accumulator resolution to the image
mGr.rows/8, //min distance between centers of detected circles
220, //higher threshold of the two passed intern canny edge detector
200, //accumulator threshold	100
20, //min radius
mGr.cols/8 //max radius
);

Работа и дальнейшие действия

Установите OpenCV Manager из Google Play* [6] и APK-файл вашего приложения из Eclipse* [7]. Запустите приложение и пройдите его настройку; оно обнаружит круги в поле зрения и приведет вас к центру круга с заданным диаметром.

Определение кругов очень просто. На начальном этапе для удобства можно использовать однотонный фон и высококонтрастные изображения. Простые функции компьютерного зрения работают с простыми фигурами точно так же, как младенцы играют с простейшими формами: круги, квадраты, звезды — все геометрические примитивы определяются как векторы. Расширенные функции компьютерного зрения могут обрабатывать не только простые геометрические примитивы, но и любые фотографические изображения. Такие библиотеки используются в приложениях дополненной реальности: они могут обнаруживать присутствие любой фотографии на другой фотографии даже при наличии искажений. Например, если задать фотографию коробки с печеньем, приложение обнаружит положение и трехмерную ориентацию такой коробки на более крупной фотографии. В большинстве случаев приложения для компьютерного зрения работают при перемещении объекта перед неподвижным мобильным телефоном. Объект обнаруживается и может быть дополнен трехмерными объектами, как показано в этом видео: http://www.dailymotion.com/video/
xco8xm_la-realite-augmentee-par-total-imme_tech
[8].

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

Для управления дроном просто заменяйте отображаемые указания, отправляя команды power (мощность), roll (крен), pitch (тангаж) и yaw (скольжение) дрону, на котором установлена камера. Команды пилотирования дрона и печатные команды совпадают, поэтому перейти от комнатных тестов к полетам на открытом воздухе будет нетрудно.

На нашем смартфоне при тестировании мы получаем и обрабатываем изображения через каждые 0,08 секунды, то есть 12,5 кадра в секунду. Это означает, что можно без особых усилий оснастить возможностью «компьютерного зрения» дрон, укладываясь при этом в жесткие ограничения по времени разработки/мощности ЦП/потреблению электроэнергии, свойственные небольшим дронам. Все необходимые данные вычисляются независимо.

Можно пройти гораздо дальше. OpenCV — библиотека с открытым исходным кодом, ее можно переносить на самые разные платформы. Кроме того, Intel IPP [5] заменяет некоторые низкоуровневые вызовы OpenCV и ускоряет код путем внедрения процедур, оптимизированных для процессоров Intel. Можно добиться переносимости кода и использовать библиотеку с открытым исходным кодом, получая при этом преимущества производительности Intel IPP.

И наконец, использование смартфона Android с процессором Intel для управления микровертолетом — это оптимальное решение, сочетающее производительность, длительную работу от аккумулятора и простоту разработки. Этот первый проект дает возможность перейти на другую ОС или на более мощную аппаратную платформу, если мощности смартфона недостаточно или если нужно перейти на более крупный вертолет. Кроме того, ознакомьтесь с другими программами [1], где показаны доступные инструкции по разработке в области дронов и роботов.

Об авторах

Авторы:Поль Гермонпрес (Paul Guermonprez), Николя Вайе (Nicolas Vailliet), Седрик Андреолли (Cedric Andreolli)
Ссылка:http://intel-software-academic-program.com/pages/courses#drones
Эл. адрес:paul.guermonprez@intel.com
Команда: Intel Software Academic Program для региона EMEA-Россия, Париж, Франция

Ссылки и Ресурсы

[1] Intel Software Academic Program: http://intel-software-academic-program.com/pages/courses#drones

[2] The Mill: Lexus “Swarm” Behind The Scenes: http://vimeo.com/78549177

[3] Autonomous Robotic Plane Flies Indoors at MIT:  http://www.youtube.com/watch?v=kYs215TgI7c

[4] Intel® Integrated Performance Primitives (Intel® IPP): http://software.intel.com/ru-ru/intel-ipp

[5] OpenCV: http://opencv.org

[6] Google Play: https://play.google.com/store

[7] Eclipse: https://www.eclipse.org

[8] www.dailymotion.com: La réalité augmentée, par Total Immersion. http://www.dailymotion.com/video/xco8xm_la-realite-augmentee-par-total-imme_tech

 


Viewing all articles
Browse latest Browse all 357

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>