Oraselul

În vacanță, neavând posibilitatea de a lucra propriu-zis la robot, ne-am gândit ca proiectul nostru trebuie să capete o față puțin mai prietenoasă. Drept urmare, am început să construim orășelul în care robotul va distribui scrisorile. Am confecționat astfel cinci căsuțe care vor fi amplasate de-o parte și de alta a străzii pe care se deplasează robotul, în spatele cutiilor poștale. Mai jos puteți vedea cum am început construirea acestora, forma lor finală fiind dezvăluită doar în ziua competiției.

Posted in Uncategorized | Lasă un comentariu

Detectarea cutiilor poștale (Partea a III-a)

După cum am promis în postul anterior, am revenit cu un film în care se poate observa cum robotul nostru alege cutia poștală cea mai apropiată. Odată făcut acest pas, el se va deplasa până va ajunge la 15 cm în fața acesteia. Aici va citi textul care se află pe cutie.

Posted in Uncategorized | Lasă un comentariu

Detectarea cutiilor poștale (Partea a II-a)

Am mai complicat puțin lucrurile. De această dată robotul are în fața lui mai mult de o cutie poștală, fiind obligat să se deplaseze spre cea mai apropiată. Când a ajuns la mai puțin de 80 cm, se va opri și va face o nouă poziționare pentru a fi sigur că ajunge la destinație.
Pentru a putea întâmpina problemele care ar putea să apară pe parcursul livrării scrisorilor, ne-am hotărât să facem cât mai multe teste.

Test 1 – cutia se află situată în partea dreaptă, textul este îndreptat spre robot

– distanța : 2 m, cutia poștală se află în unghi
- prima detectare – OK
- se opreste – OK (oprirea are loc la 81 cm de cutia poștală)
- reorientare – OK
- ajunge la destinație cu succes

Test 2 – cutia este situată în partea stângă, textul este îndreptat spre robot

- distanța : 2 m
- prima detectare – OK (detectare puțin întârziată din cauza vitezei mari cu care se executau rotațiile)
- orientare puțin greșită
- oprire – OK (81 cm)
- de această dată nu ajunge la destinație

Din cauza faptului că IRobotul se rotea prea repede și detectarea cutiei era astfel încetinită, am modificat puțin funcția Rotate(), reducând puțin viteza sa de rotație.

Test 3 – cutia situată în partea stângă, textul este îndreptat spre robot

- distanța : 1,5 m, cutia poștală este în unghi
- prima detectare puțin greșită
- test eșuat

Test 4 – cutia situată în partea dreaptă

- distanța: 1,5 m
- prima detectare – OK
- se opreste – OK (oprirea are loc la 81 cm de cutia poștală)
- reorientare – OK
- ajunge la destinație cu succes

Test 5 – cutia este situată în partea stângă, textul este îndreptat spre robot

- distanța : 3 m
- prima detectare – OK
- se opreste – OK (oprirea are loc la 80 cm de cutia poștală)
- reorientare – OK
- ajunge la destinație cu succes

Test 6 – cutie aflată în fața robotului

- distanța : 1,2 m
- prima detectare - OK
- se opreste – OK (oprirea are loc la 80 cm de cutia poștală)
- reorientare – OK
- ajunge la destinație cu succes

Test 7 – două cutii poștale

- cutia din stânga situată la 1,9 m
- cutia din dreapta situată la 1,5 m
- prima detectare – OK
- orientare – OK, spre cel mai apropiat (cutia poștală din dreapta robotului)
- se opreste – OK (oprirea are loc la 81 cm de cutia poștală)
- reorientare – OK
- ajunge cu succes la cutia din partea dreaptă

Test 8 – două cutii poștale

- cutia din stânga situată la 1,5 m
- cutia din dreapta situată la 1,9 m
- prima detectare – OK
- orientare – OK, spre cel mai apropiat (cutia poștală din stânga robotului)
- se oprește – OK (oprirea are loc la 80 cm de cutia poștală)
- reorientare – OK
- ajunge cu succes la cutia din partea stângă

Test 9 – două cutii poștale

- cutia din stânga situată la 2,5 m
- cutia din dreapta situată la 2,5 m
- prima detectare – OK
- orientare – OK (în cazul în care cutiile sunt la aceeași distanță, robotul va alege cutia poștală din stânga sa)
- se oprește – OK (oprirea are loc la 79 cm de cutia poștală)
- reorientare – OK
- ajunge cu succes la cutia din partea stângă

Test 10 – două cutii poștale

- cutia din stânga situată la 2,5 m
- cutia din dreapta situată la 1,5 m
- prima detectare – OK
- orientare – OK (robotul alege cutia poștală din dreapta sa)
- se oprește – OK (oprirea are loc la 81 cm de cutia poștală)
- reorientare – OK
- ajunge cu succes la cutia din partea stângă

