Регулируема, уеб камера с джойстик

Добър ден. Мотивиран от многобройните публикации в Хабре на домашно роботи и решава да направи нещо от собствения си по-малко полезно и интересно.

Като цяло, аз съм привърженик на роботи за дълго време, но ръцете му не са достигнали нормалната проекта, основно само игра. Малко мисъл, излезе със свой проект, търсене части боядисани скици, мечтае за робот бъдещи възможности. Детайли поръча не скандалния сайт, и докато части преодоляване на пътя под небето реши да приложи един от модулите на бъдещото робота от това, което е под ръка. Или по-скоро дори да не разберат самия модул, и сглоби прототип, и пишат софтуер, така че да не се разсейва от написването на програма, и още повече, че докато има всички подробности има море от свободно време и желание да направи нещо, не почива.

От страна бях кърпичка Arduino Diecimila, множество серво машинки, уеб камера, джойстик, както и намиране на ултразвуковия диапазон. Съответно, веднага имаше желание да направи "компютърното зрение" въз основа на уеб камери, с възможност за едновременно самостоятелна работа и ръчно управление (джойстик).

Spodviglo че аз пиша тази статия?

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

Предизвикателството в действителност тривиално, за да изпратите информация на джойстика на Arduino, която е под определен ъгъл, ще се завърти на задвижващия механизъм 2 с прикрепена към уеб камера, както и необходимостта да се чете информация от далекомер, я изпращат на SerialPort.
След претегляне отново всичко, реших да започне да се изгради прототип на техните собствени. Да вървим!

основен

прототип монтаж

Прототипът е създаден в рамките на 5 минути. Външен вид на прототипа не се интересува изобщо, основната му цел - развитие на програмата преди да дойдат на части робота.
И аз го направих от буркана първи излезе от някои витамини, две серво машинки, уеб камери, кламери, тиксо и лепило пистолет. Оказа се, както следва:

Регулируема, уеб камера с джойстик

Монтажът е завършен, предавки и ултразвуков далекомер, свързан към Ардуино, Ардуино към компютъра, се преминава към програмиране на Ардуино.

програмируем Arduino

Работещи малко по-напред трябва да кажа, има грешка тук и за които аз трябваше да се върне след написването на програмата в C #. Грешката беше тук, в какво - аз, наивни и ентусиазирани, пише малка програма, която анализира постъпващата Serial Port в низ, подобен на следните "90:90" в две части, съответно, първата част е степента на Х, втората част на Y. използването на монитора порт всичко е тествана и работи перфектно, но когато програмата, за да се контролира с джойстик е написана с повишена пристанище на атака струни с различни ценности, Ардуино просто не разполагат с време, за да прочетете цялата серия, така че често се трансформира низ в "0: 909" ": 9090" и п като това са.
Съответно безредукторни полудяха и взеха всички разпоредби, с изключение на тези, които се нуждаят от тях.

Така че без колебание, стигнах до заключението, че имаме нужда от символ на началото на една линия и край на ред характер. Отново, без колебание, първият символен низ, започващ символ на латинската азбука беше избран - «а», в края на последния ред - «Z», а стойностите на стартиращи код брадви «х» и «у», съответно. Общо линеен вход приема следния вид: «ax90y90z».

Всичко би било добре, ако не и далекомер. Ултразвуков далекомер, той определя разстоянието с гръм и трясък, но има някои нюанси. На първо място, ако ъгълът между намиране на гама и стената отчетливи 45 градуса (плюс или минус), отразената звука от стената на допирателна и стойността не отговаря на действителността. На второ място доста голям ъгъл на емисиите сигнал от около 30 градуса (наръчник) и измерената разстоянието до най-близкия обект, в полза, че сигналът от обектите, на които е наклонена на сензора, отразена в друга посока, а ние получаваме повече или по-малко реална разстояние по права линия но шума е все още там, и доста често. Затова е добавил друга функция, която се измервания на разстояния, N, добави ги и разделя на броя, изложен п = 10, така че шумът стане по-гладка и по-малко забележими.

относно кодекса на Arduino е пренаписана и веднага взе следния вид:

Проблемът с неправилното разбор на координатите е изчезнала изобщо, 100 от 100-тестовете преминат успешно.

основната програма за управление (C #)

Първо исках да напиша всичко в C ++ за Qt, но по-късно все още трябваше да се напише в C #, но О, добре.

Какво бихте искали да получите:
1. Признаване на лицата на хората.
2. Проследяване на лицето на един човек.
3. Ръчно управление чрез джойстик.
4. Определяне на разстоянието до обекта.

С разпознаване на лице и показване на изображението от вашата уеб камера, без съмнение, той е избран за библиотеката OpenCV, или по-скоро черупка си за C # - Emgu CV.

За да прочетете на джойстика върху най-горната позиция за използване на библиотека Microsoft.DirectX.DirectInput, което не ми хареса страховито, а аз прилага SharpDX библиотека, то доста успешно.

Какво се изисква от програмата:
1. улавя изображения от уеб камера и ще го покаже на екрана.
2. Посочва се лицето на снимката, да ги проследи и да получи координатите на лицето на снимката.
3. За да се образува линия на форма «ax90y90z» и да го изпратите на серийния порт за контрол на серво машинки.
4. Отчитат се показанията на позицията на джойстик.
5. Прочетете показанията на далекомер.

Да формулира проблема, се пристъпва към програмирането.

Библиотека SharpDX ни позволява да намерите свързан джойстика и да получи от него оста на стойност (0-65535), натиснете и отпуснете бутона на джойстика. Безредукторни може да се завърта от 0 до 180 градуса, съответно, трябва да конвертирате джойстика стойността оси от 0 до 180. Аз просто разделя върнатата стойност от 363, и е получен в изхода стойности от 0 до 180. След това напишете функция, която създава положение низ серво и я изпраща до порт.

Изходни изображения и разпознаване на лица, са написани с помощта OpenCV и не представляват нищо комплекс (за нас).

По-интересно, като под ръка далекомер, разбира се, аз исках да направя радара и изграждане на поне някои приблизителна представа за терена.

Повтарянето на тригонометрията и вектор, напиши процедура, която изчислява координатите на точката на нашия далекомер камера на ъгъла на въртене на задвижващия механизъм, а разстоянието до обекта, и обръща на резултатите, получени в PictureBox, бутонът започва процедурата в потока, тя работи, но все пак от облекчаване на стаята Тя е по-скоро по-скоро пречка, но груб контур съвпада с реалността. Опитвайки се да се изгладят данните от сензора, като изберете един връх и изготвяне между двата сегмента, по принцип, се оказа, не е лошо, но се отказа, тъй като често е пикови стойности са само шум.