webcam-controlabilă cu un joystick
Bună ziua. Motivat de numeroasele posturi de pe Habré de roboți de casă și a decis să facă ceva din propria mea mai puțin util și interesant.
În general, eu sunt pasionat de roboți pentru o lungă perioadă de timp, dar mâinile lui nu au ajuns la proiectul normale, practic doar joaca. Un gând mic, veni cu proiectul, cautat piese de schițe pictate, vis pe un robot oportunități viitoare. Detalii ordonat site-ul nu infam, și în timp ce părți a depăși calea de sub ceruri au decis să pună în aplicare una dintre modulele robotului viitor de la ceea ce este la îndemână. Sau, mai degrabă să nu realizeze chiar modulul în sine, și de a asambla un prototip, și scrie software-ul, astfel încât să nu te distras scriind un program, și chiar și cu atât mai mult în timp ce există toate detaliile există o mare de timp liber și dorința de a face ceva, nu se odihnește.
Pe de o parte, am fost o batistă Arduino Diecimila, multiple servomecanisme, camera web, joystick-ul, și un interval de căutare cu ultrasunete. Prin urmare, imediat a existat o dorință de a face o „viziune de calculator“ bazat pe camere web, cu capacitatea de a stand-alone atât operarea și controlul manual (joystick).
Spodviglo că am scris acest articol?
Săpat pe internet, am găsit cea mai mare parte de gunoi, întrebări vagi pe forumuri, extrase din articole, un pic mai îndepărtate de nevoile. În general, nu am găsit un bun articole, cu drepturi depline, care ar fi de la început până la sfârșit descrie crearea unui aparat de fotografiat web în mișcare, cu exemple de cod, și mai ales în combinație cu un telemetru și un joystick.
Apoi sa decis să nu mai caute, deoarece elementele timpul de prelucrare și iau toate informațiile într-un singur să plece a fost mai mult decât dacă ai face totul de la zero-te, mai ales că majoritatea articolelor au fost mult timp de actualitate.
Provocarea de fapt banal, pentru a trimite informații către joystick-ul de pe Arduino, care se află la un anumit unghi se va roti elementul de acționare 2 cu o cameră Web atașat, precum și necesitatea de a citi informații de la telemetru, trimițându-l la SerialPort.
După cântărire totul din nou, am decis să înceapă să construiască un prototip al lor. Să mergem!
principal
asamblare prototip
Prototipul a fost creat în 5 minute. Aspectul prototipului nu este interesat deloc, principalul său obiectiv - dezvoltarea programului înainte de a veni la piesele robotului.
Și am făcut-o din borcan primul ieșit din niște vitamine, două servomecanisme, camere web, clipuri de hârtie, bandă adezivă și pistol de lipit. Sa dovedit următoarele:

Ansamblul este completat, elemente de acționare și cu ultrasunete telemetru conectat la Arduino, Arduino la PC, continuați cu programarea Arduino.
programabil Arduino
Rularea un pic mai departe ar trebui să spun, a apărut o eroare aici și la care a trebuit să se întoarcă după ce a scris un program în C #. Eroarea a fost aici, în ceea ce - eu, naiv și entuziast, a scris un mic program care Analizează intrare port serial într-un șir de caractere similar cu următoarele „90:90“, în două părți, respectiv, prima parte este gradul de X, a doua parte a Y. Utilizarea monitorului Port totul a fost testat și a lucrat perfect, dar atunci când programul pentru a controla cu un joystick a fost scris cu port îmbunătățit de șiruri de atac cu valori diferite, Arduino pur și simplu nu au timp să citească toate seriile, astfel încât este de multe ori transformat șir în „0: 909“ „: 9090“ și n ca acestea sunt.
Prin urmare servomecanisme a innebunit si a luat toate dispozițiile, cu excepția celor care au nevoie de ele.
Deci, fără ezitare, am ajuns la concluzia că avem nevoie de un simbol de la începutul unei linii și sfârșitul liniei de caractere. Din nou, fără ezitare, primul simbol șir de caractere începutul alfabetului latin a fost ales - «o», la sfârșitul ultimei linii - «z», iar valorile de cod start axe «x» și «y», respectiv. linie de intrare totală ia următoarea formă: «ax90y90z».
Totul ar fi bine, dacă nu telemetru. Gama de ultrasunete Finder, determină distanța cu un bang, dar există unele nuanțe. În primul rând, în cazul în care unghiul dintre telemetrul și peretele mai clare 45 de grade (plus sau minus), sunetul reflectat de perete la o tangentă, iar valoarea nu corespunde realității. Unghiul În al doilea rând destul de mare de emisie a semnalului de aproximativ 30 de grade (un manual), iar distanța măsurată la cel mai apropiat obiect, avantajul că semnalul de la obiectele la care senzorul este înclinat, reflectată într-o altă direcție, și obținem distanța mai mult sau mai puțin reale de-a lungul unei linii drepte dar zgomotul este încă acolo, și destul de des. Prin urmare, a adăugat o altă funcție care ia măsurători la distanță n, le adaugă, și împarte de numărul de, expuse n = 10, astfel încât zgomotul să devină mai netedă și mai puțin vizibile.
pe codul Arduino a fost rescris și a luat imediat formularul de mai jos:
Problema cu parsarea incorectă a coordonatelor a dispărut, la toate, 100 din cele 100 de teste au trecut cu succes.
Programul principal de control (C #)
La început, am vrut să scrie totul în C ++ pentru Qt, dar încă mai târziu a trebuit să scrie în C #, dar oh bine.
Ce-ar dori să primească:
1. Recunoașterea fețele oamenilor.
2. Urmărirea fața unui om.
3. Controlul manual prin intermediul unui joystick.
4. Determinarea distanței la obiect.
Recunoașterea feței și a afișa imaginea de pe camera web, fără îndoială, a fost ales ca biblioteca OpenCV, sau mai degrabă cochilia pentru C # - Emgu CV.
Pentru a citi joystick-ul de pe poziția de sus pentru a utiliza biblioteca Microsoft.DirectX.DirectInput, care nu mi-a plăcut înfiorător, și am aplicat biblioteca SharpDX, destul de succes.
Ceea ce a fost necesară a programului:
1. capturează imagini de la o cameră web și afișa pe ecran.
2. Identificați persoana din imagine, le urmări și de a obține coordonatele persoanei din imagine.
3. Pentru a forma o linie de forma «ax90y90z» și trimite-l la portul serial pentru a controla servos.
4. Citiți valorile poziției joystick-ului.
5. Citiți mărturia unui telemetru.
Pentru a formula problema, vom proceda la programarea.
Biblioteca SharpDX ne permite să găsiți joystick-ul conectat și de a primi de la el axa de valoare (0-65535), apăsați și eliberați butoanele joystick. Servos poate fi rotit de la 0 la 180 de grade, respectiv, trebuie să transforme joystick-ul axelor de valoare de la 0 la 180. am împărțit valoarea returnată de 363, și a primit de la valorile de ieșire de la 0 la 180. Apoi, a scrie o funcție care creează o poziție de servo șir de caractere și o trimite la portuare.
imagini de ieșire și de recunoaștere a feței sunt scrise folosind OpenCV și nu reprezintă nimic complex (pentru noi).
Mai interesant, având la îndemână un telemetru, desigur, am vrut să fac radar și de a construi cel puțin o imagine aproximativă a terenului.
Repetând trigonometria și vector, scrie o procedură care calculează coordonatele punctului de pe camera noastră telemetru cu privire la unghiul de rotație al dispozitivului de acționare și distanța până la obiect, și atrage rezultatele obținute în picturebox, butonul începe procedura în fluxul, acesta funcționează, dar încă în afara reliefului camerei este mai degrabă mai mult un obstacol, ci un contur dur coincide cu realitatea. Încercarea de a netezi datele de la senzorul prin alegerea unui vârf și desen între cele două segmente, în principiu, sa dovedit nu-i rău, dar a decis împotriva sa, așa cum este de multe ori valorile de vârf sunt doar zgomot.