Cam atât pentru această săptămână ! Vom continua să facem cât mai multe teste, în cât mai multe situații și să încercăm să detectăm alte posibile erori.
Vom reveni și cu câteva filmulețe ale testelor care vor urma în săptămâna viitoare !

Posted in Uncategorized | Lasă un comentariu

Detectarea cutiilor postale (Partea I)

În această săptămână am modificat “ghiozdanul” robotului nostru pentru a nu părea doar o simplă cutie de carton cu câteva găuri în ea. Am muncit destul de mult pentru acest lucru și suntem destul de multumiți de cum arată acum “ghiozdanul” poștașului, dar până la ora competiției vom încerca să-i mai aducem câteva îmbunătățiri în ceea ce privește aspectul său.

De asemenea, am lucrat puțin și la cutiile poștale, dar.. aceasta nu este deloc forma lor finală. În acest moment nu se aseamănă foarte mult cu niște cutii poștale, le-am confecționat doar pentru că ne doream să avem câteva exemple cu care să putem începe să testăm detectarea lor. În principiu, aceasta este forma, culoarea și font-ul cu care va fi scrisă adresa pe cutiile noastre poștale.

Apoi, ne-am hotărât să testăm foarte bine detectarea cutiilor poștale și funcția care am scris-o pentru a situa cutia poștală odată detectată, în centrul imaginii. Imediat ce robotul detectează o cutie poștală, cu ajutorul funcției Poziționează(), în funcție de distanța la care se află cutia poștală, va stabili o limită în care trebuie să se încadreze pentru a se situa cât mai pe centru. Am întâmpinat din nou mici probleme, deoarece se întâmplă ca detectarea să nu funcționeze chiar întotdeauna, și asta din cauza camerei web cu ajutorul căreia se face detectarea de obiecte.

Mai jos avem codul sursă în C++ al funcției care poziționează obiectul detectat pe centru :

În primul exemplu, se poate observa faptul cum cu ajutorul funcției de mai sus, robotul face rotații la stânga și la dreapta, în funcție de poziția la momentul respectiv al cutiei poștale. Va face astfel de mișcări până când forma cutiei poștale va fi între cele două linii oblice verzi, desenate în funcție de distanța (Aria) la care se află cutia, acest lucru poziționând cutia poștală pe centru.

În cel de-al doilea exemplu, chiar dacă după prima detectare, robotul nu s-ar îndrepta chiar spre centrul cutiei, în momentul în care ajunge la mai puțin de 40 cm de aceasta, el va face o nouă poziționare, de această dată cu mai mult succes :

Posted in Uncategorized | Lasă un comentariu

OCR (Optical Character Recognition)

În sfârșit am reușit să facem recunoașterea textului din imagini. Am fost ajutați, ce-i drept, de o aplicație Open Source care primește ca parametru o imagine și returnează textul găsit, dacă acesta există. Totuși această aplicație nu “citește” întotdeauna corect textul și mai trebuie să o ajutăm. Imaginea care e trimisă ca parametru, trebuie să fie cât mai clară posibil și dacă textul este izolat, este mult mai bine.
Aceasta problemă a fost rezolvată foarte repede folosind OpenCV. Imaginea a fost “curațată” și tranformată într-o imagine alb-negru. Am făcut acest lucru, deorece după mai multe teste, am observat că recunoașterea textului este mult mai bună, dacă imaginea este alb-negru.
Totuși, în timpul nenumăratelor teste am descoperit o problemă, care ar putea să creeze ceva dificultăți în viitor. Și acea problemă este că uneori apăreau caractere ciudate în textul citit. De aceea a trebuit să aplicăm un filtru pe text pentru a izola literele, cifrele și caracterele spatiu și “.”.
Cu toate acestea, textul detectat nu este întotdeauna corect. Dar, deseori pierde unul-două caractere sau e posibil să detecteze caractere inexistente în imaginea respectivă, iar această problemă nu este cauzată de partea de soft, ci de camera web cu care se iau imaginile.

SOLUȚIA : Am luat 15 imagini, și am detectat textul din fiecare imagine. Apoi, am căutat textul care apare de cele mai multe ori în cele 15 imagini. Dacă apare de cel puțin N ori (N=8 momentan), e foarte mult probabil ca textul detectat să fie textul corect.

Aici avem codul sursă la funcția de mai sus, scris în C++:

Acuratețea algoritmului, în cazul în care distanța dintre camera și obiectul care conține textul e mai mică de 80 cm, este mai mare de 90%. Timpul de execuție este de câteva secunde, fiind acceptabil pentru o detectare cât mai bună. Pentru distanțe mai mari, este necesar ca textul să aibă o dimensiune mai mare sau o cameră mult mai bună.

În imagine se poate vedea rezultatul unei detecții a textului, acesta fiind Cameleon. Textul este pe o cutie poștală, iar algoritmul de detecție se aplică de mai multe ori.

Cutia poștală :


Rezultat :


Posted in Uncategorized | Lasă un comentariu

“Ghiozdanul” Robotului poștas (Partea a II-a)

