Sunteți pe pagina 1din 75

1.

Utilizarea roboţilor mobili în industrie:

Roboţii mobili răspund la comenzi, detectează obiecte tridimensionale şi le localizează cu


ajutorul senzorilor.
Sistemele robotizate precedente erau restricţionate la o poziţie staţionară. Roboţii mobili reprezintă
următorul pas în dezvoltarea roboticii prin faptul că pot executa anumite sarcini ca şi predecesorii
lor staţionari, dar în plus ei işi pot schimba poziţia. Acest lucru reprezintă un avantaj în lucrul cu
numeroase sarcini.
Ca şi rezultat al faptului că robotul Sojourner a aterizat pe Marte cu sonada Pathfinder,
roboţii mobili au ajuns pe prima pagină în toate ziarele lumii. Mai mult de atât prin acest proiect
NASA a dovedit clar cât de important este sistemul de navigare pentru roboţii mobili. Faptul că
robotul s-a mişcat 10 cm din capsula lui spaţială a fost în sine un succes imens. Oricum roboţii
mobili sunt foarte folositori şi în alte domenii. Pot fi folosiţi pentru explorarea sistemelor de
canalizare, lumilor subacvatice şi a vulcanilor, cu alte cuvinte, explorarea mediilor greu accesibile
omului.

1.1 Arii de aplicaţie a roboţilor mobili:

Motivul care stă în spatele dezvoltării şi analizei roboţilor mobili se datorează în mare parte
necesităţii şi dorinţei de a utiliza roboţi care pot opera cu şi pentru oameni în simplificarea
sarcinilor zilnice: în birouri, spitale, muzee, biblioteci, supermarket-uri, complexe
sportive(îngrijirea gazonului), galerii, aeroporturi, gări, universităţi, şcoli şi eventual în domeniu
casnic.
Pentru oamenii cu dezabilităţi sau cei mai în vârstă un mijloc de transport înseamnă mai
multă libertate de mişcare şi independenţă. În acest domeniu posibilităţile de orientare, navigare ,
recunoastere şi evitarea autonomă de obstacole au foarte mare importanţă.
Centrul de cercetare automatică din Karlsruhe a dezvoltat un robot mobil de întreţinere
numit James. Precum semenii săi Stan şi Ollie, acesta poate primi comenzi de la o staţie centrală şi
le poate planifica şi executa autonom. Diferiţi senzori cum ar fi scanere cu laser, senzori acustici de
distanţă şi camere de luat vederi îi avnatajeză pe aceşti roboţi în a percepe mediul înconjurător şi a
putea reacţiona propice la oricie potenţial obstacol. Planificarea şi execuţia sarcinilor este facută
prin diferite carduri PC şi programe dezvoltate corespunzător. Roţile oferă roboţilor o largă gamă
de direcţii de mişcare.
De exemplu dacă unui robot de acest tip îi este specificat conturul unei cladiri el poate
executa recunoaşterea autonomă. Diferite arii de aplicaţie pot fi găsite în spitale sau hoteluri mari
unde roboţii pot fi folosiţi de exemplu, pentru transportul lenjeriei la spălătorie şi pentru livrarea
mâncării. Ei pot fi de asemenea folosiţi într-un mod foarte convenabil la spălarea autonomă a
podelelor.
Un alt domeniu în care sunt foarte des folosiţi roboţii mobili este acela al securităţii, de
exemplu ca şi gardieni în muzee. Sunt mici, rapizi, silenţioşi şi invizibili pe întuneric.

1
Echipaţi cu senzori de mişcare şi căldură ei sunt capabili să localizeze imediat vizitatorii
nedoriţi şi să declanşeze alarma.

1.1.2 Robotul ca ajutor casnic:

 Tokyo(AP) are o mobilitate mai mică în mişcări şi este mai încet, iar vocea este oarecum
monotonă, dar cu ajutorul telecomenzii poate fi determinat să deschidă o fereastră sau să aducă
ceva de băut.

 Robotul HRP este în prezent dezvoltat de un laborator de cercetare japonez şi posibil va


devenii un ajutor casnic de nădejde în câţiva ani.

 Roboţii numiţi Promet sunt dezvoltaţi de Institutul National de ştinţă şi tehnologie avansată. Ei
răspund la comenzi vocale, sunt capabili să detecteze obiecte tridimensionale şi să le localizeze
cu ajutorul senzorilor cu infraroşu. Isao Hara, şeful Institutului de Cercetare din Tsukuba,
referitor la roboţii metalici, a declarat că, în prezent lucrează la modul de colaborare al acestora
cu oamenii şi modul de integrare al acestora în societatea umană. Hara explică cum că aceşti
roboţi pot copia aproape orice mişcare umană, cu excepţia alergatului. Acesta ar cauza prea
mult zgomot şi ar solicita părţile metalice ale roboţilor prea mult. De aceea aceştia se mişcă
într-un ritm prestabilit. Mai mult de atât, roboţii trebuie să fie capabili să comunice cu oamenii,
să localizeze obiecte şi să acţioneze autonom.

Japonia este vazută ca cea care dă tonul în industria de roboţi. Companii cum ar fi: Sony,
Hitachy şi Honda au dezvoltat roboţi al căror scop primar este divertismentul. Dacă roboţii încetează
de a răspunde la comenzile umane, înseamnă că bateriile sunt terminate. Un asemenea caz l-a
reprezentat robotul Promet, care a încetat lucrul în mijlocul demonstraţiei şi a trebuit să fie
reîncărcat cu un dispozitiv special.

1.2 Sarcini în industrie:

Sisteme transporoare ghidate automat(AGV)

Aceste sisteme pot fi găsite într-un număr mare în uzinele de producţie şi în zonele cu risc
mare. Acestea sunt de fapt roboţi mobili ce sunt legaţi de
podea; cu alte cuvinte un sistem transportor fără conducător
ce se mişcă de-a lungul podelii. Liniile automate se derulează
de-a lungul unor rute liber definite în funcţie de sarcina ce
trebuie executată în cadrul fabricii. Diferenţierea este prin
urmare făcută între liniile prestabilite şi liniile transportoare
libere.
Sistemele transportoare ghidate automat sunt ideale
pentru încărcarea şi descărcarea liniilor de asamblare, Fig. 1 AGV pt. Incărcături mari

2
benzilor rulante de împachetare şi pentru configurarea dispozitivelor de asamblare ce sunt folosite în
liniile de asamblare şi echipament.
AGV-urile ajută la reducerea costurilor de fabricaţie şi cresc eficienţa acetui sistem. Acestea
pot remorca obiecte în mici remorci pe care şi le pot ataşa autonom. Aceste remorci pot fi folosite
pentru a muta materia primă pe linia de fabrciaţie pentru a fi prelucrată. AGV-urile pot transporta şi
obiecte pe o platformă, ele sunt plasate pe o serie de stive motorizate şi apoi date jos prin manevra
de inversare. Unele AGV-uri folosesc furci ridicătoare pentru a depozita materia primă.
Un AGV se mai poate numi şi un LGV(Laser Guided Vehicle- Vehicul Ghidat Laser) sau
SGV(Self Guided Vehicle-Vehicul Auto Ghidat).
Primul AGV a fost introdus pe piaţă în anii 1950 de Barrett Electronics of Northbrok Illinois şi
la acel moment era un simplu vehicul de remorcare ce se deplasa de-a lungul unui fir ataşat pe podea
în locul unei şine. De-a lungul anilor tehnologia a devenit mai sofisticată, iar în ziua de astăzi
vehiculele automate sunt în principal dirijate de laser(LGV). Într-un proces automat, LGV-urile sunt
programate să comunice cu alţi roboţi pentru a asigura că produsul este mutat fără probleme prin
depozit, fie că este depozitat pentru a putea fi folosit în viitor, fie că este trimis către zonele de
transport. În ziua de astăzi LGV-ul joacă un rol important în designul noilor fabrici şi depozite având
grijă ca bunurile să ajungă la destinaţia corectă.

1.2.1 Linii flexibile de fabricaţie:

Pentru a putea înţelege cum funcţionează AGV-urile este absolut necesar să se înţeleagă bazele
liniilor flexibile de fabricaţie(FMS). FMS-urile sunt o metodă care ajută la fabricarea unui produs.
FMS este mai degrabă o filozofie decât un obiect palpabil. Acestea reprezintă ideea că mai repede e
mai bine şi se folosesc de maşinării pentru a fabrica
diverse produse. În loc de a folosi oameni pentru sarcinile
repetitive este folosită o maşinărie ce face respectivele
sarcini 24 ore pe zi.
FMS foloseşte maşini controlate numeric(CNC)
pentru a forma o celulă de lucru. Fiecare celulă execută o
sarcină specifică ce ajută la fabricarea produsului. Deşi
FMS este rapidă şi eficientă nu este deloc ieftină, având în
vedere faptul că necesită multe maşinării scumpe pentru a
putea funcţiona. În mod normal costul introducerii unei
FMS într-o fabrică poate atinge milioane de dolari. În loc Fig. 2 AGV pt. asamblare
să folosească FMS complete, majoritatea companiilor
folosesc doar anumite părţi ale acesteia numite celule flexibile de fabricaţie. Acestea sunt folosite în
producerea anumitor părţi ale produsului final, iar pentru producerea celorlalte părţi se folosesc alte
metode. Deseori unul sau mai multe AGV-uri sunt folosite în aceste linii de fabricaţie pentru a
conecta diferite celule de lucru.

1.2.2 Navigarea:

3
AGV-urile sunt folosite în liniile de fabricaţie pentru a transporta un obiect din punctul A în
punctul B, acestea navighează printre zonele de fabricaţie cu ajutorul unor senzori. În general sunt
doi senzori principali pe care AGV-urile le folosesc pentru navigare: un senzor wireless şi un senzor
cu fir.
a) Senzorul cu fir:
Acesta este plasat în partea inferioară a robotului şi este orientat spre podea. O deschizătură
este făcută pe podea şi un fir este introdus la aproximativ 2,5 cm sub podea, senzorul detectează
frecvenţa radio ce este transmisă prin fir şi o urmăreşte.

b) Banda de ghidare:
Foarte multe AGV-uri de dimensiuni mai reduse(unele dintre ele fiind cunoscute sub numele
de Carturi Ghidate Automat-AGC) folosesc ca şi sistem de ghidare benzile, acestea pot fi de două
tipuri: magnetice sau colorate. AGC-ul este dotat cu un senzor de ghidare potrivit pentru a urmării
banda respectivă. Principalul avantaj pe care îl are banda asupra ghidării cu fir este acela că poate fi
uşor scoasă şi replasată dacă este nevoie de o schimbare de rută. De asemenea nu implică nici tăierea
podelei pentru a putea trasa toate rutele. Implicit aceasta este considerată ca un sistem pasiv,
deoarece nu necesită să fie alimentată electric ca şi în cazul firului.
Banda colorată este mult mai ieftină, dar are dezavantajul de a se murdări sau de a se deteriora
mult mai uşor în zonele cu un trafic intens şi prin urmare devine inutilizabilă.

c) Navigarea cu ajutorul laserului:


Navigarea wireless se face cu ajutorul benzilor reflectoare ce sunt montate pe pereţi, stâlpi sau
maşinării. AGV-ul este dotat cu un emitor-receptor laser pe turela rotativă. Raza laser este emisă şi
apoi recepţionată, iar unghiul şi câteodată distanţa sunt automat calculate şi stocate în memoria
AGV-lui. AGV-ul are o hartă reflectoare în memorie şi îşi poate coreta poziţia ţinând cont de
diferenţele dintre măsurătorile făcute de el şi cele care sunt implementate, prin urmare el poate
naviga la destinaţia dorită reînoindu-şi în permanenţă poziţia.

 Laser modular- folosirea razelor de laser modular oferă o precizie mai mare şi o gamă mai largă
decât sistemele cu laser pulsat. Emiţând continuu un faşcicul de raze modulate, sistemul poate
obţine o reflexie neîntreruptă imediat ce scanerul ajunge raza de acţiunie a reflectorului.
Reflecţia se opreşte exact la marginea obiectului refractant ceea ce oferă o masură precisă şi
constantă a fiecărui obiect refractant pentru fiecare scaner. Scanerul LS9 este fabricat de
Guidance Navigation Ltd. şi foloseşte laserul modular, acest sistem atinge o rezoluţie unghiulară
de aproximativ 0.1 mrad, adică 0.006 grade la 8 revoluţii/s ale scanerului.
 Laser pulsat- un scaner tipic cu laser pulsat emite o rază de lumină cu frecvenţa de
14400 Hz ceea ce oferă o posibilă rezoluţie maximă de aproximativ de 3.5 mrad adică 0.2 grade
la 8 rezoluţii ale scanerului pe secundă. Pentru a putea face posibilă navigarea, datele primite
trebuie să fie interpolate pe baza intensităţii razei de laser reflectate pentru a identifica centrul
obiectului ce reflectă raza.

d) Navigarea giroscopică:

4
O altă formă de ghidare a AGV-lor este navigarea prin inerţie. Prin acest tip de navigare un
sistem controlat de computer direcţionează şi stabileşte sarcinile vehiculelor. Emiţătorii sunt
poziţionaţi pe podeaua spaţiului de lucru. AGV-urile folosesc aceşti emiţători pentru a verifica
corectitudinea rutei. Un giroscop este capabil să detecteze şi cea mai mică schimbare de direcţie a
vehicului şi îl corectează pentru ca AGV-ul să îşi păstreze ruta corectă. Marja de eroare a acestei
metode este de aproximativ un inch. Acest tip de navigare poate fi folosit în aproape orice mediu
inclusiv pe culoare înguste sau temperaturi extreme şi are o durată de viaţă mai lungă decât celelalte
sisteme de navigare.

e) Sisteme de navigare naturale:

Navigarea fără modificarea spaţiului de lucru


este numită navigare prin metode naturale. Una dintre
metode foloseşte unul sau mai mulţi senzori de poziţie
cum ar fi un laser de poziţie precum şi giroscopuri
şi/sau unităţi de măsură inerţiale cu tehnici de
localizare Monte Carlo/Markov pentru a şti cât mai
bine poziţia şi a putea calcula cea mai scurtă rută până
la destinaţie. Avantajul unui astfel de sistem este
Fig. 3 AGV cu ghidare naturală
flexibilitatea ridicată şi faptul că un eşec nu opreşte
toate secţiile de fabricaţie din moment ce AGV-urile îşi pot planifica rutele ocolind dispozitivul
defect.

1.2.3 Controlul direcţiei:

