Автоматизация системы управления квадрокоптера

Тип:
Добавлен:

Министерство образования и науки Российской Федерации

федеральное государственное бюджетное образовательное учреждениевысшего образования

«Иркутский государственный университет»

(ФГБОУ ВО «ИГУ»)

Физический факультет

Выпускная квалификационная работа бакалавра по направлению 03.03.03 Радиофизика

«Радиоэлектронные устройства, методы обработки сигналов и автоматизации»

Тема: «Автоматизация системы управления квадрокоптера»

Содержание

Введение

. Беспилотные мультироторные летательные аппараты

.1 Базовые принципы полета квадрокоптера

.2 ПИД регуляторы

.3 Полетный контроллер

.4 Фильтр Калмана

. Технология компьютерного зрения

.1 Введение в компьютерное зрение

.2 Методы обработки изображений в компьютерном зрении

. Библиотека OpenCV

.1 Примитивные типы данных в OpenCV

.2 Классы библиотеки OpenCV

.Разработка системы управления квадрокоптером на базе IMU и ультразвукового дальномера HC-504

.1 Сборка устройства и код для получения данных

.2 Преобразование данных

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

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

.2 Захват видеосигнала

.3 Обработка изображения

.4 Выделение контуров

.5 Нахождение дефектов обводящего контура

.6 Фильтрация точек дефектов

.7 Обработка результатов

. Формирование сигналов и передача полученных данных

.1 Передача данных через серийный порт

.2 Передача данных на бортовой контроллер

Заключение

Список использованных источников

Приложение

Введение

На сегодняшний день беспилотные летательные аппараты (БПЛА) - бурно развивающаяся область техники. БПЛА выполняют широкий спектр как военных, так и гражданских задач. В последние годы большую популярность приобрели мультироторные БПЛА (мультикоптеры) по причине доступности и простоты эксплуатации. Мультикоптеры используются для доставки грузов, фото- и видеосъемки, поисковых работ, наблюдения за природными явленими и многого другого.

Разработки в этой области активно ведутся как коммерческими предприятиями, так и любителями. В данной работе описан проект, цель которого - автоматизировать систему управления мультикоптера с четырьмя роторами, сделать управление интуитивно понятным и отзывчивым. В результате было разработано устройство, способное передавать «с Земли» всю информацию, необходимую для пилотирования мультикоптера, используя лишь жесты одной руки. Разработка устройства от проектирования и до готового кода велась самостоятельно и в ней, кроме всего прочего, были использованы источники с открытым исходным кодом - платформа Arduino ибиблиотека компьютерного зрения OpenCV.Устройство является прототипом, но имеет перспективы к развитию и реальному использованию.

1.Беспилотные мультироторные летательные аппараты

Квадрокоптер (разновидность мультикоптера) - это летательный аппарат построенный по вертолётной схеме с четырьмянесущими винтами.

Многовинтовые вертолёты разрабатывались ещё в первые годы вертолётостроения. Один из первых квадрокоптеров, который реально оторвался от земли и мог держаться в воздухе, был создан Георгием Ботезатом и испытан в 1922 году. Недостатком этих аппаратов была сложная трансмиссия, передававшая вращение одного мотора на несколько винтов. Изобретение хвостового винта и автомата перекоса положило конец этим попыткам. Новые разработки начались в 1950-е годы, но дальше прототипов дело не продвинулось. беспилотный квадрокоптер контроллер

Новое рождение мультикоптеры получили в XXI веке, уже как беспилотные аппараты. Благодаря простоте конструкции квадрокоптеры часто используются в любительском моделировании. Мультикоптеры удобны для недорогой аэрофото- и киносъёмки - громоздкая камера вынесена из зоны действия винтов.

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

·ускорить все винты - подъём;

·ускорить винты с одной стороны и замедлить с другой - движение в сторону;

·ускорить винты, вращающиеся по часовой стрелке, и замедлить вращающиеся против - поворот.

Микропроцессорная система переводит команды радиоуправления в команды двигателям. Чтобы обеспечить стабильное зависание, мультикоптеры в обязательном порядке снабжают тремя гироскопами, фиксирующими крен аппарата. Как вспомогательный инструмент, иногда, также используется акселерометр, данные от которого позволяют процессору устанавливать абсолютно горизонтальное положение, и бародатчик, который позволяет фиксировать аппарат на нужной высоте. Также, применяют сонар для автоматической посадки и удержания небольшой высоты, а также для облёта препятствий.

Современные мультикоптеры используют бесколлекторные электродвигатели и литий-полимерные аккумуляторы в качестве источника энергии. Это накладывает определённые ограничения на их полётные характеристики: типичная масса мультикоптера составляет от 1 до 4 кг, при времени полёта от 10 до 30 минут (30-50 минут у уникальных единичных экземпляров). Поднимаемый полезный груз моделями мультикоптеров среднего размера и грузоподъёмности - от 500 г до 2-3 кг, что позволяет поднять в воздух небольшую фото или видеокамеру. Существуют и достаточно крупные модели мультикоптеров, с количеством роторов порядка 6-8 (гекса и октокоптеры), способные поднять в воздух груз массой до 20-30 кг. Для увеличения грузоподъёмности применяют соосное расположение несущих роторов, что в случае гексакоптера, например, даёт 12 моторов и 12 пропеллеров, расположенных попарно на 6 несущих лучах. Скорость полёта мультикоптера может быть от нуля (неподвижное висение в точке) до 100-110 км/ч. Запас энергии батарей позволяет отдельным моделям мультикоптеров улетать на расстояние до 7-12 км, на практике же радиус действия (максимальное расстояние, на которое они способны улететь с последующим возвратом в точку взлёта) обычно ограничено прямой видимостью (100-200 м при ручном управлении) либо дальностью действия аппаратуры радиоуправления и видеолинка. При этом лучшие образцы подобной аппаратуры, использующие усилители мощности радиосигнала и систему направленных антенн, способны обеспечивать стабильные радиоуправление и видеолинк на расстояния до 100 км. Таким образом, наибольшее ограничение на радиус действия мультикоптеров накладывает именно время полёта.

1.1Базовые принципы полета квадрокоптера

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

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

Рис.1. Принципиальная схема квадрокоптера

Базовые принципы полетов любой техники описывает аэродинамика и квадрокоптеры не являются исключением. Три оси вращения абсолютно однозначно задают ориентацию квадрокоптера в пространстве и направление его полета. Причем направление движения никак не зависит от расположения самого квадрокоптера в воздухе.

Три перечисленных выше оси или угла принято правильно называть тангажом (pitch), креном (roll) и рысканьем (yaw). Разберем их более подробно.

Рис.2. Углы Эйлера - крен, тангаж и рыскание

Под тангажом понимают поворот аппарата вокруг продольной оси, рысканием - вокруг вертикальной оси, а креном - продольной оси.

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

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

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

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

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

1.2ПИД регуляторы

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

Например, имеется дрон которому необходимо повернуться на 60 градусов относительно центра масс. Движение вокруг центра осуществляется подачей на его привода требуемой угловой скорости вращения. Для того, чтобы повернуться именно на 60 градусов необходимую угловую скорость надо подавать по определённому закону. В момент, когда разность между текущим углом и требуемым ещё значительна, угловая скорость должна быть высокой. При уменьшении же разности должна уменьшаться и скорость. Когда разность окажется равна 0, угловая скорость также должна равняться 0. Однако, такой закон не представляется возможным определить заранее, потому что квадрокоптер обладает моментом инерции, и он способен просто пролететь необходимое положение, а в этом случае придётся подавать скорость в обратном направлении. Самое стандартное решение в такой ситуации - сообщать необходимую скорость как разность требуемого положения и текущего, умноженную на определённую неотрицательную постоянную. Подобный алгоритм называется П регулятором. Однако, такой алгоритм обладает существенным недостатком: в случае, когда требуемое угловой положение вращается с определённой угловой скоростью, то дрон никогда не догонит эту точку. Рано или поздно наступит момент, когда угловая скорость, выверенная П регулятором, будет равна угловой скорости вращения необходимого положения. Для качественного решения данной задачи рекомендуется сложить скорость от П регулятора со скоростью, рассчитанной как интеграл по времени ошибки по углу, умноженный на определённую неотрицательную постоянную. В такой ситуации необходимая скорость будет тем выше, чем дольше дрон не способен занять требуемое угловое положение. Данный алгоритм является ПИ регулятором. Но и этот алгоритм можно доработать. В момент, когда ошибка по углу будет равняться 0, дрон под действием сил инерции пролетит нужное положение, при условии, что его скорость до этого была относительно высокой. Чтобы этого избежать необходимо совершать торможение чуть быстрее, когда ещё ошибка мала, а именно - к требуемой скорости от ПИ регулятора добавить производную ошибки по времени, которая в свою очередь умножается на положительную постоянную. Это и есть ПИД регулятор.

Пропорционально-интегральное-дифференциальное управление может быть представлено следующей схемой:

Рис.3. Принципиальная схема ПИД-регулятора

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

·в блоке P происходит умножение соответствующего коэффициента пропорциональной составляющей на величину ошибки;

·в блоке I происходит интегрирование ошибки и умножение полученной величины на коэффициент ;

·в блоке D происходит дифференцирование ошибки с умножением на коэффициент ;

Уравнение ПИД регулятора:

,

(t) - выходная величина регулятора;(t) -сигнал рассогласования(ошибка);, I, D - пропорциональная, интегральная и дифференциальная составляющие;

- коэффициенты ПИД регулятора;

Распространены также следующие модификации уравнения ПИД регулятора:

,

,

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

Пользуясь преобразованием Лапласа при нулевых начальных условиях, представим передаточную функцию ПИД регулятора в операторной форме:

,

.

На рис. 4 изображены амплитудно-частотная(АЧХ) и фазо-частотная(ФЧХ) характеристики операторной передаточной функции. В области нижних частот АЧХ и ФЧХ определяются интегральным членом, в области средних частот - пропорциональным, в области высоких - дифференциальным[3].

Рис.4. АЧХ и ФЧХ ПИД-регулятора

Вид АЧХ и ФЧХ регулятора определяет его точность и запас устойчивости. Из рисунка 2 следует, что при уменьшении интегральной составляющей , происходит увеличение модуля коэффициента усиления регулятора на нижних частотах (то есть при приближении к установившемуся режиму), следовательно, погрешность «e» начинает снижаться.

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

Рис.5. ПИД-регулятор в системе с шумом и внешними возмущениями f(t)

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

1.3Полетный контроллер

Полетный контроллер - это основная плата управления, обеспечивающая функционирование мультикоптера. В качестве вычислительного центра платы управления используется микроконтроллер, зачастую это либо маломощные Atmega328, либо более современные, Atmega2560 или ARM-контроллеры (STM32)

К функциям полетного контроллера относятся:

·Стабилизация аппарата в воздухе

·Удержание высоты (при помощи барометра) и позиции (при помощи GPS)

·Автоматический полет по заданным заранее точкам (опционально)

·Передача на землю текущих параметров полета с помощью модема или Bluetooth (опционально)

·Обеспечение безопасности полета (возврат в точку взлета при потере сигнала, автопосадка)

·Подключение дополнительной периферии: OSD, светодиодной индикации и пр.

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

Используемый в данном проекте полетный контроллер ArduPilot Mega является полноценным решением БПЛА, который позволяет помимо радиоуправляемого дистанционного пилотирования - автоматическое управление по заранее созданому маршруту, т.е. полет по точкам, а также обладает возможностью двухсторонней передачей телеметрических данных с борта на наземную станцию (телефон, планшет, ноутбук, DIY) и ведение журнала во встроенную память.

Он основан на автопилоте APM 2.x, разрабатываемым сообществом DIY Drones и базирующийся на open-source проекте, позволяющий превратить любой аппарат в автономное средство и эффективно использовать его не только в развлекательных целях, но и для выполнение профессиональных проектов.

Особенности:

·3 осевой гироскоп, акселерометр, магнитометр и высокоточный барометр

·Система стабилизации с возможностью воздушной акробатики

·Удержание позиции по GPS, полет по точкам и возврат на точку старта

·Возможность использования инфракрасного датчика для обхода препятствий

·Поддержка ультразвукового датчика (sonar sensor) для автоматического взлета и посадки

·Автоматическое следование по маршрутным точкам

·Управление двигателями посредством ШИМ (PWM) с использованием дешевых регуляторов скорости (ESC)

·Собственная система стабилизации для камеры (функция контроллера подвеса)

·Радиосвязь и телеметрия с борта

·Поддержка множества рам и конфигураций аппаратов

·Поддержка датчика уровня заряда батареи

·Настраиваемая световая индикация при полетах

·Совместим с многими радиоуправляемыми приемниками PWM и PPM сигналов

·Передача в реальном времени телеметрических данных

·Поддержка OSD телеметрии (наложение на видеопередачу телемерических данных) используя протокол MAVLINK

·Конфигурирования точек полета посредством Google Maps

·Бортовая флеш память 16Мбит для автоматической регистрации данных

·Цифровой компас работает на HMC5883L (до версии 2.5.2)

·6 степеней свободы в InvenSense акселерометре , гироскоп MPU-6000

·Контроллер Atmel ATmega2560-16AU и ATMEGA32U-2 чип для обработки и функции USB

·Возможно загрузка обновлений встроенного программного обеспечения и конфигурации

Ниже описаны некоторые режимы полета, доступные контроллеру:

·Stabilize - удержание горизонта,

·AltHold - удержание высоты,

·Loiter -«замри и слоняйся»,

·Return-to-Launch - вернуться на точку старта,

·Auto - выполнение заданного маршрута в автоматическом режиме,

·Acro - акробатика (отключение всех стабилизационных систем),

·Circle - облет по кругу заданного радиуса,

·Position - фиксация в воздухе с ручным газом взлета

·Land - автоматическая посадка

·Simple - «легкий» полет

Контроллер предусматривает возможность самостоятельно программировать режимы полета.

1.4Фильтр Калмана

В практической части работы используется алгоритм фильтрации, называемый фильтром Калмана. Это один из самых действенных методов фильтрации данных в частности в робототехнике.

Фильтр Калмана использует динамическую модель системы (например, физический закон движения), известные управляющие воздействия и множество последовательных измерений для формирования оптимальной оценки состояния. Алгоритм состоит из двух повторяющихся фаз: предсказание и корректировка. На первом рассчитывается предсказание состояния в следующий момент времени (с учетом неточности их измерения). На втором, новая информация с датчика корректирует предсказанное значение (также с учетом неточности и зашумленности этой информации)

Рис.6. Схема фильтра Калмана

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

В данных обозначениях: подстрочный индекс обозначает момент времени: k - текущий, (k-1) - предыдущий, знак «минус» в верхнем индексе обозначает, что это предсказанное промежуточное значение. Описание переменных представлены на следующих изображениях[4]:

Рис.7. Уравнение предсказания

Рис.8. Уравнение корректировки

2.Технология компьютерного зрения

В данном разделе даны основные теоретические сведения о рассматриваемом предмете.

2.1Введение в компьютерное зрение

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

Компьютерное зрение - это очень молодая и динамично развивающаяся область компьютерной технологии. Первые разработки в этой области появились только в начале 1970-х годов. Главной причиной этому служит то, что методы, обычно используемые в алгоритмах компьютерного зрения достаточно требовательны к вычислительной мощности машин - почти всегда приходится иметь дело с большими по временам рассвета цифровой эры массивами данных. Так же по причине относительной новизны технологии и происхождения её из многих других областей компьютерной науки, не существует стандартной формулировки проблемы компьютерного зрения, и, более того, не существует стандартного решения этой проблемы. Методы и алгоритмы компьютерного зрения очень сильно зависят от конкретно поставленной задачи и могут кардинально отличаться друг от друга. Компьютерное зрение во многом происходит от таких областей, как статистика, методы оптимизации и обработка сигналов, а также тесно пересекается с ними.

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

Главная сложность технологий компьютерного зрения и, в то же время, причина необходимости их создания, состоит в том, что любая электронно-вычислительная машина лишена абстрактных категорий и способна работать только с конкретными величинами. Компьютер не «понимает», что такое форма, текстура, размер или даже цвет, его можно только «научить» работать с этой информацией, определенным образом закодировав её в последовательность нулей и единиц.

2.2Методы обработки изображений в компьютерном зрении

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

Рис.9. Представление зрительной информации компьютером

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

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

Эти алгоритмы могут выполнять различные действия - от очень простых, наподобие подсчета каких-либо признаков, до гораздо более сложных действий, связанных с распознаванием, определением местоположения и контролем объектов. Для формирования бинарного изображения B по данным полутонового или цветного изображения I можно выполнить операцию, которая выбирает некоторое подмножество пикселов изображения в качестве пикселов переднего плана (foreground pixels). Эти пикселы представляют интерес для решаемой задачи анализа изображений. Остальные пикселы игнорируются как фоновые (background pixels). Операция отбора пикселов может быть простой (например, пороговый оператор, который отбирает пикселы со значениями из заданного яркостного диапазона или цветового подпространства) или представлять собой сложный алгоритм классификации. [2]

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

Рис. 10. Бинарное изображение рукописных символов

Пикселы бинарного изображения B принимают значения 0 или 1. Будем полагать, что значения 1 соответствуют пикселам переднего плана, а 0 - фоновым пикселам. Значение пиксела на пересечении строки r и столбца c пиксельного массива обозначается как B [r, c]. Изображение размерами M × N состоит из M строк, пронумерованных от 0 до M − 1, и N столбцов, пронумерованных от 0 до N − 1. Таким образом, обозначение B [0, 0] соответствует значению левого верхнего пиксела изображения, а B [M − 1, N − 1] - значению правого нижнего пиксела. Во многих алгоритмах при обработке пикселов учитываются не только их значения, но и значения соседних пикселов. При рассмотрении соседних пикселов часто используются два определения окрестностей - четырехсвязная и восьмисвязная окрестности. Четырехсвязная окрестность N4 [r, c] пиксела [r, c] состоит из пикселов [r − 1, c], [r + 1, c], [r, c − 1] и [r, c + 1]. Они часто называются, соответственно, северным (north), южным (south), западным (west) и восточным (east) соседями. Восьмисвязная окрестность N8 [r, c] пиксела [r, c] содержит все пикселы четырехсвязной окрестности, а также диагональные соседние пикселы [r − 1, c − 1], [r − 1, c + 1], [r + 1, c − 1] и [r + 1, c + 1]. Их можно соответственно называть северо- западным (northwest), северо-восточным (northeast), юго-западным (southwest) и юго-восточным соседями (southeast). Расположение соседних пикселов в окрестностях двух типов демонстрируется на рис. 11. [7]

Рис. 11. Четырехсвязная и восьмисвязная окрестности пикселов

Во многих алгоритмах четырехсвязные или восьмисвязные (или определенные иначе) окрестности часто называются просто окрестностями пикселов. Анализ окрестностей позволяет перейти от пространству пикселей к пространству контуров и производить обработку изображений так называемыми скелетными методами.

Вообще методы обнаружения можно условно разделить на три основные группы:

− скелетные методы;

− методы на основе 3D модели объекта;

− методы на основе 2D модели объекта.

В скелетных методах исследуется контур силуэта: обычно отыскиваются углы, выступы, впадины и другие точки с высокими значениями кривизны. Для получения информации о форме контура применяются различные представления границы объекта. В методах на основе 3D модели руки представляют в виде сложных трехмерных поверхностей и классифицируются с помощью нейронных сетей Метод 2D распознавания схож с предыдущим, но использует двумерное изображение вместо объемных моделей. Каждый из методов имеет преимущества и недостатки. Недостатком метода на основе 3D модели является его ресурсоемкость. Построение 3D модели, обучение нейронной сети и ее использование могут потребовать значительных ресурсов, так же не стоит забывать, что для использования данного метода требует камеры с возможностью определения глубины изображения.

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

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

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

После выделения контура в бинарный вид, он подвергается процедуре скелетизации (утоньшению). Каждый последовательный контур скелетного представления описывается в виде последовательного набора особых точек и так называемого цепного кода, состоящего из точки привязки, числа кодов и массива направлений из очередной точки на следующую точку. Особые точки - это концевые точки и точки ветвления (триоды), т.е. точки, соседи которых образуют не менее трех связных областей. На рис. 12 изображен образ, обладающий двумя внутренними контурами, одной концевой точкой и тремя триодами [8].

Рис. 12. Образ, прошедший процедуру скелетизации

В полученном описании производится огрубляющая предобработка, состоящая в удалении коротких линий, объединении близких триодов, уничтожении малых внутренних контуров. Для внешнего контура находится его тип или топологический код. Для этого контур записывается в виде последовательного набора номеров особых точек, соответствующих обходу по часовой стрелке. Затем с помощью пере нумерации делается попытка отождествления контура с одним из основных типов[6].

.БиблиотекаOpenCV

В данном разделе представлены данные о библиотеке OpenCV - основного инструмента для разработки проекта. OpenCV - это одна из библиотек для работы с компьютерным зрением (библиотекой в программировании называется сборник подпрограмм или объектов, используемых для разработки программного обеспечения). OpenCV реализована на C/C++, также разрабатывается для Python, Java, Ruby, Matlab, Lua и других языков. Может свободно использоваться в академических и коммерческих целях - распространяется в условиях лицензии BSD. Библиотека довольно популярна, на текущий момент имеет более 5 миллионов скачиваний и недавно была предложена в качестве основы для стандарта Khronos по компьютерному зрению. Примечательно, что OpenCV был разработан программистами из российского отделения компании Intel.

