Introducere și motivație [305007]
Introducere
Introducere și motivație
Robotica este un domeniu cercetat încă de la începutul anilor 1900,atunci când marele om de știință Nikola Tesla a creat primul submarin controlat electric prin unde de radio frecvență. Acel concep a fost văzut la vremea respectivă drept un robot. În anii ce au trecut in lumea electronicii s-a [anonimizat]: [anonimizat] a câtor mai puține constrângeri.
În prezent, o arie de interes este reprezentată de conceperea unor roboți ce se pot deplasa autonom și pot îndeplini diferite funcții. [anonimizat], [anonimizat], avalanșe sau explorarea unor zone cu risc ridicat în care mediul înconjurător nu permite supraviețuirea omului (ex: Cernobîl).
O îmbunătățire adusă relativ recent acestor roboți este reprezentată de implementarea unor funcții vizuale bazate pe algoritmi de Machine Learning si rețele neuronale. Adevărata provocare constă in folosirea unor algoritmi optimizați si a unui hardware capabil să elimine întârzierile suplimentare de procesare.
[anonimizat]. Astfel, [anonimizat] a plasa pe această harta coordonatele unui fruct ales din setul „Măr, Banană, Portocală”. Pentru implementarea acestui proiect s-au urmat doi pași majori:
Pasul I : [anonimizat] a [anonimizat] : [anonimizat].
Pasul I : [anonimizat]-[anonimizat], fiind cel mai potrivit pentru roboți cu deplasare aproximativ liniară. Un alt avantaj al acestui algoritm este reprezentat de volumul de calcul relativ redus prin comparație cu alte implementări SLAM (ex: ORB-SLAM).
Pasul II: [anonimizat]. Astfel, avem posibiltatea de a procesa imagini mai mari provenite de la o cameră de captare fără a pierde din calitatea imaginii.
Capitolul 1. Introducere în inteligența artificială si machine learning
1.1 Inteligența artificială
1.1.1 Introducere și testul Turing
Inteligența artificială este un domeniu studiat încă din anii 1950,atunci când Alan Turing a publicat o lucrare prin care era susținută ipoteza apariției unor mașini de calcul capabile să simuleze comportamentul uman. Aceasta este și ideea de bază a conceptului, de a [anonimizat]. Deși de-a lungul timpului s-[anonimizat], întrucât aceasta nu și-a atins potențialul maxim încă. Proiectele ce implică A.I acoperă arii mari din industrie si viața de zi cu zi, însă problemele pe care le rezolvă sunt punctuale, iar oamenii de știință speră ca în viitor sa existe prototipuri de A.I. complet autonom.
Așa cum diferite domenii au teste de calitate și performanță (ex: calitatea frânării la mașini este determinată de distanța de oprire a vehiculului in raport cu viteza sa), la fel se întâmplă și in domeniul inteligenței artificiale, una din metode fiind rezultatul în urma efectuării testului Turing.
Testul Turing are la bază un joc de identificare în care trei persoane se află in trei camere diferite: un bărbat, o femeie si un judecător. Scopul jocului este ca judecătorul sa identifice cine este bărbatul și cine este femeia fără o comunicare pe cale orală. Femeia are rolul de a încurca judecătorul, iar bărbatul de a oferi indicii folositoare.
In ziua de astăzi testul Turing constă în identificarea greșită a judecătorului între cei doi participanți la joc, doar că de data aceasta nu mai sunt o femeie si un bărbat, ci un om si un calculator. Se consideră ca un sistem de inteligență artificială este optim atunci când judecătorul nu poate face diferența între om si calculator. Deși acest test poate părea foarte bun, a devenit din ce în ce mai criticat și a pierdut din popularitate, întrucât se pune întrebarea „De ce ar trebui ca un sistem A.I sa aibă un comportament uman?”. Acest test a devenit mai mult un hobby, existând chiar și o competiție cu un premiu în valoare de $100.000.
Așadar, inteligența artificială reprezintă domeniul software în care sunt concepuți si implementați algoritmi prin care calculatorul învață un anumit comportament uman sau îndeplinește anumite funcții cognitive, fiind capabil să analizeze mediul înconjurător sau date și să ia decizii pe baza acestora.
1.1.2 Domeniile A.I
De-a lungul timpului noțiunea de inteligență artificială a format diferite ramuri prezentate în cele ce urmează:
Fig 1.1 Domeniile A.I
Rețelele neuronale: Este o tehnica software bazată pe modelarea algoritmică a unui sistem de calcul astfel încât să semene cu activitatea neuronală a creierului uman. Eficacitatea acesteia este dată de apropierea răspunsului la fiecare intrare dată de răspunsul dorit.
Data Mining: Procesul de clasificare a datelor prin folosirea unor șabloane pentru seturile foarte mari de date
Inteligența artificială statistică: Constă în analiza evenimentelor anterioare și a probabilității de apariție a acestora pentru a face o predicție a evenimentelor viitoare
Recunoașterea tiparelor: Constă în găsirea similitudinilor dintr-un set de date
Logia Fuzzy: Clasificarea si determinarea apartenenței unei intrări din sistem la o anumită clasă prin aflarea unui coeficient si compararea acestuia cu un prag.
Algoritmi genetici: Constă in alegerea unui program optim dintr-o mulțime de programe pentru a rezolva o anumită problemă. Se folosesc în general pentru predicția defecțiunilor unui sistem.
Machine Learning
1.2.1 Introducerea conceptului
Computerele sau, în general mașinile de calcul nu au capacitatea de a acționa „inteligent” fără a fi programate in acest fel. Spre deosebire de om care are capacitatea de a analiza si extrage informații si date din mediul înconjurător folosind cele cinci simțuri primare, urmând ca mai apoi să asocieze aceste informații cu experiențe din trecut pentru a lua decizii, mașinile de calcul nu au această capacitate de a învăța din „experiențele” trecutului, fără a fi antrenate de utilizator printr-un algoritm special.
Conceptul de Machine Learning constă exact în conceperea unor algoritmi software prin care sistemul de calcul poate învăța din datele anterioare și poate recunoaște șabloane și asocia evenimente ulterioare acestor șabloane numite clase. Este foarte important să se înțeleagă diferența intre Artificial Intelligence și Machine Learning, întrucât domeniul cel din urmă menționat reprezintă o ramură a inteligenței artificiale.
Diferența intre A.I și M.L este destul de clară la nivel principial întrucât scopul inteligenței artificiale este de a adapta algoritmi matematici prin care sistemul de calcul va fi capabil să își îmbunătățească „cunoștințele” despre mediul înconjurător, sistemul devenind tot mai optimizat pentru luarea unor decizii, prin învățări repetate dictate de utilizatorul specializat. Pe de alta parte, domeniul M.L este unul mai complex deoarece scopul final este de a oferi sistemului de calcul independență față de utilizator, acesta fiind capabil să crească ca nivel de cunoștințe fără intervenția omului.
Noțiunile anterior menționate oferă o idee clară despre scopul final avut în vedere atunci când un algoritm este conceput și implementat. Însă, este foarte important a se avea in vedere care sunt căile de bază prin care un calculator poate fi numit inteligent. Acest aspect va fi discutat în subcapitolul următor.
1.2.2 Tehnici de antrenare ML
In prezent există mai multe ramuri ale algoritmilor de antrenare a unui sistem ML, fiecare avantajele si dezavantajele sale. Acestea sunt:
Învățarea supervizată
Învățarea nesupervizată
Învățarea semi-supervizată
Figura 1.2 Tipuri de învățare
nv
Învățarea supervizată constă în folosirea unui set de antrenare care conține datele de intrare X (input data) si vectorul de ieșire Y compus din etichete (labels). Aceste etichete reprezintă clasa de apartenență a vectorului de intrare. Acest tip de învățare se numește supervizată deoarece etichetele de la ieșirea sistemului sunt date de utilizator, deci acesta dictează modul în care algoritmul se va adapta datelor de intrare. Există doua tipuri de probleme care se află sub incidența acestui tip de învățare: clasificarea și regresia.
Învățarea nesupervizată reprezintă tipul de învățare cel mai complex și cel mai studiat în ziua de azi. În acest caz nu există etichete la ieșirea sistemului care dictează procesul de cunoaștere, mașina fiind nevoită să stabilească corespondențe între diferiți vectori de intrare. Este cel mai realist mod de operare întrucât poate acoperi seturi mari de date cum ar fi rețelele de socializare unde aceste date nu pot fi clasificate manual de specialiști deoarece ar costa foarte mult angajarea unui asemenea număr de oameni. Dintre metodele folosite pentru învățarea nesupervizată se regăsesc: clustering, input regularities. Clustering-ul reprezintă asocierea unui set de date de intrare unei clase compuse din seturi de date anterior analizate, realizând astfel partajarea datelor. Metoda „input regularities” constă în găsirea unor șabloane în seturile de date de intrare (spre exemplu: dacă un om caută pe un motor de căutare rețete culinare in fiecare zi atunci se poate spune că acel om este pasionat de gastronomie).
Învățarea semi-supervizată nu este un concept foarte popular. Este o îmbinare a celor două moduri de învățare menționate anterior astfel încât sistemul primește atât date asociate cu etichete cât și date neclasificate. Scopul final este de a face o predicție asupra clasei de apartenență având la dispoziție un mecanism de corecție prin intermediul datelor având o eticheta asociată.
Capitolul 2.EKF SLAM și noțiuni despre robotică
2.1 Introducere în robotică
Robotica este un domeniu al electronicii din ce în ce mai studiat, prezentând un foarte mare interes datorită ariei foarte largi de aplicații acoperite. Acest interes atât din partea cercetătorilor cât și a mediului de afaceri a început a fi vizibil la începutul secolului 20, atunci când s-a pus problema unei omeniri industrializate. Până la acea vreme, industria se baza strict pe mâna de lucru a omului, fapt ce aducea limitări majore în ceea ce privește volumul de producție. Odată cu începutul anilor 1910 și implicit cu începutul primului război mondial, industria grea a devenit o prioritate pentru toate statele lumii astfel încât atenția tuturor s-a oprit asupra roboților industriali. In acel moment, aceștia reprezentau doar un concept futurist însă nu imposibil de atins. Prima generație de roboți industriali se întinde în perioada 1950-1967, din aceasta categorie făcând parte toate mașinile programabile ce aveau ca scop îndeplinirea unui număr redus de sarcini.
În timp au apărut și următoarele generații de roboți industriali, aceștia fiind din ce în ce mai optimizați, cunoștințele in domeniu crescând, impulsionate de proiecte și concepte in continuă dezvoltare. Ulterior, industria robotica a devenit o alternativă și pentru sistemele medicale din întreaga lume. Astfel, în anul 1985 a avut loc prima operație simulată a unui braț robotic cu o acuratețe de 0.05 mm.
În ziua de azi roboții nu mai reprezintă o descoperire uimitoare, ei fiind asimilați în viața de zi cu zi a omului. Ceea ce reprezintă acum o provocare este implementarea inteligenței artificiale pentru a crea roboți capabili de a lua decizii proprii fără o supraveghere continuă. Vedem astfel de prototipuri în Japonia utilizate ca o resursă umană ce beneficiază de lipsa oboselii (ex: robotul Pepper),dar și în state din Europa (ex: Olanda). De asemenea, pe piața autovehiculelor conceptul de mașină autonomă capătă contur, fiind deja implementate funcții care asistă șoferii (ex: detecția oboselii, asistență frânare, asistență viraje).
Capitolul acesta prezintă una din ramurile roboticii, și anume robotica probabilistică precum și implementarea unui algoritm de mișcare si recunoaștere a mediului înconjurător într-un sistem 2D, numit EKF-SLAM (Extended Kalman Filter Simultaneous Localization And Mapping)
2.2 Concepte de bază în robotica probabilistică
Deși în concepția universală robotul este mult mai precis ca omul datorită lipsei emoțiilor si a stării de oboseală, de multe ori această afirmație este falsă întrucât robotul este doar o altă mașinărie creată de om. Deoarece nu există nici o invenție perfectă este greșit a se considera că roboții sunt mult mai performanți ca omul. În realitate, aceștia depind de niște algoritmi de optimizare foarte complecși fără de care performanța lor ar fi redusă, în multe cazuri folosirea acestor roboți devenind periculoasă. Dacă luăm ca exemplu un braț robotic folosit în domeniul medical pentru operații pe inimă, atunci este de la sine înțeles ca fără o optimizare extrem de minuțioasă a robotului, moartea pacientului este iminentă.
Există o mărime care se folosește pentru a defini robotica probabilistică, aceasta fiind incertitudinea. Conceptul de incertitudine definește un eveniment care se poate întâmplă, însă cu o probabilitate variabilă. Este o modelare a lumii reale în care nici un eveniment nu este identic cu unul precedent și nici nu se poate ști cu exactitate când și cum va avea loc. Incertitudinea depinde de următoarele „variabile”:
Mediul înconjurător: Este foarte imprevizibil. Atunci când se proiectează un sistem trebuie avut în vedere gradul său de incertitudine. De exemplu, atunci cand un robot are scopul de a detecta obiecte dintr-o cameră a unei case este puțin probabil ca obiectele din acea cameră să fie mișcate, însă daca robotul are sarcina de a număra vehiculele care circulă pe autostradă într-un anumit interval orar, atunci gradul de incertitudine crește exponențial.
Senzorii: Senzorii sunt niște dispozitive prin care robotul extrage informații din mediul înconjurător urmând, ca mai apoi, acestea să fie procesate. Problema care apare în cazul senzorilor este gradul de eroare care depinde cât de performant este acest dispozitiv. Factorii care pot influența performanța sunt rezoluția senzorială și distanța maximă de măsurare. Astfel, atunci când se alege un senzor mai ieftin trebuie depus mai mult efort pe partea software prin implementarea unor algoritmi probabilistici mai buni. De asemenea, zgomotul reprezintă un catalizator al erorii ce nu poate fi atenuat.
Roboții: Aceștia se deplasează cu ajutorul unor motoare care sunt supuse zgomotului și efectului de uzură graduală. În special in aplicațiile cu un buget redus de proiectare aceste motoare pot influența puternic percepția robotului
Modelele de procesare: Este aproape imposibil ca un algoritm de modelare a lumii înconjurătoare să poată îngloba toate situațiile posibile. Această sursă de eroare a fost puternic ignorată în trecut de cercetătorii acestor modele.
Eroarea de calcul: Roboții sunt sisteme în timp real ceea ce reduce capacitatea de calcul, întrucât un volum mare computațional duce la o încetinire nepermisă a sistemului. Pentru a ajuta sistemul de calcul, în multe din aplicațiile moderne,foarte complexe, se folosesc algoritmi de aproximație și predicție.
Scopul acestor algoritmi probabilistici este de a reprezenta incertitudinea în mod explicit prin teoria probabilistică. Astfel, în loc de a folosi doar probabilitatea cea mai mare a unui eveniment de a avea loc, se folosește distribuția de probabilități a unui set de evenimente posibile. Această abordare face posibilă luarea în calcul a tuturor surselor de incertitudine menționate anterior. Pentru o descriere mai clară a logicii probabilistice se va folosi următoarea diagramă ce simulează un caz real de localizare Markov a unui robot.
Fig 2.1 Ilustrare convingere 1D
Pentru a putea face o descriere a figurii de mai sus trebuie însemnate două mărimi:
bel(x)-convingerea- este mărimea care reprezintă estimarea instantanee a robotului și este reprezentată de o funcție densitate de probabilitate pe spațiul tuturor locațiilor.
p(z|x) este mărimea care exprimă probabilitatea condiționată a detecției unui obiect pentru o anumită poziție a robotului.
Figura ilustrează procesul unei localizări globale, ceea ce înseamnă că robotul este plasat inițial într-o zonă necunoscută, iar acesta iși stabileste locația folosind datele extrase din mediul înconjurător prin senzori. Este important de menționat faptul că în acest caz robotul dispune de o hartă anterior încărcată în algoritm astfel încât singura problemă pe care acesta o are este stabilirea coordonatelor sale.
În prima imagine robotul efectuează prima măsurătoare în urma căreia identifică existența unei uși, însă acesta nu poate spune și a câta usă este în fața sa. Acest aspect este ilustrat în graficul bel(x), fiind prezente probabilități mari pentru coordonatele la care se află toate ușile și probabilitate mică în rest. Astfel, este clar faptul că algoritmul poate rezolva problema unor conflicte, deoarece în această etapă robotul stabilește că este poziționat in fața oricăreia dintre cele 3 uși rezultat care confirmă algoritmului necesitatea unei noi iterații. O altă remarcă importantă este faptul că oricărei poziții de pe axa X îi corespunde o probabilitate diferită de zero. Valorile acestea nenule reprezintă de fapt incertitudinea dată de modelul senzorului.
La următorul pas robotul se deplasează pe o anumită distanță iar probabilitatea se „deplasează” și ea și este mai „tocită” intrucât, pe lângă incertitudinea cauzată de măsurătorile facute de senzor, acum apare și incertitudinea provocată de mișcarea robotului.
În ultima diagramă se observă faptul că robotul a reușit să-și deducă poziția. Rezultatul se datorează faptului ca informațiile anterior colectate au fost asociate cu direcția și distanța de deplasare, iar apoi s-a efectuat o nouă măsurătoare ce indică faptul ca acum robotul este la ce-a de-a doua ușă. Acest lucru este posibil doar atunci când robotul dispune de o hartă anterior încărcată cu scopul de a facilita localizarea. Algoritmii ce beneficiază de o astfel de hartă ajutătoare se numesc algoritmi cu corespondențe cunoscute.
Lucrarea curentă folosește algoritmi cu corespondențe cunoscute cu scopul de a facilita înțelegerea fenomenului, în implementarea practică fiind folosit un algoritm cu corespondențe necunoscute.
Termenul de stare va fi folosit des pe parcursul acestei lucrări și face referire la o colecție a tuturor elementelor robotului și a mediului înconjurător, care vor avea un impact asupra viitoarelor rezultate. Mai explicit, starea este compusă atat din variabilele ce definesc mișcarea și localizarea robotului cât și din variabilele ce caracterizează elementele mediului exterior:
variabilele robotului: se vor folosi 3 variabile deoarece reprezentarea finală se va face in format 2D. Aceste 3 variabile sunt: coordonata x,coordonata y și orientarea θ.
variabilele mediului înconjurător: se vor folosi de asemenea 2 variabile pentru algoritmul implementat (coordonatele x și y ale obiectului) și 3 variabile pentru demonstrația matematică generală (coordonatele x si y ale obiectului și semnătura s al acestuia)
2.3 Algoritmi Gaussieni. Filtrul Kalman. Filtrul Kalman Extins
2.3.1 Introducere
Tehnicile Gaussiene de reprezentare a mediului înconjurător sunt printre cele mai populare deoarece facilitează calculul și își păstrează proprietățile de distribuție spațială atunci când sunt folosite împreună cu ecuații liniare. Distribuția de probabilitate sub formă Gaussiana este scrisă astfel:
.
În ecuația precedentă μ este media,iar Σ este covarianța. Media este un vector cu aceeași dimensiune ca vectorul de stare x ,iar matricea de covarianță este o matrice pătratica pozitivă si simetrică. Numărul de elemente din matricea de covarianță depinde pătratic de numarul elementelor din vectorul de stare. Ceea ce este cel mai important și de asemenea reprezintă motivul pentru care reprezentările Gaussiene sunt folosite este faptul că funcțiile Gaussiene sunt unimodale (au un singur maxim) ceea ce permite intepretarea spațială a evenimentelor cu cea mai mare probabilitate de apariție.
Funcțiile de probabilitate sub forma gaussiană se reprezintă mereu folosind media și matricea de covarianță, acestea fiind considerate momentele reprezentării. Toate celelalte momente sunt considerate nule.
2.3.2 Filtrul Kalman
Filtrul Kalman reprezintă cea mai studiată implementare a unui filtru Bayes fiind inventat în anul 1950 de către Rudolph Kalman ca o unealtă pentru predicția liniară. Prin acest filtru se poate calcula convingerea pentru stări continue, deci nu se poate aplica stărilor discrete. Filtrul Kalman calculează convingerea la momentul t folosind momentele de reprezentare μt și Σt. Stările ulterioare pot fi și ele reprezentate sub forma Gaussiană dacă următoarele 3 afirmații se verifică:
1.Următoarea probabilitate de stare p(xt | ut,xt-1) trebuie să fie liniară și să fie afectată de zgomot gaussian. Expresia poate fi scrisă astfel:
În ecuația anterioara xt și xt-1 sunt vectori de stare la momentele t, respectiv t-1, iar ut este vectorul de control la momentul t. Acești vectori sunt verticali astfel:
și
At și Bt sunt matrici. At este o matrice pătratică de dimensiunea n x n , unde n este lungimea vectorului de stare xt. Bt este o matrice de forma n x m ,unde m este lungimea vectorului de control. Prin înmulțirea tuturor termenilor menționați anterior se obține o ecuație liniară ce descrie starea curentă folosind starea anterioară și controlul curent.
Variabila aleatoare εt este un vector gaussian care modelează zgomotul din tranziția de stare, fiind de aceeași dimensiune cu acesta. Media sa este considerată 0,iar covarianța va fi notată cu Rt. Ecuația care descrie probabilitatea pentru pasul 1 este:
2. Probabilitatea măsurătorii trebuie de asemenea să fie o ecuație liniară cu zgomot Gaussian adăugat:
În această ecuație Ct este o matrice de dimensiunea k x n unde k reprezintă lungimea vectorului de măsurători zt. Vectorul δt reprezintă zgomotul de măsurare. Distribuția valorilor acestui vector sunt de asemenea Gaussiene.
3. Convingerea inițială bel(x0) trebuie să fie normal distribuită. Această distribuție se face de asemenea după momentele μt și Σt.
În următoarea figură se vor reprezenta pașii implementării filtrului Kalman înpseudo cod.
1: Algoritm Filtru Kalman:
2:
3:
4 :
5:
6:
7: return ,
Scopul filtrului Kalman este de a determina convingerea la momentul de timp t prin medie și covarianță. Ca date de intrare se vor folosi media și covarianța de la momentul t-1. De asemenea, pentru ajustarea parametrilor este nevoie și de un vector de control și unul de măsurători prin care se stabilec pozițiile obiectelor din jur și a robotului.
În liniile 2 și 3 valorile prezise și sunt calculate reprezentând convingerea presupusă la momentul t, (xt) pentru un moment de timp viitor, dar înainte de a adăuga în ecuație și vectorul zt. Parametrul t se obține prin folosirea vectorului de control și a stării anterioare. Cu alte cuvinte, știind ca sistemul se deplasează pe o anumită axă cu o anumită distanță se poate considera ca noua poziție va fi aproximativ egală cu cea dorită, înainte de a trece la pasul de corecție. Matricea de covarianță se calculează după același principiu, prin folosirea în locul vectorului de control a matricei de zgomot.
În liniile 4 5 și 6 este calculată convingerea reală prin determinarea parametrilor reali μ și Σ la momentul t. Variabila Kt este numită câștigul filtrului Kalman și determină ponderea de influență a măsurătorii în determinarea noii poziții. Astfel, daca valoarea Kt este mică, atunci se poate spune că efectuarea măsurătorilor nu a dat informații relevante pentru estimarea poziției robotului.
Din punct de vedere al volumului de calcul algoritmul este destul de eficient, complexitatea inversării matricilor fiind de O (d 2.8) pentru o matrice de forma d x d. În multe aplicații precum cele ale localizării roboților volumul computațional este destul de mic, însă modelul algoritmului Kalman clasic este ineficient.
Fig 2.2. Deplasarea pe o axă a unui robot d.p.d.v. a incertitudinii
În figura 2.2 este prezentat modul de funcționar al filtrului Kalman pentru un caz simplu de deplasare pe o singura axă a unui robot. Se presupune că robotul se deplasează pe axa orizontală în fiecare figura. Se presupune, așa cum este afișat și in figura a) că parametrii de localizare a robotului sunt dominați de o lege Gaussiană și are o stare inițială nenulă. Robotul folosește senzorii pe care îi are la dispoziție (camere, senzor GPS etc.) ,iar aceștia dictează poziția robotului ca fiind cea din figura b).
Curba Gaussiană din aceasta figură ilustrează măsurătoarea, având în punctul de valoare maximă datele transmise de senzor, iar lățimea corespunde incertitudinii măsurătorii. Combinând „cunoștințele” robotului din momentul anterior și cel curent se obține forma Gaussiană din figura c). Aceasta corespunde convingerii curente ce are media intre cele două medii originale, iar incertitudinea vizibil scăzută față de ambele cazuri anterioare.
Următorul pas este presupusa mișcare a robotului spre dreapta, motiv pentru care incertitudinea crește din nou din cauza faptului că procesul este unul stocastic fig d). Curba Gaussiană se deplasează la dreapta conform deplasării robotului. Apoi, procesul de scanare a mediului înconjurător continuă, robotul primind alt set de date de la senzori fig.e ,datele acestea combinându-se cu cele anterioare obținând rezultatul din figura f).
Acest exemplu vizual ilustrează modul de alternare a algoritmului Kalman a doi pași: cel de predicție și cel de corecție. Pasul de predicție crește incertitudinea dar determină domeniul nou al stării curente, iar pasul de corecție are rolul de a scădea această incertitudine prin analiza mediului înconjurător.
2.3.3 Filtrul Kalman Extins
Deși filtrul Kalman pare o abordare solidă pentru problema predicției poziției unui robot, acest model este folosit doar teoretic deoarece are dezavantajul necesității îndeplinirii condițiilor de liniaritate. Daca un robot se deplasează pe o direcție circulară, atunci este nevoie de un alt instrument matematic care poate prezice traiectoria sa. Din acest motiv a fost creat algoritmul filtrului Kalman Extins prin care tranziția spre următoarea stare guvernată de o lege neliniară prin funcțiile g și h.
Astfel,sistemul de ecuații de la filtrul Kalman clasic devine:
În sistemul de ecuații precedent funcția neliniară g înlocuiește matricile At si Bt,iar funcția h înlocuiește matricea Ct. Dezavantajul acestei abordări este dat de faptul că prin alegerea unor funcții arbitrare h și g, convingerea nu va mai fi Gaussiană, deci respectarea pașilor algoritmului va fi imposibilă.
Metoda prin care acest algoritm devine viabil este folosirea EKF astfel încât se va calcula o convingere aproximativă a celei reale, astfel această valoare aproximativă putând fi reprezentată printr-o curbă Gaussiană, prin liniarizare folosind expansiunea Taylor de ordinul 1.
Deoarece funcțiile g și h nu permit propagarea Gaussiană din cauza neliniaritaților lor, aceste funcții pot fi aproximate prin tangente liniare la curbele lor in punctele date de media curbei Gaussiene. Astfel,se vor folosi funcțiile derivate parțial in raport cu parametrii de intrare:
Astfel,folosind acest principiu probabilitatea următoare stări poate fi exprimata astfel:
În ecuațiile precedente matricea Gt este de dimensiunea n x n,unde n reprezintă dimensiunea vectorului de stare și este numită Jacobianul funcției G.
1: Algoritmul Filtrul Kalman Extins
2:
3:
4:
5:
6:
7: return
2.4 EKF-SLAM
2.4.1 Modelul odometric de deplasare
Există multe căi prin care se implementa deplasarea unui robot, acesta putând folosi un sistem de (ex: roți,șenile, elice etc.), iar pentru fiecare din aceste moduri de construcție există și un algoritm probabilistic. Lucrarea curentă prezintă un robot ce se deplaseaza folosind 4 roți controlate de 4 motoare, dotate cu câte un set de encodere. Astfel, cel mai facil algoritm este modelul odometric de deplasare.
Prin deplasare se înțelege procesarea unui set de comenzi de către robot cu scopul de a avansa în următoarea stare definită de noile coordonate. Aceste comenzi sunt și ele afectate de zgomot la fel ca orice element din construcția robotului. La momentul de timp t poziția corectă a robotului este dată de vectorul xt iar trecerea la starea xt+1 se face conform unui set de comenzi care în cele mai multe cazuri nu estimează corect deplasarea reală. Modelul odometric folosește informațiile relative despre odometria internă a robotului. Cu alte cuvinte, având în vedere tranziția menționată anterior modelul odometric oferă informațiile despre tranziția între starea t-1= ( ) și starea t= ( ). Folosirea termenilor barați indică faptul că aceste coordonate sunt cele interne ale robotului, iar corelația acestora cu mediul real este necunoscută. Totuși, tranziția internă a robotului oferă informații estimative despre deplasarea robotului, corecția putând fi facută prin adaugarea unor termeni probabilistici.Așadar, vectorul de deplasare va avea forma ut = .
Pentru a putea extrage odometria relativă, ut este transformat intr-o secvență de 3 pași: o rotație, o deplasare liniară pe o distanță cunoscută și încă o rotație. În continuare cei 3 termeni vor fi notați astfel: δrot1 δtrans δrot2. Aceste trei mărimi sunt afectate, de asemenea, de zgomot.
1: Algoritm odometrie:
2:
3: =
4:
5: )
6: )
7: )
8: x’= x + cos()
9: y’= y + sin(
10:
11: return xt = (x’ ,y’,)T
În algoritmul precedent sunt descriși pașii de determinare a stării curente având ca intrări starea anterioara și vectorul de control. În liniile 2-4 sunt extrași parametrii relativi δrot1, δtrans, δrot2 din datele oferite de senzori ( în acest caz, encoderele). În liniile 5-7 sunt calculate valorile presupuse reale ale acestor parametri prin adaugarea unor valori aleatoare de zgomot. Termenii notați cu α reprezintă constante obținute prin măsurători practice repetate. Liniile 8-10 calculează pozițiile reale la timpul t a robotului după adăugarea factorului de zgomot.
Fig 2.3. Distribuția de probabilitate în procesul mișcării pentru a) dispersie moderată b) dispersie mică c) dispersie mare
Figura precedentă(inlocuit) ilustrează distribuția de probabilitate a stării xt în funcție de diferiți parametri α de zgomot.
2.4.2 Algoritmul de localizare EKF
Prin algoritmul EKF se urmărește rezolvarea problemei localizării unui robot folosind datele preluate si procesate din mediul exterior. Localizarea se va face folosind o hartă construită pe baza așa-ziselor repere, care reprezintă de fapt obiectele din mediul respectiv.
1: Algoritm localizare EKF:
2:
3:
4 :
5:
6: pentru toate obiectele k din hartă:
7:
8:
9:
10:
11:
12: endfor
13: pentru toate obiectele detectate :
14:
15:
16: endfor
17:
18:
Acest algoritm de localizare va fi prezentat pe scurt întrucât reprezintă doar o parte incipientă a algoritmului folosit în practică, EKF SLAM. Pentru început, în liniile 2-3 se implemententează modelul de deplasare prin care robotul va prelua datele de la senzorii, care sunt de obicei encoderele de pe roți. Astfel,se obțin parametrii preziși t și t, media și matricea de covarianță. Matricea Gt reprezintă jacobianul funcției de mișcare așa cum a fost menționat și anterior. În linia 5 este inițializată matricea de zgomot. Varianțele din aceasta sunt determinate în funcție de rezultatele experimentale repetate și se adaptează dupa performanța robotului.
Următorii pași au la bază folosirea unui principiu probabilistic numit „maximum likelihood” și se bazează pe asociere de date. Cu alte cuvinte, se determină cea mai apropiată valoare de valoarea obținută, această diferență fiind mai mică decât un anumit prag ales de utilizator, astfel încât valoarea măsurată sa poată fi asociată valorii deja existente.Pentru a nu crea confuzii asupra rezultatelor, atunci când se folosește această metoda pentru determinarea corespondențelor între reperele unei hărți se folosesc valori mici ale pragului.
În liniile 6-16 este realizată corecția prin măsurare a stării curente. Astfel, pentru fiecare reper existent în harta m se determină distanța pe fiecare coordonată între acest reper și poziția curentă,iar apoi se calculează distanța liniară. Cu aceste valori se obțin în linia 9 distanța și unghiul măsurătorii. În linia 14 este calculată distanța Mahalanobis între reperul observat prin senzori și toate celelalte repere din hartă pentru a se verifica existența unei posibile corespondențe care să indice lângă ce obstacol se află robotul. În linia 15 este calculat câștigul filtrului Kalman care determină cât din informația oferită de senzor este relevantă pentru determinarea locației reale curente. În liniile 17 și 18 sunt calculate valorile reale pentru medie și matricea de covarianță.
2.4.3 Algoritmul EKF-SLAM
Acest algoritm este implementat în partea practică a acestei lucrări, deci va fi analizat pe larg. Algoritmul EKF-SLAM a fost primul algoritm de tip SLAM și totodată cel care a avut cel mai mare impact. Deși a fost optimizat de-a lungul timpului, există o serie de aproximații și limitări care nu recomandă acest algoritm pentru aplicațiile foarte complexe, dar ramâne potrivit pentru aplicațiile cu buget redus sau cele care nu cer o performanță foarte mare.
Hărțile bazate pe repere: Hărțile realizate de algoritmul EKF SLAM sunt compuse din repere punctuale,iar din motive computaționale acestea sunt în general mai mici de 1000 de astfel de repere.
Zgomot Gaussian: Deoarece este folosit un filtru Kalman extins, zgomotul presupus ce afectează robotul este Gaussian,iar incertitudinea stării anterioare trebuie sa fie relativ mică, altfel aproximațiile pot induce nereguli clare.
Măsurătorile trebuie să fie pozitive: Algoritmul EKF-SLAM nu poate procesa informația dacă măsuratorile oferite acestuia sunt nule, nedetenctandu-se nimic.Nu se poate oferi doar o schimbare de poziție fără ca robotul să ofere și măsurători.
1: Algoritm EKF
2: Nt=Nt-1
3:
4:
5:
6:
7:
8: pentru fiecare obiect observat :
9:
10: pentru k=1:Nt+1 :
11:
12:
13:
14:
15:
16:
17:
18: endfor
19:
20:
21:
22:
23: endfor
24:
25:
26: return
Algoritmul EKF SLAM este o continuare a localizării EKF, diferența fiind făcută de faptul că scopul final al acestui algoritm nu este doar localizarea precisă a robotului ci și construirea unei hărți. Acest aspect este foarte important întrucât algoritmii prezentați anterior se bazează pe existența unui asemenea „ghid” încă din pasul incipient.
Vectorul de stare în acest algoritm va conține și pozițiile reperelor detectate prin sistemul senzorial.
,unde x, y și θ reprezintă coordonatele robotului la timpul t, iar mi,x, mi,y fiind coordonatele reperului i. Dimensiunea vectorului yt este 3N+3, unde N reprezintă numărul de repere.
Pașii 3-6 reprezintă inițializarea modelului odometric, cu o mică diferență față de cazul localizării EKF. În acest algoritm se folosește matricea Fx pentru a mapa matricea de zgomot de mișcare Rt în spațiul matricii de covarianță.
Algoritmul pornește cu asumpția existenței unui reper nou, neînregistrat anterior cu indexul Nt+1,unde Nt reprezintă dimensiunea hărții la momentul t. Locația acestui reper se inițializează în linia 9 cu datele oferite de sistemul de senzori, aflând astfel coordonatele sale prezise.
În liniile 10-17 se respectă pașii algoritmului localizării EKF menționați în subcapitolul anterior prin care se calculează distanța Mahalanobis între noul reper și toate celelalte repere existente deja in hartă. Pașii care urmează mai apoi sunt definitorii pentru acest algoritm. Se stabilește un prag de apartenență prin care este efectuată asocierea între repere. În linia 20 se stabilește cea mai mică distanță măsurată, iar dacă această distanță este mai mică decât pragul stabilit, atunci se consideră că robotul a detectat un reper deja existent în hartă, dimensiunea acestuia rămânând la fel, iar media și matricea de covarianță se ajustează conform algoritmului localizării EKF. Daca, din contră, toate distanțele măsurate sunt mai mari decât acest prag, atunci se consideră că reperul este nou, prima detecție a sa fiind cea curentă și acesta trebuie adăugat atât în matricea de covarianță cât și în vectorul de stare. Există numeroase metode prin care acest lucru se poate face, în implementarea practică din această lucrare fiind folosită următoarea metodă: Adăugarea unui termen nou reprezintă, implicit, și mărirea volumului de calcul ceea ce va duce la o încetinire treptată a sistemului până în punctul de blocare. De asemenea, se poate dovedi dificilă adăugarea unui astfel de termen fără a perturba termenii ce corespund altor repere din matricea de covarianță. În această lucrare s-a ales metoda inițializării unui număr aleator, destul de mare de repere (ex: 200) care vor fi considerate ca având coordonatele 0,0, iar apoi vor fi modificate conform măsurătorilor.
Pentru a reduce volumul de calcul și a crește eficiența robotului, în pașii 10-18 se pot restricționa calculele doar pentru reperele ce se află în vecinătatea robotului. Desigur, și aici se poate crea o discuție și trebuie avute în vedere și specificațiile părții hardware, mai exact al ansamblului de senzori.
Pentru o înțelegere mai bună a funcționării algoritmului se va folosi figura de mai jos
Fig 2.4 Evoluția matricii de covarianță și incertitudinii în 3 stagii ale procesului de mișcare a robotului
În figura anterioară este ilustrat procesul de adaptare al cunoștințelor legate de mediul înconjurător prin modificarea matricei de covarianță. În prima figură mediul nu este cunoscut, incertitudinea fiind mare în ceea ce privește poziția curentă a robotului. În matricea de covarianță acest lucru se reprezintă prin valorile de 1 (reprezentate cu gri) pe diagonală, iar cu valori infinite (reprezentate cu alb) pentru toate celelalte elemente. Valorile infinite în acest pas reprezintă corelația între obiectele de pe hartă. Desigur, acestea nu sunt cunoscute, deci nu se poate lua o decizie despre pozițiile concrete.
În pasul b, robotul a efectuat mișcări în mediul înconjurător, detectând unele obiecte, astfel încât valorile, care la pasul anterior erau infinite, acum scad, sistemul fiind din ce în ce mai sigur cu privire la pozițiile obiectelor. Totuși, în acest pas intermediar incertitudinea este mare în zonele obiectelor, aspect ilustrat prin zonele blurate din jurul punctelor albastre.
În pasul c, robotul a efectuat trasee de tip buclă închisă în jurul tuturor obiectelor de pe hartă astfel încât incertitudinea de pe hartă scade, iar valorile din matricea de corelație scad.
Capitolul 3.Rețele neuronale. Rețele convoluționale
3.1 Introducere
Rețelele neuronale reprezintă un concept de Machine Learning prin care un sistem de calcul este antrenat să proceseze informația, în mod similar cu funcționarea creierului uman. Astfel, ideea de bază a unei rețele neuronale este de a stabili o funcție de asociere între datele de intrare și cele de ieșire. Similar, creierul uman procesează informația, obținută prin simțuri, ca mai apoi, prin intermediul neuronilor si sinapselor. Spre exemplu, atât creierul uman cât și o rețea neuronală, pot procesa sunetele în mod similar. La fel cum creierul, prin intermediul urechii medii și interne distinge diferite frecvențe ca mai apoi să reconstruiască semnalul pe care îl numim sunet, la fel și o rețea neuronală poate asocia diferite spectre de frecvență Fourier cu diferite litere sau sunete. Există numeroase tipuri de rețele neuronale, în această lucrare fiind prezentate doar două dintre ele: rețeaua neuronală de tip MLP( Multilayer Perceptron sau FCN-fully connected network) și rețeaua de tip convoluțional CNN (Convolutional Neural Network).
3.2 Noțiuni de bază
Pentru a putea proiecta o rețea neuronală este necesar a înțelege funcția de bază a unui neuron, denumit și perceptron. Neuronul reprezintă cuanta unei rețele neuronale, fiind cea mai mică unitate de prelucrare, la fel ca pixelul într-o imagine digitalizată. În structura sa, neuronul nu doar stochează informație, ci o și prelucrează printr-o funcție asociată tuturor neuronilor dintr-un strat sau chiar dintr-o rețea, numita funcție de activare. Astfel, neuronul îndeplinește, prin simpla lui existență, o funcție asemănătoare cu cea a unei rețele întregi, și anume, stabilirea unei relații între ieșire și intrare.
Pentru exemplificare se va începe cu primul neuron folosit în rețele neuronale, având asociat un algoritm de învățare, numit perceptronul liniar.
Fig 3.1 Structura perceptronului și funcția liniară de activare
În figura ….. datele de intrare sunt reprezentate prin setul de valori (x1, x2 … xn), ce formează vectorul de intrare, iar valorile (w1, w2 … wn) reprezintă ponderile asociate fiecărui element al vectorului de intrare. Aceste ponderi sunt valori care atribuie fiecărei intrări (reprezentând o trăsătura) o anumită greutate în procesul de determinare a valorii la ieșire.
Pentru perceptronul liniar are o funcție liniară, astfel încât valoarea de la ieșire este suma ponderată a valorilor intrărilor, astfel: .
Un alt tip de neuron, folosit mult mai des, motivele fiind explicate în subcapitolele ulterioare, este neuronul de tip sigmoid. Acesta are aceeași structură ca neuronul de tip perceptron liniar, însă o funcție de activare diferită, definită de legea: .
Fig 3.2 Funcția sigmoidă
Ceea ce este nou la această funcție de activare, sunt limitele impuse de aceasta: 0 și 1. Astfel, valoarea de la ieșire a unui neuron nu va putea avea valori mai mari ca 1 și mai mici ca 0 ceea ce conduce la asocierea intuitivă cu o probabilitate de apartenență. Cu alte cuvinte, funcția sigmoid oferă la ieșire o transformare a spațiului de intrare în valori probabilistice. De asemenea, se poate observa că această funcție ar fi foarte potrivită pentru aplicațiile ce au ca scop clasificarea, spre deosebire de perceptronul liniar care este mai potrivit pentru probleme de predicție și regresie.
3.2.1 Eroarea și funcția cost
Așa cum a fost menționat anterior, neuronul are capabilitatea de a prelucra informația, însă el nu poate fi conceput pentru o aplicație specifică sau pentru anumite valori discrete, deoarece scopul unei rețele neuronale este de a generaliza informația de la intrare după trecerea printr-un proces de învățare. Astfel, este nevoie de o cantitate care să poată fi folosită în procesul de învățare. Mai exact, este nevoie de o entitate care să ilustreze eroarea între ieșirea dorită, impusă de programator si cea reală, oferită de rețea.
Pentru a putea estima eroarea anterior menționată se folosește funcția cost, aceasta putând avea mai multe forme, 2 dintre ele fiind: eroarea medie pătratică în cazul unei aplicații ce are ca scop predicția și funcția entropie încrucișată în cazul în care scopul rețelei este de a clasifica datele de intrare.
În cazul clasic, în care se folosește eroarea pătratică medie, funcția cost va avea următoarea formă, pentru cazul unui singur neuron:
În formula anterioară, dj reprezintă ieșirea dorită pentru vectorul de intrare cu numărul j, N fiind numărul total de vectori de intrare, iar f reprezintă funcția de activare.
Așadar, există o funcție cost care definește eroarea între valoarea dorită și cea reală la ieșirea din rețea. În mod clar, pentru ca această eroare să fie cât mai mică, deci valorile ieșire dorită-ieșire reală sa fie aproape identice, trebuie ca funcția cost să ia o valoare minimă. Se precizează o valoarea minimă și nu 0 întrucât este posibil ca minimul global al funcției cost să nu coincidă cu valoarea 0.
Se observă din formula anterioară că funcția cost este influențată de fiecare pondere în parte, ceea ce duce la concluzia evidentă ca prin modificarea unei singure ponderi, funcția cost poate lua o valoare mai mică sau mai mare. Astfel a apărut primul algoritm de învățare, învățarea prin penalizare, algoritm ce precede descoperirea noțiunii de backpropagation. Pașii acestui algoritm sunt:
Inițializarea aleatorie a tuturor ponderilor (W1, W2, …)
Se dă lotul de învățare {X,d} unde X reprezintă vectorii de intrare, iar d reprezintă ieșirile dorite
Pentru fiecare vector de intrare Xi i=1:N :
Se calculează ieșirea reală din rețea
Se compară ieșirea reală
Se calculează eroarea e=di-yi
În cazul în care există eroare, ponderile se penalizează cu o valoare astfel încât eroarea să scadă:
Ponderile sunt actualizate:
Se repetă pasul 3 până când eroarea devine minimă
3.2.2 MLP. Funcția cost. Backpropagation
Până în acest moment, pe parcursul acestui capitol s-a făcut referire doar la funcționarea unui simplu neuron pentru o înțelegere a conceptelor de bază. În continuare se va trece la prezentarea unei arhitecturi de rețea MLP (Multi-layer perceptron), compusă din numeroși neuroni de tip sigmoid, așezați în straturi. Ideea folosirii unei rețele este găsirea unei funcții care asociază datele dorite de ieșire cu intrările in rețea. Neuronul simplu prezentat anterior este limitat in termeni de complexitate, întrucât el poate stabili doar o relație simplă intrare-ieșire și poate clasifica datele de intrare în doar 2 clase. Pentru sarcini mai complexe se folosesc rețele cu un număr mult mai mare de neuroni.
Într-o astfel de rețea, fiecare neuron din fiecare strat preia o parte din sarcina de găsire a unei astfel de relații intrare-ieșire și are ponderile ajustate astfel încât sarcina sa să fie îndeplinită cât mai corect. Acești neuroni nu au o sarcină predefinită încă din etapa de concepere a arhitecturii, ci se adaptează ulterior prin numeroase iterații si corecții a ponderilor.
Fig 3.3 Structura unei rețele MLP
În figura 3.3 este ilustrată structura generală a unei rețele de tip MLP. Rețeaua MLP este o rețea de tip feed-forward, în care nu există legături laterale între neuronii aceluiași strat. Fiecare neuron este legat doar de cei din stratul anterior și cei din stratul ulterior. O astfel de arhitectura conține 3 tipuri de straturi:
Stratul de intrare: Acesta nu are rol în prelucrarea datelor ci doar în stabilirea legăturilor cu următoarele straturi a datelor de intrare. Este faza incipientă din rețea, prin care fiecărui element din vectorul de intrare îi sunt atribuite ponderile spre următorul strat. Acest strat are dimensiunea vectorului de intrare.
Stratul ascuns: Reprezintă cea mai importantă parte a unei rețele neuronale. Într-o rețea pot fi mai multe straturi ascunse, ceea ce duce la creșterea complexității funcției intrare-ieșire ce poate fi stabilită de rețea. Neuronii din straturile ascunse au rol de prelucrare a informației. Este important de notat faptul că nu există o regulă sau o formulă care să stabilească numărul exact de neuroni din fiecare strat ascuns. Alegerea acestui număr este o sarcină ce revine programatorului cu următoarele observații:
Alegerea unui număr prea mare de neuroni poate duce la fenomenul de supra-antrenare. Astfel, rețeaua ar oferi un răspuns bun doar pentru vectorii de antrenare, nefiind capabilă să generalizeze datele din aplicația respectivă ceea ce transformă întregul ansamblu în unul inutil.
Folosirea prea multor straturi ascunse duce la o creștere a volumului de calcul în mod exponențial ceea ce va încetini procesul de convergență
O regulă de bună practică este stabilirea unui număr de neuroni dintr-un strat ascuns care să se afle ca valoare între numărul unităților de intrare și numărul unităților de ieșire.
Stratul de ieșire: Conține ultimii neuroni din rețea responsabili cu funcția de prelucrare. În general, numărul acestor neuroni este dat de numărul de clase în care sunt împărțite datele. Daca problema este una de regresie, numărul neuronilor este cel al atributelor de la ieșire ce urmează a fi prezise
Pentru o astfel de rețea funcția cost urmărește același principiu ca și în cazul unui neuron singular. Este de la sine înțeles faptul ca această funcție va avea o formă cu atât mai complicată cu cât sunt folosite mai multe straturi ascunse. De asemenea, așa cum a fost menționat anterior, în funcție de aplicație se alege funcția cost eroare pătratică sau funcția cost entropie-încrucișată. Pentru funcția cost eroare pătratică medie pentru o rețea având un singur strat ascuns formula este:
, unde No=numărul neuronilor din stratul de ieșire, Ni=numărul de unități de intrare,Nh= numărul de neuroni din stratul ascuns.
Ca și în cazul neuronului singular, funcția cost este influențată de fiecare pondere în parte. Algoritmul de învățare folosind pentru o rețea neuronală se numește backpropagation și are la bază influența fiecărei ponderi asupra funcției cost. Pentru a determina schimbările ce se efectuează pentru fiecare pondere astfel încât funcția cost să ajungă într-un punct de minim global, se dorește aflarea exactă a influenței oricărei ponderi asupra acestei funcții. Mărimea care indică cât de influentă este o pondere în calculul final este derivata parțială a funcției cost în raport cu ponderea în cauză. Astfel, la fiecare pas al procesului de învățare ponderile sunt modificate astfel:
, unde =rata de învățare
Fig 3.4 Funcția eroare pătratică medie
În figura anterioară este prezentată o posibilă formă a unei funcții cost, pentru a putea fi prezentate câteva probleme ce pot apărea în procesul de învățare. Funcția cost poate avea o formă complexă, cu numeroase puncte de minim local și doar un punct de minim global. Acest aspect poate conduce la o un proces de convergență eronat al algoritmului de învățare. Astfel, rețeaua se poate opri din a învăța într-un punct de minim local, unde eroarea nu este minimă. De asemenea, există posibilitatea ca procesul de învățare să conveargă prea puternic, ceea ce ar duce la posibilitatea depășirii punctului de minim global și deci la un fenomen de neconvergență.
3.3 Deep learning. Rețele neuronale CNN
În multe aplicații folosirea unei rețele neuronale de tip MLP nu este optimă, deoarece volumul de calcul crește într-un ritm alert cu cât complexitatea rețelei este mai mare, iar performanțele nu mai pot fi îmbunătățite de la un anumit punct. Astfel, se preferă abordări de tip deep learning. Aceste rețele se bazează pe niște structuri adânci, cu un număr mare de straturi ascunse, fiecare strat fiind specializat. Spre exemplu, se poate face o discuție pentru aplicațiile care au ca scop procesarea imaginilor și detecția/clasificarea obiectelor din aceste imagini. Daca imaginile au dimensiuni de 40×40 pixeli se poate folosi o abordare clasică cu o rețea MLP, însă dacă imaginea are dimensiunea de 400×400 pixeli, atunci volumul de calcul crește enorm. De asemenea, ar fi nevoie de un număr mare de neuroni în straturile ascunse ca această rețea să dea rezultate. Drept rezultat, procesul de învățare ar putea dura chiar și zile întregi sau ar putea să nu conveargă deloc.
Pentru aplicațiile ce au ca scop procesarea de imagine s-au creat rețelele convoluționale (Convolutional Neural Networks). Aceste rețele folosesc filtre de dimensuni reduse (ex: 3×3,5×5,7×7), numite si kerneluri, ce au ca scop extragerea anumitor trăsături din fiecare imagine. Rețelele CNN au un număr ridicat de straturi pentru aplicații complexe, fiecare strat având un număr mic de parametri. Mai exact, parametri ce urmează a fi stabiliți prin algoritmul de învățare sunt elementele fiecărui kernel. Este important de notat faptul că pentru imagini complexe sau detecție multiplă de obiecte se poate folosi un număr mare de astfel de filtre.
Așadar, rețelele CNN rezolvă problema complexității și poate spori performanțele rețelelor în cazul în care datele de intrare sunt imagini. Un alt aspect important este faptul că procesul de extragere de trăsături revine în totalitate rețelei, astfel încât inginerul nu mai este nevoit să compuna arhitectura ținând cont de trăsăturile comune și diferite ale imaginilor din datele de antrenare. De asemenea, fiecare strat din rețea se va autospecializa în procesul de învățare. Pentru o explicație mai clară a acestei afirmații se poate face referire la o aplicație care are ca scop clasificarea semnelor ce circulație. Primul strat al rețelei ar putea avea rolul de a detecta margini, al doilea strat ar putea avea rolul de a detecta formele geometrice pe baza rezultatelor date de primul strat, al treilea strat ar putea avea ca scop detecția culorilor ș.a.m.d.
Fig 3.5 Acuratețe deep vs shallow learning
În figura 3.5 este reprezentată diferența de performanță între o rețea neuronla cu un singur strat și o rețea având 3 straturi. Nu se poate spune daca o rețea cu 3 straturi face parte din categoria deep learning întrucât nu există o graniță exact definită între rețelele clasice și rețelele deep learning. Din figură se poate observa ca numărul de parametri,deci lărgimea stratului ascuns al unei rețele poate crește foarte mult fără a mai ridica performanța rețelei. În cazul rețelei cu un singur strat ascuns se poate observa ca peste un anumit număr al parametrilor performanța chiar scade o dată cu creșterea, în continuare, a numărului de parametri. De asemenea, pentru același număr total de parametri, deci pentru mai puțini neuroni pentru fiecare strat ascuns, performanța în cazul rețelei cu 3 straturi este considerabil mai ridicată decât în cazul rețelei cu un singur strat.
3.3.1 Arhitectura unei rețele CNN
O rețea de tip CNN diferă total ca arhitectură față de o rețea clasică de tip MLP, nu doar prin numărul mai ridicat de straturi, ci și prin forma acestor straturi și rolurile fiecăruia. Dacă în contextul rețelelor clasice, toate straturile aveau aceeași structură, fiind formate dintr-un anumit număr de neuroni, în cazul rețelelor CNN fiecare strat are altă funcție. De asemenea, straturile nu sunt plasate aleator, ci trebuie respectată o ordine predefinită a acestora. Este important de observat faptul că straturile nu mai sunt formate din neuroni, ci din filtre.
O rețea CNN conține următoarele straturi principale:
Straturi convoluționale + Funcție de activare
Straturi cu funcție pooling
Straturi padding
Straturi flatten
Strat softmax
Fig 3.6 Structura unei rețele CNN
3.3.2 Stratul convoluțional și funcția de activare
Primul strat funcțional într-o rețea CNN este cel convoluțional. Acesta este compus dintr-un număr de filtre ales de utilizator cu scopul de a extrage trăsături din imaginile ce reprezintă datele de intrare. Numărul de dimensiuni ale unui kernel va fi același ca al imaginii de intrare. Daca imaginea de intrare este RGB, atunci kernel-ul poate avea forma 3x3x3. În figura următoare se ilustreaza funcționarea unui astfel de strat.
Fig 3.7 Funcționalitatea stratului de convoluție
Pornind de la imaginea (a), se observă că filtrul se suprapune peste prima porțiune din matricea imaginii, fiecare termen din porțiunea respectivă înmulțindu-se cu termenul asociat din kernel. Mai apoi, toate aceste rezultate se adună și astfel se obține rezultatul convoluției.
În imaginea (b), filtrul se deplasează la dreapta cu o unitate și aceeași operație este executată ca la pasul anterior. Pasul nu este fixat la o singură unitate, el fiind variabil. Dacă se dorește o filtrare detaliată a imaginii se va alege pasul de o unitate, însă timpul de prelucrare va crește. Daca se dorește o filtrare mai rapidă se poate mări pasul la mai multe unități.
După aplicarea unui strat convoluțional se folosește o funcție de prelucrare, cel mai des aceasta fiind ReLU (Rectified Liniar Unit).
Fig 3.8 Funcția de activare ReLU
În figura anterioară este ilustrată funcția de activare ReLU. Toate valorile mai mici ca 0 iau valoarea 0 iar valorile mai mari ca 0 își păstrează valoarea. Scopul folosirii acestei funcții este de a elimina componentele negative. Dupa cum se observă din prezentarea stratului convoluțional, după un proces de convoluție, valoarea rezultată poate fi mai mică decât 0, însă într-o imagine un astfel de pixel nu există.
3.3.3 Stratul de pooling
Fig 3.9 Funcționalitatea stratului de max-pooling
După etapa de convoluție se trece la extragerea celor mai importante trăsături din fiecare nouă imagine rezultată. Există mai multe metode de a face această operație, cea mai simplă este max-pooling. La fel ca și în cazul convoluției, se crează un filtru, de data acesta fără a avea componente. Acest filtru este un simplu șablon care se potrivește peste imaginea rezultată pentru a face o selecție de zonă. În cazul max-poolingului, din această zonă se extrage componenta maximă.
Pooling-ul este folosit pentru a reduce dimensiunea imaginii rezultate într-un mod mai rapid. Daca s-ar face doar operații de convoluție, atunci reducerea imaginilor și selecția de caracteristici ar fi foare lentă și ar crește complexitatea de calcul.
Există și varianta mean-poolingului prin care se face o mediere a tututor componentelor din zona delimitată de șablon. Șablonul, ca și în cazul kernel-ului de convoluție, se deplasează pe întreaga suprafață a imaginii cu un pas ce este definit de utilizator.
3.3.4 Straturile de padding
În unele cazuri kernel-ul ales poate să nu respecte în totalitate dimensiunile datelor de intrare, astfel încât poate fi nevoie de o adăugare de coloane și linii. Acest procedeu se numește padding și reprezintă mărirea matricilor de intrare cu coloane și linii cu valoarea 0 pentru toate elementele.
Fig 3.10 Funcționalitatea operației de padding
A fost menționat anterior faptul că prin convoluție se obține o reducere a dimensiunilor entității de intrare, ceea ce poate fi nefavorabil în unele cazuri în care elementele importante dintr-o imagine se află spre margini. Prin padding această problemă poate fi evitată întrucât imaginea se mărește artificial.
3.3.5 Straturi flatten și softmax
Aceste straturi reprezintă finalul unei arhitecturi a rețelelor CNN și au aceeași structura ca o rețea neuronală de tip FCN. Această parte din rețea este cea care efectuează operația de clasificare, toate celelalte straturi menționate în subcapitolele anterioare fiind însărcinate cu identificarea trăsăturilor.
Capitolul 4.Implementarea Hardware și Software
4.1 Implementarea Hardware
4.1.1 Raspberry Pi 3 Model B+
Raspberry Pi este cel mai popular Single-Board Computer, fiind perfect pentru un număr foarte mare de aplicații care necesită un consum mediu de memorie și operații relativ complexe. Această placă oferă avantajele unei viteze de procesare crescute și compatibilitatea cu numeroase dispozitive multimedia. De asemenea, poate fi montată și pe proiecte de mici dimeniuni, mobile, Raspberry Pi putând fi controlat de la distanță în timp real prin intermediul VNC.
Specificațiile Raspberry Pi 3 Model B+:
Specificațiile procesorului: Broadcom BCM2837B0 quad-core A53 (ARMv8) 64-bit, 1.4GHz
GPU: Broadcom Videocore-4
Memorie RAM: 1GB LPDDR2 SDRAM
Conectivitate:
Gigabit Ethernet prin USB 2.0. Viteză maximă de 300 Mbps
Conectivitate Wi-fi: 2.4GHz and 5GHz IEEE 802.11.b/g/n/ac wireless LAN, Bluetooth 4.2, BLE
4 porturi USB 2.0
HDMI
Port CSI pentru conectarea camerei Raspberry Pi
Port DSI pentru conectarea touchscreen-ului Raspberry Pi
Porturi audio stereo
Port GPIO (General Purpose I/O) cu 40 de pini
Încărcarea softului de operare: Se folosește un card SD de 32 Gb maximum
Alimentare: 5V/2.5A DC
Dimensiuni: 82mm x 56mm x 19.5mm
Masă: 50g
În ceea ce privește sistemul de operare, Raspberry Pi funcționează pe baza sistemului Raspbian, o variantă a sistemului de operare Debian, ce are la bază Linux. Astfel, există multiple limbaje de programare acceptate precum C++, Python,C,Java. Totuși, cel recomandat este Python, limbaj ce este folosit și pentru implementarea software a acestui proiect.
4.1.2 Macheta
Fig 4.3 Macheta robotului
Macheta robotului conține următoarele componente:
2 suporturi de plastic
4 motoare DC
4 roți cu diametrul de 20cm
4 înălțătoare
Șuruburi, piulițe și elemente de fixare
Motoarele DC funcționează la tensiuni între 4 și 6 V la un curent nominal de 100mA. În această aplicație, pentru buna funcționare se alege o tensiune stabilizată de 5V oferită de placa Raspberry Pi.
4.1.3 Alimentarea
Blocul de alimentare constă într-un ansamblu de 4 baterii Li-Ion și un convertor Buck ce are ca scop producerea unei tensiuni stabilizate de 5V.
Fig 4.4 Acumulatorii Li-Ion și modulul DC-DC Buck
Acumulatorii au un curent de descărcare de 3000 mAh și o tensiune maximă de 4.2V. Tensiunea nominală de folosire este de 3.6V, iar tensiunea minimă admisă este de 2.5V. Cu toate acestea, pentru a prelungi perioada de viață a acumulatorilor tensiunea nu va fi lăsată să scadă sub valoarea de 3.4, întrucât atunci încep să apară semne de încălzire locală iar alimentarea spre componente nu mai este optimă, astfel încât Raspberry Pi-ul va funcționa foarte lent, producându-se un fenoment de under-voltage.
Cei 4 acumulatori sunt montați pe 4 suporturi separate, legate în serie 2 câte 2. Astfel, primul ansamblu înseriat va alimenta convertorul Buck, urmând ca tensiunea stabilizată să fie folosită pentru alimentarea Raspberry-ului. Celealte 2 baterii înseriate sunt folosite pentru a alimenta driver-ul motoarelor, L298N, tensiune ce nu va fi stabilizată datorită plajei largi de valori permise de driver la alimentare.
Am ales acest tip de acumulator datorită raportului performanță- cost, precum și pentru faptul că permite detașarea ușoară de pe machetă și reîncărcarea separată a fiecărui acumulator. Din rezultatele experimentale a fost observat că acumulatorii, în funcționare continuă pentru sarcina maximă descresc de la valoarea de 4.2V la 3.4V în aproximativ 80 de minute, iar pentru o funcționare în care sarcina nu lucrează la capacitate maximă timpul de descărcare în același interval menționat anterior devine de 120 de minute. De asemenea, timpul de încărcare la curentul de 1 A, de la valoarea 3.4V la 4.2V este de aproximativ 90 de minute.
În ceea ce privește convertorul Buck, acesta are următoarele date de catalog:
Tensiune de intrare: 5-60V
Tensiune de ieșire: 1.25-26V
Curent maxim de ieșire: 3A
Eficiența: 92%
Frecvența de funcționare: 150KHz
Convertorul a fost reglat astfel încât la ieșire tensiunea oferită să fie de 5.04V, curentul fiind de 2.5 A. Din datele de catalog se observă ca acest convertor este potrivit pentru alimentarea Raspberry-ului.
4.1.4 Blocul de control al motoarelor
Pentru a putea controla atât turația, cât și direcția de de rotație a motoarelor DC trebuie integrat în proiect module driver pentru fiecare motor în parte. În acest proiect va fi folosit modulul L298N.
Fig 4.5 Driver motor L298N
L298N este un modul ce are integrate 2 drivere sub forma a două punți H. Folosind un singur driver se va face controlul celor 4 motoare astfel: Motoarele corespunzătoare roților de pe partea dreaptă vor folosi puntea 1, iar motoarele de pe partea stângă vor folosit puntea 2. Această implementare a fost gândită ținând cont de posibilitatea prelungirii timpului de descărcare a acumulatorilor, precum și din considerente de spațiu pe machetă. Roțile fiind conectate împreună, pentru fiecare parte, acestea vor acționa simultan. Nu este nevoie ca fiecare roată să acționeze independent, în unele cazuri fiind mai optimă conectarea grupată a acestora, întrucât este redusă eroarea de control.
Modulul L298 conține 6 pini de comandă: EN1, IN1, IN2, IN3, IN4, EN2. Pinii numiți EN(enable) se conecteză, la cerere, la pinii PWM de pe portul GPIO al Raspberry Pi. În acest proiect, pinii EN1 și EN2 vor lucra în scurcircuit deoarece nu se dorește controlul turației motorului. Pinii IN1, IN2, IN3, IN4 se pot conecta la orice pini de pe portul GPIO, funcționând doar în stările de HIGH și LOW.
Caracteristici de alimentare și electrice:
Tensiune de alimentare: 46V max
Tensiune de alimentare circuite logice: 7V max
Tensiune pini EN și IN: 7V max
Curent de ieșire: 2A max
Modulul L298N conține 3 pini pentru alimentare: Vss, GND și Vlogic. Vlogic reprezintă tensiunea de alimentare a circuitelor logice. În cazul în care tensiunea Vss este sub valoarea de 12 V, atunci nu este nevoie de alimentarea separată a circuitelor logice. În acest caz, se plasează jumperul de alimentare pe poziția sa iar pinul Vlogic devine o ieșire stabilizată de 5V. În implementarea curentă, acest pin nu este folosit.
Din punct de vedere al funcționării, pinii IN1, IN2 și IN3,IN4 trebuie sa se afle permanent în stări diferite. Dacă pinul IN1 este în starea HIGH, iar pinul IN2 este în starea LOW, atunci motorul se va deplasa în sensul invers al acelor de ceasornic, corespunzător cu direcția „înainte”. În caz contrar, motorul se va roti în sens invers. Analog pentru pinii 3 și 4.
4.1.5 Controlul distanței de deplasare și al virajelor
Pentru deplasarea optimă este necesar un dispozitiv capabil să monitorizeze numărul de rotații al unei roți. Prin procesarea acestui număr de rotații se poate crea o buclă de feedback prin care să se controleze motorul. Un astfel de dizpozitiv este modulul HC-020K ce joacă rol de encoder digital.
Fig 4.6 Encodere IR
Encoderul este format dintr-un senzor infraroșu în formă de U, integrat în structura modulului, și un disc cu orificii. Senzorul infraroșu conține un LED emițător și un receptor plasați în linie, pe pilonii diferiți ce formează U-ul. Atunci când raza se lovește de discul de carton este detectată prezența unui obiect și semnalul de ieșire va trece în starea HIGH, altfel,semnalul ramâne în starea LOW. Discul de carton se montează pe axul roții astfel încât sa poată fi monitorizat numărul de rotații al acesteia.
Modulul are 3 pini, 2 de alimentare(Vcc și GND) și unul de transmitere a semnalului de ieșire, fiind de tip one-wire. Alimentarea se face la 5V, tensiune ce trebuie să fie stabilizată. În implementarea curentă se folosește pinul de output 5V de pe portul GPIO pentru alimentarea modulului, iar pentru semnalul de ieșire al modulului se folosește orice pin GPIO.
4.1.6 Ansamblul de detecție a obiectelor din mediul înconjurător
Pentru a putea măsura distanțele spre obiectele din mediul înconjurător este nevoie de un ansamblu de senzori care să acopere toate unghiurile robotului. Această abordare ar fi fost scumpă și greu de implementat, astfel încât comunicarea tuturor senzorilor cu placa de bază nu ar fi putut fi facută simultan iar detecția ar fi fost supusă erorilor foarte mari date de geometria machetei și de punctul de poziționare al acestora.
În implementarea acestui proiect am ales o abordare care include un servomotor, un senzor de distanță infraroșu și o cameră Raspberry Pi V2. Fiecare din aceste componente va fi detaliată în subcapitolele următoare. Din punct de vedere constructiv, senzorul IR va fi atașat pe elicea sevomotorului, iar pe acest senzor se va atașa, într-un suport, camera Pi V2.
4.1.6.1 Servomotorul SG90 180
Fig 4.7 SG90 180 Servomotor
Servomotorul SG90 se comandă folosind un semnal PWM prin frecvență, mai exact prin factorul de umplere al acestuia. Astfel, nu există un anumit pas minim de rotație, finețea pasului fiind stabilită de utilizator cu o constrângere: performanța și stabilitatea servomotorului depind de masa pe care o transportă. Alimentarea servomotorului se face la 5V, tensiune provenită din pinul output 5V al plăcii Raspberry Pi.
Caracteristicile SG90:
Tensiunea de alimentare: 4.8-6V
Viteza de rotație: 0.1s/60 grade
Cuplu: 1.4kg/cm
Greutate: 9g
Cursă maximă: 0-180 grade
Din datele de catalog reiese că acest servomotor este sensibil doar la semnale ce au o perioada de 1-2 ms, deci un factor de umplere cuprins în intervalul 5-10%. Cu toate acestea, experimental s-a constata faptul ca pentru o cursă de 170 grade( cursa maximă posibilă experimental) este nevoie de un interval al factorului de umplere de 4-12%.
4.1.6.2 Senzorul de distanță infraroșu
Fig 4.9 Sharp IR senzor
Pentru acest proiect a fost ales senzorul IR Sharp 20-150 analogic, de înaltă precizie. Din punct de vedere funcțional și constructiv senzorul Sharp este format dintr-o emitor și un receptor. Emitorul este o diodă LED cu spectrul de emisie în infraroșu, iar receptorul este o fotodiodă. Atunci când emitorul are în cale un obiect, o parte din raza incidentă pe obiect este reflectată, iar în funcție de cantiatea de radiație receptată de receptor se stabilește distanța la care se află obiectul. Aceasă distanță se calculează software în funcție de tensiunea de ieșire analogică oferită de senzor. Alimentarea senzorului se face la 5V, valoare ce trebuie stabilizată și se va folosi pinul de output 5V de pe portul GPIO al Raspberry Pi.
Fig 4.10 Spectrul tensiunilor de ieșire în funcție de distanță
In figura este ilustrată caracteristica de funcționare a senzorului Sharp. Se observă că tensiunea de ieșire variază între 2.8 și 0.5 V pentru intervalul 20-150. Pentru intervalul 0-20 măsurătoarile nu se pot efectua, întrucât fiecare valoarea a tensiunii are un corespondent și în intervalul 20-150.
Deoarece senzorul IR Sharp oferă tensiuni analogice, iar placa Raspberry Pi nu are incorporat un convertor A/D și nici pini analogici, se va folosi un convertor cu o rezoluție de 10 biți MCP3008 produs de Microchip.
4.1.6.3 Camera Raspberry Pi V2
4.2 Implementarea software
Există 3 ramuri ale implementării software ce, concatenate, conduc la funcționarea proiectului. Prima ramură constă în algoritmul de evitare a obiectelor din jur fără a le plasa într-o hartă. De asemenea, această parte de algoritm conține toate funcțiile de mișcare și detecție senzorială a robotului. În această parte de cod sunt implementate software toate modulele detaliate în capitolul 4.1.
Cea de-a doua ramură constă în implementarea algoritmului EKF SLAM, algoritm descris în capitolul 2. În linii mari, algoritmul urmărește pașii expuși în capitolul menționat, de aceea nu va fi prezentat și în acest capitol.
În final, cea de a treia parte constă în implementarea algoritmului de rețele neuronale prin care se clasifică obiectele identificate pe traseul robotului.
4.2.1 Algoritmul de evitare obiecte și interfațarea modulelor
Pentru algoritmul de evitare a obiectelor se ține cont de dimensiunile robotului, acesta având aproximativ 20 x 20 cm. Folosind ansamblul senzor-servomotor-cameră se face o scanare a mediului înconjurător cu un pas de 18 grade ca mai apoi acestea să fie plasate într-o hartă virtuală,locală a robotului. Această hartă nu conține informații despre poziția curentă a robotului, ci procesează informația pentru o suprafață relativă la poziția sa.
Fig 4.13 Fragment de cod reprezentând clasa casuta
Clasa casuta creează un obiect intitulat casuta ce va fi caracterizat de coordonatele sale: xmin,xmax,ymin,ymax. Astfel, se creează un perimetru virtual. Funcția checkinside(self, coord_mas) are ca scop verificarea apartenenței la căsuța respectivă. Astfel, având un obiect cu coordonatele carteziene x și y, se verifică dacă aceste coordonate se încadrează în perimetrul casuței apelate.
Fig 4.14 Fragment de cod reprezntând clasa harta
Clasa hartă are ca scop constuirea unei hărți virtuale din căsuțele create folosind clasa descrisă anterior. Prin apelarea acestei clase se inițializează, de asemenea, un vector 1×28 în care toate elementele sunt 0. Funcția completare_harta(self,coord_mas) parcurge toate cele 28 de căsuțe existente (ce vor fi create în clasa descrisă în paragrafele ce urmează) și verifică în care din cele 28 de perimetre se încadrează coordonatele obiectului detectat. În cazul în care obiectul se regasește într-unul din perimetre, corespondentul căsuței respective din vectorul vector (având același index) va lua valoarea 1.
Funcția rearanjare transformă vectorul de forma 1×28 într-o matrice de forma 7×4 pentru o vizualizare mai bună a spațiului și o corelare mai ușoară cu mediul înconjurător
În continuare,în paragrafele următoare se va explicita clasa miscare_evitare_ekf
Fig 4.15 Fragment de cod reprezentând clasa miscare_evitare_ekf
La apelarea acestei clase se creează, de asemenea, câte o instanță pentru clasele hartă și căsuță. Funcția creare_patrate apelează clasa căsuță de 28 de ori pentru a crea perimetre ce au ca coordonate valori crescătoare cu 20 (valoare ce reprezintă cm) în intervalul (-70,70) pentru x și (0,80) pentru y. Prin crearea acestor pătrate se obține harta locală descrisă anterior. Funcția return_numar_ordine(param) are ca scop corelarea poziției unui element din hartă cu indexul din vectorul de căsuțe.
Fig 4.16 Fragment de cod reprezentând clasa miscare_evitare_ekf
Funcția senzor(self,vect) are ca scop interfațarea și controlul ansamblului servomotor-senzor-camera astfel: Se baleiază factorul de umplere de la valoarea 4 la valoarea 14 cu câte 1 unitate, comandând servomotorul în rotație cu pas de 18 grade. Pentru fiecare pas se citește tensiunea cuantizată de la ieșirea convertorului analogic/digital, această tensiune fiind transformată în distanță (linia 128). Apoi, se calculează coordonatele carteziene și rezultatul se transferă în harta creată la pasul anterior. De asemenea, în cazul în care coordonatele obiectului identificat din mediul înconjurător, relative la poziția robotului, se încadrează în limitele impuse în linia 138, atunci acestea se adaugă într-un vector ce se va folosi pentru algoritmul EKF ulterior și se face o poză folosind camera instalată pe senzor.
Funcția readadc(self,adcnum) are rolul interfațării convertorului A/D cu placa Raspberry Pi prin protocolul SPI.
Fig 4.17 Fragment de cod ce reprezintă funcția forward
Funcția forward(self,dist) are ca scop controlul motoarelor robotului cu ajutorul encoderelor astfel încât robotul să se deplaseze cu o eroare minimă pe distanța dorită. Din rezultatele experimentale reiese că pentru o rotație completă a roții robotului pe parchet este nevoie de 40 de tranziții 0/1 ale encoderului. Este important de știut că encoderul are o viteză foarte mare de detecție și transmisie, deci pentru o singură stare encoderul poate trimite foarte multe semnale,de aceea numărul lor este irelevant și contează doar tranzițiile. În liniile 146-149 se comandă toate cele 4 motoare înainte, iar în liniile 152-159 se numără tranzițiile emise de encodere.
Aceeași metolodogie se păstrează și pentru funcția de rotație, diferite fiind sensurile de rotație a celor 2 părți laterale ale robotului. Daca se dorește un viraj la stânga,roțile de pe partea stângă se vor roti „înapoi”, iar cele de pe partea dreaptă se vor roti „înainte”.
Fig 4.18 Fragment de cod ce reprezintă funcții de validare traseu
Funcția return_coord_punct(self,x) returnează coordonatele punctului în care robotul urmează să se deplaseze după procesul de identificare a obiectelor din jur. Funcția ecuatie_dreapta_unghiuri(self,b) stabilește unghiul si lungimea dreptei traseului de evitare al obiectelor. Funcția samples_dreapta() eșantionează dreapta de deplasare iar funcția validare_dreapta() preia aceste eșantioane și determina dacă în perimetrele de care aparțin aceste eșantioane se regasește unul din obiectele detectate. Daca toate perimetrele străbătute de dreapta de deplasare sunt libere, atunci robotul va putea efectua acest traseu pentru evitarea obstacolului întâlnit.
Fig 4.19 Fragment de cod ce reprezintă funcția de evitare obiecte
Funcția evitare_nord(self) se folosește pentru a apela toate instanțele create anterior și pentru a efectua efectiv pașii de evitare a obiectelor. În liniile 274-279 se verifică toate perimetrele situate în fața robotului, la 0 grade. În cazul în care se identifică un obiect se determină perimetrul corespunzător coordonatelor acestui obiect. În liniile 282-296 se reține valoarea aflată anterior și se verifică perimetrele de la dreapta și la stânga perimetrului ocupat, progresiv către margine. În cazul în care se va găsi un perimetru liber,primul găsit va reprezenta viitoarea poziție a robotului. În restul liniilor de cod se fac verificările menționate anterior și se returnează unghiul de rotație și distanța ce trebuie străbătută de robot.
4.2.2 Rețeaua neuronală CNN
Pentru creare și implementarea rețelei neuronale s-a folosit librăria specializată TensorFlow. Această librărie transformă o rețea neuronală într-un graf astfel încât utilizatorul nu mai este nevoit să implementeze funcțiile de procesare și calculare a rețelei, ci doar să definească parametri acesteia. Structura rețelei neuronale este prezentată în figura umătoare:
Fig 4.21 Fragment de cod rețeaua CNN
Funcția create_placeholders() are rolul de a inițializa nodurile din graful rețelei. Este identică cu o inițializare a unei variabile ce are ca scop stocarea unei matrici în C. Variabila X corespunde unei imagini de intrare, sau unui set de imagini, iar variabila Y corespunde ieșirii din rețea a acestor imagini. Funcția initialize_parameters() are ca scop inițializarea filtrelor de convoluție și a ponderilor din aceste kernel-uri folosind o inițializare Xavier. Funcția forward_propagation() reprezintă algoritmul de parcurgere a datelor de intrare prin rețea.
Fig 4.22 Fragment de cod rețeaua CNN
Funcția compute_cost() are ca scop calcularea funcției cost. Librăria python oferă funcții predefinite pentru acest calcul, fiind posibilă alegerea tipului de funcție cost. Deoarece această rețea rezolvă o problemă de clasificare se va folosi funcția entropie încrucișată. Termenul Logits reprezintă ieșirile reale din rețeaua neuronală, iar labels reprezintă ieșirile ideale, etichetele din lotul de antrenare.
Fig 4.23 Fragment de cod rețeaua CNN
Funcția model reprezintă centrul acestei implementări întrucât prin apelarea ei se face antrenarea rețelei și evaluarea lotului de test. Astfel, în liniile 96-117 se inițializează toate funcțiile menționate anterior. Deoarece TensorFlow nu rulează codul decât daca se deschide o sesiune acestea nu vor rula,ci doar se vor inițializa.
În liniile 121-144 se face antrenarea și calcularea costului propriu-zisă. Deoarece lotul de antrenare poate fi foarte mare se preferă o abordare în care se culeg loturi aleatoare din lotul de antrenare pentru învățare. Dacă lotul de antrenare ar fi abordat ca un tot unitar, atunci învățarea ar fi grea și ineficientă deoarece schimbările aduse ponderilor de către primele date de intrare vor deveni nesemnificative în timp, comparativ cu ultimele date procesate.
Fig 4.24 Fragment de cod rețea CNN
În liniile 163-180 se alege un lot aleator din setul de test,în cazul în care acesta este prea mare pentru a fi procesat ca un întreg. Acest lot de test este trecut prin rețea, apoi se stochează, într-un fișier CSV, indexii din lotul de test corespunzători pozelor ce au fost clasificare drept obiectul căutat. Specific in ce anexa se face prelucrarea finala
Capitolul 5. Rezultate experimentale
Rezultate experimentale-algoritm 2D EKF-SLAM
Implementarea algoritmului SLAM are la bază estimarea posibilelor erori ce pot apărea în procesele de deplasare și măsurare a robotului. Scopul folosirii acestui algoritm este de a facilita corecția poziției robotului și a obiectelor din mediul înconjurător.Pentru a putea modela aceste variabile aleatoare de zgomot au fost studiate cazuri particulare, pentru fiecare componentă din ansamblul robotului. Urmând o tehnică de tip trial and fail au fost obținute valori medii ale variabilelor de zgomot conform tabelului următor:
Din tabelul prezentat anterior se poate observa că eroarea în cazul rotației robotului poate fi foarte mare, întrucât calitatea motoarelor este scazută. În cazul unei erori mari,de tip spike,a carei probabilitate este de 1 la 10 rotații, robotul va avea nevoie de cateva cicluri de parcurgere a unei bucle pentru a-și corecta poziția prin observarea mediului înconjurător.
De asemenea, servomotorul prezintă o calitate scăzută,ceea ce duce la posibilitatea unor erori de până la 27.77%. Astfel,unele măsurători pot fi eronate și corecția este dată de poziția robotului. În cazul în care atât măsurătoarea cât și poziția robotului sunt eronate, singura metodă prin care se poate face corecția robotului este de a măsura un număr mare de obiecte și de a parcurge o distanță mare astfel încât erorile individuale sa devină nesemnificative.
Pentru a studia influența zgomotului asupra măsurătorilor și performanța robotului s-au luat în considerare un scenariu cu dimensiunea maximă a hărții de 100 elemente(numărul maxim de obiecte de pe hartă). În cazul în care acest numar este depășit, robotul va funcționa în continuare găsind corelații între măsurători și obiectele deja existente în hartă.
Redarea hărții
În figura de mai sus axele sunt reprezentate in centimetri.Punctele albastre reprezintă obiectele vizualizate de robot iar patratele roșii reprezintă locurile în care robotul s-a oprit pentru scanare.În această interpretare s-a folosit un prag de asociere între coordonate foarte „strâns”, astfel încât un obiect era asociat cu un altul deja existent în hartă daca distanța Mahalanobis nu depășea valoarea 2. În mod evident,acest prag este un hiper-parametru ce poate fi modificat astfel încât asocierile să fie mai bune sau mai slabe. Pentru o precizie mai bună, pentru fiecare iterație, distanța maximă între un obiect detectat și senzor a fost setată la valoarea 80. Peste această valoare senzorul induce erori din ce în ce mai mari. Se poate observa în figură că anumite zone sunt definite de o probabilitate mai mare de apariție a unui obiect,cum ar fi zona din jurul coordonatelor 190,20. Folosind un prag de corelație mai ridicat aceste obiecte vor fi contopite în unul singur.
Timpi de execuție:
Din tabelul anterior se observă că timpul de execuție crește rapid în funcție de dimensiunea hărții întrucât crește complexitatea calculului de găsire a asocierilor între obiecte.
Rezultate experimentale rețea neuronală CNN
Rețeaua neuronală implementată în această lucrare se bazează pe un set de antrenare propriu compus din 100 de poze. Rolul acesteia este de a clasifica jucarii de pluș în 3 clase: vacuțe,ursuleți și câini. De asemenea,se adaugă o clasă artificială de tip „fundal” pentru a reduce erorile. Pozele sunt de dimensiune 300×300 pixeli și sunt efectuate cu camera Raspberry Pi V2 folosind o rezoluție de 640×480. Pentru a obține imaginea de 300×300 se folosește funcția Resize din librăria OpenCV. Această dimensiune a fost aleasă întrucât este dimensiunea maximă ce poate fi procesata de placa de dezvoltare din considerende de utilizare a memoriei.
Pentru evaluarea rețelei neuronale s-au folosit setul de antrenare anterior menționat precum și setul de test compus din fotografiile făcute de robot în timpul parcurgerii traseului. Pentru o ușurare a complexității de calcul și o îmbunătățire a performanței, rețeaua se antreneaza folosind loturi de câte 20 de poze.Pentru a evalua performanța se folosesc 3 valori diferite ale ratei de învățare, știind că funcția cost variază dupa legea funcției entropie încrucișată și se selectează căteva poze aleatoare din lotul de antrenare pentru a crea un set de validare.
Scenariul 1: Rata de învățare=0.001
Scenariul 2:Rata de învățare=0.005
Scenariul 3: Rata de învățare=0.003
Din cele 3 figuri anterioare se poate observa ca cea mai bună rată de învățare este de 0.003. În primul caz rețeaua nu se antreneaza suficient,dar rezultatele pot fi considerate bune.În cel de-al doilea caz are loc supra-antrenarea rețelei, iar rezultatul oferit de lotul de test este foarte slab deoarece rețeaua raspunde doar la pozele din lotul de antrenare. În cel de-al 3-lea caz rețeaua ajunge într-un punct minim al funcției cost și este capabilă să generalizeze datele de intrare.
Rezultate experimentale ale performanței totale
În urma analizei asupra unor performanțe generale ale robotului, am constatat faptul că timpul maxim de funcționare poate fi aproximat la 5 ore, timp în care robotul nu va procesa continuu informație. Astfel, dupa acest tip limită un pas de scanare dintr-un ciclu de mișcare are un timp de execuție de 1-1.5 secunde, ceea ce duce la un timp total de deplasare de 12-15 secunde.
De asemenea, tensiunea unui acumulator dupa 5 ore scade de la 4.17 la 2.6 V ceea ce duce la posibilitatea distrugerii acumulatorilor. O posibilitate de a preveni un defect de o asemenea magnitude este implementarea unui circuit de decuplare folosind un comparator. Astfel, atunci cand tensiunea acumulatorului scade sub o anumită valoare (ex: 3.2), circuitul de decuplare va opri forțaț Raspberry Pi-ul.
În ceea ce privește testele asupra algoritmului de rețele neuronale, acestea au fost efectuate la o temperatură a camerei de 18 grade și la o temperatură de 30 de grade. În cazul temperaturii de 30 de grade, temperatura procesorului a atins 70 de grade, valoare apropiată de limita de 80 de grade impusă de producător. Totodată, atingând o temperatură înaltă, timpul de execuție a crescut cu aproximativ 40 secunde.
Concluzii
În urma finalizării acestui proiect se pot trage câteva concluzii referitoare la rezultatele experimentale și funcționarea robotului:
Rezultatele experimentale depind de numărul de iterații efectuate de robot în ceea ce privește măsurarea aceluiași obiect. La început, robotul va afișa erori semnificative asupra poziției obiectelor, oferindu-le acestora o poziție aproximativă. Daca robotul își va continua deplasarea și va scana aceleași obiecte, atât poziția robotului cât și a obiectelor vor fi mai precise.
Există un compromis între precizia robotului și viteza acestuia. Dacă se alege o corelare strânsă între obiectele de pe hartă, atunci poziția acestora nu va mai fi la fel de precisă, întrucât obiectele diferite, dar apropiate unele de celelalte, se vor influența reciproc și vor modifica și poziția robotului prin pasul de corecție. Pe de altă parte, dacă se alege o corelare strânsă între obiectele de pe hartă, pozițiile acestora vor fi mai precise, însă numărul de obiecte din hartă va crește, ceea ce conduce la o creștere a volumui de calcul și o scădere treptată a vitezei de procesare. O posibilă metodă prin care acest dezavantaj poate fi eliminat este implementarea unei funcții software astfel încât să se caute legătura între obiectele ce aparțin unei arii apropiate poziției curente a robotului, nu a tuturor obiectelor de pe hartă.
Algoritmul CNN funcționează acceptabil, având în vedere structura simplă a acestuia. Pentru a putea dezvolta un algoritm mai puternic este nevoie și de un sistem de calcul mai puternic.
Implementări viitoare
Pe viitor, acest proiect va fi readaptat cu un sistem de calcul mult mai puternic (Raspberry Pi 4) astfel încât algoritmul de detecție al imaginii va fi mult mai puternic și potrivit pentru imaginile cu o complexitate mare (cele făcute cu camera Raspberry Pi V2).
De asemenea, se dorește implementarea unor algoritmi de optimizare pentru algoritmul EKF-SLAM pentru a scădea volumul de calcul și a mări precizia de cartografiere.
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Introducere și motivație [305007] (ID: 305007)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