Pentru a ajuta un AGV să navigheze se folosesc două sisteme diferite de control al direcţiei.
Controlul de viteză diferenţial este cel mai des întâlnit. Prin această metodă sunt controlate două
seturi de roţi, fiecare set în parte este conectat la un vehicul conducător. Aceste vehicule circulă la
viteze diferite pentru a-şi crea loc de întoarcere sau circulă cu aceeaşi viteză pentru a permite AGV-
lui să se deplaseze înainte sau înapoi. AGV-ul se întoarce asemănător unui tanc. Această metodă de
control al direcţiei este bună deoarece este uşor de manevrat în spaţiile mici. De multe ori acest lucru
este observat la un AGV folosit pentru transport în spaţii înguste sau la unul ce lucrează la mai multe
maşinării. Această poziţionare a roţilor nu este folosită în cadrul aplicaţiilor de tractare deoarece
AGV-ul ar provoca o răsturnare a remorcii în momentul întoarcerii.
Celălalt mod de schimbare al direcţiei este controlul direcţie roţilor AGV-lui. Această metodă
este similară cu aceea folosită pentru roţile maşinilor. Este mult mai precisă în folosirea firului decât
metoda diferenţială de controlare a vitezei. Acest tip de AGV are o întoarcere mult mai lină, dar nu
poate face întoarceri în unghi mic în locurile înguste. Metoda controlului roţilor unui AGV pote fi
folosită în toate aplicaţiile, spre deosebire de controloul diferenţial. Poate fi folosit în aplicaţiile de
tractare şi poate avea din când în când un operator care să-l controleze.

1.2.4 Alegerea rutei:

5
AGV-urile trebuie să ia decizii în ceea ce priveşte selecţia rutei. Acest lucru se face prin
diferite metode: modul de selectare a frecvenţei(doar navigarea cu fir), modul de selectare a
rutei(doar navigarea wireless) sau printr-o bandă magnetică aflată pe podea ce este folosită nu doar
pentru a ghida AGV-urile, dar şi pentru a da comenzi pentru viteză şi direcţie.

● Modul de selectare a frecvenţei:


Acest mod îşi bazează deciziile pe frecvenţele ce sunt emise de la nivelul podelei. Când AGV-
ul se apropie de un nod în fir acesta detectează două frecvenţe şi cu ajutorul unei tabele stocate în
memorie decide calea cea mai bună. Diferitele frecvenţe sunt necesare doar la un punct de decizie
pentru AGV. Frecvenţele se pot schimbă înapoi la un singur set de semnale după acest punct.
Această metodă nu este uşor de răspândit şi necesită mai mulţi bani.

● Modul de selectare a rutei:


Un AGV ce foloseşte acest mod de selectare a rutei îşi bazează deciziile pe nişte rute
preprogramate. Foloseşte măsurătorile făcute de diferiţi senzori şi le compară cu valorile inserate de
programatori. Când un AGV se apropie de punctul de decizie trebuie să se decidă doar între a urma
căile 1,2,3, etc. . Această decizie este destul de simplă având în vedere că îi sunt cunoscute căile
programate. Această metodă poate să crească costul unui AGV deoarece acesta necesită o echipă de
programatori pentru a-l programa, să ţină cont de căile curente şi să schimbe ruta atunci când este
necesar. Această metodă este uşor de setat şi de modificat.

● Modul ce foloseşte banda magnetică:


Banda magnetică este aşezată pe suprafaţa podelei sau introdusă într-un canal de 10mm.
Aceasta nu numai că oferă AGV-ului direcţia ce trebuie să o urmeze dar şi diferite linii al benzii în
diferite combinaţii, înformează AGV-ul când să schimbe linia, când să accelereze, să încetinească
sau când să se oprească folosind diferite combinaţii între N şi S magnetic. Această metodă este
folosită de TOYOTA USA şi TOYOTA JAPAN.

1.2.5 Controlul traficului:

Sistemele de fabricaţie flexibile conţin cel puţin un AGV şi de aceea necesită un control al
traficului pentru ca acestea să nu intre în coliziune. Diferite metode includ controlul zonelor,
controlul înaintării şi controlul mixt. Fiecare metodă are avantajele şi dezavantajele sale.

● Controlul zonelor:
Această metodă este preferată în majoritatea mediilor, deoarece este uşor de instalat şi de
extins. Controlul zonelor se face prin folosirea unui transmiţător wireless ce emite un semnal într-o
arie fixă. Fiecare AGV conţine un dispozitiv cu senzori ce recepţionează acest semnal şi îl transmit
înapoi transmiţătorului. Dacă aria este liberă semnalul este setat la „CLEAR”, permiţând AGV-ului
să între şi să traverseze zona. Dacă un AGV se află în zona respectivă este transmis un semnal
„STOP” şi toate AGV-le ce încercau să intre în zona respectivă se opresc şi îşi aşteaptă rândul.
Imediat ce AGV-ul aflat în zonă a ieşit semnalul „CLEAR” este transmis unuia din AGV-ul ce

6
aşteaptă. O altă cale de a seta această metodă de control al traficului este de a echipa fiecare robot în
parte cu propriul dispozitiv transmiţător-receptor. Fiecare AGV transmite propiul mesaj „DO NOT
ENTER” către restul AGV-lor ce se apropie de zona ce vor să o traverseze. Dezavantajul este că
dacă se defectează ceva într-o anumită zonă există riscul ca toate AGV-urile să intre în coliziune.
Această metodă reprezintă o cale ieftină de a controla AGV-urile într-o anumită zonă.

● Controlul înaintării:
Pentru această metodă se folosesc senzori de evitare a coleziunii pentru a nu se provoca
accidente între două sau mai multe AGV-uri din zonă. Aceşti senzori includ senzori sonici, ce
funcţionează precum un radar; senzori optici ce folosesc senzorii cu infraroşu; senzori de coliziune,
senzori de contact fizic. Majoritatea AGV-lor sunt echipate cu un senzor de coliziune asemănător
unui sistem de siguranţă. Senzorii sonici emit un semnal de înaltă frecvenţă şi apoi aşteaptă un
răspuns. AGV-ul poate determina dacă un obiect se află înaintea sa şi poate face manevrele necesare
pentru a evita coliziunea. Senzorii optici folosesc un transmiţător-receptor pe bază de infraroşu. Pe
acelaşi concept similar funcţionează şi senzorii sonici. Dezavantajul folosirii acestor senzori este că
ei pot proteja AGV-ul de coliziuni într-un număr limitat de direcţii. Sunt relativ destul de greu de
instalat şi manevrat.

● Controlul mixt:
Acest tip de control foloseşte senzori de evitare al coleziunii precum şi metoda de control a
zonelor. Combinaţia dintre aceste două metode previne coliziunile în orice situaţie. Metoda de
control a zonelor este folosită împreună cu metoda de evitare a coleziunii ca un sistem de siguranţă.
De exemplu, dacă sistemul de control al zonei nu funcţionează sistemul de evitare al coliziunii
previne accidentele între AGV-uri.

1.2.5 Managementul sitemelor:

Industria AGV-lor trebuie să aibă un anumit control asupra acestora. Sunt trei metode
principale de control al AGV-lor: panouri de localizare, display CRT şi centru de logare şi raport.
Panoul de localizare este un panou simplu folosit pentru a identifica zona în care se află AGV-
ul. Dacă robotul se află într-o zonă de prea mult timp poate însemna fie că este blocat fie că este
defect.
Displayul CRT arată în timp real unde se află fiecare vehicul. De asemenea arată statusul
AGV-lui, tensiunea bateriei şi poate arăta şi punctele de blocaj.
Centrul de logare este folosit pentru un istoric al AGV-lor în sistem. Acesta stochează toate
datele legate de aceste vehicule, iar acestea pot fi listate pentru a oferi un suport tehnic sau verificate
prin logare.
AGV-ul este un sistem folosit în FMS pentru a transporta şi conecta mai multe subsisteme într-
o unitate mai mare de producţie. Aceşti roboţi necesită foarte multă tehnologie pentru asigurarea
evitării accidentelor şi ajungerea la destinaţie. Încărcarea şi transportarea materialelor reprezintă
principala sarcină a acestora. Folosirea AGV-urile necesită o suma considerabilă de bani dar aceştia
îşi fac treaba cu eficienţă maximă. În locuri precum Japonia automatizarea a crescut şi se consideră a

7
fi de două ori mai eficientă decât în fabricile din America. Costul foarte mare iniţial este amortizat în
timp.

1.2.6 Tipuri de vehicule:

● Vehicule de remorcare AGVS: au fost primele tipuri introduse pe piaţă şi sunt încă foarte
populare şi astăzi. Acestea pot tracta o multitudine de tipuri de remorci şi au capacităţi cuprinse între
4 şi 30 t.
● Vehicule de încărcare AGVS: sunt echipate cu platforme ce permit transportul încărcăturii şi
uneori şi transferul automat al acesteia. Platformele pot fi de tipuri ridicare-coborâre, role alimentate
sau nealimentate pe bază de lanţ sau curele. Există şi
platforme cu mai multe compartimente.
● Remorci tip paletă AGVS: sunt destinate
transportului încărcăturilor aplatizate către diferite
nivele.
● Remorci tip furcă AGVS: au posibilitatea de a
muta încărcături atât la nivelul podelei şi la nivelele
superioare. În unele cazuri aceste vehicule pot depozita
şi pe rafturi.
● AGV pentru încărcături uşoare: sunt vehicule cu
Fig. 4 AGV tip paletă
o capacitate de transport de aproximativ 250 kg sau mai
puţin şi sunt folosite pentru a transporta încărcături mici
printr-o fabrică de industrie uşoară. Sunt folosite în zone cu suprafeţe mici.
● Vehicule pentru linia de asamblare AGVS: sunt o adaptare a AGVS-ului pentru sarcini
uşoare în aplicaţiile ce necesită procese de asamblare în serie.

1.2.7 Încărcarea bateriilor:

Pentru încărcarea bateriilor există mai multe opţiuni, acestea depind de preferinţele
utilizatorului. Cele mai des întâlnite sunt: schimbarea
bateriei manual, încărcarea automatizată/ocazională şi
schimbarea bateriei automat.

● Schimbarea bateriei manual:

Această tehnologie necesită un operator care să


înlăture manual bateria descărcată şi să pună în locul
acesteia o baterie încărcată. Pentru a face această Fig. 5 Schimbarea baterie
operaţiune sunt necesare între 5 şi 10 min.

● Încărcarea automatizată/ocazională:

Această metodă permite continuarea operaţiunilor AGV-lor. În medie un AGV se încarcă timp
de 12 min la fiecare oră de funcţionare fără a necesita o intervenţie manuală. Dacă este folosită
8
încărcarea ocazională, AGV-ul va recepţiona o sarcină electrică oricând se iveşte ocazia. Când setul
de baterie ajunge la un nivel predeterminat, AGV-ul îşi termină sarcina curentă înainte de a merge la
staţia de încărcare.

● Schimbarea automată a bateriei:

Aceasta reprezintă o alternativă pentru


schimbarea manuală a bateriei. Necesită o maşinărie
automată adiţională şi un încărcător de baterii
automat. AGV-urile vor merge la staţia de încărcare
a bateriei pentru înlocuirea automată a acestora.
Încărcătorul automat plasează bateriile descărcate
într-un slot pentru reîncărcarea automată a acestora.
Se ţine cont de bateriile aflate în sistemul de
încărcare, iar încărcătorul le extrage atunci cand sunt Fig.6 Incărcare automată
încărcate la maxim.

2. Robotino - descriere generală

2.1 Caracteristici generale:

Robotino este un sistem robotic mobil modern de înaltă calitate. Trei roţi omnidirecţionale îi
permit să se deplaseze în toate direcţiile din plan şi rotire pe propria axă. Alegerea roţilor
omnidirecţionale permit reducerea forţelor de contact în timpul deplasărilor complexe. Robotino este
autonom, cu o mulţime de senzori, webcam şi o unitate de comandă puternică, oferă sistemului
inteligenţa necesară pentru a rezolva de maniera autonomă problemele ce îi sunt date.
Accesul la unitatea de comandă se poate face fie prin conectarea unui ecran şi a unei tastaturi
direct pe robot, fie preluând controlul de la distanţă via unei conexiuni prin reţea.
Adăugarea de senzori sau acţionări suplimentare pot fi luate în vedere datorită interfaţei de
intrare-ieşire.
Robotul dispune de un soclu pentru a fi pus în cazul în care nu este folosit sau când se
încarcă. Acest soclu este făcut astfel încât pentru a putea fi verificată funcţionarea senzorilor şi a
acţionărilor fără risc de coliziune. De fapt roţile rămân libere şi nu intră în contact cu solul.

9
Fig1. Robotino

2.2 Descrierea modulelor:

●Şasiu:

Şasiul este o platformă de oţel sudat cu laserul. Acumulatorii, unitatea de deplasare şi


webcam-ul sunt fixate pe şasiu cât şi senzori de măsurare a distanţei şi anticoliziune. Şasiul oferă
spaţiul suplimentar pentru adăugarea eventuală a altor senzori şi/sau acţionări.
Deplasarea manuală a lui Robotino se face cu ajutorul mânerelor de transportare(1) din fig.2.

10
Fig. 2 Mânere de transport

● Unitatea de deplasare:

Robotul este dotat cu 3 unitaţi de deplasare, implementate cu 120 o una faţă de cealălaltă
asupra şasiului circular, ceea ce îi permite deplasarea pe 3 axe(3 grade de libertate):
 Deplasare pe axa longitudinală;
 Deplasare pe axa laterală;
 Deplasare pe serpetină.
Viteza reală a motorului poate fi comparată cu viteza dorită datorită codificatorului
incremental şi poate fi reglată cu un controler PID. Deplasarea robotului se face cu ajutorul
sistemului de reglaj în paralel cu cele 3 unităţi.

Fig. 3 Roţile omnidirecţionale

● Webcam:

Robotino este echipat cu un webcam, unde înălţimea şi înclinarea se pot ajusta. Webcam-ul
este conectat la unitatea centrală printr-o conexiune USB1. Este posibilă efectuarea tratamentelor de
imagine în diferite scopuri, de exemplu urmărirea unui obiect sau reglajul vizual.

11
(4) Controler (5)Webcam

● Controler:

Controlerul este construit din următoarele componente:


- un procesor 300Mhz, compatibil cu Linux şi 128MB SDRAM;
- un card de memorie compact flash 256MB;
- o placă Ethernet;
- un modul wi-fi;
- 2 porturi USB1;
- un port VGA.
Diferitele elemente ajută la conexiunea unui PC, o tastatură şi un ecran.

● Circuitul de intrare-ieşire:

Circuitul de intrare-ieşire stabileşte comunicarea dintre controler şi senzori, unitatea de


deplasare şi interfaţa intrare-ieşire.

● Alimentarea:

Puterea este furnizată de 2 acumulatori reîncărcabili de 12V care debitează un curent


maximal de 4Ah. Cei doi acumulatori sunt montaţi pe şasiu. Mai sunt disponibili 2 acumulatori
suplimentari şi un încărcător care permite încărcarea celor doi acumulatori, în timp ce ceilalţi sunt la
încărcat.

● Senzorii infraroşu:

12
Robotino este echipat cu 9 senzori infraroşu pentru măsurarea distanţei care sunt montaţi pe
periferia şasiului circular cu un unghi de 40 o unul faţă de celălalt. Robotino poate detecta toate
obiectele din împrejur dacă înălţimea lor o permite. Fiecare senzor poate fi interogat individual
pentru a evita un obstacol sau de a menţine o distanţă în raport cu un obiect. Senzorii sunt capabili
de a măsura distanţa incepând cu 4 până la 30 de centimetri. Fiecare senzor este conectat la
alimentare şi posedă o ieşire analogică.

● Senzor anticoliziune:

Senzorul anticoliziune este situat pe circumferinţa şasiului, cea mai mică presiune asupra
senzorului crează un scurt circuit între două suprafeţe şi un semnal este trimis la controler. Deci, o
oprire de urgenţă a motoarelor poate fi programată în timpul unei coliziuni.

Fig. 4 Dispunerea senzorilor infraroşu(IR) ale motoarelor(M)


şi senzorul anticoliziune

● Codificator incremental:

Un codificator incremental este implementat pe fiecare motor, fiecare codificator returnează o


informaţie aupra poziţiei unghiulare a arborelui. Plecând de aici, este posibil deducerea vitezei reale
a motorului în ROT/MIN. Dacă această viteză derivează de la valoarea înregistrată, ea poate fi
reglată cu un regulator PID ai cărui parametri sunt ajustabili.

● Interfaţa intrare/ieşire:
Interfaţa I/O permite conectarea senzorilor şi/sau a acţionărilor şi/sau LED-uri:
- 8 intrări analogice (0 la 10V)(AIN0 la AIN7);
- 8 intrări numerice (DI0 la DI7);
- 8 ieşiri numerice(DO0 la DO7);
- 2 relee pentru acţionări suplimentare(REL0 şi REL1).

13
Fig. 5 Interfaţa I/O a Robotului

● Tastatură şi afişaj:

O tastatură şi un afişaj sunt instalate deasupra unităţi centrale şi permit selecţionarea


opţiunilor, afişarea informaţiilor sau lansarea în execuţie a programelor din memorie.

2.3 Punerea în funcţiune:

● Aprinderea lui Robotino:

Pentru aceasta, apăsaţi butonul ON/OFF până când LED-ul verde se aprinde. În timpul
pornirii, două liniuţe apar pe ecran, apoi când robotul este pregătit(după aproximativ 30s) adresa IP
se afişează(ex. 172.263.1.118) şi stadiul acumulatorilor.

● Oprire Robotino:

Se menţine apăsat butonul ON/OFF până când LED-ul verde se stinge, permiţând stingerea
robotului.

● Meniul principal:

Navigarea în diferitele meniuri se efectuează cu tastele (▲▼) şi selectarea se face cu tasta


ENTER. Sunt posibile următoarele opţiuni:
- Limba: este posibilă setarea limbii engleză şi germană;
- State of charge(Stadiul de încărcare): Această opţiune informează stadiul real al încărcării
acumulatorilor: tensiune şi curent;
- Demo: Lansarea programului de demonstraţie se face apăsând tasta ENTER. Iniţial, 6
programe demonstrative sunt salvate în robot(Circle, Forward, Quadrangle, Roaming, Follow line).
Pentru a opri programul, apăsaţi scurt pe orice tastă sau pe senzorul de anticoliziune.
- Reţea: Această opţiune afişează adresa IP a robotului şi permite schimbarea acesteia. Mişcaţi
cursorul spre dreapta apăsând pe tasta ENTER. Măriţi valoarea cursorului sau micşoraţi cu săgeţile
SUS şi JOS până la valoarea dorită.

14
2.4 Software-ul Robotino View:

RobotinoView este un software de programare grafică sub Windows pentru Robotino. Acest
software permite crearea şi execuţia programelor de comandă pentru Robotino şi de asemenea oferă
posibilitatea de a avea o succesiune de programe.

● Familiarizarea cu spaţiul de lucru:

Software-ul execută sub un sistem de exploatare Windows unde ecranul este descris prin fig.
6.

Fig. 6 Ecranul principal


RobotinoView

1) Bara de unelte: Permite crearea, deschiderea şi salvarea programelor. Această bară de


unelte permite de asemenea lansarea, punere pe pauză sau oprirea execuţiei unui program. Un dublu
click pe butonul de oprire opreşte toate programele active.
2) Câmp de intrare a adresei IP a Robotului;
3) Buton de conexiune care stabileşte sau opreşte conexiunea cu robotul;
4) Afişajul bibliotecii cu toate blocurile funcţionale;
5) Afişarea performanţelor în timpul controlului de la distanţă a robotului de către
program;

15
6) Un dublu click pe un bloc de funcţii permite afişarea parametrilor interni în această
zonă;
7) O bară de stadiu ce prezintă diferite informaţii;
8) Zona ce afişeajă numele şi valorile tuturor constantelor din program;
9) Spaţiul de lucru ce permite dezvoltarea programului;
10) Zona ce permite trecerea de la un program la un altul.

2.5 Prezentarea blocurilor:

Logic: Această categorie grupează funcţiile logice clasice precum numărători, multiplexoare,
porţi ŞI, SAU, etc.
Mathematics: Conţine operaţiile matematice simple, precum produs, adunare, comparare, etc.
Vector Analysis: Grupează unelte ce permit conversia şi operaţiile cu vectori în plan.
Display: Conţine unelte de afişare precum osciloscopul, afişajul vectorilor în plan.
Image Processing: Unelte de bază pentru tratarea imaginilor.
Generators: Conţine diverse generatoare de semnal, impulsuri: sinus, triunghiulare, ceas, etc.
Filter: Funcţia smoothing permite atenuarea unui semnal.
Robotino Hardware: Conţine diferite acţionări şi senzori ale lui Robotino.
Input Devices: Periferic de comandă al robotului precum joystick şi panoul de control.
Sequence Control: Diverse elemente ce permit pornirea, oprirea sau sincronizarea mai multor
programe.
Programs: Lista de programe deschise ce pot fi inserate într-o secvenţă.

16
3. Subsistemele Robotino:
3.1 Sistemul de locomoţie

Avantajul vehiculelor cu sistem de locomoţie omnidirecţională este aceea că se pot deplasa


în orice direcţie fără să fie nevoite să se întoarcă. Elementele cheie ale sistemului de locomoţie
omnidirecţional sunt roţile omnidirecţionale sau roţi multidirecţie, cunoscute ca şi roţi omni. De
obicei în formă de butoi, aceste roţi sunt ataşate de suprafaţa de rotaţie a roţii principale, ale cărei
axe de rotaţie sunt perpendiculare pe axa de rotaţie a roţii principale. Roţile multidirecţionale pot fi
acţionate activ printr-un motor sau pasiv cu ajutorul unui mecanism cu rotiţe integrat în roată. Un
robot nu trebuie să se îndepărteze de la obiectul monitorizat, trebuie să îşi menţină linia de
vizibilitate.

Obiectul detectat

Direcţia
de deplasare

Direcţia
de deplasare

17
Deplasare cu rotaţie

3.1.2 Roţile multidirecţionale:

O roată multidirecţională este mişcată într-o direcţie cu ajutorul axului de transmisie şi se


poate deplasa liberă în altă direcţie faţă de celelalte roţi. Prin interacţiunea cu cele doua sisteme de
transmisie, este posibilă generarea unei direcţii de mişcare ce derivează de la direcţia de acţionare.

Transmisie omnidirecţională

Dacă roata principală este acţionată, cele două roţi auxiliare se blochează şi acţionează
precum o suprafaţă de rulare. Dacă deplasarea este oprită, iar vehiculul s-a mişcat într-o altă direcţie,
de exemplu cu ajutorul unei roţi omnidirecţionale auxiliare ataşată la un unghi drept, roţile auxiliare
se rotesc şi minimizează rezistenţa de frecare a roţii. Acest tip de design permite o deplasare rapidă
în orice unghi faţă de roata principală.
La o deplasare simetrică, roţile (roţile multidirecţionale) sunt decalate între ele cu 120 o.
Roţile la un sistem de locomoţie omnidirecţional sunt acţionate astfel încât să se rotească împreună.

Decalajul roţilor 120o

Direcţia de deplasare

18
Avantajele şi dezavantajele roţilor multidirecţionale:
Avantajul acestui sistem, datorită controlului vitezei motoarelor, este că robotul se poate
deplasa în orice direcţie fără să fie nevoie de întoarcere. Alte avantaje:
∎ Un vehicul omnidirecţional se poate întoarce chiar dacă este în staţionare;
∎ Raza de întoarcere a vehiculelor este egală cu 0, nu sunt necesare mai multe mişcări;
∎ Greutatea întregului robot este distribuită în mod egal pe roţi şi astfel echilibrul robotului s-
a îmbunătăţit;
∎ Nu necesită niciun sistem de virare;
∎ Mecanism simplu şi robust.
Un dezavantaj este consumul de energie care este ridicat în cazul deplasări pe direcţia înainte,
deoarce există un număr mare de suprafeţe de rotaţie şi o rezistenţă la rulaj mai mare datorită
rezistenţei la frecare.
Diferite tipuri de roţi sunt folosite în domeniul roboţilor omnidirecţionali. Alegerea acestora
depinde de suprafaţa pe care trebuie să ruleze robotul. Rotiţe realizate din plastic moale sau
poliuretan, în particular sunt folosite pe suprafeţe dure sau line precum geam sau ţigle; rotiţe
realizate din materiale dure sunt utilizate pentru suprafeţe moi precum covoare sau parchet. O
diferenţă la roţile multidirecţionale este numarul de rotiţe folosite.

3.1.3 Grade de libertate:

Libertatea de deplasare în plan sau în spaţiu este cunoscută sub numele de grade de deplasare.
Gradele de libertate sunt flexibilitatea de deplasare în plan sau spaţiu. Există diferite posibilităţi
pentru mişcarea unui corp în spaţiu:
Mişcări de translaţie: coordonate-x,y,z.
Aceste grade de libertate pentru deplasarea în spaţiu se numesc grade de libertate de translaţie.
În cazul rotaţiei corpurilor rigide se aplică două sau trei grade de libertate, depinzând de
rotaţia corpului în jurul uneia, a două sau a trei axe de rotaţie.(mişcări de rotaţie în jurul axei x,y,z).
Pentru a reprezenta poziţia şi gradele de libertate ale unui corp, este folosit sitemul de
coordonate cartezian. Scopul unui sistem de coordonate este acela de a indica poziţia punctelor
corpului în spaţiu. Poziţia în spaţiu este determinată unic folosind un sistem de coordonate prin
indicarea valorilor numerice, respectiv coordonatele. Liniile, curbele, distanţele, ariile, corpurile, pot
fi determinate apoi prin puncte.

Sistem de coordonate cartezian


tridimensional.

19
3.1.4 Mişcarea corpurilor:

Orice mişcare a corpurilor este posibilă în direcţie pozitivă sau negativă. De exemplu un tren
se mişcă înainte sau înapoi de-a lungul unei axe x(o cale predefinită) şi are un singur grad de
libertate.
Un robot ce este capabil să se deplaseze pe o linie dreaptă(înainte, înapoi, pozitiv sau negativ
în sistemul de coordonate) şi în lateral(la dreapta sau la stânga, negativ sau pozitiv în sistemul de
coordonate) are două grade de libertate de translaţie. Un robot ce se deplasează în cerc, se roteşte în
jurul axei centrale, pe axa z, are un grad de libertate în plus, gradul de libertate rotaţional. Rotaţia în
jurul axei z este posibilă în două direcţii. Robotino se poate deplasa: înainte, înapoi, lateral şi în cerc
fără să menţină linia de vizibilitate, deci are trei grade de libertate, două translatorii şi unul
rotaţional.

3.1.5 Acţionarea sistemului de locomoţie omnidirecţional:

Acţionarea sistemului de locomoţie omnidirecţional este destul de complexă. Deplasarea


omnidirecţională este posibilă prin acţionarea celor trei roţi ce nu pot fi virate. Trei motoare sunt
acţionate pentru a realiza deplasarea omnidirecţională. Există trei comenzi: înainte, înapoi şi off,
rezultând 27 opţiuni pentru trei motoare. Aceste opţiuni permit controlul direcţiei.

Acţionarea motoarelor

Tabelul de mai jos prezintă cele 27 de opţiuni cu ajutorul comenzilor: înainte, înapoi şi off. Nu
se vor lua în considerare diferitele niveluri de viteză. Toate motoarele sunt acţionate cu aceeaşi
viteză.

20
Acţionarea şi direcţia de deplasare:
Motor 1 Motor 2 Motor 3 Direcţia de deplasare
Înainte Înainte Înainte Rotaţie spre dreapta, staţionar
Înainte Înainte Off Rotaţie spre dreapta, cu rază mică
Înainte Înainte Înapoi Rotaţie spre dreapta, cu rază mare
Înainte Off Înainte Rotaţie spre dreapta, cu rază mică
Înainte Off Off Rotaţie spre dreapta, cu rază medie
Înainte Off Înapoi Deplasare către 300o
Înainte Înapoi Înainte Rotaţie spre dreapta, cu rază mare
Înainte Înapoi Off Deplasare către 0o
Înainte Înapoi Înapoi Rotaţie spre stânga, cu rază mare
Off Înainte Înainte Rotaţie spre dreapta, cu rază mică
Off Înainte Off Rotaţie spre dreapta, cu rază medie
Off Înainte Înapoi Deplasare către 240o
Off Off Înainte Rotaţie spre stânga, cu rază medie
Off Off Off Staţionar
Off Off Înapoi Rotaţie spre stânga, cu rază medie
Off Înapoi Înainte Deplasare către 60o
Off Înapoi Off Rotaţie spre stânga, cu rază medie
Off Înapoi Înapoi Rotaţie spre stânga, cu rază mică
Înapoi Înainte Înainte Rotaţie spre dreapta, cu rază mare
Înapoi Înainte Off Deplasare către 180o
Înapoi Înainte Înapoi Rotaţie spre stânga, cu rază mare
Înapoi Off Înainte Deplasare către 120o
Înapoi Off Off Rotaţie spre stânga, cu rază medie
Înapoi Off Înapoi Rotaţie spre stânga, cu rază mică
Înapoi Înapoi Înainte Rotaţie spre stânga, cu rază mare
Înapoi Înapoi Off Rotaţie spre stânga, cu rază mică
Înapoi Înapoi Înapoi Rotaţie spre stânga, staţionar

21
Tabelul de mai sus ne arată cum trebuie acţionate motoarele pentru ca robotul să se deplaseze
pe 300o , aşa cum arată şi figura de mai jos:

Robotino are trei motoare ce acţionează roţile multidirecţionale. Viteza de rotaţie a unei roţi
poate fi setată astfel încât să nu depindă de celelalte două. Pentru ca Robotino să se deplaseze
trebuie ca rotaţia roţilor individuale să fie coordonată, astfel ca interacţiunea corectă să genereaze
deplasarea dorită pentru Robotino.
Motoarele pot fi acţionate direct cu ajutorul help-ului de la RobotinoView sau cu blocul
„omnidrive”, folosirea acestui bloc fiind recomandată în orice aplicaţie. „Omnidrive” calculează
viteza de rotaţie ale motoarelor 1, 2 şi 3 pentru anumite coordonate pe direcţia x sau y. Robotino are
două grade de libertate translatorii pentru deplasare pe x şi y, în direcţia înainte sau lateral, rotaţia
fiind posibilă pe axa z.
Intrările şi ieşirile modulului omni sunt prezentate mai jos:

Intrări: Descriere:
vx_set viteza setată pentru direcţia x în mm/s
vy_set viteza setată pentru direcţia y în mm/s
omega_set viteza de rotaţie în grade/s
v1 viteza actuală pentru motorul 1 în rot/m
v2 viteza actuală pentru motorul 2 în rot/m
v3 viteza actuală pentru motorul 3 în rot/m

Ieşiri: Descriere:
v1_set viteza setată pentru motorul 1 în rot/min
v2_set viteza setată pentru motorul 2 în rot/min
v3_set viteza setată pentru motorul 3 în rot/min
vx viteza actuală în direcţia x(înainte/înapoi) în mm/s
vy viteza actuală în direcţia y(lateral) în mm/s
omega viteza de rotaţie actuală(rotaţie) în grade/s

22
Omnidrive

Direcţia (coordonatele) şi viteza sunt definite, introduse şi calculate la intrarea block-lui


„Omnidrive” apoi convertite în valori setate pentru viteza motorului.

3.2. Curbele caracteristice:


23
3.2.1 Generalităţi:

O curbă caracteristică reprezintă relaţia dintre două valori în formă de linie într-un sistem de
coordonate bidimensional. În cazul senzorilor de distanţă ale robotului Robotino relaţia este dată de
distanţa până la obstacol şi valorile de ieşire generate în RobotinoView.

Înregistrarea curbelor caracteristice:


Ca regulă, o curbă caracteristică este înregistrată prin măsurarea a două variabile şi
introducerea acestora într-un sistem corespunzător de coordonate sau tabel, unde valoarea unei
variabile este alocată celeilalte. Curba caracteristică a unei componente este obţinută dacă punctele
pereche sunt conectate printr-o linie sau curbă. Acurateţea curbei este mărită dacă se măsoară mai
multe puncte.

3.2.2 Linearizarea unei curbe caracteristice:

Curbele caracteristice sunt în general non-lineare, dar se pot lineariza pe anumite secţiuni,
unde o simplă conversie a valorii senzorilor în unităţi de măsură standard se poate realiza pe
secţiunea respectivă. Curbele caracteristice se pot determina uşor prin linearizare cu ajutorul
ecuaţiilor liniare.
Formula pentru o linie dreaptă într-un sistem de coordonate este(pentru distanţa D şi valoarea
X a senzorului) D=MX+B
unde:
M= gradientul curbei
B= ordonata curbei
D= distanţa pâna la obiect
X= valoarea ieşirii senzorului.
Dacă ecuaţia liniară folosită pentru linearizarea secţiunii reprezintă distanţa curbei
caracteristice a senzorului, atunci M şi B trebuie să determine valoarea X a senzorului pentru
distanţa D.
Constantele M şi B sunt determinate cu ajutorul unor măsurători de probă: D1 şi X1 sunt
distanţa şi valoarea de ieşire a măsurării; D2 şi X2 sunt distanţa şi valoarea de ieşire pentru o a doua
măsurare(de exemplu 10 cm).
Gradientul M al unei curbe este determinat prin realizarea relaţiei dintre diferenţa distanţei şi
valoarea senzorilor şi calcularea conversiei din această formulă:
M=∆D/∆X.
Impreciziile apar la această metodă, dar în majoritatea cazurilor pot fi ignorate. Trebuie luate
în calcul diferitele linearizări pe alte secţiuni pentru a înlătura impreciziile.

3.3. Senzori infraroşii de distanţă:

24
3.3.1 Principiul de funcţionare:

Senzorii infraroşii de distanţă sunt alcătuiţi dintr-un emiţător ce emite o rază infraroşie, un
receptor corespunzător şi o unitate de evaluare electronică.
Emiţătorul emite o rază infraroşie, iar dacă aceasta nu se loveşte de niciun obiect, nu este
reflectată iar receptorul nu primeşte raza infraroşie. Dacă raza se loveşte de un obiect, este
recepţionată cu întârziere de către receptor. Deoarce emiţătorul şi receptorul sunt poziţionate
apropiate unul de celălalt, raza formată de cele două are formă de triunghi.
Detector de pozitie

Lentile

LED infrarosu

Raza

Depinzând de distanţă, raza reflectată loveşte receptorul într-un punct diferit. Receptorul
conţine un detector senzitiv de poziţie(PSD) care detectează diferitele puncte de incidenţă şi o
unitate de procesare a semnalului ce îl converteşte într-o tensiune analogică.
Un PSD este o diodă fotoelectrică în formă lamelară, ce cuprinde o suprafaţă sensibilă la
lumină şi o suprafaţă metalică. Dacă o rază loveşte într-un punct suprafaţa sensibilă, aceasta
lansează purtători de sarcină care generează un curent către cei doi electrozi. Relaţia dintre curenţi şi
dintre electrozi depinde de poziţia punctului de incidenţă. Relaţia determinată de curenţi este
evaluată de partea electronică, fiind independentă de cantitatea de lumină; distanţa măsurată este
dependentă de reflexie, material şi obiect. Lumina difuză şi lumina zilei sunt eliminate prin metode
de vibrare a razei de lumină emisă. Numai semnalele recepţionate prin asemenea metode de vibrare
sunt folosite pentru evaluare. Lumina continuă este „ignorată” virtual. În majoritatea cazurilor,
emitorul, receptorul şi procesorul de semnal sunt combinate într-o singură unitate.
Exemple de sisteme tipice folosirii senzorilor cu infraroşii sunt sistemele de control de la
distanţă a maşinilor, sisteme de folosire a apei la toaletă, sisteme de deschidere a uşilor sau sisteme
de alarmă.
25
Senzorii de distanţă folosiţi în RobotinoView au ieşirea A1, ce oferă o valoare a tensiunii de
0 – 2.55 V. Măsurarea şi conversia acestor valori oferite de senzorul de distanţă trebuie să fie
efectuate de utilizator.
Funcţia bloc pntru senzorii de distanţă se găseşte în librăria funcţiilor bloc „Robotino
Hardware”.

Crearea unei noi diagrame bloc a funcţiilor.


Trageţi simbolul pentru funcţia bloc „distanţă” pe desktop.

Fereastra pentru setarea parametrului intern corespunzător se deschide dând dublu-click pe


blocul funcţiei.

Se atribuie unul din cei 9 senzori de distanţă funcţiei bloc prin selectarea respectivului din
lista ce apare în fereastră.

26
Senzorul corespunzător este apoi atribuit funcţiei bloc. Acest lucru se poate observa cu
ajutorul numărului senzorului ce este afişat în cadrul imaginii ce reprezintă simbolul.

Pentru o identificare mai simplă se poate aloca un nume senzorului. Pentru a realiza acest
lucru se deschide a treia fereastră a funcţiei bloc şi se scrie numele ales pentru senzor şi se dă apoi
click pe butonul „Accept”.

Numele simbolului este schimbat.

În cea de-a doua fereastră se află lista cu datele de ieşire ale funcţiilor bloc cu denumirile
corespunzătoare ce pot fi îndreptate, aduse la aceeaşi scală şi ajustate.

Conexiunea „Value” indică valoarea tensiunii curentului senzorului iar conexiunea


„Direction” arată direcţia de detectarea a senzorului, începând cu 0o pentru senzorul „Distance 1”.
3.4. Senzori optici de proximitate:

27
3.4.1 Caracteristici generale:

Senzorii optici de proximitate folosesc metode optice şi electronice de detectare a diverselor


obiecte cu lumină roşie sau infraroşie. Surse sigure pentru lumina roşie şi infraroşie sunt diodele
semiconductoare emiţătoare de lumină (LED-urile). Sunt mici şi robuste, au o durată de funcţionare
mare şi pot fi uşor modulate. Fotodiodele sau fototranzistorii sunt utilizate ca elemente receptor.
Avantajul luminii roşii este acela că poate fi detectată şi cu ochiul liber în timp ce se ajustează axele
optice ale senzorului de apropiere folosit. De asemenea pot fi folosite şi cablurile de polimer cu fibră
optică datorită estompării luminii la o anumită gamă de lungime a undei.
Lumina infraroşie (invizibilă) este folosită în aplicaţii unde este necesară o putere luminoasă
mai mare, de exemplu pentru a traversa distanţe mai mari. Mai mult decât atât, este mai puţin
susceptibilă la interferenţe (lumina ambientală).
În cazul ambelor tipuri de senzori optici de proximitate suprimarea influenţei luminii
externe este obţinută prin metode de modulare a semnalului optic. Receptorul este reglat la pulsaţia
emitorului. În mod particular, în cazul luminii infraroşii, folosirea filtrelor pentru lumină de zi
îmbunătăţeşte şi mai mult lipsa de sensibilitate la lumina ambientală.
În cazul senzorilor optici difuzi funcţia de comutare funcţionează astfel:
•Comutarea luminozitaţii
Ieşirea comută pe „închis” dacă un obiect ce trebuie detectat intră în raza de lumină.
(ieşire normală deschisă=NO)
•Comutarea lipsei de luminozitate
Ieşirea comută pe „deschis” dacă un obiect ce trebuie detectat intră în raza de lumină.
(ieşire normală închisă= NC)

3.4.2 Designul senzorilor optici de proximitate:

Senzorii optici de proximitate sunt împărţiţi în emitori şi receptori. Depinzând de design şi


aplicaţii, sunt necesare reflectoare şi cabluri de fibră optică.
Emiţătorul şi receptorul sunt încorporate fie într-o carcasă (senzorii difuzi şi senzorii retro-
reflexivi), sau sunt poziţionaţi în carcase diferite (senzori cu faşcicul de lumină).
Emitorul conţine o sursă pentru lumina roşie sau inflaroşie ce este emisă în linie dreaptă şi
poate fi deviată, focalizată, întreruptă, reflectată şi direcţionată. Este captată de receptor şi evaluată
electronic.
Senzorii de proximitate obişnuiţi conţin o diodă emiţătoare de lumină (LED), ce se aprinde
când ieşirea comutează. LED-ul afişează notificări ca un ajutor pentru ajustare şi poate fi folosit
pentru testări funcţionale.

3.4.3 Rezervele operaţionale a senzorilor optici de proximitate:

28
Senzorii optici de proximitate pot fi expuşi la contaminări cum ar fi praful sau lubrifianţii în
timpul utilizării acestora şi prin urmare buna-funcţionare poate fi deteriorată. Atât coruperea
lentilelor senzorului cât şi a obiectului ce ar trebui detectat pot cauza o proastă funcţionare.
Dacă o corupere gravă se întamplă în cadrul faşciculului de lumină a senzorului retro-reflexiv
sau a celor cu faşcicul de lumină, acest lucru poate cauza întreruperea razei de lumină, ce practic
simulează prezenţa unui obiect. În cazul senzorilor difuzi, contaminarea sistemului de lentile este de
asemenea percepută ca şi prezenţă a unui obiect dacă radierea optică reflectă contaminarea de pe
lentile către receptor. Coruperea obiectului în sine poate avea ca rezultat o evaluarea unui obiect care
de fapt nu este prezent din cauză că faşciculul reflectat este mai mic ca urmare a contaminării
obiectului.
Senzorii optici de proximitate au anumite rezerve operaţionale (cunoscute şi ca rezerve
funcţionale). Un indicator ce se aprinde intermitent aflat pe senzor este o metodă bună de verificare
a rezervei operaţionale, care devine activ în cazul în care rezerva este inadecvată. Există de
exemplu indicatoare ce încep să se aprindă intermitent dacă factorul de rezervă operaţional este de
β=1.5. Acesta semnalează că rezerva operaţională de 50% este încă disponibilă.
Indicatorul luminos poate fi folosit ca un ajutor suplimentar pentru asamblarea şi ajustarea
configuraţiei senzorului de apropiere. Funcţionează şi ca un display pentru contaminare în timpul
funcţionării ulterioare. Rezerva funcţională este redusă treptat din cauza efectelor contaminării.
Rezervele funcţioanale inadecvate îşi pot începe funcţionarea şi din alte cauze, de exemplu:
- Depăşirea gamei de funcţionare sigură sau a celei de sensibilate
- Schimbările materialului de suprafaţă a obiectelor detectate
- Asamblarea incorectă
- Învechirea diodei transmiţătorului
- Rupturi în cablurile de fibră optică

3.4.4 Modul de funcţionare:

Emitorul şi receptorul sunt amplasate în aceeaşi carcasă. Obiectul reflectă o parte din radiaţia
emisă şi ca urmare activează receptorul. În funcţie de designul receptorului, ieşirea este comutată pe
pornit(funcţia de contact NO) sau oprit(funcţia de contact NC). Distanţa de comutare depinde de
factorul de radiaţie al obiectului. Mărimea, suprafaţa, forma, densitatea şi culoarea acestuia precum
şi unghiul de incidenţă determină intensitatea radiaţiei reflectate pentru ca numai distanţele mici
aflate pe o rază de câţiva decimetri să poată fi monitorizate. Fundalul trebuie să absoarbă sau să
reflecte lumina; cu alte cuvinte, dacă nu este prezent nici un obiect, radiaţia reflectată trebuie sa fie
clar la un nivel mai mic decât cel necesar declanşării circuitului receptorului.

Senzorul difuz (principiul de funcţionare)

29
3.4.5 Caracteristicle tehnice:

Tabelul de mai jos afişeaza cele mai importante caracteristici ale senzorului difuz. Aceste
compilaţii tabelare furnizează informaţii tipice şi sunt pur şi simplu destinate unei prezentări
generale.

Parametru Valoare

Materialul de fabricaţie al obiectului Oricare

Tensiunea de funcţionare 10-30V CC sau 20-250V CA

Câmp senzorial 50mm – 2m (distanţa ajustabilă)

Curentul maxim de comutaţie


(ieşirea tranzistorului) 100-500mA

Sensibiliatea la contaminare Sensibil

Durata de funcţionare Mare(aproximativ 100.000h)

Frecvenţa de comutare 20-2000Hz

Design Cilindric sau forma de bloc

Clasa de protecţie Până la IP67

Temperatura ambientală de funcţionare 0o- 60oC sau -25o - +80oC

30
Emiţător/Receptor(1) Raza de transmisie(2) Curba de răspuns(3)
Pentru distanţă mică: nu este nevoie de suprafaţa reflectoare.
Pentru distanţă mare: este nevoie de suprafaţa reflectoare.

3.4.6 Avantajele senzorilor difuzi:

● Deoarece reflexia luminii pe un obiect activează receptorul, nu este necesar un reflector în