3.1Примитивные типы данных в OpenCV

включает в себя множество примитивных типов данных. Эти данные не являются примитивными с точки зрения языков программирования высокого уровня, но являются самыми элементарными с точки зрения OpenCV. [5]

Самый простой тип данных - Point. Эта простая структура состоит только из двух полей x и y типа int. Point2D32f содержит два поля x и y типа float. Point3D32f содержит три поля x, y и z типа float. Используется для задания и обработки графических точек.содержит два поля width и height типа int. Size2D32f содержит два поля width и height типа float. Size содержит в себе информацию о размере того или иного массива.содержит четыре поля x, y, width и height типа int и представляет собой прямоугольник.содержит четыре переменные типа double. На самом деле Scalar включает в себя одно поле val, которое является указателем на массив, содержащий четыре числа типа double. Scalar хранит в себе данные о цвете того или иного объекта и, в отличие от всех остальных структур содержит три конструктора. Первый может принимать один, два, три или четыре аргумента и присваивать их соответствующим элементам val []. Второй конструктор, RealScalar, принимает один аргумент и устанавливает соответствующее значение val [0], остальные элементы устанавливаются в 0. Третий конструктор ScalarAll так же принимает один аргумент и инициализирует все элементы val [] этим значением., Size, Rect и Scalar чрезвычайно полезны, потому что существенно упрощают код. Они позволяют перейти от объектов, привычных в численных вычислениях к объектам, необходимым для работы с изображениями.

3.2Классы библиотеки OpenCV

В данном подразделе обозначим основные классы библиотеки OpenCV, причем функционал тех, которые будут широко использованы в практической части, обговорим подробнее.-основная функциональность. Включает в себя базовые структуры, вычисления (математические функции, генераторы случайных чисел) и линейную алгебру, DFT, DCT, ввод/вывод для XML и YAML и т. д.- работа с матрицами (многомерными массивами). Понятие матрицы в OpenCV несколько более абстрактно, нежели в линейной алгебре. В частности, элементы матрицы не обязательно должны быть просто числами, а могут представлять собой любые объекты, в том числе и сторонних библиотек.- обработка изображений (фильтрация, геометрические преобразования, преобразование цветовых пространств и т. д.). Imgproc это базовая структура, используемая для кодирования того, что мы называем "изображение". Эти изображения могут быть чёрно-белыми, цветными, 4-х канальными (RGB+Alpha), и каждый канал может содержать либо целые, либо вещественные значения. Следовательно, этот тип является более общим, чем стандартные 3-х канальные 8-битные изображения. OpenCV располагает обширным арсеналом операторов для работы с этими изображениями, которые позволяют изменять размеры изображений, извлекать отдельные каналы, складывать два изображения, и т.д. В сущности, это объект Mat, но с некоторыми дополнениями для интерпретации матрицы как изображения. Одно важное отличие Imgproc от Mat заключается в поведении imageData. Данные Mat являются объединением, поэтому существует возможность задать тип указателя. Указатель imageData задается жестко как uchar*. При работе с матрицами, необходимо уменьшать смещение, так как указатель данных не всегда может быть типа byte, в то время, как указатель данных изображения всегда типа byte, смещение можно использовать "как есть".

HighGUI - простой UI, ввод/вывод изображений и видео. Функции OpenCV, которые позволяют взаимодействовать с операционной системой, файловой системой и аппаратными средствами, такими, как камера, собраны в библиотеке HighGUI (что означает "высокоуровневый графический пользовательский интерфейс"). HighGUI позволяет открывать окна для отображения изображений, читать и записывать графические файлы (изображения и видео), обрабатывать простые события мыши, указателя и клавиатуры. Данный класс также позволяет создавать такие полезные элементы, как ползунок. HighGUI имеет достаточный функционал для разработки различного рода приложений. При этом наибольшая польза от использования данной библиотеки в её кроссплатформенности. библиотека HighGUI состоит из трех частей: аппаратной, файловой и GUI. Аппаратная часть в первую очередь касается работы с камерой. HighGUI предоставляет простые механизмы подключения и последующего получения изображения с камеры. Все, что касается файловой системы, в первую очередь связано с загрузкой и сохранением изображения. Приятной особенностью библиотеки является наличие методов, которые одинаково обрабатывают видеопоток и из файла, и с камеры. Та же идея заложена и в методы обработки изображений. Функции просто полагаются на расширения файлов и автоматически обрабатывают все операции по кодированию и декодированию изображений. Третья часть HighGUI - GUI. Библиотека предоставляет несколько простых функций, которые позволяют открывать окно и отображать в нем изображения. Тут же (в окне) существует возможность обрабатывать события, поступившие от мыши и клавиатуры [10].

ML - модели машинного обучения (SVM, деревья решений, обучение со стимулированием и т. д.).

Features2d - распознавание и описание плоских примитивов (SURF, FAST и другие, включая специализированный фреймворк).

Video - анализ движения и отслеживание объектов (оптический поток, шаблоны движения, устранение фона).

Objdetect - обнаружение объектов на изображении (нахождение лиц с помощью алгоритма Виолы-Джонса, распознавание людей HOG и т. д.).

Calib3d - калибровка камеры, поиск стерео-соответствия и элементы обработки трёхмерных данных.

4.Разработка системы управления квадрокоптером на базе IMUи ультразвукового дальномера HC-504

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

Рис. 13. Принципиальная схема устройства

Принципиальная схема устройства показана на рисунке. Ее ключевая часть - микроконтроллер AVRна базе платформы Arduino. На него приходят сигналы с датчиков, обрабатываются и с помощью радиомодулей отправляются на борт. Каналом газа управляет ультразвуковой дальномер - чем больше расстояние от него до руки, тем больше мощности подается на двигатели. За рыскание, тангаж и крен отвечает так называемое инерционное измерительное устройство (IMU), закрепленное на руке, - гироскоп, акселерометр, компас и барометр, собранные в одной плате. В определенном для каждого угла Эйлера интервале борт будет копировать положение устройства.

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

Начнем сборку устройства с манипулятора, который будет управлять первыми четырьмя каналами. В качестве логического процессора будет использоваться микроконтроллер AtmelATMega2560 на базе Arduino. Использование Arduino позволяет упростить разработку и отладку устройства, в дальнейшем от него можно отказаться, ограничиваясь только микроконтроллером.

4.1Сборка устройства и код для получения данных

Как было сказано выше, беспилотный дрон управляется четырьмя основными каналами - газ, рыскание, крен и тангаж. Полетный контроллер принимает на своих входах значения каждого канала как целое число размером 1 байт (от 0 до 255 для газа и от -127 до 127 для рыскания, крена и тангажа). Значит первая цель - получить эти значения как переменные в микроконтроллере. В скетче можно сразу объявить эти переменные и назвать их throttle, yaw, pitch и roll. В этих переменных будут хранится необработанные показатели датчиков. Для данных, прошедших обработку и готовых к отправке, объявим еще четыре переменных: sendThrottle, sendYaw, sendPitch, sendRoll.

Для получения значения газа будет использоваться ультразвуковой дальномер HC-SR04. Необходимо подключить его к выводам 5V и GND для обеспечения питания и два логических вывода соединить с любыми цифровыми выводами Arduino. Подсоединим вывод trig к цифровому выводу с номером 8 и определим его в программе как TRIGGER_PIN, а echo - к выводу 9 и определим, как ECHO_PIN. Для работы с дальномером будет использоваться библиотека NewPing.h. После ее импортирования следует ввести команду NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE), где MAX_DISTANCEустановим как 200 - это максимальное измеряемое значение в сантиметрах. Эта команда создает объект sonar, методами которого можно получить расстояние, измеряемое дальномером. Теперь в функции loop можно присвоить переменной throttle значение sonar.ping и ее значение будет пропорционально расстоянию до препятствия. В этом можно убедиться, если вывести значение переменной в монитор серийного порта. В конце функции loop также необходимо ввести задержку в 5мс для того чтобы периоды опроса не «наслаивались» друг на друга и не возникало ошибочных значений.

В массиве представленных значений присутствует достаточно сильный шум, который может негативно повлиять на результаты их анализа. Необходимо включить в программу фильтрацию для переменной throttle. Имеет смысл в данной работе использовать упрощенный фильтр Калмана. Принцип его работы приведен выше. Функция фильтра принимает два аргумента - стандартное отклонение величины от математического ожидания и скорость реакции на изменение. Первый аргумент считается опытным путем - для этого нужно создать массив данных достаточного размера на выходе датчика без изменения внешних условий, а затем найти стандартное отклонение по генеральной совокупности. Можно модифицировать программу для выполнения этого действия, но удобнее выполнить его в программе MicrosoftExcel с помощью функции СТАНДОТКЛОН.Г. Из выборки около 750 элементов получаем стандартное отклонение 21,47. Запишем это значение при объявлении констант в начале кода. Подбор скорости реакции на изменение производится вручную, эмпирическим путем. Нужно выставить значение достаточно малое, чтобы дрон быстро воспринимал команду изменения газа и достаточно большую, чтобы отфильтровать лишние значения. Для тестирования добавим в программу функцию с алгоритмом упрощенного фильтра Калмана, которая принимает значение и возвращает его отфильтрованным. Сразу после получения переменной throttle в функции loop вызовем фильтрующую функцию, в качестве аргумента которой будет значение throttle и значение которой будет снова присваиваться переменной throttle. Далее эмпирическим путем определено, что оптимальный коэффициент для данной задачи - это число 0,02.

Теперь произведем аналогичные действия для остальных трех каналов, а именно считаем и отфильтруем данные с датчиков. Показания рыскания, крена и тангажа будут считываться с инерционного измерительного устройства, который имеет в составе гироскоп, акселерометр, барометр и компас. Оно так же нуждается в питании с напряжением 5В и имеет два логических выхода. Передача данных осуществляется по протоколу I2C, который поддерживается Arduino, поэтому для передачи большого количества данных достаточно двух проводов. Подсоединим устройство к I2C-совместимым портам ArduinoMega, а именно 20 и 21. Они помечены метками SDA и SCL.

Для работы с инерционным измерительным устройством необходимо импортировать в скетч две библиотеки - Wire.h для работы с протоколом I2C и TroykaIMU.h для работы с самим устройством. Библиотека написана по принципам объектно-ориентированного программирования, поэтому для дальнейшей работы, вне функций необходимо создать по объекту для каждого использованного модуля, а именно объекты классов Accelerometer, Gyroscope и Compass. Все полученные величины будут проходить через фильтр Магвика, поэтому для него тоже создать объект класса Magwick. Дадим ему имя filter, а объектам для акселерометра, гироскопа и компаса - accel, gyro и compass соответсвенно.

