Documente Academic
Documente Profesional
Documente Cultură
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.
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.
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.
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ă.
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ă.
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.
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.
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.
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.
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.
● 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.
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.
● Î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.
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
●Şasiu:
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.
● 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:
● Circuitul de intrare-ieşire:
● Alimentarea:
● 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.
● Codificator incremental:
● 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:
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:
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.
Software-ul execută sub un sistem de exploatare Windows unde ecranul este descris prin fig.
6.
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.
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
Obiectul detectat
Direcţia
de deplasare
Direcţia
de deplasare
17
Deplasare cu rotaţie
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ă.
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.
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.
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.
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
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.
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.
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”.
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”.
Î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.
27
3.4.1 Caracteristici generale:
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ă
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.
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
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.
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)
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:
32
Emitor/Receptor(1) Suprafaţa de reflexie(2)
33
Corect(1) Incorect(2)
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ă.
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ă.
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.
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ă.
Arii de aplicaţie:
Protecţia la îmbinare
38
3.8. Webcam:
Descriere:
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.
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.
42
Element Descriere
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:
43
Semnificaţia generatoarelor şi efectele acestora asupra vitezei rotaţionale a motoarelor:
Comportamentul
Tipul Simbol Semnificaţie
vitezei rotaţionale
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:
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ă.
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
Element Descriere
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.
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 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.2. Intrări:
4.3.3 Ieşiri:
51
4.3.4 Funcţia bloc:
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.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.
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
Scoaterea piesei
Piesă scoasă
Către magazie
Creare vid
Vid creat
Eliberare piesă
Piesă eliberată
Depozitare piesă 55
Stopare vid
Către magazie
Poziţia magaziei
4.6.2. Secvenţa de control în RobotinoView:
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;
/**
Returnează adevarat dacă clientul este creat. */
Bool isValid() const;
/** Iniţializează comunicarea. Prametrii funcţiei initWinsock2 nu are nici un efect asupra platformei
decât Windows */
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() ;
/** 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 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);
/** Blocheaza până când o imagine este primită sau dacă conexiunea este închisă.
Returnează adevarat dacă reuşeşte, altfel fals. */
Bool receiveImage () ;
/** 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);
/** 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);
/** 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);
61
void setDriveLayout( double rb = 125.0f , double k =6.903f );
void getDriveLayout( double* rb, double* k );
/** 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 );
/** 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 );
/** Setează ultima eroare ca şi cum nu ar fi. Apoi funcţia error() returnează NoError. */
void clearError();
/** Returnează adevărat dacă bara de protecţie a robotului este atinsă altfel fals. */
62
bool bumper () 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;
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:
#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;
}
#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;
#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();
CLEANUP:
#ifdef GUI
cvReleaseImageHeader( &src );
72
cvReleaseImageHeader( &gray );
cvDestroyWindow("Live Image");
cvDestroyWindow("Gray Image");
#endif
delete [] rawImage.data;
return 0;
}
6. Concluzii:
7.Bibliografie:
75