plus;
● Obiectul poate reflecta difuz, să răsfrângă lumina, diafan către transparent;
● Întrucât prin intermediul făsciculului senzorului permite detectarea de obiecte la un unghi
drept cu faşciculul de lumină, senzori difuzi permit detectarea obiectelor în linie dreaptă cu
faşciculul de lumină;
● Depinzând de cum sunt setaţi senzorii difuzi, ei pot detecta obiecte selective pe un fundal.

3.4.7 Dezavantajele senzorilor difuzi:

● Curba de răspuns la un unghi drept cu faşciculul de lumină, direcţia de răspândire nu este


liniară. Senzorii difuzi nu sunt la fel de eficienţi precum senzorii prin grindă când este vorba de
precizie laterală;
● Mărimea, suprafaţa, forma, densitatea şi culoarea unui obiect cât şi unghiul de incidenţă
determină intensitatea radiaţiei reflectată şi astfel, ca o regulă, numai distanţele mici cu o rază de
câţiva decimetri poate fi monitorizate. Fundalul trebuie să absoarbă sau să reflecte, în absenţa unui
obiect, iar radiaţia trebuie să fie mult mai mică decât nivelul de pornire al circuitului receptiv;
● Eroarea emiţătorului este evaluată precum “nici un obiect prezent”.

3.4.8 Suprimarea fundalului cu un senzor difuz:

31
Potenţiometru ajustabil(1) Obiect(2) Fundal(3)
Distanţa dintre senzorul de proximitate şi obiect- (a)
Distanţa dintre senzorul de proximitate şi fundal- (b)

3.4.9 Ajustarea sensibilităţi:

Acţiunea unui senzor difuz este bazată pe diferenţa de reflexie a obiectului şi reflexia
fundalului. Dacă contrastul este minimal, nivelul de pornire al circuitului poate fi selectat prin
mijloacele de setare a sensibilitaţi la senzorul de proximitate(potenţiometru cu o singură rotaţie sau
multi-rotaţie), astfel încât obiectul să fie detectat în aceste condiţii nefavorabile.
Cu toate acestea, o rază de toleranţă trebuie luată în calcul pentru îmbătrânire, tensiune şi
fluctuaţia temperaturii şi contaminare. Intervalul setarilor nu trebuie folosit la maxim când se fac
ajustarile.
Ajustarea fină a senzorilor difuzi folosind un potenţiometru trebuie să permită o rezervă
pentru a respecta calitatea obiectului, contaminarea senzorului de proximitate, praful din atmosferă,
etc. . Dacă setarile se fac doar funcţionale, acestea pot cauza probleme.
Anumiţi senzori difuzi sunt echipaţi cu un ajutor de ajustare sub forma unui LED ce licăre,
pentru a asigura setări stabile. LED-ul licăre atunci când setările nu sunt în raza bună. Setările
trebuie făcute astfel încât, LED-ul să lumineze continuu, fără să licăre.
Comportamentul unui senzor difuz în cazul unui obiect reflexiv:

Obiectul este detectat.

32
Emitor/Receptor(1) Suprafaţa de reflexie(2)

Obiectul nu este detectat.

Emitor/Receptor(1) Suprafaţa de reflexie(2)


Obiecte transparente:
- Sticlă;
- Plexiglas;
- Folie transparentă din plastic.
În general, aceste materiale au suprafeţe fine, reflexive pentru ca senzorii difuzi să fie folosiţi. De
regulă, obiectul trebuie să fie pe verticală în direcţia faşciculului.
Obiecte cu reflexie minimă:
- Plastic negru mat;
- Cauciuc negru;
- Materiale închise cu suprafeţe neprelucrate;
- Materiale textile închise;
- Oţel netratat.
Senzorii difuzi nu reacţionează la materialele de mai sus chiar dacă sunt aproape de aceste
materiale.

Exemplu: Monitorizarea poziţiei pieselor de prelucrat cu ajutorul senzorilor difuzi.

33
Corect(1) Incorect(2)

Ajustarea fină a senzitivităţii potenţiometrului este necesară, unde toleranţa diferenţelor de


materiale, contaminare, etc. trebuie luată în considerare.

Verificarea poziţiei cu ajutorul senzorilor difuzi.

Un controler conectat verifică dacă senzorii răspund(ieşirea senzorului de proximitate este


conectată cu operaţia logică AND). Senzorii difuzi cu cabluri de fibră optică sunt necesari pentru
acurateţea necesară şi distanţa mică faţă de obiect.

3.5 Senzorii optici de proximitate cu fibra optică:

3.5.1 Modul de operare:

Senzorii optici de proximitate cu cablu de fibră optică sunt folosiţi când dispozitivele
convenţionale necesită spaţiu mare. Folosirea cablurilor optice sunt avantajoase în domenii supuse
riscurilor de explozie. Poziţionarea obiectelor mici poate fi precis detectată folosind cabluri cu fibră
optică.

34
Principiu de funcţionare al senzorilor difuzi cu fibră optică.

Emitor şi receptor cu cablu de fibră optică într-un singur bloc.

Senzor optic de proximitate(1) Emiţător cu cablu de fibră optică(3) Obiect(5)


LED şi reglarea cu şurub (2) Receptor cu cablu de fibră optică(4)

3.5.2 Avantajele fibrei optice la senzorii optici de proximitate:

● Detectarea obiectelor în locuri dificile, exemplu o gaură mică;


● Posibilitatea de montare a senzorilor în zona cu risc mare de: căldură, explozie, apă,
interferenţe cu radiaţii;
● Precizie în detectarea obiectelor mici;
● Posibilitate schimbării configuraţiei.

Avantajele cablurilor din polimeri cu fibră optică:

● Rezistenţa mecanică mai mare decât cablurile din fibră de sticlă;


● Posibilitatea tăierii pe lungime cu un cuţit;
● Costuri mici.

Avantajele cablurilor din sticlă cu fibră optică:


● Bune pentru temperaturi ridicate;
● Rezistenţa mare la îmbătrânire.

Exemple:

35
Detectarea obiectelor mici cu ajutorul senzorilor difuzi cu fibră optică.

Verificarea filetului.

Şuruburile filetate reflectă suficientă lumină pentru a acţiona receptorul. Raza emisă de
emitor este reflectată în altă parte de către suprafaţa netedă.

3.6. Senzori inductivi

Funcţionare:

Un senzor inductiv este construit dintr-o bobină cu miez din ferită. Împreună cu un
condensator, bobina formează un circuit rezonant, creându-se un câmp electromagnetic în faţa
bobinei. Dacă un obiect bun conductor electric este prezent în acel câmp, o tensiune este generată
între acestea, care la rândul său cauzează un curent între materiale. Energia necesară este luată din
circuitul rezonant, aceasta mai este numită ca şi atenuarea circuitului rezonant. Rezultatul este trecut
printr-o etapă de evaluare în conformitate cu programarea. În funcţie de material sau de distanţă,
senzorii inductivi analogi furnizează o tensiune analogică sau un semnal.

36
Senzorii inductivi sunt folosiţi de exemplu: pentru diferenţierea a două materiale metalice,
pentru măsurarea distanţei, pentru monitorizarea asamblării.

3.7. Marginea sensibilă, detectarea coliziunii:

Modul de funcţionare:

Senzorul de coliziune al robotului Robotino este construit din aşa numita margine sensibilă.
Marginea sensibilă este construită dintr-un profil de polimer în diferite forme ce conţine o cameră ce
işi schimbă forma. Două arii conductoare separate sunt situate în camera ce crează un scurt-circuit la
o presiune dacă este aplicată o forţă pe marginea sensibilă şi generează un semnal pentru unitatea de

37
evaluare. Marginea sensibilă al robotului Robotino funcţionează în conformitate cu principiul
curentului pasiv precum o întrerupere la un cablu, aşa detectează şi Robotino se opreşte.
Curentul pasiv este un curent electric care circulă prin circuit chiar dacă acesta este oprit. Dacă
curentul nu circulă prin circuit, atunci înseamnă că este posibilă o întrerupere la un cablu sau
marginea sensibilă este defectă.

Funcţionarea senzorului de coliziune.

Arii de aplicaţie:

Marginile sensibile sunt folosite predominant în tehnologiile de siguranţă pentru a evita


ciocnirea cu oamenii, maşini sau materiale. În ingineria medicinală, sunt folosite la echipamentele
de diagnostificare, echipamentele cu radiaţii în scopul de a proteja pacienţi şi personalul. Mai sunt
folosite la uşile lifturilor, uşile autobuzelor şi luminatorii electrici.
Protecţia la punct comun

Protecţia la îmbinare

Marginea sensibilă este prezentă în RobotinoView în fişierul de hardwear şi nu necesită


parametrizare. Furnizează un semnal la contact şi este folosită în general pentru a opri Robotino în
cazul unei coliziuni. Este conectată la ieşirea blocului Sequence Control. Secvenţa programului este
oprită în cazul unei coliziuni.

Diagrama pentru coliziune.

38
3.8. Webcam:

Descriere:

Funcţia modulului Camera permite accesul la imagini de la camera robotului Robotino.


Camera este conectată la puntea de comandă prin intermediul unei intrări USB din cele două.
Rezoluţia imaginii poate fi ajustată prin mişcarea lentilelor.

39
(1) Mărimea pozei. (2) Selectarea culorii. (3) Rezoluţia.

Funcţionarea:

Imaginea de la cameră este afişată în blocul de funcţii. Mărimea imaginii se schimbă prin
mărirea ferestrei de dialog. Mărimea pozei este afişată în procente de la forma originală. Se pot
selecta diferite arii de culoare prin intermediul casetei de mijloc.
Spaţiul de culoare YcbCr face diferenţa dintre luminozitate şi nuanţa culorilor individuale şi
reprezintă acestea corespunzător. Acestea nu sunt reprezentate în mod obişnuit, cu toate că acest
model de reprezentare a culorilor este mai sensibil la modificările de luminozitate.
Spaţiul de culoare HSV face diferenţa dintre culorile individuale şi tentă, saturaţie şi valoare.
Reprezentarea în RGB este mult mai puţin definită. Toate acestea se aplică în egală masură şi în
cazul reprezentării în spaţiul de culori HLS, în loc de valoare, spaţiul HLS utilizează luminozitatea
pentru a stabili o culoare.
Aceste spaţii de culori pot oferi rezultate mai bune, acestea trebuie sa fie stabilite prin
intermediul unor experimente.
Casuţa din dreapta(3) face posibilă selectarea unei rezoluţii din cele două(320x240 şi
640x480). În cazul recunoaşterii unei culori, rezoluţia scazută este folosită în general, deoarece poza
conţine mai puţine culori, aceasta uşurează recunoaşterea culorilor asociate spaţiilor de culori pentru
software.

40
3.9 Generatoare:

Generatoare de undă:

Un generator de undă generează semnale de undă, frecvenţe diferite, tensiuni, etc. Poate fi
setat. Această categorie conţine numeroase funcţii numerice pentru generarea semnalului. Diferite
tipuri de generatoare sunt disponibile în RobotinoView:
●generator undă sinusoidală;
●generator undă dreptunghiulară;
●generator de tensiune dinţi de fierăstrău.

Tip Rezultat Funcţie(descriere pe scurt)


Generator undă sinusoidală Curba sinusoidală Unda sinusoidală cu o valoare
setată, de exemplu, dispozitive
41
de control al vitezei, tensiunii.
Generează pulsuri
dreptunghiulare cu lăţime
Generator undă dreptunghiulară Puls dreptunghiular variabilă. Pulsul pe lăţime este
măsurat în ms şi este
independent de frecvenţă
O valoare iniţială al undei în
Generator de tensiune dinţi de
Curba dinţi de fierăstrău formă de dinţi fierăstrău este
fierăstrău
generată

Simboluri:

Un dublu click pe pimbol deschide blocul de funcţii, care permite accesarea parametrilor
interni ai blocurilor de funcţii individuale, în acest caz, blocul generator şi de asemenea setările
parametrilor.

1-Ieşirea depinde de tipul generatorului- generează o valoare


iniţială şi acţionează precum o sursă pentru blocurile
adiţionale, de exemplu un motor.

Căsuţa de dialog al generatorului:

42
Element Descriere

Setarea amplitudinii, valori de la


1 A
0.1-1000

Frecvenţa(Hz), Max 25Hz.


Frecvenţa poate fi setată în 8 etape,
2 F
de exemplu: 25Hz, 10Hz, 5Hz,
2Hz, 1Hz, 0.5Hz, 0.2Hz şi 0.1Hz.

Lăţimea semnalului(ms), intervalul


de valori poate fi modificat cu
3 PW generatorul de unde
dreptunghiulare şi este independent
de frecvenţă.

Tipul generatorului poate fi rapid


Selectarea tipului modificat dând un click pe
4 diagrama blocul funcţiei folosite şi
selectarea generatorului apropiat
din căsuţa de dialog.

Generarea unei valori constante:

1- Rezultatul este o valoare constantă. Diferite blocuri de funcţii pot fi conectate la ieşire, de
exemplu: conectare la motor şi la osciloscop(pentru afişarea valorii iniţiale pentru controlul
motorului şi de asemenea o constantă numerică pentru funcţiile matematice).
Setări:

1- Nume- Numele constantei poate fi schimbat în acest câmp.


2- Valoare- Setarile valorii de ieşire. O valoare pentru constantă trebuie introdusă aici. Diferite
blocuri de funcţii pot fi conectate la această ieşire, o conexiune la motor şi la osciloscop.

43
Semnificaţia generatoarelor şi efectele acestora asupra vitezei rotaţionale a motoarelor:
Comportamentul
Tipul Simbol Semnificaţie
vitezei rotaţionale

Roata accelereaza uşor


Generator undă Generează o valoare iniţială a pâna la o viteză
sinusoidală vitezei cu o undă sinusoidală. maximă negativă sau
pozitivă.

Roata accelerează rapid


la viteza maximă şi
Generează o undă de semnal ceea ce
Generator undă rămâne în acest stagiu.
măreşte rapid sau micşorează
dreptunghiulară Durata mişcării roţii
amplitudinea.
depinde de lăţimea
pulsului.

Viteza roţii creşte liniar


Generează un semnal în formă de
Generator tensiune până la valoarea
rampă care se resetează în 0 după
dinţi de fierăstrău maximă şi se opreşte
ceva timp.
brusc după un timp.

Roata se roteşte la o
Constantă Aloca o valoare constantă la intrare. viteză constantă într-o
singură direcţie.

4. RobotinoView
4.1. Osciloscopul:

Oscilocopul ne permite reprezentarea în funcţie de timp a unui semnal a uneia sau a


mai multor ieşiri. Semnalele caracteristice sunt descrise ca o funcţie de timp.
Un osciloscop(osciloscop cu memorie) permite reprezentarea vizuală a proceselor
electrice rapide şi este folosit, de asemenea, periodic în cazul semnalelor recurente.

4.1.1. Măsurarea tensiunilor cu ajutorul osciloscopurilor:

Tensiunea poate fi măsurată cu ajutorul intrărilor(canalelor). Intervalul de măsurare poate fi