Далее объявим переменные для данных с акселерометра, гироскопа и компаса - каждый из них ориентируется в трехмерном пространстве и поэтому выдает контроллеру по три значения за раз. Назовем их ax, ay, az, gx, gy, gz, mx, my, mz соответственно. Также необходимо объявить переменную fps, которая будет хранить частоту выборок фильтра. В конце каждого цикла она будет обновляться, но для первого цикла ей при инициализации нужно присвоить значение, например, 100. Далее инициализируем массивы постоянных величин, полученные в калибровочной матрице из примеров на сайте производителя [12]. Это наборы констант для калибровки компаса и compassCalibrationBias представляет собой одномерный массив из трех элементов, а compassCalibrationMatrix - двухмерный массив из девяти элементов.

В функции setup необходимо произвести инициализацию всех элементов инерционного измерительного устройства и откалибровать компас. В начале функции выведем в монитор порта сообщение «Begin init». Затем нужно для объектов accel, gyro и compass запустить метод .begin. Для объекта compass также запускаем метод calibrateMatrix с аргументами compassCalibrationBias и compassCalibrationMatrix, он откалибрует компас для данного запуска устройства. В конце функции выводим в монитор порта сообщение об удачной инициализации, его можно будет увидеть только если все методы завершили свою работу без ошибок.

В функции loop нужно сначала вычислить частоту обработки фильтра, fps. Для этого в функции, после всех команд, связанных с ультразвуковым дальномером нужно записать в переменную startMillis значение времени, прошедшего с начала работы контроллера с помощью функции millis, которая возвращает это время. В конце функции, но перед командой задержки delay нужно сначала вычислить затраченное время на обработку данных, millis - startMillis и записать его в новую переменную, deltaMillis. Затем вычисляем частоту обработки фильтра в герцах, для этого нужно величину, обратную deltaMillis домножить на 1000, так как время в переменной deltaMillis измеряется в миллисекундах. Между присваиванием startMillis и вычислением fps находится весь остальной код, обрабатывающий информацию с инерционного измерительного устройства.

Начинается он со считывания данных с датчиков. Метод readGXYZ объекта accel считывает данные с акселерометра в единицах G и записывает их в переменные ax, ay, az с помощью указателей. Метод readRadPerSecXYZ объекта gyro считывает данные с гироскопа в радианах в секунду и записывает их в переменные gx, gy, gz. Метод readCalibrateGaussXYZ объекта compass считывает данные с компаса в Гауссах и записывает их в переменные mx, my, mz.

После того, как данные получены, библиотека позволяет поместить их в объект фильтра и извлекать из него конкретные значения рыскания, крена и тангажа. Для начала нужно обновить коэффициенты фильтра - это делается с помощью метода setKoeff соответствующего объекта. Метод принимает два аргумента - вычисленное в предыдущем цикле значение fps и числовой коэффициент BETA, в примерах производителя равный 0,22. При необходимости его можно будет изменять эмпирическим путем, вне функций запишем это число в константу BETA с помощью команды #define.

Далее с помощью метода update обновляем входные данные в фильтр. Аргументами служат значения g* a* и z*, полученные ранее. Теперь из объекта фильтра методами getYawDeg, getPitchDeg и getRollDeg можно получить значения рыскания, тангажа и крена и записать их в соответствующие переменные yaw, pitch и deg. После вывода их в монитор серийного порта, можно наблюдать следующее.

Рис. 14. Данные из монитора порта

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

Для исправления обеих вышеописанных проблем добавим к схеме кнопку запуска. Она должна замыкать вывод питания 5В и один из логических выводов. Объявим номер ее вывода как константу с именем BUTTON_PIN и функцией pinMode зададим выводу значение INPUT_PULLUP, то есть вход с включением подтягивающего резистора, встроенного в плату Arduino. Создадим функцию, в которую включены различные типы отработки нажатий кнопок. В данном коде будут использоваться только одинарные нажатия с применением защиты против дребезга контактов, но функция поддерживает так же двойные нажатия, нажатия с удержанием и т.д. Все эти режимы могут пригодиться при дальнейшей разработке программы. Присвоим одной из переменных, button1S значение digitalRead (BUTTON_PIN), а затем вызовем функцию обработки кнопок. После этого нужно поставить условие, было ли выполнено одинарное нажатие, то есть является ли выражение button1P истиной. Если да, то этой переменной следует задать значение false и выполнить необходимые действия, а именно «перевернуть» флаг check (то есть присвоить значение true переменной check, если до этого она имела значение false и наоборот) и задать переменной yawCenter значение yaw. Это нулевой отсчет рыскания, теперь в программе ориентация будет приходиться не на север, а на градус, записанный в переменную yawCenter при нажатии кнопки. Также в блоке, в котором происходит печать значений в монитор порта, добавим условие: при значении check равному false пусть в начале каждой строки печатается восклицательный знак - это будет символизировать то, что устройство находится в режиме ожидания и не передает данные.

4.2Преобразование данных

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

Начнем с преобразования рыскания. Как оговаривалось ранее, его значение центрируется, то есть задается определенный угол yawCenter, который считается нулевым. Значит для получения конечного результата следует пользоваться не углом yaw, а углом yaw - yawCenter, он равен нулю если датчик находится в положении, при котором была нажата кнопка пуска и отклоняется от нуля при изменении этого положения. Нас интересует изменение положения максимум на 40 градусов в каждую сторону, на больший угол повернуть руку трудно физически. Экспериментально выявлено, что значение угла является положительным при повороте влево и отрицательным при повороте вправо. Значит нужно составить такую функцию sendYaw (yaw - yawCenter), чтобы

·При yaw - yawCenter = 0, sendYaw = 0;

·При yaw - yawCenter = 40, sendYaw = -127;

·При yaw - yawCenter = -40, sendYaw = 127;

Решив простую систему уравнений, выясняем, что такой функцией является sendYaw = -3,175 (yaw - yawCenter).

Теперь данные изменяются в нужном виде, но значения могут быть больше 127 и меньше -127. Можно исправить это простыми условиями: если sendYaw> 127, значит sendYaw нужно принудительно присвоить значение 127. Если же sendYaw< -127, значит sendYaw нужно принудительно присвоить значение -127.тангажом и креном необходимо произвести аналогичные преобразования, учитывая характер показаний с датчиков.

Для тангажа:

·При pitch = 180 или -180, sendPitch = 0;

·При pitch = 140, sendPitch = -127;

·При pitch = -140, sendPitch = 127;

Получившееся уравнение:= 3,175 * pitch - 571,5, если -180 <= pitch < -140;

sendPitch = 3,175 * pitch + 571,5, если 140 < pitch <= 180;= 127, если 0 > pitch >= -140;

sendPitch = -127, если 0 <= pitch <= 140;

Для крена:

·При roll = 180 или -180, sendRoll = 0;

·При roll = -140, sendRoll = -127;

·При roll = 140, sendRoll = 127;

Получившееся уравнение:

sendRoll= -3,175 * roll - 571,5, если -180 <= roll < -140;= -3,175 * roll + 571,5, если 140 < roll <= 180;= 127, если 0 < roll =< 140;= -127, если 0 >= roll >= -140;

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

·При throttle = 400, sendThrottle = 0;

·При throttle = 2000, sendThrottle = 255;

Тогда,= 0.159375 * throttle - 63,75, если 400 < throttle < 2000;= 0, если throttle <= 400; = 255, еслиthrottle>= 2000;

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

5.Разработка ПО для распознавания жестов руки с видеосигнала методами библиотеки OpenCV

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

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

Программа должна каким-то образом распознавать жест, показанный пользователем, возвращать результат (определенный код для каждого предусмотренного жеста), затем этот результат передавать в программу, анализирующую показания датчиков и формирующую сигнал для передачи на квадрокоптер. Эта задача является достаточно сложной в плане производительности - жест руки снимается на видео и затем видеосигнал анализируется сложными алгоритмами, требующими значительных вычислительных мощностей. Микроконтроллер AVR для этих целей не подойдет, а персональный компьютер обладает слишком низкой мобильностью для практического применения устройства. Поэтому идеальным вариантом бы стал мобильный телефон на системе Android: мы можем создать приложение, захватывающее видеосигнал с камеры устройства, обрабатывающее его и передающее результат по протоколу Bluetooth на основной модуль устройства. Поэтому для разработки был выбран язык программирования, используемый в разработке приложений для Android - Java. Первый вариант программы, для упрощения отладки и тестирования, создан как приложение с графическим интерфейсом на языке JavaFX для платформы IBM PC, но в будущем перенос приложения на Android не займет много сил и времени, так как Java является мультиплафтормерным языком программирования. Функционал первой версии программы пока будет ограничен подсчетом загнутых пальцев и проверкой состояния руки (соединены ли пальцы вместе или раздвинуты).

5.1Постановка задачи и проектирование программного обеспечения

Рис. 15. Принципиальная схема программы

Разработку программы имеет смысл разделить на несколько шагов. Сначала программа должна получить видеосигнал с камеры и выделить из него одно изображение. Все остальные действия ведутся над анализом этого изображения, и, после завершения всех процедур, программа возвращает результат и захватывает новое изображение. Следующий после захвата изображения этап - его редактирование. Программа должна максимально упростить себе задачу анализа: изображение должно быть максимально сжато по разрешению и не должно содержать лишних цветов. В данном случае нужно произвести пороговое преобразование в бинарный вид, так как будут использоваться именно бинарные методы. Далее программа должна выделить необходимые контуры изображения с помощью алгоритмов компьютерного зрения и найти их дефекты. Подробнее об этом пойдет речь в соответствующем подразделе. Далее нужно найти и отфильтровать так называемые экстремальные точки - они содержат большинство информации об объекте. Затем исходя из положения этих точек нужно произвести необходимые вычисления и сделать вывод о том, какой именно жест демонстрируется. Так же вся графическая информация должна быть показана на экране. После всех этих действий цикл следует повторить.

Для программы был создан проект на платформе JavaFX в среде разработки IntelliJ IDEA. JavaFX по своей сути есть платформа для создания приложений на языке Java с графическим интерфейсом. Для создания интерфейсов существует файл на языке разметки FXML, который «общается» с программой на Java с помощью класса controller.java. FXML-файл описывает положение, размеры, графическое оформление всех элементов программы, а controller.java связывает элементы в программный код.

5.2Захват видеосигнала

Первой за

Copyright © 2018 WorldReferat.ru All rights reserved.