Săptămâna 10 :

În această săptămână am lucrat în continuare la “ghiozdanul” robotului pentru a putea definitiva comenzile de scoatere a tuturor scrisorilor. Aveam nevoie de acest lucru și pentru ca scrisorile să stea fixe pe suport, și a nu avea mai multe rezultate pentru aceeași comandă, iar funcțiile o dată scrise pentru scoaterea unei scrisori, să fie definitive. Pentru început, am modificat puțin “ghiozdanul”, având acum patru sertare în care se pot ține scrisorile, fiecare loc având un suport, astfel încât scrisoarea să nu alunece înăuntru.


Apoi, ne-am apucat să scriem cele patru funcții de scoatere a scrisorilor. A fost destul de dificil deoarece pozițiile în care erau puse scrisoriile erau destul de incomode pentru LynxArm. Chiar dacă ar fi reușit să o scoată, mai apărea încă o problemă : datorită mișcării circulare a brațului, de exemplu dacă se scoatea prima scrisoare (prima scrisoare fiind cea mai de jos), în timp ce era scoasă, scrisoarea lovea și scrisoarea de deasupra ei, lucru ce ar fi putut strica calculele de scoatere a scrisorii lovite.

Pentru prima scrisoare am întâmpinat, din nou, cele mai multe probleme deoarece mișcarea era foarte complicată pentru braț, care nu funcționează nici cum ne-am dori (gripper-ul brațului este extrem de uzat și nu funcționează foarte bine).

Scoaterea primei scrisori :

Scoaterea celei de-a doua scrisori :

Scoaterea celei de-a patra scrisori :

După aceea am făcut mai multe teste și am pus robotul să scoată toate scrisorile din ghiozdan și să le pună într-o “cutie poștală” care se afla din coincidență fix în fața lui, și nu mai era nevoit să mai facă vreo mișcare pentru a ajunge lângă ea.
Mai jos puteți vedea ce a ieșit :

Am incercat apoi să ne mișcăm puțin cu IRobotul, și cu ajutorul senzorului de ultrasunete să ne oprim dacă el întâlnește vreun obstacol.

La început viteza era prea mare, iar scrisorile robotului săreau afară :) )

Dar cu o viteza mai mică acest lucru nu se mai întâmpla, iar robotul ajungea la “destinație” fără a mai pierde vreo scrisoare :

Cam atât pentru această săptămână! :)

Ne auzim din nou săptămâna viitoare ! :D

Posted in Uncategorized | Lasă un comentariu

“Ghiozdanul” Robotului postas (Partea I)

Saptamana 8 – Saptamana 9 :

In aceste saptamani am lucrat foarte serios la partea in care robotul nostru va lua scrisorile in momentul in care va detecta o cutie postala, si se afla deja in fata ei. Pentru aceasta ne-am gandit ca “postasul” nostru sa aiba un “ghiozdan” in care va avea scrisorile sale.

Chiar daca la inceput ne-am chinuit putin in a incerca sa “prindem” scrisoarea, am reusit sa pozitionam bratul pentru a face aceasta miscare. Totusi, din cauza ca cutia din care lua scrisorile LynxArm-ul era prea aproape de brat, acest lucru ne incurca teribil si nu am reusit nicicum sa scoatem o scrisoare din locul in care se va afla prima scrisoare din ghiozdanul robotul. Bratul nu mergea suficient de mult in spate, pentru a putea face posibila aceasta miscare. Chiar daca am fi scos-o, ar fi dat peste scrisorile de mai sus ceea ce nu ne convenea absolut deloc.

(1)

(2)

(3)

Apoi ne-am gandit ca ar fi bine ca ghiozdanul sa fie pus pe un suport montat in prelungirea suportului pe care se afla bratul Lynx. Astfel castigam mai mult loc pentru a putea scoate scrisorile mai in siguranta si mai eficient.

This slideshow requires JavaScript.

Dar.. dupa aceea am fost nevoiti sa calculam din nou toate miscarile bratului pentru a ajunge in noua pozitie in care se afla prima scrisoare. Nu a fost deloc usor, si ne-am chinuit destul de mult pana am reusit sa facem ceva care sa ne multumeasca cat de cat.

(4)

(5) A reusit sa o scoata! :D

(6) Aceeasi scoatere a scrisorii cu succes, dar executata putin mai repede.. :D

Dupa multa munca am reusit sa scoatem prima scrisoare din ghiozdanul “postasului”, ceea ce ne va ajuta foarte mult si in scoaterea celorlalte scrisori ale sale. Mai jos putem vedea si codul care face toate aceste miscari (de notat este faptul ca functia sendCommand() trimite bratului o comanda):

Suntem foarte siguri ca pentru celelalte va fi mult mai usor, deoarece vor fi situate intr-o pozitie multa mai comoda bratului. Sa speram ca asa va fi !

Ne auzim saptamana viitoare ! :)

Posted in Uncategorized | Lasă un comentariu