ajustat cu ajutorul switch-lor.

4.1.2 Declanşarea:

Declanşarea înseamnă eliberarea unui proces. Declanşarea corectă este necesară pentru a
obţine model fix pentru măsurarea semnalului. Declanşarea este selectată prin intermediul unui

44
comutator pentru a trece pe respectivele canale. Există, de asemenea un osciloscop cu un supliment
extern de declanşare pe intrare. Dupa ce procesul de reprezentare al semnalului s-a finalizat, există o
pauză până când semnalul măsurat va avea aceeaşi direcţie şi acelaşi nivel încă o dată. Declanşarea
nu se produce până când noul semnal nu este afişat din nou. Aceasta este realizată cu ajutorul unui
generator de timp de bază.

4.1.3. Măsurarea cu ajutorul osciloscopului în RobotinoView:

Trei valori de intrare(canale) pot fi vizualizate cu osciloscopul. Această funcţie bloc a fost
modelată pe un osciloscop cu memorie digitală.
Cu toate acestea, în afară de tensiune, diferite variabile pot fi afişate şi măsurate în funcţie de
timp utilizând osciloscopul în RobotinoView. Aceasta, de asemenea, este efectuată prin intermediul
intrărilor(canalelor). În RobotinoView canalele sunt desemnate cu Ch1-Ch3.
Aceasta permite citirea duratei ciclului variabil respectiv(viteză, intensitatea curentului,
tensiune, etc.) în functie de valoarea reală sau iniţială aplicată la intrările osciloscopului.

4.1.4. Parametri:
Setările canalelor(Ch1-Ch3):
 Scalare pe axa y;
 Poziţionare în 0 pe axa y;
 Definirea condiţiilor de declanşare: creşterea, micşorarea marginii;
 Poziţionarea de declanşare;
 Baza de timp.
Căsuţa de dialog al osciloscopului:

45
Element Descriere

1 Canalul 1
Deschide căsuţa de dialog pentru setarile canalelor
2 Canalul 2
1-3
3 Canalul 3

4 Deschide căsuţa de dialog pentru setările bazei de


Baza de timp
timp şi copierea afişării.

5 Afişarea în poziţia 0 Afişează poziţionarea în 0 a canalelor individual.

6 Scalează individual în orice direcţie(C0-C2) şi


Scalare
rezoluţia timpului.

Element Descriere

1 Canal(setări) Canalele pot fi activate sau dezactivate făcând un click pe simbol.

2 Poziţia-V Setează pozitia în 0 al canalului respectiv.

3 Scalare Setează scalarea pe Y(amplitudine) pe respectivul canal. Valoarea

46
afişată corespunde diferenţei numerice dintre liniile orizontale din grilă.
Unitatea de măsură depinde de variabilele ce urmează a fi măsurate, de
exemplu, dacă viteza este aplicată la intrarea 1 de la osciloscop aceasta
înseamnă că, căsuţa 1 din diagramă corespunde la 0.5s.

4 Declanşează poziţia pentru respectivul canal. Condiţii de declanşare:


Declanşare off, scăderea şi creşterea marginii. Deplasarea poziţiei de declanşare
(afişează poziţia de declanşare în partea dreapta a ecranului).

5 Setează baza de timp a canalelor. Valoarea afişată indică diferenţa de


Baza de timp
timp dintre liniile verticale din grilă.

6 Copiază afişările pe clipbord în forma bitmap pentru folosirea în alte


Clipbord
programe.

Exemple pentru setarea canalelor:

Setările bazei de timp:

47
1- Scalare- definirea bazei de timp pentru toate canalele. O casuţă pentru direcţia pe x
corespunde valorii setate. Minim: 20ms, maxim: 500s.

4.2. Segmentatorul:

Descriere:

Funcţia bloc Segmenter identifică zonele de aceeaşi culoare dintr-o imagine şi oferă
posibilitatea de a defini culorile necesare.
Segmentatorul procesează o imagine furnizată de webcam. O imagine fixă este selectată de la
cameră făcând un click pe simbolul camerei(1) din căsuţa de dialog al funcţiei bloc. Folosind
pătratul (2) sau instrumentul de selecţie circular(4), intervalul de culoare dorit este evidenţiat prin
marcarea intervalului de selecţie(9) prin intermediul apăsării butonului de jos al mouse-lui. Mai
multe segmente de culoare pot fi transferate în listă sau eliminate(6), sau schimbarea ordinii(7,8).
Butonul(2) permite estomparea zonei asociată unui segment.

48
Pentru a optimiza captura unui segment din zonă, acesta poate fi modificat prin schimbarea
intensităţii pixelilor sau comutând ON sau OFF canalul individual al imaginii(1) făcând click pe
segmentul dorit şi utilizând o continuare a dialogului. Afişarea segmentului capturat trebuie comutat
pe ON pentru aceste setări astfel încât rezultatul procesului de stabilire poate fi verificat.

În cazul în care setarea originală de la RobotinoView este utilizată, un segment(obiect), după


cum se arată în ilustraţia de mai jos este identificat.

În cazul în care canalul de albastru(B) este oprit şi intensitatea pixelilor utilizată pentru roşu(R)
şi verde(G) este crescută,aria realizată este virtualmente identică cu obiectul original din imaginea
provenită de la cameră.

49
Segmentele selectate şi ajustarea preciziei pot fi distorsionate la o astfel da mărime prin
modificări minore, luând în considerare condiţiile în care segmentul este dificil sau nu este
recunoscut. De multe ori este necesar pentru a realiza segmentarea din nou.

50
4.3. Extracţia de segmente:

4.3.1. Funcţia Segment Extractor:


Funcţia bloc Segment Extractor furnizează poziţia şi mărimea unui segment dintr-o imagine
segmentată anterior.

4.3.2. Intrări:

Segment Extractor are urmatoarele intrări:


 Imagine segmentată- imaginiea ce provine de la cameră este copiată cu informaţiile
segmentului;
 Selectarea segmentului- selectarea segmentului unde imaginea este examinată.
Segmentele sunt adresate cu ajutorul numerelor de la 1 la x. Trebuie ţinut seamă că această
secvenţă este bazată pe căsuţa de selecţie a segmentelor nu pe numere alocate de către
segmentator. Primul segment este setat prin intermediul numărului 1.
Numai în cazul în care această introducere nu este ocupată, poate fi selectat un segment prin
intermediul funcţiei bloc. Intrarea are proioritate faţă de funcţia bloc.

4.3.3 Ieşiri:

X- indică poziţia pe x a punctului de focalizare al segmentului în relaţia cu centrul imaginii. Y


indică poziţia pe y a punctului de focalizare al segmentului în relaţie cu centrul imaginii.
O valoare pozitivă indică o deviere la dreapta sau în sus, iar o valoare negativă indică devierea
către stânga sau în jos. Prin urmare, este foarte uşor să navigăm spre centrul imaginii. Zona de
rezultat indică dacă o arie de mărime mică a fost găsită. Mărimea mică a ariei segmentului este
definită în dialogul funcţiei bloc şi indică pixeli. Intrarea este 1 dacă segmentul corespunzător este
găsit în imaginea curentă. Dacă o arie suficient de mare nu este găsită, valoarea ieşirii este 0.

51
4.3.4 Funcţia bloc:

 Selectarea segmentului- selectarea segmentului de găsit dacă intrarea la Segment


Selection nu este ocupată;
 Mărimea minimă- numărul minim de pixeli(exemplu 200) pentru un segment care
trebuie extras.
Imaginea originală poate fi ştearsă făcând un click pe simbolul de cameră.

4.4. Funcţia IF:

Descriere:

În mai multe limbaje de programare funcţia IF este utilizată. Instrucţiunea IF este disponibilă
în formă de instrucţiune de selecţie altfel cunoscută ca instrucţiune pentru ramificarea programelor.
Instrucţiunea poate fi executată precum o funcţie pentru o condiţie specifică. Aceasta este folosită
pentru a reacţiona la anumite condiţii sau evenimente. Cea mai simplă instrucţiune IF este IF-
THEN(ramură simplă).
Exemplu:
IF X<0 THEN X:=-X>;
END_IF;
Dacă condiţia ce urmează după IF este adevarată, atunci instrucţiunile ce urmează după
THEN sunt executate. Dacă condiţia nu este îndeplinită, instrucţiunile nu sunt executate.
În RobotinoView, o funcţie IF poate fi realizată prin intermediul multiplicărilor matematice
simple.

Diagrama bloc de mai sus reprezintă o astfel de funcţie IF în RobotinoView. Dacă bara de
protecţie nu este activată, valoarea constantei BackWards este multiplicată cu 0 şi rezultatul de
asemenea tot cu 0. Cu toate acestea, în cazul în care bara de protecţie este activată, valoarea este
52
multiplicată cu 1, iar rezultatul multiplicării este -100. Sistemul omnidirecţional primeşte valoarea
constantei în formă de viteză de deplasare. Aceasta este aplicată atât timp cât bara de protecţie este
activată.
Această formă a funcţiei IF poate fi realizată doar cu semnale binare deoarece acestea
generează doar 1 şi 0.

4.5. Inversarea semnului unei valori:

4.5.1. Descriere:

Inversarea semnului unei valori este folosită, de exemplu, dacă trebuie folosită o singură
viteză sau direcţie de rotaţie constantă simultan pentru deplasarea înainte sau înapoi ale lui Robotino
sau pentru rotaţie către dreapta sau stânga. Acesta este modul prin care programul se schimbă,
simplifică, deoarece este nevoie doar de o constantă ce trebuie schimbată şi intrările incorecte sunt
eliminate omiţând semnul. De exemplu, dacă direcţia de rotaţie trebuie schimbată- deplasarea
înainte trebuie să devină deplasare înapoi- deci, doar semnul asociat constantei trebuie schimbat.

4.5.2. Inversarea semnului în RobotinoView:

Inversarea semnului în RobotinoView se face cu ajutorul unei multiplicări cu valoarea -1.


Două opţiuni sunt disponibile pentru aceasta.
În prima variantă, constanta „Rotational Speed” este multiplicată cu constanta „Minus Sign”,
care are valoarea -1. Dacă, în exemplul de mai jos, intrarea DI0 furnizează un semnal 1, valoarea
iniţială a vitezei pentru sistemul omnidirecţional este -10 şi execută rotaţia către dreapta. Dacă
intrarea DI2 furnizeaza un semnal 1, valoarea constantei „Rotational Speed” rămane neschimbată;
sistemul omnidirecţional primeşte o valoare pozitivă, iar Robotino se deplasează către stânga. Dacă
direcţia de rotaţie trebuie schimbată, valoarea constantei „Rotational Speed” trebuie doar să
primească semnul „-”.

53
În cea de-a doua variantă intrarea E2 este setată la -1 prin intermediul funcţiei bloc a
modulului de multiplicare „Sign Reversal”. Pentru a realiza acest lucru, funcţia y= trebuie selectată
în funcţia bloc de dialogului pentru intrarea E2 şi valoarea setată la -1. Această variantă oferă o
constanta de prisos şi un program, prin urmare, poate fi mai uşor de structurat.

54
4.6. Secvenţa de control:

4.6.1. Generaliţati:
Secvenţele de control sunt procese care se execută succesiv în mai mulţi paşi separaţi.
Trecerea de la o etapă la alta depinde de îndeplinirea condiţiilor. Principala caracteristică este aceea
că fiecare etapă este activată pe rând.
Avantajele secvenţelor de control sunt urmatoarele:
 Un program împărţit pe etape este mult mai transparent şi ca urmare mult mai
uşor de menţinut şi extins;
 Exemplele tipice de secvenţe de control sunt sistemele de maşini de control
pentru tehnologia producţiei sau sisteme de control în procesul de inginerie;
 Funcţii grafice( sau flux de diagrame) unde au fost introduse ca unelte pentru
facilitarea analizei şi reprezentarea secvenţelor.
Poziţia iniţială
Afişarea poziţiei

Condiţia de start

Către staţia din aval

Poziţia staţiei din aval

Scoaterea piesei

Piesă scoasă

Către magazie

Poziţia a 2-a a magaziei

Creare vid

Vid creat

Eliberare piesă

Piesă eliberată

Către staţia din aval

Poziţia staţiei din aval

Depozitare piesă 55
Stopare vid

Către magazie
Poziţia magaziei
4.6.2. Secvenţa de control în RobotinoView:

RobotinoView oferă posibilitatea de a lega diferite programe într-o secvenţă de program


unde programele individuale sunt tratate ca blocuri de funcţii. Fiecare subprogram trebuie să aibă
unul sau mai multe blocuri de funcţii pentru ieşiri. În plus, o funcţie bloc de start este necesară
pentru a demara secvenţa de program.
Fiecare subprogram are o intrare şi trei ieşiri(A, B, C). Acestea corespund ieşirilor funcţiilor
bloc folosite în diagrama bloc respectivă. Dacă ieşirea corespunzătoare este setată în subprogram,
subprogramul este terminat şi ieşirea corespunzătoare a subprogramului este setată. Dacă această
ieşire este conectată la intrarea unui subprogram ce urmează, acesta este executat. În acest fel
programele pot fi folosite precum bucle. De asemenea, se pot realiza remificări între programe
individuale.

56
5. Programarea în Visual C++:
5.1 Explicarea programului:

#ifndef _ROBOTINOCOM_H_
#define _ROBOTINOCOM_H_
#include <string>
#include <rtstar_interface.h>
class RobotinoComImpl;
#ifdef WIN32
#ifdef MAKEDLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
#else
#define DLLEXPORT
#endif
class DLLEXPORT RobotinoCom
{
public:
/**
NoError nu exista erori
ErrorConnectionRefused dacă conexiunea a fost refuzată
ErrorSocketSend dacă conexiunea la port a fost refuzată
ErrorSocketRead dacă citirea portului este eronată
ErrorImageServerCreat dacă crearea serverului imagine nu a fost realizată
ErrorImageServerBind dacă imaginea serverului nu este alipită la imagePort()
ErrorTimeout dacă Robotino nu a trimis decât câteva milisecunde
timeout()
ErrorConnectionBusy dacă Robotino este deja conectat la altcineva
ErrorClientCreate dacă crearea portului de client este refuzată
ErrorHostNotFound dacă căutarea unui DNS eşuează
ErrorUndefined eroare nedefinită
*/
typedef enum
57
{NoError,ErrorConnectionRefused,ErrorSocketSend,Error
SocketRead,ErrorImageServerCreate,ErrorImageServerBin
d,ErrorTimeout,ErrorConnectionBusy,ErrorClientCreate,
ErrorHostNotFound,ErrorUndefined,ErrorWinsock2Initial
ization} Error;
/**
QVGA: 320 x 240 pixel
VGA : 640 x 480 pixel
*/
typedef enum {QVGA,VGA,CustomResolution,ResolutionSize}
Resolution;
/**
HighCompression : comprimă imaginea la o calitate mai mică rezultând imagini jpeg mici

LowCompression : comprimă imaginea la o calitate mai mare rezultând imagini jpeg mari

*/
typedef enum
{HighCompression,LowCompression,NoCompression,Compres
sionSize} Compression;
typedef struct CameraParameters
{
Resolution resolution;
Compression compression;
unsigned char brightness;
unsigned char contrast;
bool autoWithBalance;
} CameraParameters;
/**
IdleState : nu este conectat
ConnectingState : după apelarea connectToHost(), dacă este conectat
connectToHost() trece cu success la ConnectedState altfel la IdleState
ConnectedState: :conectat
*/
typedef enum {IdleState,ConnectingState,ConnectedState}
State;
typedef void(*errorCb_t)( void* data, int error );
typedef void(*connectionClosedCb_t)( void* data );
typedef void(*connectedCb_t)( void* data );
typedef enum
{JPG,JPG2000,RAW,BMP,PNG,TIFF,UnknownImageType,ImageT
ypeSize} ImageType;
typedef struct ImageParameters
{
ImageParameters()
58
{
type = UnknownImageType;
resolution = CustomResolution;
width = 0;
height = 0;
numColorChannels = 0;
bitsPerChannel = 0;
}
ImageType type;
Resolution resolution;
unsigned int width;
unsigned int height;
unsigned char numColorChannels;
unsigned char bitsPerChannel;
} ImageParameters;

typedef struct Image


{
Image()
{
data = NULL;
dataSize = 0;
}
ImageParameters parameters;
unsigned char* data;
unsigned int dataSize;
unsigned int timestamp;
} Image;
RobotinoCom();
~RobotinoCom();

/**
Returnează adevarat dacă clientul este creat. */
Bool isValid() const;

/** Returnează starea actuală.*/


State state() const;

/** Iniţializează comunicarea. Prametrii funcţiei initWinsock2 nu are nici un efect asupra platformei
decât Windows */

bool init( bool initWinsock2 = true );


void setTimeout( unsigned int msecs );
unsigned int timeout() const;

59
/** Trimite valoarea curentă la Robotino apoi execută un blocaj recv().
Dacă resetAfterSend este adevarată, viteza motoarelor este setată la 0 dupa trimitere.
Dacă este corect rezultatul este adevarat, altfel fals. */
bool receiveIoStatus( bool resetAfterSend = true );

/**Trimite valoarea curentă la Robotino. Returnează adevărat dacă trimiterea a avut succes.* /
bool sendControlMessage() ;

/**Această funcţie de reapelare este apelată după ce connectToHost() a fost apelată şi o


conectarea a fost realizată. */
void setConnectedCallback( connectedCb_t, void* data );

/** Încearcă să realizeze o conexiune la gazda şi returnează imediat rezultatul.


Orice conexiune sau conexiune în aşteptare este închisă imediat.
Când conexiunea reuşeşte, trimite connected(). Funcţia isConnected() returnează rezultatul
adevarat de acum în colo.
Dacă există o eroare în orice moment, trimite error().
Gazda trebuie să fie o adresa IP în forma de sir. */
void connectToHost( std::string hostname );

/** După apelarea funcţiei stopAsyncCommunication() permite restartarea comunicaţiei asincrone.


Când este realizată funcţia connectToHost(), este emis un semnal de conectare, comunicarea
asincronă porneste. Acesta primeste un mesaj de status de la Robotino şi trimite un mesaj
KeepALive pentru a menţine conexiunea deschisă. * /
void startAsyncCommunication () ;

/** Prin oprirea comunicării asincrone, comunicarea rămâne la decizia noastra pentru a apela
receive() periodic.
De asemenea suntem responsabili pentru a trimite mesajul control sau KeepAlive.
Altfel conexiunea se v-a termina. */
Void stopAsyncCommunication() ;

/** Aceasta va închide Robotino.


Aceasta va merge cat timp isConnected() returnează valoarea adevărat. */
void setShutdown() ;

/** Aceasta funcţie este apelată atunci când conexiunea este închisă, după apelarea funcţiei close()
sau după ce o eroare a aparut .*/
void setConnectionClosedCallback( connectionClosedCb_t,void* data);

/** Închide orice conexiune imediat. */


Void close () ;
60
void setImagePort( unsigned int port );
unsigned int imagePort() const;

/** Blocheaza până când o imagine este primită sau dacă conexiunea este închisă.
Returnează adevarat dacă reuşeşte, altfel fals. */
Bool receiveImage () ;

/** Retrage ultimele imagini primite


Dacă este adevarat returnează un pointer imagine :: datele nu sunt 0.
Image :: dataSize este mărimea Image ::data.
Dacă nici o imagine nu este valabilă returnează Image ::data şi Image :: dataSize este 0.
Când reusim să obţinem o imagine trebuie să apelăm unlockImage(), după folosirea datelor. */
Const Image* lockImage () ;

/** Returnează imaginea obţinută dupa aplelarea funcţiei lockImage(). */


Void unlockImage () ;

/** Trimite robotului că suntem gata să primim imagini prin setarea cerinţelor adevărat.
Prin setarea cerinţelor la fals, Robotino nu mai transmite imagini. */
Void setImageRequest (bool request);

/** Setează rezoluţia camerei la res şi compresia la nivelul c.


Această va merge atât timp cât isConnected() returnează adevarat. */
void setCameraParameters( const CameraParameters& param);

/** Returnează parametrii setaţi de funcţia setCameraParameters(). */


CameraParameters cameraPrameters () const;

/** Salveaza imagine pe harddisck. Dacă extensia fişierului nu este dată, extensia este pusă automat
astfel încât valoarea imaginii să fie de genul : parameters.type. */
Bool saveImageToFile (const Image* image, const std::string& fileName);

/** Returnează numarul de motoare de la Robotino. */


Unsigned int numMotors() const;

/** Setăm acceleraţia motorului în rot/min. Motoarele sunt numerotate începand cu 0. Aceasta nu
ţine seama de setările precedente set/addVelocit pentru motor. */
Void setVelocity (unsigned int motor, float rpm);

/* Organizează setările sistemului de deplasare al robotului astfel încât sa meargă cu mm/s.


Setările din fabrică ale Robotino:
rb : distanţa din centru la centrul roţii
k : k=2*pi*rw*fctrl/(g*mer)
rw : raza roţii
fctrl : frecvenţa buclei de contol ce măsoară viteza
g : treapta de viteză
mer : rezoluţia encoderului motorului */

61
void setDriveLayout( double rb = 125.0f , double k =6.903f );
void getDriveLayout( double* rb, double* k );

/** Setează acceleraţia robotului:


vx : acceleraţia pe direcţia x, măsurata în mm/s
vy : acceleraţia pe direcţia y. Măsurată în mm/s
omega : acceleraţia unghiulară, măsurata în deg/s */
void setVelocity( double vx, double vy, double omega );

/** Acceleratia setată pentru motor este calculată ca valoarea medie a acceleraţiilor setate în functie
de prioritate .
Motoarele sunt numerotate începând cu 0. */
void addVelocity( unsigned int motor, float rpm, float priority );

/** Returnează, actualVelocity, valoarea actuală a acceleraţiei motorului primită de StatusMessage.


Dacă nu primim StatusMessage sau dacă nu este o conexiune operaţională cu Robotino,
returnează 0. */
float actualVelocity( unsigned int motor );
float motorTime( unsigned int motor );
void resetPosition( unsigned int motor, bool reset );
int position( unsigned int motor );
void resetMotorTime( unsigned int motor, bool reset );
void setBrake( unsigned int motor, bool on );

/** Setează controlerul PID direct proporţional cu valoarea motorului.


Motoarele sunt numerotate începând cu 0. */
void setKp( unsigned int motor, float value );
void setKd( unsigned int motor, float value );
void setKi( unsigned int motor, float value );

/** Această funcţie de reapelare este apelată după ce apare o eroare. Argumentele sunt datele şi
valoarea erorilor.
Dacă o conexiune este stabilită la apelarea connectionClosed() funcţia de reapelare este apelată
apoi. */
void setErrorCallback( errorCb_t, void* data );

/** Returnează eroarea de cod al ultimei erori. Valoarea este Error.


Eroarea este ştearsă automat de fiecare dată când este aplelată funcţia connectToHost(). */
Int error() const;

/** Setează ultima eroare ca şi cum nu ar fi. Apoi funcţia error() returnează NoError. */
void clearError();

/** Returnează descrierea în engleza a erorii. */


Static std::string errorString (int error);

/** Returnează adevărat dacă bara de protecţie a robotului este atinsă altfel fals. */

62
bool bumper () const;

/** Returnează numărul de senzori de distanţa ale Robotino */


unsigned int numDistanceSensors() const;
/** Returnează citirea senzorilor n de distanţă. Numerotarea senzorilor începe cu 1. Numarul
senzorilor se obţine cu numDistanceSensors() . */
Float distance(unsigned int n) const;

/**Returnează citirea brută a convertorului analog-digital numit adcname. */


unsigned int adc( std::string adcname ) const;

/** Dacă valoarea este falsă se setează ieşirea digitală la nivel low. Altfel ieşirea digitală la nivel
high. */
void setDigitalOutput( std::string name, bool value );

/** Setează ieşirea digitală n la low, dacă valoarea este falsă. Dacă valoarea este adevarată ieşirea
devine high. Canalele ieşiri sunt numerotate începând cu 0. */
void setDigitalOutput( unsigned int n, bool value );

/** Returnează adevărat, dacă intrarea digitală referite de nume este high.
Dacă intrarea este high, returnează fals. Dacă numele nu este găsit returnează fals. */
bool digitalInput (std::string name) const;

/** Returnează numarul convertoarelor analog-digital. */


unsigned int numADC() const;

/** Returnează numărul intrărilor digitale. */


unsigned int numDigitalInput() const;

/**Returnează numarul ieşirilor digitale. */


unsigned int numDigitalOutput() const;

/** Returnează frecvenţa updatată a liniei serial. */


unsigned int serialLineFrequency() const;
float current() const;
float voltageBatt1() const;
float voltageBatt1plus2() const;
/** Milisecunde de când obiectul Robotino a fost creat. */
unsigned int msecsElapsed() const;
void northStar( northStarData* rstar );
void setNorthStarRoomId( char roomId );
void setNorthStarCalState( unsigned char state );
void setNorthStarCalFlag( unsigned char flag );
void setNorthStarCalDistance( unsigned short dist );
private:
double _rb;
double _k;

63
RobotinoComImpl* _impl;
};
#endif
5.2 Programul final:

#ifndef _ROBOTINOCOM_H_
#define _ROBOTINOCOM_H_
#include <string>
#include <rtstar_interface.h>
class RobotinoComImpl;
#ifdef WIN32
#ifdef MAKEDLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
#else
#define DLLEXPORT
#endif
class DLLEXPORT RobotinoCom
{
public:
typedef enum
{NoError,ErrorConnectionRefused,ErrorSocketSend,Error
SocketRead,ErrorImageServerCreate,ErrorImageServerBin
d,ErrorTimeout,ErrorConnectionBusy,ErrorClientCreate,
ErrorHostNotFound,ErrorUndefined,ErrorWinsock2Initial
ization} Error;
typedef enum {QVGA,VGA,CustomResolution,ResolutionSize}
Resolution;
typedef enum
{HighCompression,LowCompression,NoCompression,Compres
sionSize} Compression;
typedef struct CameraParameters
{
Resolution resolution;
Compression compression;
unsigned char brightness;
unsigned char contrast;
bool autoWithBalance;
} CameraParameters;
typedef enum {IdleState,ConnectingState,ConnectedState}
State;
typedef void(*errorCb_t)( void* data, int error );
typedef void(*connectionClosedCb_t)( void* data );
typedef void(*connectedCb_t)( void* data );
typedef enum
{JPG,JPG2000,RAW,BMP,PNG,TIFF,UnknownImageType,ImageT
ypeSize} ImageType;
typedef struct ImageParameters
{
ImageParameters()
{
type = UnknownImageType;
resolution = CustomResolution;
width = 0;
height = 0;
64
numColorChannels = 0;
bitsPerChannel = 0;
}
ImageType type;
Resolution resolution;
unsigned int width;
unsigned int height;
unsigned char numColorChannels;
unsigned char bitsPerChannel;
} ImageParameters;
typedef struct Image
{
Image()
{
data = NULL;
dataSize = 0;
}
ImageParameters parameters;
unsigned char* data;
unsigned int dataSize;
unsigned int timestamp;
} Image;
RobotinoCom();
~RobotinoCom();
bool isValid() const;
State state() const;
bool init( bool initWinsock2 = true );
void setTimeout( unsigned int msecs );
unsigned int timeout() const;
bool receiveIoStatus( bool resetAfterSend = true );
bool sendControlMessage();
void setConnectedCallback( connectedCb_t, void* data );
void connectToHost( std::string hostname );
void startAsyncCommunication();
void stopAsyncCommunication();
void setShutdown();
void setConnectionClosedCallback( connectionClosedCb_t,void* data);
void close();
void setImagePort( unsigned int port );
unsigned int imagePort() const;
bool receiveImage();
const Image* lockImage();
void unlockImage();
void setImageRequest( bool request );
void setImageRequest( bool request );
void setCameraParameters( const CameraParameters& param);
CameraParameters cameraParameters() const;
bool saveImageToFile( const Image* image, const std::string& fileName );
unsigned int numMotors() const;
void setVelocity( unsigned int motor, float rpm );
void setDriveLayout( double rb = 125.0f , double k =6.903f );
void getDriveLayout( double* rb, double* k );
void setVelocity( double vx, double vy, double omega );
void addVelocity( unsigned int motor, float rpm, float priority );
float actualVelocity( unsigned int motor );
float motorTime( unsigned int motor );
void resetPosition( unsigned int motor, bool reset );
int position( unsigned int motor );
65
void resetMotorTime( unsigned int motor, bool reset );
void setBrake( unsigned int motor, bool on );
void setKp( unsigned int motor, float value );
void setKd( unsigned int motor, float value );
void setKi( unsigned int motor, float value );
void setErrorCallback( errorCb_t, void* data );
int error() const;
void clearError();
static std::string errorString( int error );
bool bumper() const;
unsigned int numDistanceSensors() const;
float distance( unsigned int n ) const;
unsigned int adc( std::string adcname ) const;
void setDigitalOutput( std::string name, bool value );
void setDigitalOutput( unsigned int n, bool value );
bool digitalInput( std::string name ) const;
unsigned int numADC() const;
unsigned int numDigitalInput() const;
unsigned int numDigitalOutput() const;
unsigned int serialLineFrequency() const;
float current() const;
float voltageBatt1() const;
float voltageBatt1plus2() const;
unsigned int msecsElapsed() const;
void northStar( northStarData* rstar );
void setNorthStarRoomId( char roomId );
void setNorthStarCalState( unsigned char state );
void setNorthStarCalFlag( unsigned char flag );
void setNorthStarCalDistance( unsigned short dist );
private:
double _rb;
double _k;
RobotinoComImpl* _impl;
};
#endif

66
5.3. Programe demonstrative:

1) Deplasarea pe direcţia înainte

#include <iostream>
#include <xtimer.h>
#include <robotinocom.h>
#include <xthread.h>
#include <fstream>
#define IPFILENAME "../../robotinoip.txt"
std::string getIpFromFile( std::string filename )
{
std::string ip;
std::ifstream is;
is.open( filename.c_str() );
if( is.is_open() )
{
is >> ip;
is.close();
}
else
{
ip = "127.0.0.1";
}
return ip;
}
void errorCb( void* data, int error )
{
std::cout << std::endl << "Error " << RobotinoCom::errorString( error ) <<
std::endl;
}
void connectedCb( void* data )
{
std::cout << std::endl << "Connected" << std::endl;
}
void connectionClosedCb( void* data )
{
std::cout << std::endl << "Connection closed." << std::endl;
}
int main(int argc, char **argv)
{
std::string hostname;
hostname = getIpFromFile( IPFILENAME );
RobotinoCom com;
XTimer timer;
if( false == com.init() )
{
return 1;
}
com.setErrorCallback( &errorCb, NULL );
com.setConnectedCallback( &connectedCb, NULL );
com.setConnectionClosedCallback( &connectionClosedCb, NULL );
std::cout << "Connecting to host " << hostname;
com.connectToHost( hostname );
while( com.state() == RobotinoCom::ConnectingState )
{
std::cout << ".";
67
XThread::msleep( 200 );
}
std::cout << std::endl;
if( com.error() != RobotinoCom::NoError )
{
goto CLEANUP;
}
timer.start();
while( false == com.bumper() )
{
if( timer.msecsElapsed() < 10000 )
{
//se deplasează înainte cu 100mm/s
com.setVelocity( 100, //vx=100 mm/s
0, //vy=0 mm/s
0 //omega=0 deg/s
);
}
else
{
break;
}
//returnează valorile setate şi primeşte citirea senzorilor
if( com.receiveIoStatus() == false )
{
break;
}
}
CLEANUP:
com.close();
return 0;
}

2) Deplasare urmărind o rută predefinită:

#ifdef GUI
#include <cv.h>
68
#include <highgui.h>
#endif
#include <stdlib.h>
#include <iostream>
#include <rvjpeg.h>
#include <xthread.h>
#include <rvlinedetector.h>
#include <robotinocom.h>
#include <fstream>
#define IPFILENAME "../../robotinoip.txt"
#define OMEGAMAX 40
#define VX 100
unsigned int timestampOfLastImage = 0;
std::string getIpFromFile( std::string filename )
{
std::string ip;
std::ifstream is;
is.open( filename.c_str() );
if( is.is_open() )
{
is >> ip;
is.close();
}
else
{
ip = "127.0.0.1";
}
return ip;
}
void errorCb( void* data, int error )
{
std::cout << std::endl << "Error " << RobotinoCom::errorString( error ) <<
std::endl;
}
void connectedCb( void* data )
{
std::cout << std::endl << "Connected" << std::endl;
}
void connectionClosedCb( void* data )
{
std::cout << std::endl << "Connection closed." << std::endl;
}
int main( int argc, char** argv )
{
std::string hostname;
hostname = getIpFromFile( IPFILENAME );
RobotinoCom::Image rawImage;
#ifdef GUI
IplImage* src = NULL;
IplImage* gray = NULL;
#endif
RobotinoCom com;
RVJpeg rvjpeg;
RVLineDetector lineDetector;
RobotinoCom::CameraParameters param = com.cameraParameters();
unsigned int i = 0;
int thres = 5000;
int lineX = 0;
69
int omega = 0;
if( false == com.init() )
{
return 1;
}
com.setErrorCallback( &errorCb, NULL );
com.setConnectedCallback( &connectedCb, NULL );
com.setConnectionClosedCallback( &connectionClosedCb, NULL );
#ifdef GUI
cvNamedWindow("Live Image",1);
cvNamedWindow("Gray Image",1);
cvCreateTrackbar( "Threshold", "Gray Image", &thres, 20000, NULL );
#endif
std::cout << "Connecting to host " << hostname;
com.connectToHost( hostname );
while( com.state() == RobotinoCom::ConnectingState )
{
std::cout << ".";
XThread::msleep( 200 );
}
std::cout << std::endl;
if( com.error() != RobotinoCom::NoError )
{
goto CLEANUP;
}
std::cout << "Press q to quit." << std::endl;
com.setImageRequest( true );
param.compression = RobotinoCom::LowCompression;
param.resolution = RobotinoCom::QVGA;
com.setCameraParameters( param );
#ifdef GUI
while( 'q' != cvWaitKey( 1 ) )
#else
while( false == com.bumper() )
#endif
{
if( timestampOfLastImage > 0 )
{
if( com.msecsElapsed() - timestampOfLastImage < 500 )
{
if( lineX != -1 )
{
omega = -lineX + rawImage.parameters.width / 2;
if( omega < 20 && omega > -20 )
{
omega = 0;
}
if( omega > OMEGAMAX )
{
omega = OMEGAMAX;
}
if( omega < -OMEGAMAX )
{
omega = -OMEGAMAX;
}
}
else
{
70
if( omega > 0 )
{
omega = OMEGAMAX;
}
else
{
omega = -OMEGAMAX;
}
}
std::cout << omega << std::endl;
if( 0 == omega )
{
com.setVelocity( VX, 0, omega );
}
else
{
com.setVelocity( 0, 0, omega );
}
}
}
if( com.receiveIoStatus() == false )
{
break;
}
const RobotinoCom::Image* image = com.lockImage();
if( image != NULL )
{
timestampOfLastImage = image->timestamp;
unsigned int width = 0;
unsigned int height = 0;

if( RobotinoCom::JPG == image->parameters.type )


{
if( rvjpeg.setDecodeSource( image->data, image->dataSize ) )
{
rvjpeg.sourceImageSize( &width, &height );
}
}
else if( RobotinoCom::RAW == image->parameters.type )
{
width = image->parameters.width;
height = image->parameters.height;
}
if( 0 != width && 0 != height )
{
if( rawImage.parameters.width != width || rawImage.parameters.height !=
height )
{
delete [] rawImage.data;
rawImage.data = new unsigned char[width*height*3];
rawImage.dataSize = width*height*3;
rawImage.parameters.width = width;
rawImage.parameters.height = height;
}

#ifdef GUI
CvSize size;
size.width = width;
71
size.height = height;
if( NULL != src )
{
if( src->width != width || src->height != height )
{
cvReleaseImageHeader(&src);
cvReleaseImageHeader(&gray);
src = cvCreateImageHeader( size, IPL_DEPTH_8U, 3 );
gray = cvCreateImageHeader( size, IPL_DEPTH_8U, 1 );
}
}
else
{
src = cvCreateImageHeader( size, IPL_DEPTH_8U, 3 );
gray = cvCreateImageHeader( size, IPL_DEPTH_8U, 1 );
}
#endif
if( RobotinoCom::JPG == image->parameters.type )
{
rvjpeg.setDestination( (char*)rawImage.data, rawImage.dataSize,
RVJpeg::BGR );
rvjpeg.decode();
}
else if( RobotinoCom::RAW == image->parameters.type )
{
memcpy( (void*)rawImage.data, (const void*)image->data, image-
>dataSize );
}
com.unlockImage();

lineDetector.doSobel( (const unsigned char*)rawImage.data,


rawImage.parameters.width, rawImage.parameters.height, thres );
lineX = lineDetector.findLine( lineDetector.height() - 40,
lineDetector.height() - 5, true );
#ifdef GUI
cvSetData( src, rawImage.data, rawImage.parameters.width * 3 );
cvSetData( gray, lineDetector.sobelImage(), lineDetector.width() );
if( lineX != -1 )
{
CvPoint p1;
p1.x = lineX - 2;
p1.y = gray->height - 5 ;
CvPoint p2;
p2.x = lineX + 2;
p2.y = gray->height - 1;

cvRectangle( gray, p1, p2, cvScalar(200) );


}
cvShowImage("Live Image",src);
cvShowImage("Gray Image",gray);
#endif
}
}
}

CLEANUP:
#ifdef GUI
cvReleaseImageHeader( &src );
72
cvReleaseImageHeader( &gray );
cvDestroyWindow("Live Image");
cvDestroyWindow("Gray Image");
#endif
delete [] rawImage.data;
return 0;
}

6. Concluzii:

Robotino este un sistem mecatronic mobil operaţional performant cu acţionare


omnidirecţionala, care poate să se deplaseze în toate direcţiile datorită celor trei unităţi de antrenare
73
şi poate de asemenea să se rotească în jurul propriei axe. Este prevazut cu o cameră video şi cu mai
multe tipuri de senzori (analogici pentru măsurarea distanţelor, binari pentru evitarea coliziunilor,
numerici pentru controlul vitezei, etc), care permit astfel sistemului să răspundă tututror exigenţelor.
Robotino poate fi utilizat direct sau cu comanda de la calculator, prin intermediul unei cartele
pe care se regăsesc mai multe aplicaţii demonstrative şi sistemul de operare Linux. Programarea
robotului poate fi realizată de la un calculator cu ajutorul software-ului RobotinoView, prin
intermediul unei reţele wireless. RobotinoView asigură transmiterea semnalelor la sistemele de
comandă ale motoarelor, afişează şi modifică informaţiile primite de la senzori. Robotino mai poate
fi programat şi în Linux sau C++. Camera video permite afişarea şi exploatarea imaginilor live prin
intermediul software-ului RobotinoView. De asemenea pot fi implementate aplicaţii pentru
urmărirea unei traiectorii sau a unui obiect.
Robotino este un robot autonom. Numeroşii senzori, camera video şi un controler performant
îi asigură sistemului “inteligenţa” necesară. Controler-ul poate fi accesat direct prin wireless.
Programat corect, Robotino finalizează în mod automat sarcinile trasate. O interfaţă E/S permite
conectarea de senzori şi actuatoare adiţionale.
Unul din obiectivele esenţiale ale Roboticii este elaborarea roboţilor autonomi. Asemenea
roboţi ar putea accepta o descriere naturală - formală - (de nivel înalt) a sarcinilor de îndeplinit şi
executarea comenzilor fără alte intervenţii umane. Descrierile necesare vor preciza ce doreşte
utilizatorul şi nu cum să execute comenzile. Roboţii capabili să îndeplinească aceste operaţii vor fi
dispozitive mecanice versatile, echipate cu senzori de perceperea a mediului şi aflate sub controlul
unui sistem de calcul.
Progresul roboţilor autonomi prezintă un interes major într-o plajă mare de domenii de
aplicaţii incluzând diversele procese tehnologice, construcţiile, procesarea deşeurilor, explorarea
spaţiului, oceanelor şi a zonelor de risc ridicat, medicină, asistenţa persoanelor cu handicap, etc.
Dezvoltarea tehnologiilor necesare este o sarcină extraordinară cu implicaţii în multe domenii ca
acelea al senzorilor, inteligenţei artificiale, sistemelor de calcul, planificării traiectoriei, procesării
semnalelor, controlului motoarelor, electronicii, ştiinţei calculatoarelor. Orientarea într-un mediu
total necunoscut, folosind senzori pentru detectarea obstacolelor şi comunicaţia cu un calculator
aflat la distanţă sunt două aspecte importante care trebuie luate în considerare atunci când lucrăm cu
un robot mobil. Capacitatea roboţilor de a “simţi” mediul înconjurător şi de a-şi schimba
comportamentul pe baza informaţiilor din mediu este ceea ce face ca roboţii, mai ales cei mobili, să
fie atât de interesant de construit şi utilizat. Fără senzori, roboţii nu ar putea executa altceva decât
sarcini fixate dinainte, repetând operaţiile ce le are de realizat iar şi iar, dar dotaţi cu senzori, roboţii
au capacitatea de a face mult mai mult decât atât.
Domeniul roboţilor mobili s-a dezvoltat foarte mult în ultimii ani având în prezent aplicaţii în
majoritatea domeniilor de activitate. Spre deosebire de roboţii instalaţi în puncte fixe care pot lucra
într-un spaţiu limitat, roboţii mobili au capacitatea de a opera într-un spaţiu ce depăşeşte cu mult
dimensiunile proprii. În cazul general, un robot mobil este un vehicul dotat cu un anumit grad de
autonomie capabil să execute o clasă de sarcini utile. Astfel aceştia pot îndeplini sarcini de convoiaj,
transportând obiecte între posturi de depozitare şi de lucru ndepărtate, de explorare, furnizând
informaţii despre mediul de lucru în care acţionează prin intermediul unor organe de percepţie,
sarcini de recoltare, fiind capabili să localizeze şi să culeagă obiecte îndepărtate, şi pot chiar
74
interveni, realizând operaţii asupra obiectelor aflate la distanţă Intervenţia sepoate face în ederea
manipulării, a organizării locului de muncă şi ca operaţie de salvare sau înlăturare de diferite obiecte
în medii dificile.
Robotul mobil este un sistem complex care poate efectua diferite activităţi într-o varietate de
situaţii specifice lumii reale. El este o combinaţie de dispozitive echipate cu servomotoare şi senzori
(aflate sub controlul unui sistem ierarhic de calcul) ce operează într-un spaţiu real, marcat de o serie
de proprietăţi fizice (de exemplu gravitaţia care influenţează mişcarea tuturor roboţilor care
funcţionează pe pământ) şi care trebuie să planifice mişcările astfel încât robotul să poată realiza o
sarcină în funcţie de starea iniţială a sistemului şi în funcţie de informaţia apriori existentă, legată de
mediul de lucru. Succesul în îndeplinirea acestor sarcini depinde atât de cunoştinţele pe care robotul
le are asupra configuraţiei iniţiale a spaţiului de lucru, cât şi de cele obţinute pe parcursul evoluţiei
sale.
Problemele specifice ce apar la roboţii mobili ar fi următoarele: evitarea impactului cu
obiectele staţionare sau în mişcare, determinarea poziţiei şi orientării robotului pe teren, planificarea
unei traiectorii optime de mişcare.
Aplicaţiile tipice ale roboţii mobili sunt următoarele:
• intervenţie în cazul unui accident nuclear,
• explorarea planetelor,
• vehicule ghidate automat (robocare) în cadrul întreprinderilor etc. .
Dintre roboţii mobili, cei care se deplasează pe şenile sau roţi cu pneuri sunt folosiţi tot mai
mult pentru executarea unor lucrări speciale, cu grad mare de pericol pentru operatorul uman, dintre
care se menţionează: manipularea şi neutralizarea muniţiilor neexplodate; executarea unor culoare
prin câmpurile de mine; cercetarea autovehiculelor, trenurilor, aeronavelor şi a clădirilor, urmată de
neutralizarea dispozitivelor explozive descoperite în aceste vehicule. În vederea executării unor
astfel de operaţii, roboţii mobili sunt echipaţi cu dispozitive speciale ca: aruncător de flăcări,
detectoare de explozivi, disruptoare, cleşti etc..

7.Bibliografie:

75