Gestionați camera Web cu ajutorul joystick-ului


Bună ziua. Motivați de numeroasele postări pe Habr despre robotii auto-făcuți, au decis să facă ceva mai mult sau mai puțin util și interesant.

În general, m-am îndrăgit de roboți pentru o lungă perioadă de timp, dar înainte de proiectul normal mâinile mele nu au ajuns, în principiu doar jocam. Dupa un pic de gandire, el a venit cu proiectul sau, a cautat detalii, a tras proiecte, fantezand despre viitoarele posibilitati ale robotului. 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).

Ce ma motivat să scriu acest articol?


După ce am scos pe Internet, am găsit în esență orice gunoaie, întrebări vagi despre forumuri, extrase din articole ușor depărtate de nevoi. Î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 hotărât să nu mai căutăm nimic, deoarece a fost nevoie de mai mult timp pentru a procesa articole și a colecta toate informațiile într-o singură bucată decât pentru a face totul de la zero, mai ales că majoritatea articolelor au fost mult timp învechite.

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ă ce m-am gândit din nou, am hotărât să încep să creez singur acest prototip. Să mergem!

Partea principală

Construiți un prototip


Prototipul a fost creat în 5 minute. Aspectul prototipului nu este deloc interesant, scopul său principal este dezvoltarea componentei software înainte de sosirea părților robotului.
Și am făcut-o din primul borcan din câteva vitamine, două servoare, o cameră web, un clip, o bandă izolatoare și un pistol de lipire. Rezultatul este următorul:

Gestionați camera Web cu ajutorul joystick-ului

Ansamblul este completat, elemente de acționare și cu ultrasunete telemetru conectat la Arduino, Arduino la PC, continuați cu programarea Arduino.

Cum să programați 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 așa mai departe ca acestea sunt.






În consecință, servii s-au înnebunit și au luat toate pozițiile, cu excepția celor de care avem nevoie.

Prin urmare, fără să mă gândesc mult timp, am ajuns la concluzia că avem nevoie de caracterul începutului liniei și al simbolului sfârșitului liniei. Din nou, fără să se gândească mult timp, primul caracter alfabetului latin a fost ales ca simbol pentru începutul liniei - "a", sfârșitul liniei a fost "z" și simbolurile pentru începutul valorilor axelor "x" și, respectiv, "y". Linia de intrare totală a avut următoarea formă: "ax90y90z".

Totul ar fi bine, dacă nu detectorul de distanță. Contorul de distanță este ultrasonic, distanța determinată de noroc, dar există mai multe 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 interferența are loc, ș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.

Codul de pe Arduino a fost imediat rescris și a luat următoarea formă:

Problema cu analiza incorectă a coordonatelor a dispărut complet, 100 din 100 de teste au trecut cu succes.

Principalul program de control (C #)


La început am vrut să scriu totul în C ++ sub Qt, dar mai târziu trebuia să scriu în C #, dar bine.

Că ar fi de dorit să primiți:
1. Recunoașterea fețelor oamenilor.
2. Urmărirea chipului unei persoane.
3. Comandă manuală cu joystick-ul.
4. Determinarea distanței față de obiect.

Pentru a recunoaște chipurile și a afișa imagini dintr-o cameră web, fără nici o întrebare, biblioteca OpenCV a fost aleasă sau, mai degrabă, cochilia ei pentru C # - Emgu CV.

Pentru a citi poziția joystick-ului, prima utilizare a fost biblioteca Microsoft.DirectX.DirectInput, pe care nu mi-a plăcut teribil, și am aplicat biblioteca SharpDX și destul de succes.

Ce a fost cerut de program:
1. Capturați o imagine dintr-o cameră web și afișați-o pe ecran.
2. Recunoașteți fețele din imagine, urmăriți-le și obțineți coordonatele feței din imagine.
3. Creați un șir de formular "ax90y90z" și trimiteți-l la portul serial pentru a controla serverele.
4. Citiți poziția joystick-ului.
5. Citiți citirile din aparatul de căutare a distanței.

După ce am formulat problemele, procedăm la programare.

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.

Ieșirea imaginii și recunoașterea feței sunt scrise cu OpenCV și nu reprezintă nimic complicat (pentru noi).

În plus, mai interesant, având un detector de rază la îndemână, a vrut, desigur, să facă un radar și să construiască cel puțin o imagine brutală a zonei.

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 se produce destul de mult zgomot, însă forma aproximativă 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.

În final, obținem tot ce ne-am dorit. Computerul recunoaște fețele și le monitorizează automat. Controlarea manuală a joystick-ului funcționează pe ura. Radarul, deși nu este exact, funcționează. Principalele funcții ale modulului de vizualizare a robotului au fost elaborate și rămâne doar să le perfecționăm și să le îmbunătățim.


Asta sa întâmplat când a fost terminat.

concluzie


Sa dovedit a fi destul de simplu. Scopul este atins, prototipul este gata. Este ceva de făcut și de făcut în timpul liber, așteptând un pachet cu componente pentru robot.

Planuri pentru viitor


Următorul pas este construirea unei platforme cu roți pentru robot, configurarea controlului la distanță (WiFi, 3G). senzori de suspendare (temperatură, presiune etc.), sinteză de vorbire. În colibe există și planuri pentru un braț mecanic.

Cred că dacă există interes pentru acest articol și continuarea acestuia, atunci va fi în mod necesar următorul! Corecțiile și criticile sunt binevenite!

Vă mulțumesc pentru atenție!







Trimiteți-le prietenilor: