I UTILIZAREA SISTEMELOR MECATRONICE ÎN EDUCAȚIE [310295]

[anonimizat] „robot” a devenit unul obișnuit pentru un număr mare de oameni. O persoană medie interacționează zilnic cu diverse sisteme robotice sau cu produsele care au fost create utilizând acestea.

[anonimizat]. [anonimizat], [anonimizat] o [anonimizat] o serie de acțiuni determinată precum domeniul industrial de producere etc. În ultimii ani un interes sporit este pentru roboții mobili care nu sunt fixați și care se pot deplasa liber prin spațiul înconjurător. Acest tip de roboți permit o [anonimizat]. Sistemul educațional modern este încă de demult familiar cu noțiunea de ”roboți educaționali”, în alte cuvinte un mediu educațional în care oamenii sunt motivați cu creții care au caracteristici asemănătoare cu cele ale oamenilor sau animalelor. [anonimizat]. Odată cu intrarea omenirii în cea de-a [anonimizat].

Teza de licență este dedicată dezvoltării unei platforme de rulare și testare a aplicațiilor pe sistemul robotic mobil Robotino de la compania Festo Didactic. Această platformă va fi în special utilă domeniului educațional. [anonimizat] o cercetare a posibilităților de aplicare în educație a [anonimizat].

I UTILIZAREA SISTEMELOR MECATRONICE ÎN EDUCAȚIE

1.1 Introducere în robotică și mecatronică

1.1.1 [anonimizat], [anonimizat] o serie de acțiuni dirijate. Un robot mai poate fi definit ca o mașină, în special una programabilă de un computator care este capabilă să efectueze automat o serie de acțiuni complexă. Știința care studiază roboții se numește Robotica. [anonimizat] a roboților în scopul înlocuirii parțiale sau totale a [anonimizat].

Istoria roboticii își are originea în lumea antică. [anonimizat], indiană și chineză. Conceptul modern al roboților a început să se dezvolte odată cu debutul Revoluției Industriale care a permis utilizarea în producție a mecanicii complexe și ulterior a electricității.

Pentru prima dată cuvântul robot a fost utilizat de către Karel Čapek în lucrarea sa ”Roboții universali ai lui Rossum”, publicată în anul 1921[2]. În această lucrare el utilizează noțiunea de robot. Cuvântul robot a parvenit de la cuvântul ceh rabota ce se traduce ca muncă forțată. O altă persoană notorie care a contribuit la popularizarea termenului de robot în masele populare poate fi considerat Isaac Asimov. Povestea scurtă ”Mincinosul!”(eng. ”Liar!”) publicată în 1941 de către Asimov se consideră prima lucrară literară care utilizează cuvântul robotică[3].

Primele utilizări ale roboților moderni se atestă în industria anilor 60-70 ai secolului trecut. Acești roboți constituiau mașini fixate simple capabilă să execute o singură sarcină, ceea ce permitea reducerea numărului de oameni necesari la producție. Roboții industriali controlați digital și roboții care utilizează inteligența artificială au început să fie construiți începând din anii 2000.

Roboții și sistemele robotice pot fi clasificați după diverse criterii:

Clasificarea după generația tehnologică

Roboți meniți pentru efectuarea unei secvențe prestabilite de acțiuni

Roboți senzoriali la care secvența de acțiuni îndeplinite depinde de informația captată de senzori sau cameră de luat vederi

Roboți adaptivi, care se pot adapta mediului înconjurător pe baza informației captate de senzori

Roboți inteligenți care utilizează sistem de inteligență artificială pentru a luarea deciziilor

Clasificarea după părțile mobile ale roboților

Roboți de tip manipulator care pot mișca o parte a lor în spațiu

Roboți mobili care se pot deplasa în spațiu

Clasificarea după domeniul de aplicare

Roboți industriali

Roboți militari

Roboți spațiali

Roboți medicali

Roboți de divertisment

Roboți educaționali

În prezent, domeniul care a avut cel mai mult de câștigat pe baza utilizării roboticii este domeniul industrial. Roboții sunt potriviți ideal acestui domeniu fiind capabili să efectueze munca umană de o calitate mai mare cu o precizie mai mare reducând astfel numărul de oameni implicați în producție, reducând astfel costurile. Roboții medicali cunosc o dezvoltare majoră în ultimul deceniu. În prezent un robot de tip DaVinci poate efectua operații medicale cu o precizie mult superioară capacităților umane. Așa companii ca Boston Dynamics și Festo cercetează extensiv domeniul roboților bionici inspirând-se de la mecanismele existente în natură pentru a crea roboți care au caracteristici animale precum capacitatea de a merge. Industria militară cercetează domeniul roboticii pentru a înlocui oamenii în locurile cele mai periculoase de pe câmpul de luptă astfel reducând numărul de leziuni umane.

Bazele mecatronicii

Robotica este considerată ca fiind o subramură a mecatronicii. Noțiunea de mecatronică a fost inițial propusă în anul 1969 de către un angajat al companiei Yasakawa Electric Company care definea cuvântul mecatronică drept o combinație dintre cuvintele meca ceea ce înseamnă mecanism și tronică ceea ce înseamnă electronică. Cu alte cuvinte, un sistem mecatronic este un sistem la care partea electronică este incorporată în partea mecanică la un nivel la care este imposibil de spus unde se finisează una și unde se începe alta. O definiție mai contemporană a noțiunii de mecatronică sugerată de către W. Bolton spune că un sistem mecatronic nu este doar o combinație dintre sistemul electric și mecanic și mai mult decât doar un sistem de control ci o integrare completă a tuturor acestora[2]. Totuși, nici până în prezent nu există o definiție clară și convenită asupra noțiunii de mecatronică în jurul căreia s-ar alinia dezvoltatorii și educatorii. Calea de dezvoltare a mecatronicii este redată în figura 1.

Figura 1.1 Evoluția mecatronicii[1]

Studierea sistemelor mecatronice poate fi divizată în următoarele arii de specialitate:

Modelarea sistemelor fizice

Senzori și actuatori

Semnale și sisteme

Calculatoare și sisteme logice

Software și achiziționarea datelor

Dezvoltarea mecatronicii este o etapă firească în dezvoltarea științei și strâns legată de evoluția automatizării. Noțiunea de automatizare a început să fie popularizată doar începând cu anii 40 de către antreprenorul american Henry Ford. Însă omul din cele mai vechi timpuri a tins să automatizeze procesele pe care le făcea obținând succese în acest scop chiar la etapele timpurii ale dezvoltării civilizației.

Aplicațiile timpurii ale sistemelor de control automată au apărut încă în Grecia antică odată cu dezvoltarea a mecanismelor de reglementare flotantă precum ceasul de apă a lui Ktesibos și lampa de petrol concepută de Philon. Tot în perioada Greciei antice, Heron din Alexandria a publicat cartea Pneumatica ce descria diferite mecanisme cu nivel pe apă folosind controlor de flotabilitate.

Pe parcursul secolelor 17 și 19 au fost inventate multe dispozitive care au contribuit esențial la dezvoltarea mecatronicii precum regulatorul de temperatură a lui Cornelis Drebbel din Polonia și regulatorul de presiune a lui Dennis Papin și a motorului cu aburi a lui Watt . Aceste succese timpurii au fost obținute prin intermediul intuiției, abilităților practice și persistenței. Următoarea etapă în evoluția automatizării a constat în dezvoltarea unei teorii al controlului automat. Utilizarea tot mai largă a electricității în această perioadă de asemenea a lăsat o amprentă în dezvoltarea automatizării și mecatronicii.

Dezvoltarea computatoarelor în a doua parte a anilor 60 a dus la formele primitive a sistemelor de control computerizate. S-a început dezvoltarea unei noi clase de produse care încorporau sistemele mecanice și electronice și le necesitau pe ambele pentru a funcționa. Compania Yasakawa Electric care deținea inițial dreptul de autor asupra noțiunii ”mecatronica”, luând în considerație utilizarea pe scară largă a termenului și-a abolit drepturile de autor asupra termenului de mecatronică. La sfârșitul anilor 1970 Societatea japoneză de promovare a industriei mașinilor a definit 4 categorii de sisteme mecatronice

Clasa 1. Produse în primul rând mecanice cu componente electronice încorporate pentru a spori funcționalitatea.

Clasa 2. Sisteme mecanice tradiționale cu dispozitive interne semnificativ actualizate ce incorporează componente electronice

Clasa 3. Sisteme ce rețin funcționalitatea sistemelor mecanice tradiționale însă mecanismele interne sunt înlocuite cu componente electronice

Clasa 4. Produse concepute cu tehnologii mecanice și electronice prin integrare sinergică.

Ulterior, în această lucrare noțiunile de robot și sistem mecatronic vor fi utilizate interschimbabil.

Utilizarea sistemelor robotice și mecatronice în educație

Mai mulți cercetători consideră că în prezent omenirea trece prin cea de-a patra revoluție industrială. Această etapă a dezvoltării umanității se caracterizează prin utilizarea excesivă a tehnologiilor care șterg liniile dintre lumea fizică și biologică de cea digitală. Este marcată printr-o serie de progrese tehnologice într-o serie de domenii precum robotica, calculul cuantic, biotehnologia, IoT(Internet of Things), IIoT(Industrial Internet of Things), tehnologiile wireless, imprimarea 3D, vehicule complet autonome și altele. În prezent în majoritatea instituțiilor de învățământ se utilizează metoda clasică de predare a informației, metoda orientată spre teorie, în care persoanei se transmit cunoștințe finale. Această metodă nu este sustenabilă pentru realitățile contemporane în care nivelul de informație este într-o creștere permanentă. Sistemul educațional contemporan este necesar să se adapteze condițiilor noi, dezvoltând în persoanele implicate în procesul de învățământ capacități de analiză și prelucrare a informației precum și capacități de a o utiliza cât mai efectiv, astfel contribuind la succesul acestora în lumea contemporană. Cercetările din ultimii ani arată că aplicarea sistemelor mecatronice și robotice în educație pot spori procesul de învățare și să atragă un număr mai mare a persoanelor în domeniul IT și înspre disciplinele de inginerie în general.

Sistemul de învățământ contemporan este de mai mult timp familiar cu termenul de ”roboți educaționali” adică un mediu de învățământ în care oamenii sunt motivați cu creații care au caracteristici similare cu cele ale oamenilor sau animalelor. Roboții educaționali sunt în special utilizate pentru a ajuta utilizatorii să dezvolte abilități practice, didactice, cognitive și motorii. Aplicarea a unui astfel de sistem schimbă metodele de predare tradițională și a rolului actorilor în acest proces. În acest model, în schimbul transferului tradițional de informații, elevul însăși este nevoit să captureze informația prin intermediul interacțiunii acestuia cu mediul. Pentru ca un astfel de model de învățământ să aibă succes este nevoie de exemple selectate cu grijă și un mediu de lucru prietenos care ar putea influența pozitiv asupra interesului și motivației lor și astfel ar stimula participarea mai activă în procesul de învățământ.

În ultimul ani se atestă o creștere a numărului de cursuri de mecatronică propusă de către instituțiile de învățământ superior. Elaborarea unui program educativ mecatronic nu este o sarcină ușoară, fiind necesară găsirea echilibrului dintre înțelegere profundă a tehnologiilor de bază și abilitatea de a dezvolta soluții noi utilizând aceste cunoștințe. Un sistem de educație mecatronic ar trebuie să promoveze ca inginerul să pună un accent mai mare asupra capacității de a lucra între diferite domenii ale tehnologiei. Acest lucru nu înseamnă că aprofundarea într-un singur domeniu este greșită ci doar că o asemenea aprofunzime este echilibrată de o înțelegere și apreciere a contribuțiilor altor domenii ale tehnologiei. Un sistem de educație mecatronic balansat trebuie prin urmare să asigură că persoana beneficiază de o profunzime suficientă în cel puțin o zonă de tehnologie pentru ai permite să aducă o contribuție eficientă la acest domeniu, garantând totodată amploarea înțelegerii necesare pentru a-i da autoritate față de alți specialiști din domeniu.

1.3 Sisteme robotice existente pe piață

Există mai multe soluții mecatronice și robotice pe piață care pot fi utilizate în educație, atât educația preuniversitară și universitară cât și în educația de sine stătătoare. Diverse sisteme se pot axa pe diverse aspecte ale roboticii precum proiectarea și programarea independentă a funcțiilor robotului.

1.3.1 Lego Mindstorms

Una din cele mai cunoscute și utilizate sisteme robotice sunt sistemele Lego Mindstorms dezvoltate de către compania Lego. Compania Lego este prezentă de mai mulți ani pe piața sistemelor robotice în general și pe piața sistemelor robotice educaționale în particular. Primele prototipuri robotice ale companiei au apărut în anul 1987 când a fost elaborat primul block programabile al companie și a mediului de programare Lego/LOGO. Al doilea prototip a fost elaborat la mijlocul anilor 90 iar dispozitivul final a fost realizat în 1998.

Primele seturi robotice ale companie LEGO au fost seturile Robotics Invention System care se bazau în jurul blocului RCX(Robotic Command eXplorers) și perifericile 9V LEGO Technic disponibile la vremea respectivă. RCX se bază pe microcontrolerul de 8-biți Renesas H8/300 care includea 32KB de memorie ROM și 32KB de memorie RAM. Interfața RCX se programa utilizând o încărcarea programelor pe acesta utilizând o interfața dedicată infraroșu.

figura 1.2 Prima generație a blocului programabil Lego RCX[7]

LEGO Mindstorms NXT a fost un kit de robotică programabil lansat în Iulie 2006 cu scopul de a înlocui prima generație a sistemelor LEGO Mindstorm[7]. De asemenea această versiune a kit-ului dispunea de o versiune educațională menită special pentru utilizarea în învățământul școlar. A doua versiune a kit-ului LEGO Mindstorms a fost lansată pe 5 august 2009. Versiunea NXT 2.0 utiliza operațiile cu numerele flotante pe când versiunile anterioare utilizau operațiile cu numere întregi.

A treia generație al kit-ului LEGO Mindstorms este reprezentată de către LEGO Mindstorms EV3 lansată pe 1 septembrie 2013. EV3 este cel mai avansat kit robotic al companiei LEGO de până acum. Acesta poate boot-a un sistem de operare de pe o cartelă microSD ceea cei permite să utilizeze ev3dev, un sistem de operare bazat pe Debian. De asemenea sistemul EV3 poate fi controlat utilizând dispozitivele mobile.

Figura 1.3 Kit-ul programabil Lego Mindstorms EV3[7]

Kiturile LEGO Mindstorms se potrivesc ideal pentru utilizarea în educație. Formatul constructorului se potrivește ideal inițializării persoanelor în domeniul roboticii și programării, acesta fiind familiar persoanelor de orice vârstă. Kitul poate fi programat utilizând o multitudine de limbaje de programare disponibile atât în format textual cât și în format textual precum NXT-G, LeJOS, MonoBrick, c4ev3, ROBOTIC. Kitul poate fi utilizat și în cadrul învățământului superior pentru instruirea studenților din primii ani de universitate. Pentru studenții de la cursurile mai avansate kitul poate să le pară plictisitor și ar fi mai bine de utilizat alte sisteme robotice care ar implica cerințe mai mari din partea studentului.

1.3.2 Nao

Un alt sistem robotic popular utilizat în educație îl constituie robotul humanoid Nao dezvoltat de către compania franceză Aldebaran Robotics, în prezent SoftBank Robotics. Dezvoltarea robotului a început în 2004 odată cu lansarea proiectului Nao. Între anii 2005 și 2007 au fost elaborate 6 prototipuri ale robotului până când în martie 2008 nu a fost lansată versiunea de producere.

Nao este controlat de un procesor Intel Atom cu o frecvență de 1.91GHz. Diverse versiuni ale robotului au fost lansate cu 14, 21 și 25 de axe de libertate. Nao este compus din mai mulți senzori care îi permit să interacționeze cu mediul înconjurător precum accelerometru, girometru și patru senzori ultrasonici. Nao este controlat de un sistem de operare Linux specializat care se numește NAOqi care este utilizat pentru controlul sistemelor multimedia ale robotului precum cele 4 microfoane, 2 difuzoare și 2 camere HD. Robotul de asemenea vine cu set de aplicații care include un mediu de programare grafic denumit Choregraphe, uns packet software de simulare. În plus Nao este compatibil cu mediile de programare ale părților terțe precum Microsoft Robotics Studio, Cyberbotics Webots și Gostai URBI Studio. Nao poate fi programat utilizând diverse limbaje de programare precum C++, Python, Java, Matlab, Urbi, C, .Net. Utilizatorul se poate conecta la acesta utilizând interfața Ethernet sau Wi-Fi.

Robotul Nao este pe larg utilizat în mediul academic și științific. Începând cu 2011 peste 200 de instituții de învățământ din toată lumea utilizează robotul Nao. Spre sfârșitul anului 2105 peste 5000 de roboți Nao erau utilizate în instituțiile de învățământ a peste 70 de țări. Roboții Nao sunt utilizați pe larg în școli, colegii și universități pentru a preda și studiera interacțiunea om-robot . În 2012 roboții Nao au fost utilizați într-o școală din Regatul Unit pentru a preda copiilor cu deficiențe autiste. În mai multe școli din Regatul Unit Nao este utilizat pentru a introduce copiii în lumea roboților și a industriei robotice. În 2010 universitatea din Tokio a procurat peste 30 de roboți Nao cu scopul creării unui laborator pentru dezvoltarea roboților ca asistenți de laborator. Roboții Nao sunt pe larg utilizați în competițiile robotice internaționale precum RoboCup. În 2017 Nao a înlocuit robotul Aibo al companiei Sony în competiția de fotbal RoboCup Standart Platform League(SPL).

Figura 1.4 Robotul humanoid Nao

Nao este un sistem robotic mult mai avansat față de sistemele Lego Mindstorms. Nao poate fi utilizat cu succes atât în cadrul mediul educațional preuniversitar cât și universitar. Nao se potrivește ideal pentru inițializarea persoanelor în lumea roboticii și a industriei robotice în special a copiilor. Nao poate fi utilizat atât pentru introducerea studenților din cursurile inițiale cât și pentru studenții din cursurile mai avansate. Nao poate fi utilizat pentru cercetări științifice în mediul post universitar.

Robotino

Un alt sistem robotic utilizat în educație este Robotino dezvoltat de către compania Festo Didactic. Robotino este o platformă mobilă robotizată dotată cu o transmisie omnidirecțională care se utilizată în cercetare și educație. Robotino a fost conceput ca un robot constituit din componente mecanice și electronice de standart industrial. O astfel de abordare permite persoanelor care lucrează cu Robotino să primească o viziune mai clară asupra dispozitivilor uitilizate real în industrie. Există două versiuni ale robotului, versiunea standart și versiunea Premium. Versiunile se deosebesc înre ele prin componentele echipate.

Figura 1.5 Sistemul robotic Robotino

Robotino are la bază un sistem de direcție holomonic omnidirecțional de tip Kiwi. Sistemul este compus din 3 roți omnidirecționale la 120 de grade depărtare una față de alta. Fiecarii roți îi este asignat câte un motor de curent continuu. Pentru transmiterea vitezei motorului spre roți, o unitate de transmise cu rata de transmisie 32:1 este conectată între fiecare motor și roată. Pentru citirea vitezei motorului este utilizat un codificator incremental. Datele de la acesta sunt de asemenea utilizate pentru determinarea poziției în spațiu a robotului. Robotino este dotat cu două baterii de 12V reîncărcabile conectate în serie ce furnizează Robotino o alimintare de 24 V de Curent Continuu. Pe versiunea standart a robotului batariile instalate au o capacitate de 9.5 Ah fiecare.

Robotino are un sistem senzorial performant care poate fi utilizat în mai multe aplicații. Robotino este dotat cu 9 senzori infraroșu montați pe șasiul acestuia la distanța de 40 de grade unul față de celălalt. Pe modelul de bază senzorii infraroșii instalați pot detecta obiectele ce se află între 5 și 50 cm. distanță. Robotul este echipat cu o bandă de protecție în jurul șasiului care poate fi utilizată pentru oprirea robotului în cazul unei ciocniri cu un obstacol. Robotino este dotat cu o cameră de luat vederi de rezoluție înaltă care poate fi utilizată pentru captarea informației vizuale despre mediul înconjurător. Robotino are un giroscop intern care poate fi utilizat pentru mărirea preciziei de detectare a poziției.

Robotino oferă o gamă largă de interfețe care pot fi utilizate pentru conectare dispozitivelor adăugătoare. Robotino este dotat cu 6 porturi USB 2.0 la care pot fi conectate camera și adaptorul WLAN-USB. Extensii cum ar fi dispozitive de acționare și senzori pot fi conectate prin intermediul interfeței I/O de pe Robotino. Interfața include atât intrări și ieșiri digitale, intrări analogice și ieșiri releu, precum și conexiuni de alimentare. Robotino dispune de două intrări menite pentru conectarea unui motor și a unui encoder adăugător. Robotino dispune de sloturi PCI express care permit instalarea cardurilor de extensie precum placă video și plăci de memorie RAM sau SSD. Robotino posedă o interfață VGA la care poate fi conectat un monitor pentru accesul sistemului de operare de pe acesta.

La baza lui Robotino se află o placă de format PC104. Pe versiunea de bază este instalată o placă de model PC SOM-6763 B1 cu un procesor de model Intel Atom D525 iar pe versiunea Premium o placă de model PC SOM-5788 cu un procesor de model Intel Core I5-520E dezvoltate de către compania Advantech. Datele de la senzori, inclusiv datele de la codificatoarele incrementale conectate la motoare sunt citite și prelucrate de către placa EA09. PC104 comunică cu EA09 prin intermediul unei intermediul interfeței RS232. Prin intermediul acestei conexiuni pot fi accesate datele privind conectoarele I/O, senzorii de administrare a bateriilor și multe altele. De asemenea, în mod normal această legătură va fi utilizată pentru setarea valorilor de referință a codificatoarelor incrementale. Placa EA09 poate fi controlată și direct utilizând interfața Ethernet prin intermediul datagramelor UDP.

Figura 1.6 Comunicarea dinre EA09 și PC104[3]

Robotino este controlat de către un sistem de operare bazat pe Ubuntu bootabil de pe un card de memorie MicroSD. Accesul la componentele Hardware ale robotului se efectuează prin intermediul librăriilor ROS(Robot Operating System). Robotino poate fi programat utilizând o varietate de limbaje de programare precum C/C++, Java, .Net, Python, Matlab, Robotino View.

Robotino este o soluție educațională bună pentru instituțiile de învățământ superior. Utilizând acest robot, studenții au o închipuire mai bună asupra domeniului roboticii industriale. Robotino oferă posibilitatea de a fi programat într-o varietate largă de limbaje de programare de nivel diferit de dificultatea ceea ce permite implicarea persoanelor cu diferit bagaj de cunoștințe. Un dezavantaj notoriu ce nu permite utilizarea în masă a acestui robot constituie prețul acestuia. Nu toate instituțiile de învățământ îți pot permite o investiție atât de costisitoare, în special în țările cu o economie mai puțin dezvoltată. De asemenea, lipsa documentației actuale și a suportului din partea comunității limitează utilizarea pe deplin a potențialului acestuia.

II METODOLOGIA ȘI TEHNOLOGIILE UTILIAZATE

Robotino View

Robotino View este un mediu de programare vizuală elaborat și menținut de către compania Robotics Equipment Corporations(REC GmbH), conceput în special pentru elaborarea și rularea algoritmilor de control pentru robotul mobil Robotino. Aplicația are o interfață grafică simplificată care împreună cu utilizarea paradigmei de programare grafică facilitează introducerea persoanelor noi în programarea robotului, chiar și utilizatorilor fără o experiență a limbajelor de programare în spate. Robotino View este mediul de programare recomandat pentru a face cunoștință cu sistemul robotic Robotino, cu componentele Hardware ale acestuia și a posibilităților de interacțiune cu aceasta[6].

Pentru descrierea ulterioară a aplicației este nevoie de a introduce terminologia pe care aceasta o utilizează:

Bloc funcțional – cea mai mică unitate de funcții dintr-un subprogram. Combinarea a mai multor blocuri funcționale între ele permite elaborarea logicii de comportament al robotului. Acest component este utilizat atât pentru reprezentarea componentelor software precum operațiile aritmetice cât și pentru reprezentarea componentelor hardware ale robotului precum senzorii, camera, motoarele, etc.

Subprogram – o serie de blocuri interconectate între ele care îndeplinesc o logică anumită.

Programul principal – un program de control scris sub formă de diagramă funcțională secvențială care conectează mai multe subprograme

Proiect – un proiect constă din programul principal și mai multe subprograme. Un proiect poate fi salvat și încărcat

În figura 2.1 este prezentată interfața grafică a aplicație care apare odată cu lansarea acesteia. Fiecare cifră din imagine reprezintă câte un componente al acesteia și anume:

Bara de titlu – afișează numele proiectului curent (Unnamed). În cazul în care în proiect sunt schimbări nesalvate, numele proiectului va fi urma simbolul ”*”. În cazul în care s-a început elaborarea unui proiect nou numele afișat pe bara de titlu va fi ”Unnamed”(eng. Fără denumire)

Bara de meniu – funcțiile de lucru cu aplicația precum salvarea și încărcarea proiectelor, editarea, simularea, ajutor, etc.

Bara de instrumente – conține butoanele de acces rapid la cele mai utilizate funcții din bara de meniu precum încărcarea și salvarea proiectului și funcțiile de simularea.

Selector de programe – afișează toate programele disponibile în cadrul proiectului precum și oferă posibilitatea de selectare a programului pentru editare.

Spațiul de lucru – oferă posibilitatea de editare și vizualizare a programelor

Biblioteca blocurilor funcționale – afișează toate blocurile disponibile pentru programare precum și oferă posibilitatea de utilizarea a acestora prin mecanismul de drag & drop a blocului în spațiul de lucru

Bara de stare – afișează statutul proiectului și aplicației.

Figura 2.1 Interfața aplicației Robotino View

Robotino View este un mediu de programare vizuală în care algoritmii de control pot fi elaborați prin conectarea a diferitor blocuri funcționale între ele. Blocul funcțional este cel mai important component al mediul de programare. Robotino utilizează blocurile funcționale pentru reprezentarea tuturor componentelor cu care utilizatorul poate să interacționeze, atât componentele software precum operațiile aritmetice, variabile și diferiți algoritmi cât și componentele Hardware ale Robotului și ale controllerelor externi.

Un bloc funcțional poate să conțină mai multe intrări sau ieșiri. Intrările blocului funcțional reprezintă datele de intrare care vor fi prelucrate iar ieșirile datele de ieșire care pot fi utilizate de către alte blocuri. Numărul intrărilor și ieșirilor poate să varieze de la un bloc funcțional la altul. Există blocuri funcționale care au doar intrări sau doar ieșiri.

Conectarea blocurilor se efectuează prin intermediul legăturilor care se trasează de la ieșirea unui bloc spre intrarea altuia. Trasarea legăturilor se efectuează prin intermediul mouse-lui, doar de la ieșirea blocului spre intrarea blocului și doar dacă acestea au tipurile de date compatibile. În cazul în care se dorește conectarea legăturii la o intrare și această intrare este compatibilă, Robotino View v-a colora intrarea în verde iar în caz contrar în roșu. Conectarea mai multor blocuri funcționale între ele formează un program.

Figura 2.2 Exemple de blocuri funcționale în Robotino View

Accesarea ferestrei de proprietăți a blocului se face prin dublu click pe imaginea acestuia. Fereastra de proprietăți permite utilizatorului configurarea avansată a funcționalității blocului sau pentru obținerea starea acestuia la momentul actual de timp.

Figura 2.3 Exemplu de fereastră de proprietăți ale blocului

Figura 2.4 Algoritm de control al motoarelor robotului utilizând blocul Control Panel

Un proiect poate fi compus din mai multe programe. Ordinea de executare a programelor este stabilită de către o diagramă funcțională secvențială. Începând cu versiunea 2 a softului, aceasta reprezintă o implementare a limbajului GRAFCET stabilit în standartul IEC 61131[9]. Diagrama funcțională este reprezentată sub formă de pași. La fiecare pas este executat câte un program. Execuția poate să treacă de la un pas la altul dacă condiția de trecere este validată. În același moment de timp se pot executa câțiva pași concomitent. Același program poate fi utilizat în cadrul a mai mulți pași. Diagrama funcțională poate fi vizualizată accesând fereastra Main Program din cadrul componentului Selector de Programe.

Robotino View oferă posibilitatea utilizatorului de a crea și utiliza variabile globale la care pot avea acces toate programele existente în cadrul proiectului. Acestea pot fi utilizate pentru păstrarea valorilor obținute în urma executării programului. De asemenea acestea pot fi utilizate pentru construirea expresiilor logice de validare a tranziției de la un pas la altul în cadrul diagramei secvențiale. Variabilele globale pot fi adăugate pe pagina Main Program în partea dreaptă a ferestrei. Utilizatorul poate crea variabile de 4 tipuri de date: float, pose, string și posevector. Fiecărei variabile îi corespund câte 2 blocuri funcționale, pentru înscrierea și citirea datelor. Blocurile vor apărea în librăria de blocuri funcționale odată cu adăugarea variabilei.

Robotino View oferă posibilitatea utilizatorului de a implementa blocuri funcționale proprie utilizând blocul LUA Script. Utilizând acest bloc funcțional, utilizatorul poate specifica de sine stătător logica de comportament al acestuia utilizând limbajul de programare LUA. De asemenea aplicația oferă posibilitatea de creare a blocurilor proprii utilizând limbajul de programare C++.

Figura 2.5 Exemplu de schemă secvențială de control.

Robotino View oferă posibilitatea de rulare a proiectelor elaborate direct pe Robotino sau în cadrul unui soft de simulare precum Robotino Sim utilizând în acest scop doar adresa IP.

2.2 Robotino Sim

Robotino SIM este un mediu de simulare virtual elaborat și menținut de către compania Robotics Equipment Corporations(REC GmbH) care oferă posibilitatea de a testa în siguranță algoritmii de control elaborați pentru sistemul robotic mobil Robotino. Aplicația oferă la dispoziție un spațiu virtual în care este plasat un model virtual al lui Robotino precum și diferite obiecte cu care acesta poate să interacționeze. Robotino SIM permite simularea a mai mulți parametri fizici precum masa, culoarea, viteza și inerția. De asemenea Robotino SIM oferă o simulare și a senzorilor plasați pe robot precum senzorii de proximitate, bara de protecție, senzorii magnetici și camera. La baza Robotino SIM stă tehnologia Nvidia PhysX ceea ce permite o simulare cât mai veridică a obiectelor fizice[10]. Robotino SIM este oferit în două versiuni, versiunea Demo și versiunea Professional. Versiunea Demo este versiunea gratuită a softului care conține toate capacitățile de simulare ca și versiunea Professional însă este limitată în posibilitatea de editare a mediului în care se află robotul[9].

Figura 2.6 Aplicația Robotino Sim Demo 1.4.1

Odată cu lansarea aplicației, aceasta pornește un server la care au posibilitatea să se conecteze diferiți clienți, în special mediile de programare precum Robotino View sau C++ prin intermediul API2. Utilizatorul are posibilitatea să se conecteze la serverul aplicației accesând adresa de localhost a computatorului 127.0.0.1. Serverul are posibilitatea să conecteze clienți TCP la porturile 8080 sau 12080.

Robotino SIM Demo oferă posibilitatea de a controla diferiți parametri ai robotului precum portul de conectare, unghiul de rotație al camerei și încărcătura electrică a bateriei. De asemenea, Acest lucru se efectuează prin accesarea ferestrei de proprietăți ale modelului virtual al robotului. De asemenea, această fereastră dispune de o zonă text în care utilizatorul are posibilitatea de a urmări mesajele ce sunt transmise spre și de la Robotino SIM astfel având posibilitatea să studieze particularitățile protocolului de comunicare dintre Robotino și mediul de programare.

2.3 Robotino API 2

Robotino API2 reprezintă o bibliotecă scrisă în limbajul de programare C++ dezvoltată și menținută de către compania Robotics Equipment Corporation(REC GmbH). Biblioteca este special prevăzută pentru elaborarea algoritmilor de control în limbajele C/C++ însă aceasta poate fi utilizată împreună și cu alte medii de programare precum Java, .NET, Matalab, Simulink utilizând diverse metode de wrapping precum Swig. Biblioteca permite dezvoltarea atât a aplicaților de tip consolă cât și a aplicațiilor cu interfață grafică utilizând setul de biblioteci QT. Robotino API2 este disponibilă pentru diverse platforme precum Windows și Linux[10].

Aplicațiile dezvoltate prin intermediul Robotino API2 au posibilitatea să fie executate atât însăși pe Robotino cât și pe alt computator conectat la acesta prin rețea. De asemenea, aplicația poate fi utilizată pentru controlarea versiunii virtuale a robotului din cadrul Robotino SIM. Comunicarea dintre computatorul gazdă și robot are loc prin utilizarea tehnologiei Remote Procedure Call(RPC). Această tehnologie permite executarea procedurilor în diferite spații de adrese fără ca acest lucru să fie observabil pentru programator. Tehnologia RPC este utilizată de către Robotino API2 prin intermediul bibliotecii REC RPC care a fost elaborată de la zero în special pentru API2. Motivația principală în dezvoltarea unei biblioteci noi pentru implementarea tehnologii RPC a fost lipsa soluțiilor pe piață care ar putea permite comunicarea dintre aplicațiile QT de pe Windows cu ROS de pe Robotino[10].

Pentru rezolvarea dependențelor, Robotino API2 utilizează CMake, astfel crearea soluțiilor utilizând această bibliotecă necesită de asemenea utilizarea CMake. Crearea soluțiilor cu Robotino API2 pe Windows poate fi efectuată doar utilizând Microsoft Visual Studio utilizând compilatorul MVCC pentru C++. Pe sistemele Linux, în acest scop poate fi folosit gcc. Utilizatorul poate să descarce biblioteca de pe site-ul oficial al robotului în formă precompilată pentru versiunile 14 și 12 ale mediului Microsoft Visual Studio. Utilizatorul poate opta și pentru construirea bibliotecii din fișierele sursă ale acesteia. Varianta recomandată de utilizare a bibliotecii este prin utilizarea acesteia în formă precompilată. Compilarea fișierelor sursă a bibliotecii nu este un proces trivial și necesită a fi utilizată ca ultimul remediu.

Robotino API2 este constituit dintr-un set de clase, fiecare reprezentând câte o componentă a robotului precum motoarele, senzorii de proximitate, camera, bateriile, omnidrive-ul, interfețele externe etc. Robotino API2 posedă echivalent pentru orice bloc funcțional care poate fi întâlnit în Robotino View în biblioteca de blocuri funcționale ale robotului. Pentru comunicarea aplicației care utilizează API2 cu Robotino sau versiunea virtuală a acestuia este utilizat un obiect de tip Com. Pentru conectarea aplicației la Robotino, este destul de apelat metoda setAddress(std::string addr) cu adresa ip a robotului urmată de apelul funcției connectToServer(bool val) cu valoarea true. Mai jos este prezentată o versiune al programului Hello, World, pentru Robotino utilizând API2:

#include <all.h>

using namespace rec::robotino::api2;

int main(void)

{

Com com;

OmniDrive omniDrive;

com.setAddress("127.0.0.1");

com.connectToServer(true);

while (true)

{

omniDrive.setVelocity(0, 0, 0.1);

msleep(50);

}

return (0);

}

Recent Robotics Equipment Corporation(REC GmbH) a lansat o nouă versiune a API-ului pentru Robotino bazată pe tehnologia Rest API[10]. În această versiune toate funcțiile robotului sunt disponibile prin intermediul solicitărilor HTTP de tip GET, POST sau PUT. Răspunsul de la server este recepționat sub forma un fișier JSON. Utilizând versiunea REST a API-ului robotului, utilizatorul are posibilitatea să creeze algoritmi de control pentru Robotino în orice limbaj de programare care poate efectua cereri HTTP. Robotino SIM Demo nu suportă la moment această versiune a API-ului.

Exemple de solicitări pentru robotul cu adresa ip 127.0.0.1:

127.0.0.1/cam0 – Obținere imaginea de la prima camera. Răspunsul este recepționat sub forma unei imagini JPEG

127.0.0.1/data/odometry – Accesează datele de odometrie a robotului

127.0.0.1/data/omnidrive – Setează vitezele robotului pe fiecare axă

127.0.0.1/data/servicies – Accesează datele despre serviciile specifice ale robotului

2.4 C++

C++ este un limbaj de programare de scop general. C++ implementează mai multe paradigme de programare printre care programarea orientată pe obiecte, programarea imperativă, programarea funcțională, programarea generică, programarea procedurală și altele. C++ posedă un sistem de tipuri static și nominativ[6]. C++ este un limbaj compilabil. C++ a fost conceput ca un limbaj care ar putea fi utilizat pentru programarea componentelor sistemelor computaționale precum și a sistemelor embedded. C++ se potrivește ideal pentru programarea sistemelor cu resurse limitate precum și a sistemelor largi cu cerințe sporite asupra performanței, flexibilității și eficienței acestora.

Dezvoltarea limbajului a fost începută în 1979 ca un proiect în cadrul laboratorului BellLabs, AT&T de către cercetătorul danez Bjarne Stroustrup. Motivația principală de creare a unui limbaj nou a fost dorința lui Stroustrup de a combina într-un singur limbaj paradigma programării orientate pe obiecte a limbajului Simula cu viteza de execuție a limbajului BCPL[12]. Stroustrup a observat că limbajul Simula posedă caracteristici folositoare pentru dezvoltarea sistemelor software de dimensiuni mari însă viteza de execuție era prea mică pentru utilizarea în practică pe când limbajul BCPL era rapid însă era un limbaj de nivel jos, inadecvat pentru utilizarea în proiecte de dimensiuni largi. Ca bază sintactică pentru noul limbaj a fost ales limbajul C. Printre motivele din care a fost ales limbajul C au fost că C a fost un limbaj de scop general, rapid, portabil și utilizat pe larg. Pe lângă C au mai fost considerate și alte limbaje precum Modula-2, Ada, Smaltalk, Mesa Clu însă în versiunea finală au lăsat urme considerabile doar C, Simula, Algol68 și BCPL.

Prima versiune a limbajului a fost cunoscută sub denumirea ”C cu clase”. În 1983 limbajul își schimbă denumirea în C++. Noua denumire a limbajului a fost inspirată de către operatorul ”++” din cadrul limbajului C care este utilizat pentru incrementarea valorii variabilei cu o unitate[13]. În 1985 a fost publicată prima ediție a cărții ”The C++ Programming Language” iar în octombrie a aceluiași an a fost realizat primul compilator comercial al limbajului. În 1989 a apărut a doua versiune a limbajului, C++ 2.0 urmată de versiunea revizuită a cărții ”The C++ Programming Language” în 1991. Limbajul C++ a fost standartizat de către grupul de lucru ISO cunoscut sub numele de JTC1/SC22/WG21[13]. Primul standart al limbajului a fost ISO/IEC 14882:1998 publicat în anul 1998. Ulterior au urmat mai multe revizuiri ale standardului în 2003, 2011, 2014 și 2017. Versiunile din anii 2011 și 2017 au adus schimbări semnificative atât în nucleul limbajului cât și în biblioteca standartă.

Bjarne Stroustrup a urmat un set de principii și scopuri în timpul proiectării limbajului C++ ceea ce a făcut ca acesta să arate așa cum este la moment[12]. Printre aceste principii se evidențiază:

Utilitatea limbajului pentru rezolvarea problemelor reale

Posibilitatea alegerii de către programator a stilului propriu de programare și suportul deplin al stilului ales de către limbaj

Facilitatea separării programelor în mai multe module independente

Posibilitatea utilizării limbajului împreună cu alte medii de programare

Portabilitatea codului sursă între diferite sisteme

Introducerea unei caracteristici utile este mai importantă decât prevenirea oricărei utilizări incorecte a limbajului

Tipurile de date create de utilizator trebuie să aibă același suport ca și tipurile de date standarte.

Ca și limbajul C, C++ este un limbaj compilabil ceea ce înseamnă că orice program scris în acest limbaj, înainte ca să poată fi executat, necesită să parcurgă două etape intermediare: compilarea și link-area. La etapa de compilare, fișierele sursă sunt prelucrate de către un program special denumit compilator în urma căreia este creată versiunea binară a codului sursă care poate fi interpretată de către computator. Compilatorul verifică dacă programul este scris cu respect față de regulile sintactice ale limbajului. În cazul în care există abateri de la reguli compilatorul poate să emită o avertizare, programul nu scris corect însă acest lucru nu este un impediment pentru rularea aplicației, sau o eroare, programul nu este scris corect și este un impediment pentru rularea aplicației. La etapa de link-are, mai multe fișiere binare sunt unite împreună într-un singur fișier executabil. După etapa de link-are utilizatorul poate să ruleze aplicația pe platforma pe care aceasta a fost compilată. Fiecare platformă are nevoie de compilatorul său propriu care ar permite transformarea codului sursă în cod binar specific acesteia.

C++ este compatibil în proporții relativ mari cu predecesorul său limbajul C însă există diferențe minore între acestea ceea ce face ca limbajul C++ să nu fie considerat ca un superset strict al limbajului C precum este spre exemplu Objective-C[6]. Majoritatea programelor scrise în C pot fi compilate cu un compilator C++. Printre elementele comune dintre cele două limbaje se enumeră tipurile de date, paradigma procedurală, directivele preprocesorului, pointerii, mecanismul de includere a fișierelor etc. Ca și în C, punctul de intrare într-un program C++ este funcția int main().

Caracteristicile programării orientate pe obiecte a limbajului C++ sunt reprezentatea de către tipul de date class. C++ suportă toate paradigmele programării orientate pe obiecte precum moștenirea, incapsularea, polimorfizmul și abstractizarea. C++ susține supraîncărcarea și suprascrierea metodelor clasei precum și supraîncărcarea operatorilor, atât în interiorul clasei cât și înafara acesteia. C++ susține moștenirea multiplă dintre clase.

C++ implementează paradigma de programare generică prin introducerea noțiunii de template prin intermediul cărora utilizatorul are posibilitatea să creeze obiecte generice ce conțin tipuri date care vor fi evaluate în timpul rulării programului. Același principiu este aplicat și pentru funcțiile generice.

Recent C++ a fost completat cu tipurile de date de tip lambda, ceea ce permite tratarea funcțiilor ca obiecte[12]. Acest lucru permite elaborarea algoritmilor funcționali în limbajul C++, care sunt o alternativă mai reușită pentru rezolvarea unui număr larg de probleme. Tratarea funcțiilor ca parametri este posibilă și în cadrul limbajului C, prin intermediul pointerilor la funcții, însă sintaxa simplificată introdusă în C++ facilitează utilizarea mai largă a acestei posibilități.

2.5 CMake

CMake este o aplicație multi-platformă open source utilizată pentru administrarea procesului de strângere a aplicațiilor indiferent de compilatorul instalat în sistem. CMake este utilizat nu atât pentru compilarea proiectelor ci pentru generarea proiectelor cu ajutorul cărora prin intermediul cărora se va efectua generarea proiectelor[14]. CMake este utilizat împreună cu mediile de construire native precum make, Xcode, Eclipse CDT, Microsoft Visual Studio etc.

Dezvoltarea CMake a început în 1999 de către Bill Hoffman de la compania Kitware atunci când a fost necesară o aplicație pentru construirea proiectelor multi-platformă pentru proiectul Insight Segmentation and Registration Toolkit(ITK)[14]. CMake a fost parțial inspirată de către o altă aplicație pcmaker utilizată pentru proiectul Visualization Toolkit(VTK). Prima versiune a softului a apărut în anul 2000. Cu timpul mai multe proiecte au început să adopte CMake contribuind atât la popularizarea aplicației cât și la dezvoltarea acesteia. Versiunea actuală a softului este CMake 3.0 care a fost lansată în 2014.

CMake este utilizat în special pentru compilarea proiectelor de dimensiuni mari care utilizează un număr mare de fișiere surse. CMake este un instrument potrivit pentru proiectele la care fișierele sursă sunt distribuite în mai multe directoare precum și pentru proiectelor dependente de mai multe biblioteci externe. CMake poate administra chiar și cazurile când un proiect este dependent de o bibliotecă care la rândul său sunt constituite din mai multe directoare. CMake poate administra proiectele care necesită crearea de fișiere executabile temporare înainte de generarea codului care va fi utilizat pentru generarea aplicației finale. Una din proprietățile de bază ale CMake este de administra construirea proiectului atât din locația fișierelor sursă cât și din afara acestuia. Acest lucru permite separarea fișierelor sursă de rezultatul compilării acestora ceea ce facilitează construirea a mai multor proiecte dintr-un singur cod sursă precum și a posibilității de eliminare ușoară a proiectelor construite fără alterarea codului sursă.

Procesul de compilare a proiectului utilizând CMake decurge în două etape. La prima etapă din fișierele de configurare se generează fișierele de compilare. La cea de-a doua etapă instrumentele native de construcție a platformei sunt utilizate pentru compilarea finală a proiectului. Într-un proiect CMake se recomandă ca fiecare directoriu din proiect care este direct legat de procesul de construire a proiectului să conțină câte un fișier de configurare CMakeLists.txt[14].

Lua

Lua este un limbaj de programare multi-paradigmă, multi-platformă conceput în primul rând pentru utilizarea în cadrul sistemelor încorporate. În mare parte Lua este utilizat ca un limbaj de scriptare în cadrul altor aplicații ceea ce permite introducerea de flexibilitate în aplicațiile de altfel rigide[5]. Dezvoltarea limbajului a fost influențată de către alte limbaje existente atunci precum C++, CLU, Modula, Schema, SNOBOL etc. Lua a fost elaborat în 1993 de către Roberto Ierusalimschy, Luiz Henrique de Figueiredo, and Waldemar Celes în cadrul universității Pontificatului Catolic a Rio de Janeiro, Brazilia. Limbajul a fost dezvoltat din cauza lipsei pe piața din Brazilia din acea perioadă a limbaje de scriptare ce ar putea fi integrate în cadrul altor aplicații. Versiunea curentă a limbajului este versiunea 5.4.0 lansată în 2018.

Mediul de programare Robotino View are încorporat blocul Lua care permite utilizatorului definirea logicii proprii într-o versiune limitată al limbajului Lua. Utilizând acest bloc, utilizatorul are posibilitatea atât să definească secvențe ce de altfel ar fi imposibil de implementat utilizând alte blocuri din cadrul Robotino View, cât și să simplifice considerabil schemele existente. Blocul Lua Script este prezentat în figura 2.7. Fereastra de proprietăți a blocului are 3 file. În prima filă utilizatorul are posibilitatea să seteze numărul de intrări și ieșiri a blocului. A doua filă este utilizată pentru introducerea scriptului Lua și a variabilelor globale utilizate de către acesta. A treia filă este utilizată pentru vizualizarea log-urilor generate de către program.

În această versiune utilizată a limbajului, biblioteca standartă este limitată, utilizatorul fiind capabil să acceseze un număr limitat de funcții. Utilizatorul are posibilitatea apelării funcției print ceea ce va face ca textul transmis să fie afișat în fereastra de log-uri. În cadrul programului Lua intrările și ieșirile blocului pot fi accesate prin intermediul variabilelor de tip in* și out*. Valoarea atribuită variabilelor out* corespunde valorii generate de către bloc, atribuirea fiind posibilă doar o singură dată.

Figura 2.7 Blocul Lua Script

a – apariția externă a blocului Lua Script

b – feresatra de proprietăți a blocului Lua Script – pagina de configurare

c – fereastra de proprietăți a blocului Lua Script – pagina de editate

d – fereastra de proprietăți a blocului Lua Script – pagina de loguri

Microsoft Visual Studio

Visual Studio este un mediu de dezvoltare integrat(IDE) dezvoltat de către compania Microsoft. Aceasta este utilizat pentru dezvoltarea aplicațiilor pe un număr larg de platforme precum Windows, Linux, MacOS, Android, iPhone, Mindows Mobile, Web etc. Visual Studio poate fi utilizat pentru programarea aplicațiilor în peste 30 de limbaje de calculator precum C/C++, C#, Visual Basic, F#, JavaScript, TypeScript, Python, Ruby, R, Node.js, HTML, CSS, XML, XSLT, JSON, SQL etc. Visual Studio este disponibil atât pe Windows cât și pe Mac OS[15].

Microsoft Visual Studio a cunoscut 12 ediții pe parcursul dezvoltării proiectului. Prima versiune a aplicației a apărut în 1997. Această aplicație a integrat împreună mai multe produse de dezvoltare care anterior erau comercializate separat precum Visual Basic, Visual C++, Visual FoxPro și altele. De asemenea, în această versiune a fost introdus pentru prima data instrumentul de autocompletare inteligentă a codului, IntelliSense, una dintre principalele caracteristici ale Visual Studio. Versiunea Visual Studio .NET (2002) a fost prima ediție a aplicației care a suportat nou framework de la Microsoft ”.NET Framework”. Începând cu această versiune, Visual Studio a fost asociată, în mare parte cu dezvoltarea de aplicații pentru acest framework. În Visual Studio 2008 a fost adăugat suport pentru tehnologiile WPF, XAML și LINQ. De asemenea, această ediție a inclus prima versiune a Microsoft Blend care este utilizată pentru redactarea interfețelor grafice pe bază la XAML. Microsoft Blend este disponibilă ca o aplicație separată însă care lucrează într-un tandem apropiat cu Visual Studio. Visual Studio 2017 a adăugat suport nativ pentru proiecte bazate pe CMake. Ultima versiune disponibilă la momentul actual este Microsoft Visual Studio 2019 care este disponibilă în 3 ediții: Community, Professional și Enterprise[15].

Microsoft Visual Studio posedă un set larg de caracteristici care sunt în special utile pentru dezvoltarea aplicațiilor de dimensiuni mari. În terminologia Visual Studio, noțiunea de aplicație este înlocuită cu noțiunea de soluție. O soluție poate să conțină unul sau mai multe proiecte. Proiectele pot fi utilizate pentru separarea soluției în mai multe unități logice care comunică între ele. O astfel de abordare permite concentrarea logicii de un singur tip într-un singur loc ceea ce poate contribui considerabil la posibilitatea de mentenanță a aplicației și la posibilitatea de adăugarea a funcționalității noi în viitor. Microsoft Visual Studio posedă un debugger performant pentru mai multe limbaje de programare, în special pentru limbajele din familia .NET. Cu ajutorul acestuia poate fi efectuată o analiză performantă a comportamentului aplicației. Microsoft Visual Studio are funcționalitatea incorporată de lucru cu bazele de date, în special cu bazele de date ale companie Microsoft precum SQLServer și MSSQL. Funcționalitatea mediului poate fi extinsă prin utilizarea a diferitor plugin-uri care pot adăuga schimbări minore sau considerabile.

Figura 2.8 Fereastra de pornirea a aplicație Microsoft Visual Studio

III. DEZVOLTAREA SCENARIILOR PE ROBOTINO

3.1 Scenarii ce vizează utilizarea sistemului de acționare.

3.1.1 Noțiuni generale

Sistemul de acționare al robotului este compus din totalitatea elementelor ce sunt utilizate pentru deplasarea acestuia. Utilizarea sistemului de acționare în cadrul programelor educaționale oferă un șir de provocări care pot amplifica interesul studenților asupra domeniului roboticii și mecatronicii.

Componentele Robotino View

Mediul de programare Robotino View oferă la dispoziție un set de blocuri funcționale pentru administrarea de către utilizator a componentelor sistemului de acționare a lui Robotino. Aceste blocuri reprezintă o mapare spre componentele hardware de pe Robotino. Aceste blocuri se află în sub meniul RobotinoDrive system. Printre principalele blocuri din această categorie sunt blocurile Motor* și Omnidrive.

Robotino View conține 3 blocuri Motor(Motor 1, Motor 2, Motor 3) corespunzătoare fiecărui din cele 3 motoare instalate pe robot(figura 3.1). Prin intermediul blocurilor Motor utilizatorul are posibilitate să seteze nemijlocit viteza de rotație a fiecărui motor. Blocul conține 3 intrări utilizate pentru setarea vitezei de rotație, resetarea poziției și stopare, precum și 3 ieșiri prin intermediul cărora poate fi accesată starea actuală a parametrilor roților precum viteza actuală, poziția actuală și tensiunea electrică actuală.

Figura 3.1 Blocurile Motor

Setarea directă de către utilizator a vitezelor de rotație a motoarelor nu este o soluție acceptabilă în toate situațiile. În majoritatea cazurilor utilizatorul este interesat în mișcare robotului în una din direcțiile sus, jos, stânga, dreapta, în jurul axei sale. Robotino View oferă la dispoziție blocul Omnidrive care permite calcularea vitezelor de rotație ce trebuie transmise motoarelor pentru ca robotul să se miște în direcția dorită. Blocul posedă 3 intrări care permit setarea vitezelor în fiecare direcție și 3 ieșiri cu vitezele de rotație pentru fiecare motor calculată. Utilizatorul este nevoit să conecteze ieșirile blocului Omnidrive la blocurile Motor pentru ca robotul să se miște în direcția dorită. Fereastra de proprietăți a blocului Omnidrive permite setarea parametrilor utilizați pentru determinarea vitezelor de rotație precum raza bazei, raza roții, și raportul de transmisie.

Figura 3.2 Blocul Omnidrive

a – apariția exterioară a blocului Omnidrive

b – fereastra de proprietăți a blocului Omnidrive

Componentele Robotino API2

Robotino API2 oferă utilizatorul un număr larg de clase ce pot fi utilizate pentru manipularea mișcării robotului. Din această categorie fac parte așa clase ca OmniDrive, Motor, MotorArray și MotorDebug. Clasa OmniDrive este utilizată pentru setarea vitezelor de deplasare a robotului pe fiecare axă. Clasa Motor poate fi utilizată pentru obținerea informației referitoare la motoarele robotului. Clasa MotorArray este utilizată pentru administrarea motoarelor instalate pe Robotino. Clasa MotorDebug este utilizată pentru depanarea motorului.

3.1.2 Acționarea directă a motoarelor

Descrierea scenariului

Elaborarea unui program ce ar permite manipularea direcției de deplasare a robotului prin setarea directă a vitezelor de rotație a roților robotului.

Considerații teoretice

Modelul cinematic al robotului permite determinarea poziției acestuia în dependență de poziția anterioară a acestuia. De asemenea, modelul cinematic permite aflarea vitezei robotului în dependență de viteza de rotație a roților și viceversa.

Robotino are la bază un sistem omnidirecțional de tip Kiwi, constituit din 3 roți omnidirecționale situate la un unghi de 120 de grade una fața de alta. Roțile sunt controlate prin rotirea acestora în direcția de deplasare fără alunecare. Rolele de pe roți permit alunecarea acestora în direcție ortogonală. Vectorul de viteză al roții este compus din suma celor doi vectori. Mai jos este prezentat modelul general al unei roți omnidirecționale.

Figura 3.3 Modelul general al roții omnidirecționale

unde, – unghiul format între direcția de deplasare și axa robotului

– unghiul format între direcția de deplasare și direcția de alunecare liberă.

Pe roțile instalate pe Robotino, unghiul este de 180 de grade. Combinând valorile obținute de la cele 3 roți cu referință la poziția acestora pe șasiul robotului se poate de obținut vectorul de mișcare a acestuia.

Figura 3.4 Modelul șasiului robotului

unde, – raza robotului

– raza roții

Ecuația 3.3 reprezintă varianta schimbată a ecuației 3.2 în cazul în care se ia în considerație poziționarea roților pe Robotino unde .

Din formula 2.3 se poate de dedus ce viteze trebuie de setat la fiecare motor pentru ca robotul să se miște în direcția dorită. În tabelul 2.1 este prezentată lista cu direcțiile de deplasarea a robotului în grade și respectiv valoarea ce trebuie de setat la fiecare motor pentru ca acesta să se miște în direcția dorită.

Tabelul 3.1 Direcțiile de deplasare ale robotului

unde nsp reprezintă numărul de rotații pe minut atribuit fiecărei roți.

Figura 3.5 Schema de control al algoritmului

Exemplu de implementare

Cea mai simplă utilizarea a formulelor descrise mai sus poate fi utilizată utilizând mediul de programarea Robotino View. Acesta dispune de o număr mare de blocuri menite controlului sistemului de acționare printre care se evidențiază blocurile Motor, Omnidrive și Control Panel. Robotino View poate fi utilizat pentru setarea pe rând a valorilor din tabelul 2.1 astfel demonstrând deplasarea acestuia în direcția notată. Valorile ce necesită a fi setate la fiecare motor sunt salvate în 3 variabile de tip floatvector. Blocul Float array index acces permite accesarea elementelor din vector pe baza indexului. Indexul de acces este incrementat la fiecare secundă. Pentru simplificare, perioada de timp la care se incrementează indexul precum și lungimea vectorilor de valori sunt de asemenea păstrate în variabile.

3.1.3 Acționarea motoarelor prin intermediul controlerelor

Descrierea scenariului

Elaborarea unui proiect ce ar permite controlarea robotului utilizând un controler. Controlerul trebuie să ofere posibilitatea utilizatorului să deplaseze robotul în toate direcțiile și să aibă posibilitatea să efectueze rotirea pe loc atât în jurul acelor de ceasornic cât și împotriva acestora. Utilizatorul trebuie să aibă posibilitatea să deplaseze robotul pe mai multe axe concomitent.

Considerații teoretice

Un Controler este un dispozitiv ce permite captarea acțiunilor umane și translarea acestora în semnale ce pot fi înțelese de către computator. În categoria de controler intră o varietate largă de dispozitive precum joystick, gamepad, volan, ecran tactil, mouse, tastatură etc. Controlerul poate simplifica interacțiunea umană cu computatorul în unele cazuri de utilizare și complica în altele. Utilizarea controlerelor externi pentru controlarea robotului este o practică obișnuită în domeniul roboticii. Printre exemplele comune de controlere pentru manipularea robotului sunt joystick-ul, tastatura și mouse-ul.

a. Utilizarea Joystick-ul

Robotino și Robotino View au incorporată funcționalitatea pentru utilizarea joystick-ului. Robotino poate fi controlat de orice joystick sau gamepad conectat prin USB la acesta sau la computatorul pe care rulează programul de control precum și de joystick-uri wireless de model Logitech F710 și Xbox One 1708 [10]. Robotino View dispune de o bibliotecă separată care oferă acces spre toate butoanele și axele disponibile pe joystick. Biblioteca poate fi adăugată prin accesarea butonului add din partea de jos a bibliotecii de blocuri funcționale și prin selectarea opțiunii Joystick, figura 3.4a. Accesând fereastra de proprietăți a modului Joystick, utilizatorul are posibilitatea să vizualizeze toate controlerele conectate la computator și să aleagă unul din ele. Odată controlerul ales, utilizatorul poate să vizualizeze numărul de axe și butoane disponibile. Robotino View dispune la dispoziția utilizatorului un set de blocuri ce sunt mapate la butoanele și axele de pe joystick, figura 3.4b. Diferența dintre buton și axă constă în diapazonul de valori care este generat de către acesta. Un buton poate genera doar 2 valori, true – butonul este apăsat, false – butonul este ridicat, pe când o axă poate genera valori într-un diapazon [min..max] în dependență de gradul de deplasare al axei față de centru.

În acest exemplu este utilizat un Joystick de model Logitech F710 ce constă din 10 butoane și 8 axe. În tabelul 3.2 este prezentată maparea butoanelor și axelor joystick-ului la blocurile din cadrul Robotino View.

Figura 3.6 Setarea Joystick-ului

a – Adăugarea Bibliotecii Joystick în Robotino View

b – Fereastra de proprietăți a modulului Joystick

Exemplu de implementare

În acest exemplu joystick-ul este utilizat pentru deplasarea robotului în stânga și în dreapta precum și în sus și în jos. În acest scop sunt utilizate axele Left, Right, Top și Down ale joystick-ului. De asemenea, algoritmul oferă posibilitatea rotirii robotului după acele de ceasornic și împotriva acestora tastând butoanele B și respectiv X ale joystick-ului. Pentru generarea vitezelor de deplasare pe fiecare axă este utilizat un script Lua.

Tabelul 3.2 Maparea butoanelor și axelor de pe Logitech F710 la blocurile Robotino View

Figura 3.7 Schema de utilizare a joystick-ului pentru controlarea lui Robotino

Codul scriptului Lua:

out1val = 0;

out2val = 0;

out3val = 0

if in4 > 0 then

out1val = out1val – 200;

end

if in4 < 0 then

out1val = out1val + 200;

end

if in3 > 0 then

out2val = out2val – 200;

end

if in3 < 0 then

out2val = out2val + 200;

end

if in1 then

out3val = out3val – 50;

end

if in2 then

out3val = out3val + 50;

end

out1 = out1val;

out2 = out2val;

out3 = out3val;

b. Utilizarea Tastaturii calculatorului

Tastatura poate fi utilizată pentru controlarea lui Robotino la fel ca și Joystick-ul. Cu regret, Robotino View nu dispune de funcționalitatea necesară pentru utilizarea tastaturii. Singura modalitate ca tastatura computatorului să poate fi utilizată pentru manipularea lui Robotino este prin intermediul limbajului C++ și a API2 pentru Robotino. Pentru elaborarea programului de controlare a robotului pe bază la tastatură este necesar de utilizat mediul de programare Visual Studio. În acest scop e necesar de creat un proiect nou CMake.

C++ oferă mai multe posibilități pentru depistarea accesării butoanelor de pe tastatură. Un dintre posibilități este utilizarea bibliotecii winuser.h din cadrul Windows API. Această bibliotecă oferă posibilitatea ca utilizatorul să definească metodele care vor fi apelate în cazul apariției diferitor evenimente legate de dispozitivele de intrare și ieșire, inclusiv și în cazul accesării tastaturii. Un alt avantaj al acestei biblioteci este că metodele vor fi apelate chiar și în cazul când utilizatorul nu se află în aplicația care rulează. Utilizatorul trebuie să definească o funcție care ar administra apariția evenimentelor și apoi să înregistreze această funcție prin apelarea SetWindowsHookExA din cadrul winuser.h.

Exemplu de implementare

Pentru generarea proiectului Visual Studio este utilizat scriptul CMake prezentat în anexa 1. Proiectul utilizează tastele W, A, S, D pentru deplasarea robotului în direcțiile sus, stânga, jos și dreapta și săgețile stânga și dreapta pentru rotirea robotului după acele de ceasornic și respectiv împotriva acestora. Manipularea robotului se efectuează prin asignarea de viteze constante la axele de mișcare a robotului în dependență de tasta care este accesată. În tabelul 3.3 este prezentată corespondența dintre viteza asignată robotului și tasta accesată.

Tabelul 3.3 Corespondența dintre viteza asignată robotului și tasta accesată

Programul utilizează clasa OmniDrive pentru setarea vitezelor robotului. Deoarece este necesară resetarea vitezelor de deplasare la fiecare 100ms acest lucru este efectuat în cadrul unui ciclu while infinit. Programul utilizează 3 variabile globale pentru păstrarea vitezelor pe fiecare din cele 3 axe.

Programul utilizează biblioteca winuser.h pentru ascultarea evenimentelor de apăsare a butoanelor tastaturii. În cazul în care evenimentul înregistrat corespunde tastării unuia din butoanele enumerate în tabelul 3.3 se va efectua setarea unei din variabilele globale pentru păstrarea vitezelor. Evaluarea evenimentelor de la tastatură este efectuată prin intermediul unei expresii switch. Codul complet al programului este prezentat în anexa 2

Scenarii ce vizează utilizarea sistemului senzorial.

3.2.1 Noțiuni generale

Principalul avantaj al lui Robotino față de alte sisteme robotice existente pe piață este numărul mare de senzori de standard industrial de diferit tip instalate pe acesta. Printre senzorii instalați pe Robotino se numără 9 senzori infraroșii, o bară de protecție, giroscop, senzorii de citire a datelor de la baterii, cameră de luat vederi și altele.

3.2.2 Stoparea mișcării la ciocnirea cu un obstacol

Descrierea Sarcinii

Elaborarea unui program ce ar permite stoparea mișcării ulterioare în cazul în care Robotino se va ciocni cu un obstacol.

Considerații teoretice

Robotino este un sistem robotic complex de standard industrial, bazat pe mai multe componente sensibile la acționari mecanice. Dacă în timpul exploatării, Robotino va intra în coliziuni cu obstacolele întâlnite, componentele sensibile ale acestuia pot fi deteriorate. Pentru a preveni coliziunile, Robotino este echipat cu o bară de protecție(eng. bumper) în partea de jos a șasiului. În cazul unei conexiuni aceasta generează un impuls electric care poate fi folosit pentru stoparea mișcării ulterioare a robotului, astfel prevenind deteriorarea robotului.

Robotino View oferă acces către bara de protecție de pe Robotino prin intermediul blocului Bumper. Blocul Bumper are o singură ieșire de tip boolean care generează valoarea true în cazul în care s-a produs o coliziune.

Figura 3.8 Blocul Bumper

Exemplu de implementare

În cel mai simplu stoparea mișcării ulterioare a robotului în cazul unei ciocniri poate fi obținută prin conectarea ieșirea negate a blocului Bumper la o intrare a blocului Multiplication iar ieșirea blocului Multiplication la una din intrările blocului Omnidrive sau Motor. La cea de-a doua intrare a blocului Multiplication necesită a fi conectat valoarea care se dorește a fi setată. În cazul în care s-a produs vreo coliziune blocul Multiplication va genera valoarea 0 astfel stopând mișcarea ulterioară iar în caz contrar valoarea dorită va fi setată. Figura 3.6 reprezintă o schemă care implementează acest concept utilizând blocurile Omnidrive și Control Panel.

Figura 3.9 Schema de utilizare a bumperului

3.2.3 Stoparea robotului în fața obstacolului

Descrierea scenariului

Elaborarea unui algoritm ce ar permite stoparea robotului în fața obstacolului întâlnit la o distanță prestabilită

Considerații teoretice

Robotino este dotat cu 9 senzori de proximitate infraroșii montate pe șasiul robotului la o distanță de 40 de grade unul față de celălalt. Acești senzori pot fi utilizați pentru determinarea distanței față de obiectele din imediata apropiere a lui Robotino. Pe modelul actual al robotului sunt instalați senzori infraroșii de model GP2Y0A41SK0F produse de către compania Sharp. Acest model de senzori permite măsurarea distanței până la obiectele ce se află de la 4 la 30cm depărtare. Calcularea distanței până la obiect poate fi efectuată prin măsurarea tensiunii electrice generate de către senzor. Cu cât distanța până la obiect este mai mare cu atât valoarea tensiunii este mai mică.

Figura 3.10 Graficul de dependență a distanței față de tensiune

a senzorului infraroșu GP2Y0A41SK0F[10]

În mediul de programarea Robotino View, pentru lucrul cu senzorii de proximitatea sunt prevăzute blocurile Distance*. Blocul Distance are două ieșiri, prima reprezentând valoarea tensiunii citită de la senzorul de proximitate iar cea de-a doua unghiul la care se află senzorul pe Robotino.

Figura 3.11 Blocul Distance1

Valoarea tensiunii poate fi transformată în distanță utilizând blocul Transfer Function. Blocul Transfer Function implementează o funcție care efectuează maparea intrarea x la ieșirea y. În acest caz x este valoarea tensiunii iar y este valoarea distanței. Funcția de mapare lucrează pe baza unei liste de puncte de reper de formă pentru x avem y.

Figura 3.12 Blocul Transfer Function

Exemplu de implementare

În figura 3.7 este prezentat un exemplu de utilizarea a blocului Distance împreună cu blocul Transfer Function. În acest exemplu Robotino se va mișca înainte cu o viteză constantă până când nu va întâlni un obstacol poziționat în față sa la o distanță mai mică decât 30 cm. Ulterior se va opri așteptând ca obstacolul să fie mișcat din loc. Această schemă utilizează aceeași logică pentru setarea valorii dorite, utilizând blocul Multiplication.

Figura 3.13 Schema de deplasare înainte a lui Robotino până la depistarea obstacolului

3.2.4 Deplasarea robotului în spațiu cu obstacole.

Descrierea Scenariului

Elaborarea unui algoritm ce ar permite Robotino să se deplaseze în spațiu conținând obstacole și să evite ciocnirea cu acestea.

Considerații Teoretice

Deplasarea robotului într-un mediu cu obstacole și evitarea acestora este un scenariu real de utilizare a senzorilor de proximitate instalate pe carcasa robotului. În cel mai simplu caz se efectuează ocolirea obstacolelor statice care se află direct în fața robotului. Pentru așa gen de algoritmi nu este necesară utilizarea tuturor celor 9 senzori instalați pe acesta. În [1, 2, 3] sunt prezentate mai multe exemple de algoritmi pentru ocolirea obstacolelor care utilizează 3 senzori instalați în fața robotului. Numărul senzorilor utilizați poate fi extins la 5 pentru mărirea unghiului de detectare.

Un scenariu real de utilizare a senzorilor de proximitate instalate pe robot este utilizarea acestora pentru deplasarea robotului într-un mediu cu obstacole. În cel mai simplu caz se efectuează ocolirea obstacolelor statice care se află în fața robotului. Pentru așa gen de algoritmi nu este necesară utilizarea tuturor celor 9 senzori instalați pe carcasa robotului.

Exemplu de implementare

În figura 3.10 este prezentată schema algoritmului de deplasare înainte a lui Robotino cu ocolirea obstacolelor care utilizează senzorii 1, 2, 3, 8 și 9. Primele ieșiri a blocurilor Distance sunt conectate la un bloc Maximum pentru a detecta valoarea maximă obținută de la senzori, astfel detectarea obstacolului de către fiecare senzor particular va fi echivalentă detectării obstacolului în general. Pentru a determina apropierea robotului de obstacol se utilizează blocul Greater Equal care compară valoarea maximală a senzorilor cu valoarea de prag. În cazul în care valoarea senzorilor a depășit valoarea de prag se consideră că obstacolul a fost detectat și se generează valoare true, în caz contrat se generează valoarea false. Această valoare poate fi utilizată ca o condiție pentru acțiunile ulterioare. În acest exemplu, această valoarea este utilizată pentru setarea vitezelor de deplasare a robotului, înainte și în jurul axei sale. În cazul în care nici un obstacol nu a fost detectat robotul se va deplasa înainte cu o viteză constantă de 200 cm/s iar în cazul depistării unui obstacol, robotul se va roti în jurul axei sale, după acele de ceasornic cu o viteză de 50 grade/s.

Figura 3.14 Schema algoritmului de ocolire a obstacolelor fără păstrarea direcției

3.3 Scenarii ce vizează utilizarea subsistemului optic

3.3.1 Noțiuni Generale

Robotino dispune de un subsistem optic performant care corespunde standartelor industriale. Sub sistemul optic al robotului este format din mai multe componente precum camera video, dispozitiv de măsurare a distanței electro-optic și senzori opto-electronici. Studierea sistemului optic al lui Robotino poate contribui la formarea fundamentului care poate fi utilizat pentru studierea acestora mai departe.

Componentele Robotino View

Robotino View conține un set de blocuri standarte care pot fi utilizate pentru recepționarea și prelucrarea datelor obținute de la subsistemul optic al robotului, în special de la camera video. Robotino View dispune de blocuri funcționale pentru toate componentele subsistemului optic al robotului.

Datele de la camera video a robotului pot fi obținute prin intermediul blocului Camera care se află pe calea RobotinoImage system. Robotino View permite controlarea a până la 4 camere instalate pe robot. În cazul în care pe Robotino este instalată o singură cameră aceasta poate fi accesată prin intermediul blocului Camera1. Blocul Camera are o singură intrare prin care poate fi accesată imaginea captată de către camera fizică. Aceasta poate fi utilizată ca intrare pentru diverse blocuri pentru prelucrarea acesteia. Utilizatorul are posibilitate de vizualizare a imaginilor captate de cameră în timp real utilizând fereastra de proprietăți a blocului.

Figura 3.15 Blocul Camera

a – apariția exterioară a blocului Camera

b – fereastra de proprietăți a blocului Camera

Figura 3.16 Blocul Line Detector

a – apariția exterioară a blocului Line Detector

b – fereastra de proprietăți a blocului Line Detector

Robotino View oferă o categorie largă de blocuri pentru prelucrarea imaginilor obținute de la cameră. Acestea implementează diverși algoritmi care de altfel ar trebui implementate de către utilizator. Toate blocurile din această categorie se găsesc sub calea GenericCV. Printre cele mai importante blocuri din această categorie se numără Line Detector, Color Range Finder și Segment tracker. Majoritatea schemelor logice, implementate în Robotino View, care utilizează capacitățile subsistemului optic al robotului utilizează unul din aceste 3 blocuri.

Blocul Line Detector este utilizat pentru detectarea unei linii. Acesta are 4 intrări și 2 ieșiri. Prima intrare a blocului este utilizată pentru conectarea sursei de imagini, de obicei ieșirea de la blocul Camera. Celelalte intrări corespund la diverși parametri care controlează algoritmul de detectare a liniei precum pragul, distanța de la podea și grosimea liniei. Acești parametri pot fi setați și prin intermediul ferestrei de proprietăți a blocului. Prin intermediul ieșirilor blocului, utilizatorul poate afla coordonata X a liniei detectate și faptul dacă linia a fost detectată sau nu. În fereastra de proprietăți, utilizatorul are posibilitatea să vizualizeze în timp real procesul de detectare a liniei precum și să seteze parametrii algoritmului de detectare. Linia detectată va fi marcată în fereastra de proprietăți cu un cerc roșu intersectat.

Blocul Color Range Finder este utilizat pentru separarea unei singure game de colori din imagine. Blocul are 2 intrări și o ieșire. Ca și în cazul precedent, prima intrare a blocului este utilizată pentru conectarea sursei de imagini. A doua intrare este utilizată pentru setarea gamei de culori care necesită a fi detectată. Gama de culori care necesită a fi detectată este compusă dintr-un vector cu 6 valori care corespund valorilor minimale și maximale ale nuanței, saturației și valorii. Ieșirea constă din aceeași imagine primită la intrare în format alb-negru, unde culorile detectate sunt albe iar restul este negru. În fereastra de proprietăți a blocului utilizatorul are posibilitatea de a vizualiza în timp real procesul de separarea a gamei de culori precum și de a seta gama de culori pentru a fi detectată.

Figura 3.17 Blocul Color Range Finder

a – apariția exterioară a blocului Color Range Finder

b – fereastra de proprietăți a blocului Color Range Finder

Blocul Segment Tracker este utilizat pentru urmărirea segmentelor din imaginile de intrare. Blocul are 2 intrări și 7 ieșiri. Prima intrare este utilizată pentru conectarea sursei de imagini, de obicei ieșirea blocului Color Range Finder. A doua intrare este utilizată pentru resetarea blocului. Ieșirile blocului pot fi utilizate pentru urmărirea a diferiți parametri ai segmentului detectat precum coordonatele x și y ale centrului segmentului, aria segmentului detectat, deplasarea obiectului pe fiecare axă și numărul de segmente detectate. Ultima ieșire poate fi utilizată pentru conectarea la un alt bloc de tip Segment Tracker, astfel find posibilă urmărirea a mai multe segmente concomitent. În fereastra de proprietăți, utilizatorul are posibilitatea să vizualizeze în timp real procesul de detectare a segmentului precum și setarea a diferiți parametri. Segmentul detectat va fi marcat un cerc roșu intersectat plasat în centrul acestuia.

Figura 3.18 Blocul Segment Tracker

a – apariția exterioară a blocului Segment Tracker

b – fereastra de proprietăți a blocului Segment Tracker

Scheme standarte în Robotino View

Mediul de programare Robotino View este extrem de limitat în ceea ce privește utilizarea sistemului optic al robotului. Blocurile funcționale existente oferă puține scenarii în care poate fi integrate componentele subsistemului optic al robotului. Două din scenariile care pot fi implementate în Robotino View sunt deplasarea robotului pe linie și detectarea culorii cu deplasarea către acestea. Robotino View este o implementarea a limbajului secvențial GRAFCET, ceea ce permite utilizarea scenariilor de mai sus ca sub scenarii în programe complexe.

Deplasarea robotului pe linie

Deplasarea robotului pe linie este efectuată prin intermediul blocului Line Detector. Prima ieșire a blocului va întoarce coordonata pe axa x a liniei. Efectuând operația de scădere din această valoare a jumate din lățimea imaginii se poate de determinat cât de deplasat se află Robotino față de linie. Această informație poate fi utilizată pentru determinarea vitezei cu care robotul trebuie să se rotească în jurul axei sale. În același timp viteza de deplasare a robotului înainte poate fi lăsată constantă. Schema completă este prezentată în figura 3.5.

În partea dreaptă a schemei sunt plasate blocurile Camera, Line Detector și Image Information cu ieșirea de la blocul camera conectată la intrările celorlalte 2 blocuri. Blocul Image Information este utilizat pentru a obține informație referitor la dimensiunea imaginilor preluate de la cameră. Doar prima intrare a blocului Line Detector este utilizată. Ceilalți parametri utilizați de algoritmi sunt redați în pagina de setări a blocului. În acest exemplu, valorile parametrilor au fost setați la: pragul – 153, grosimea liniei – 10, înălțimea de la podea – 60.

Partea din mijloc a schemei implică determinarea vitezelor pe fiecare axă a mișcării robotului. La prima etapă este necesar de împărțit lățimea imaginii la 2. Pentru aceasta este necesar de conectat prima ieșire a blocului

Prima ieșire a blocului Image Information, ce corespunde informației legate de lățimea imaginei este conectată la prima intrare a blocului Divide, iar la a doua intrare un bloc Constant cu valoarea 2, ceea ce permite aflarea a jumate din lățime. Conectând prima ieșire a blocului Image Information și o constantă la un bloc Divide. La a doua etapă este necesar de determinat poziția liniei față de centrul robotului. Acest lucru poate fi efectuat prin scăderea din jumate din lățimea imaginii a coordonatei X a liniei detectate. Pentru aceasta este necesar de conectat ieșirea blocului Divide și prima ieșire a blocului Line Detector la un bloc Substraction. În cazul în care Linie se află la dreapta robotului valoare rezultantă a blocului Substraction va fi negativă iar în cazul în care se află valoarea rezultantă va fi pozitivă. Această valoare poate fi utilizată ca un coeficient pentru determinarea direcției de rotație a robotului. Înmulțind această valoare la un coeficient utilizatorul poate controla nivelul de reacție a robotului la intrarea în curve. În acest exemplu, valoarea coeficientului a fost stabilită la 0.5. Viteza de mișcare înainte este constantă și în acest exemplu constituie 150mm/s.

Vitezele calculate sunt comunicate motoarelor utilizând blocul Omnidrive, ce poate fi vizualizat în partea stângă a schemei.

Figura 3.19 Algoritmul de urmărire a liniei de către Robotino

Partea de mijloc a schemei poate fi înlocuită prin utilizarea blocului Lua Script. În acest caz, toate calculele pentru determinarea vitezelor robotului pot fi efectuate în utilizând limbajul scriptabil Lua, în interiorul blocului Lua Script.

Figura 3.20 Algoritmul de urmărire a liniei de către Robotino utilizând blocul Lua

Codul scriptului Lua:

out1 = 150

out2 = (in2 / 2 – in1) * 0.2

Detectarea și urmărirea culorii

Detectarea și urmărirea unei culori poate fi efectuată prin combinarea a două blocuri, Color Range Finder și Segment Tracker. Blocul Segment Tracker oferă un număr mare de ieșiri care pot fi utilizate pentru ghidarea robotului. În acest scop pot fi utilizați în special ieșirile ce corespund coordonate x a centrului segmentului, ariei segmentului și numărului de segmente detectate(ieșirile 1, 3, 6). Pentru funcționarea blocului Segment Tracker este necesar ca acesta să fie conectat la ieșirea blocului Color Range Finder. Schema completă este prezentată în figura 3.6.

În partea dreaptă a schemei sunt plasate blocurile Camera, Color Range Finder, Segment Tracker și Image Information. Acestea sunt utilizate pentru obținerea informației care va fi necesară pentru ghidarea robotului. Culoarea care necesită a fi găsită poate fi setată în fereastra de proprietăți a robotului însă setarea externă, prin utilizarea celei de-a doua intrări a blocului Color Range Finder este mai flexibilă, în special când setările sunt salvate în cadrul variabilelor. În acest exemplu a fost aleasă culoare roșie, parametrii căreia sunt salvate în variabila cu denumirea red. Ieșirea blocului Color Range Finder este conectată la prima intrare a blocului Segment Tracker și Image Information.

Partea din mijloc este utilizată pentru calcularea vitezelor robotului și a condiției de oprire a acestuia. Viteza de deplasare înainte a robotului este constantă însă acesta poate să se deplaseze înainte doar în momentul când culoarea a fost depistată. În acest scop este utilizată ieșirea nr. 6 a blocului Segment Tracker ce corespunde numărului de segmente depistate. Deoarece există posibilitatea ca blocul Segment Tracker să detecteze mai multe segmente, valoarea primită de la ieșirea nr. 6 a blocului necesită a fi normalizată. Acest lucru poate fi efectuat prin intermediul blocului Or. Simularea condiției este efectuată prin intermediul blocului Multiplication la care se conectează o constantă ce conține viteza dorită de deplasare și ieșirea numărul 6 a blocului Segment Tracker. Pentru ca robotul să păstreze direcția de deplasare spre culoarea detectată este necesar ca poziția acestuia să fie corectată în concordanță cu centrul segmentului detectat. Efectuând scăderea din jumate din lățimea imaginii a coordonatei x a segmentului detectat se poate de determinat deplasarea robotului față de centrul segmentului detectat. Determinarea a jumate din lățimea imaginii se efectuează ca și în cazul schemei precedente și a poziției robotului față de mijlocul segmentului detectat se efectuează ca și în cazul schemei precedente. În acest scop este utilizată prima intrare a blocului Segment Tracker. Blocul Transform Function este utilizat pentru normalizarea diferenței obținute în pasul precedent. Astfel, viteza de rotație a robotului în jurul axei sale nu va depăși valoare de 50 deg/s în orice direcție.

Pentru detectarea faptului că robotul a ajuns la culoarea dorită pot fi utilizate diverse mecanisme. În acest exemplu, în cazul în care aria segmentului detectat depășește 4500 de pixeli, execuția programului va trece la altă etapă. A treia ieșire a blocului Segment Tracker, împreună cu o constantă cu valoarea 4500 este conectată la un bloc Greater. Ieșirea blocului Greater este conectată la blocul de citire a variabilei target_reached. Această variabilă va fi utilizată ca condiție pentru validarea trecerii de la o schemă la alta. Trecerea se va efectua în cazul valorii True.

Ca și în cazul precedent, vitezele determinate sunt transmise motoarelor prin intermediul blocului Omnidrive în partea stângă a schemei.

Figura 3.21 Schema de urmărire a culorii de către Robotino

Ca și în cazul schemei precedente partea de mijloc a schemei poate fi simplificată utilizând blocul Lua Script.

Figura 3.22 Schema de urmărire a culorii de către Robotino utilizând blocul Lua Script

Codul Sursă Lua:

out1 = 4500 <= in2;

out2 = (in3 ~= 0) * 300;

out3_val = in4 / 2 – in3;

if out3_val < -50 then out3_val =-50;

elseif out3_val > 50 then out3_val = 50; end;

out3 = out3_val;

3.3.2 Detectarea unei liste de culori

Descrierea scenariului

Elaborarea unui algoritm ce ar permite robotului să detecteze un set de culori prestabilite, și să se deplaseze pe rând spre fiecare culoare detectată. După depistarea culorii, aceasta va fi exclusă din lista de culori pentru detectare. În cazul în care toate culorile au fost depistate execuția programului va fi stopată.

Considerente Teoretice

Acest proiect este compus din 3 etape:

Detectarea culorii

Deplasarea spre culoarea detectată

Eliminarea culorii din lista de culori ce trebuie detectate.

Fiecare etapă poate fi dezvoltată ca un program separat grație implementării de către Robotino View a limbajului standartizat GRAFCET. Trecerea de la o etapă de executare la alta va fi controlată de către diverse variabile. În cazul acestui program, în acest scop vor fi utilizate 3 variabile.

Exemplu de implementare

Proiectul utilizează în diverse scopuri 9 variabile de tip float și floatvector: red, blue, green, pink, color_detected_index, color_detected_vector, colors_vector, target_reached și terminate. red, blue, green și pink sunt variabile de tip floatvector ce sunt utilizate pentru păstrarea culorilor codificate în format HSV. În acest exemplu, valorile acestora sunt: red – 0 0 100 100 39 100, blue – 240 240 100 100 38 100, green – 120 120 100 100 45 100, pink – 289 310 100 100 45 100. Această soluție simplifică semnificativ procesul de administrare a culorilor. colors_vector este o variabilă de tip floatvector ce reprezintă combinarea celor 4 culori. Această soluție reduce numărul de variabile utilizate în cadrul programelor și oferă un strat abstract adăugător ceea ce poate simplifica modificările proiectului în viitor. color_detected_index este o variabilă de tip float ce este utilizată pentru determinarea indexului culorii care a fost detectată. În acest exemplu culorile au următoarea codificare: roșu – 1, albastru – 2, verde – 3, roz – 4. Valoarea 0 înseamnă că momentan nici o culoare nu a fost detectată. color_detected_vector este o variabilă de tip floatvector compus din 4 elemente cu valorile posibile 0 sau 1. Această variabilă este utilizată pentru determinarea faptului dacă o culoare a fost sau nu detectată, 1 – culoarea nu a fost detectată, 0 – a fost detectată. Poziția elementului care păstrează informația despre detectarea culorii este asociată cu indexul atribuit fiecărei culori. target_reached este o variabilă de tip float ce este utilizată pentru notificarea faptului că Robotino a ajuns la culoarea detectată. terminate este o variabilă de tip float ce este utilizată pentru notificarea faptului că robotul a detectat toate culorile căutate și execuția ulterioară a acestuia trebuie stopată.

Proiectul este constituit din 5 blocuri: Init, Rotate, Find Color, Go To Color și Change Color. În figura 3.23 este prezentată diagrama secvențială a proiectului.

Figura 3.23 Schema secvențială a proiectului Detectarea Listei de Culori

Blocul Init este responsabil de inițializarea variabilelor proiectului. Blocul Rotate este responsabil de rotirea robotului cât timp blocul Find Color efectuează căutarea culorilor. Execuția celor două blocuri va fi efectuată simultan. În cazul în care blocul Find Color a găsit o culoare variabila color_detected_index își va schimba valoarea ceea ce va determina ca execuția programului să fie preluată de către blocul Go To Color care va efectua deplasarea robotului către obiectul de culoarea detectată. După sosirea la destinație variabila target_reached își va schimba valoarea ceea ce va declanșa execuția blocului Change Color ce va efectua excluderea culorii găsite recent din lista colorilor ce trebuie detectate precum și dacă toate culorile au fost detectate. În cazul în care toate culorile au fost detectate variabila terminate își va schimba valoarea și odată cu asta, execuția programului va fi stopată iar în caz contrar, execuția programului va fi reluată de la blocul Init.

Figura 3.24 Structura programelor Init și Rotate

a – Structura programului Init

b – Structura programului Rotate

În figura 3.22a este prezentată structura programului Init. Acesta este utilizat doar pentru inițializarea variabilei colors_vector. În acest scop este utilizat blocul Float Array Composer la intrările căruia sunt conectate toate variabilele ce păstrează culorile. În rezultat, la ieșirea blocului Array Float Composer se va obține un vector ce este compus din valorile tuturor culorilor păstrate individual. Rezultatul de la ieșirea Array Float Composer este păstrat de către variabila colors_vector și este utilizat în alte programe ulterior.

În figura 3.22b este prezentată structura programului Rotate. Acesta este compus dintr-o simplă schemă ce permite robotului să se rotească în jurul axei sale cu o viteză constantă, în acest exemplu de 10 g/s.

În figura 3.25 este prezentată structura programului Find Color. Acest program utilizează 4 seturi de blocuri Color Detector și Segment Tracker, câte un set pentru fiecare culoare care necesită a fi detectată. Partea din stânga a programului este utilizată pentru determinarea vectorilor de culori ce necesită a fi transmise către blocurile Color Detector. Acest lucru este efectuat prin utilizarea a 4 blocuri Float Array Decomposer care vor extrage din variabila colors_vector câte un vector ce corespunde culorii ce necesită a fi detectată. Această soluție a fost aleasă în special pentru a separa procesul de setare a culorilor de procesul de detectare a acestuia. Pentru a simplifica schema, o parte din intrările pentru blocurile Float Array Decomposer sunt generate de către un script Lua

Figura 3.25 Schema Find Color

Listingul Scriptului Generate Inputs:

out1 = 0

out2 = 7

out3 = 13

out4 = 19

out5 = 6

Detectarea culorii se efectuează prin compararea coordonate x a segmentului detectat cu mijlocul imaginii. Culoarea este considerată ca detectată în cazul în care centrul acesteia se află în limita de -10…10 pixeli față de centrul imaginii. În acest scop este utilizat un bloc Lua care efectuează toate calculele ce poate fi observat în partea dreaptă a schemei. La prima intrare a blocului este conectată prima ieșire a blocului Image Information ce reprezintă informația legată de lățimea imaginii. La celelalte ieșiri sunt conectate primele ieșiri a blocurilor Segment Tracker împerecheate cu ieșirile de la blocul Float Array Splitter la care este conectat variabila color_detected_vector. Blocul Float Array Splitter permite accesare tuturor elementelor vectorului. Valorile variabilei color_detected_vector vor fi utilizate pentru determinarea dacă culoarea trebuie să fie detectată sau nu. Mai jos este prezentat listingul scriptului Lua.

Listingul scriptului Find Module:

local half_width = in1 / 2;

local det_col_cnt1 = half_width – in2;

local det_col_cnt2 = half_width – in4;

local det_col_cnt3 = half_width – in6;

local det_col_cnt4 = half_width – in8;

local check_col1 = in3;

local check_col2 = in5;

local check_col3 = in7;

local check_col4 = in9;

if half_width == 0 then

out1 = 0;

elseif check_col1 and -10 < det_col_cnt1 and det_col_cnt1 < 10 then

out1 = 1;

elseif check_col2 and -10 < det_col_cnt2 and det_col_cnt2 < 10 then

out1 = 2;

elseif check_col3 and -10 < det_col_cnt3 and det_col_cnt3 < 10 then

out1 = 3;

elseif check_col4 and -10 < det_col_cnt4 and det_col_cnt4 < 10 then

out1 = 4;

else

out1 = 0;

end

Figura 3.26 Schema Go To Color

În figura 3.26 este prezentată structura programului Go To Color. Această schemă este similară cu schema pentru detectarea și urmărire a culorii prezentate anterior în figura 3.18. Deosebirea acestei scheme față de schema prezentată anterior o constituie Selectarea dinamică a culorii ce necesită a fi detectată. Mecanismul de selectare a culorii este bazat pe utilizarea variabilelor color_detected_index și colors_vector. Scriptul Lua Index Calculator va genera valorile Start Index și Length a blocului Float Array Decomposer care la rândul său vor servi pentru extragerea din variabila colors_vector a unei secvențe corespunzătoare unei culori. Mai jos este prezentat listingul scriptului Lua:

Listingul scriptului Index Calculator:

arr_len = 6;

out2 = arr_len;

out1 = (in1 – 1) * arr_len + 1;

Figura 3.27 Schema Change Color

În figura 3.25 este prezentată structura programului Change Color. Scriptul Lua din imagine este responsabil de schimbarea valorii în 0 a elementului vectorului color_detected_index la care indică variabila color_detected_index. Elementele individuale ale vectorului sunt obținute utilizând blocul Float Array Decomposer. Rezultatele executării scriptului Lua sunt reasamblate într-un vector utilizând blocul Float Array Composer și savate din nou în variabila color_detected_vector. Efectuând operația sau asupra elementelor se poate de determinat dacă toate culorile au fost detectate sau nu. Mai jos este prezenta listingul scriptului Lua.

Listingul scriptului Lua:

out1 = in1 == 1 and 0 or in2;

out2 = in1 == 2 and 0 or in3;

out3 = in1 == 3 and 0 or in4;

out4 = in1 == 4 and 0 or in5;

3.3.3 Semaforul

Descrierea Scenariului

Elaborarea unui algoritm care ar permite deplasarea robotului pe o traiectorie marcată de o linie. În cazul în care în fața robotului va apărea un obiect de culoare roșie acesta se va opri la o distanță prestabilită de la obiect și va aștepta ca acesta să dispară. Robotino își va continua deplasarea doar atunci când în fața sa va apărea un obiect de culoare verde.

Considerații Teoretice

Acest proiect poate fi împărțit în 3 pași separați

Deplasarea robotului pe traiectorie

Detectarea culorii roșii

Detectarea culorii verzi

Faza de deplasare a robotului pe traiectorie va fi executată concomitent cu detectarea culorii roșii. În cazul în care a fost detectat un obiect de culoare roșie și acest obiect se află la o distanță prestabilită. Execuția programului va trece la etapa de detectare a culorii verzi. În cazul în care a fost detectat un obiect de culoare verde deplasarea robotului va fi reluată.

Exemplu de implementare

Proiectul utilizează 4 variabile de tip float și floatvector: red, green, is_red, is_green. red și green sunt variabile de tip floatvector ce sunt utilizate pentru păstrarea culorilor codificate în format HSV. În acest exemplu, valorile acestora sunt: red – 0 0 100 100 39 100, green – 120 120 100 100 45 100. is_red și is_green sunt variabile de tip float ce sunt utilizate pentru a comunica dacă culorile roșu și respectiv verde au fost detectate.

Proiectul este constituit din 4 blocuri: Init, Follow Line, Look for Red și Look For Green. În figura blablabla este prezentată diagrama secvențială a proiectului:

Figura 3.28 Schema secvențială a proiectului Semaforul

Blocul Init este responsabil de inițializarea variabilelor utilizate în proiect. Blocul Follow Line este responsabil de deplasarea robotului pe traiectorie. Blocul Loor For Red este responsabil de detectarea culorii roșii. Blocul Look For Green este responsabil de detectarea culorii verzi. Execuția blocurilor Follow Line și Look For Red se va efectua concomitent. Odată cu detectarea culorii roșii, blocul Follow Line își va transmite execuția către blocul Look For Green. În cazul în care, blocul Look For Green va detecta culoarea verde execuția proiectului va fi reluată de la blocul Init.

Figura 3.29 Schema programului Init

În figura 3.29 este prezentată structura blocului Init, unde poate fi observat că blocul Init este utilizat pentru resetarea variabilelor is_red și is_green.

Figura 3.30 Schema programului find_red

Figura 3.31 Schema programului find_green

Structura blocului Follow Line corespunde întocmai structurii programului follow line prezentat în figura 3.20. În figura 3.30 este prezentată structura blocului Look for Red. În scopul detectării dacă robotul se află la distanța dorită față de obiect este utilizată aria segmentului detectat. În acest exemplu, obiectul de culoare roșie se consideră a fi detectat dacă aria acestuia depășește 4500 de pixeli. În figura 3.31 este prezentată structura blocului Look for Green. Schema din acest bloc este similară cu cea din figura 3.30. Singura diferență o constituie că culoarea verde poate fi detectată doar dacă culoarea roșie nu mai este vizibilă.

IV ARGUMENTAREA ECONOMICĂ A PROIECUTLUI

În cadrul lucrării de licență ”Dezvoltarea platformei de rulare și testare a aplicațiilor pe Robotino Festo Didactic” s-a efecutat o cercetare a posibilității de utilizare în sistemul educațional a robotului mobil Robotino de la compania Festo Didactic. În carul lucrării a fost elaborat un set de scenarii în care robotul poate fi utlizat. Fiecare scenariu este completat cu o soluție dezvoltată în cadrul uneia din tehnologii Robotino View și C++ API2. Lucrarea de licență poate fi utilizată ca bază pentru dezvoltarea programelor educaționale robotice cu implicarea sistemului robotic mobil Robotino.

Oferta de pe piață în cadrul programelor educaționale ce utilizează sistemul robotic Robotino este extrem de limitată, practic inexistentă. În marea majoritate a cazurilor, programele de studiu elaborate nu sunt accesibile publicului larg. Singurul suport didcatic comercial pe Robotino existent pe piață este Robotino Workbook oferit de către compania Festo Didactic la un preț de 350 euro[4].

Tabel 4.1 Analiza SWOT a proiectului

Pentru a determina faptul că acest proiect va fi util este necesară efectuarea unei analize atât a avantajelor soluției propuse față de soluțiile existente cât și a altor factori care ar putea influența reușita. Una din metodologiile care permit detectarea tutoror avantajelor și dezavantajelor soluției este analiza SWOT. Termenul de SWOT este un acronim constituit din 4 cuvinte din limba engleză(Strengths, Weaknesses, Opportunities, Threats) care în traducere semnifică: puncte forte, puncte slabe, oportunități și riscuri. Analiza SWOT este o metodologie utilă ce poate fi utilizată pentru a analiza dacă proiectul merită a fi implementat. În cazul în care numărul de puncte forte și oportunități prevalează numărul de puncte slabe și riscuri, implementarea proiectului poate fi începută. În tabelul 4.1 este prezentată analiza SWOT a proiectului.

Planul de activități în cadrul proiectului

Stabilirea etapelor de dezvoltare a proiectului precum și stabilirea termenilor de realizare a acestora și a persoanelor responsabile este importantă pentru dezvoltarea cu succes a unui sistem informatic, atât hardware cât și software. Orice proiect este constituit dintr-o serie de etape standarte precum studierea domeniului de studiu, cercetarea resurselor umane, căutarea resurselor hardware și software, stabilirea obiectivelor generale și finale ale proiectului. Unele din etapele de dezvoltare sunt independente ceea ce permite efectuarea acestora în paralel pentru eficiență și economie de timp și resurse. În unele cazuri, rezultatele etapei precedente necesită a fi luate în considerație pentru etapa actuală. În acest caz este necesară o ordine stabilită de executare. În figura 4.2 este prezentată sub formă de diagrama Gantt, distribuirea cronologică a timpului alocat etapelor de dezvoltare a proiectului. În această diagrama pot fi observate etapele care pot fi efectuate concomitent și posibilitățile de paralelizare ale acestora.

Project Manager(PM) – persoana care este responsabilă de dezvoltarea proiectului de la stadia de idee până la stadia inițială. Această persoană este responsabilă de definirea cerințelor, organizarea procesului de lucru în cadrul echipei precum și este responsabilă de deciziile luate în urma unor schimbări apărute în procesul de dezvoltare a proiectului. Printre alte responsabilități ale Project Manager-ului se numără cercetarea pieței în domeniul de dezvoltare, ducerea tratativelor cu potențialii clienți și experți din domeniu precum și administrarea strategiei de marketing după ce proiectul este făcut accesibil publicului larg.

Programator Robotino View(PRW) – persoana care este responsabilă de dezvoltarea soluțiilor software ce vizează mediul de programare Robotino View. Această persoană este responsabilă de definirea schemelor algoritmilor în mediul de programare Robotino View precum și de testarea funcționalității corecte a acestora.

Programator C++(PC) – persoana care este responsabilă de dezvoltarea soluțiilor software

Expert Robotică și Mecatronică(ERM) – persoană care posedă cunoștințe în domeniul roboticii și mecatronicii și care poate oferi o bază de cunoștințe ce va fi utilă pentru elaborarea scenariilor în care va fi implicat Robotino.

Expert Educație(EE) – persoană care posedă cunoștințe în domeniul educațional și care poate oferi un suport necesar pentru dezvoltarea programelor de studiu

Tabelul 4.2 Planificarea lucrărilor de proiect

Analizând diagrama Gantt prezentată în figura 4.1 se poate de constat că implementare proiectului durează 42 de zile.

Estimarea cheltuielilor de proiectare

Pentru o administrare efectivă a costurilor produsului final este necesară cercetarea cheltuielilor de proiectare implicate. În aceste cheltuieli se includ mai multe categorii precum cheltuielile indirecte de producție, cheltuielile directe privind retribuirea muncii, consumul de materiale pentru cercetare, cheltuielile totale și costul produsului.

Fonduri fixe:

Din categoria de bunuri fixe fac parte bunurile agenților economici care sunt menite pentru utilizarea în mai mult de un proces. Din această categorie de bunuri fac parte dispozitive precum calculatoare personale, mijloace de transport, mobilier etc[13]. Lista fondurilor fixe utilizate este prezentat în tabelul 4.3.

Tabelul 4.3. Fonduri fixe

De menționat este faptul că deși la începutul este nevoie doar de un singur computator personal pentru Project Manager, ulterior la etapa de dezvoltare a lucariilor de laborator numărul acestora necesită a fi mărit pentru o administrare cât mai efectivă a resurselor de timp disponibilă.

Calcularea uzurii pentru fondurile fixe

Calculul uzurii fondurilor fixe a mijloacelor tehnice implicate la elaborarea soft-ului poate fi calculat utilizat formula 4.1

unde, – costul inițial al utilajului, lei,

– norma de uzură anuală a utilajului (25%),

– timpul de utilizare a utilajului în proiecte, zile.

Mai jos sunt prezentate calculele pentru aflarea uzurii pentru fiecare componentă. Indicele formulei va indica la materialul cu numărul respectiv din tabelul 4.4.

Tabelul 4.4 Cheltuielile pentru procurarea soft-ului

Din categoria fondurilor circulante fac parte valorile și bunurile care participă la un singur circuit economic, fiind deținute pe termin scurt de către proiectant. Această categorie joacă un rol important în finanțarea activității curente a companiei. În tabelul 4.5 este prezentată lista materialelor din categoria fondurilor circulante precum și prețurilor acestora.

Tabelul 4.5 Fonduri circulante

Cheltuieli indirecte de producție

Din categoria costurilor indirecte de producție fac parte totalitatea cheltuielilor care nu pot fi considerate ca consumuri directe. Din această categorie fac parte costurile de întreținere, costurile serviciilor comunale și altele. În tabelul 4.6 este prezentată lista serviciilor indirecte utilizate în cadrul dezvoltării proiectului

Tabelul 4.6 Cheltuielile indirecte.

Calculul cheltuielilor indirecte pe durata de elaborare a proiectului

unde, – preț lunar, lei

– timpul de realizare a proiectului, lei

Mai jos sunt prezentate calculele pentru aflarea cheltuielilor indirecte a fiecare categorie de cheltuieli. Indicele formulei va indica la categoria de cheltuieli cu numărul respectiv din tabelul 4.4.

Cheltuielile directe privind retribuirea muncii

În tabelul 4.8 pot fi vizualizate datele privind retribuirea muncii. Tot aici sunt incluse și diverse impozite obligatorii care necesită a fi achitate de către angajator.

Conform legii bugetului național al Republicii Moldova în anul 2019 cuantumul defalcărilor a Fondului de Asigurări Sociale(FS) este 18%, iar a Primelor de Asigurare Medicală(AM) este 4.5%.

Pentru determinarea salariului final este utilizată formula:

unde, – salariul pe proiect, lei

– salariul tarifar lunar, lei

– numărul de zile lucrate în proiectul

– fondul de lucru nominal într-o lună, 20 zile.

Mai jos sunt prezentate calculele pentru determinarea salariului final al fiecărui angajat. Indicele formulei va indica la categoria de cheltuieli cu numărul respectiv din tabelul 4.4.

Salariul total care mai este numit și fondul de retribuire a muncii este utilizat pentru determinarea contribuțiilor în Fondul Social(FS), formula 4.4 precum și a primei de Asigurare Medicală Obligatorie(AM), formula 4.5.

unde, – fondul de retribuire a muncii, lei

– cota contribuțiilor de asigurări social de stat obligatorii

unde, – Fondul de retribuire a muncii, lei

– Coda primei de asigurări obligatorii de asistență medicală.

Mai jos sunt prezentate calculele pentru determinarea contribuțiilor în Fondul Social și a primei de Asigurare Medicală Obligatorie pentru fiecare angajat. Indicele formulei va indica la angajatul cu numărul respectiv din tabelul 4.4.

Tabelul 4.7 Calculul fondului de retribuire a muncii

Cheltuielile totale și costul produsului

Determinarea costului produsului dezvoltat poate fi efectuată prin însumarea tuturor cheltuitelor identificate anterior precum fondurile fixe și circulante, salariile și uzura. În tabelul 4.8 este prezentată lista cheltuielilor și cota parte a acestora din suma totală și prețul de cost al produsului.

Tabelul 4.8 Prețul de cost al proiectului

4.3 Efectele socio-economice ale implementării proiectului

În urma analizării rezultatelor obținute în tabelul 4.8 se poate constata că costurile de implementare a proiectului sunt relativ ridicate, circa 130322.8 lei echivalentul a 6516 euro. Cota majoritară a cheltuielilor, în proporții de circa 90%, este reprezentată de cheltuielile directe de retribuire a muncii. Ponderea celorlalte tipuri de cheltuieli luate împreună nu depășește cifra de 10%.

Implementarea proiectului va facilita mărimea numărului de programe educaționale oferite în domeniile roboticii și mecatronicii ceea ce va contribui considerabil la popularitatea acestor domenii, astfel suplinind cererea de pe piață de astfel de specialiști care este în continuă creștere. Alte domenii IT de asemenea vor avea de câștigat din implementarea proiectului. Domeniul roboticii este considerat drept o poartă în domeniul IT pentru persoanele noi fără experiență .

Robotino este un robot ce utilizează componente de standart industrial ceea ce înseamnă că persoanele instruite cu ajutorul acestui robot vor avea o pregătire profesională mai bună.

În concluzie se poate afirma că deși costul implementării proiectului este unul mare, implementarea acestuia va avea efecte economice benefice pe termen lung.

CONCLUZII

Domeniul roboticii și mecatronicii este un domeniu fascinant care în ultimul timp cunoaște o dezvoltare enormă ceea ce face ca specialiștii în aceste domenii să fie tot mai căutați. Concurență de pe piața prestatorilor de servicii educaționale este tot mai mare iar instituțiile de învățământ care nu se adaptează tendințelor actuale riscă să dispară. În condițiile actuale instituțiile de învățământ, trebuie să mărească ofertă de programe educaționale robotice și mecatronice.

Sistemul robotic mobil Robotino este ales din ce în ce mai mult ca platformă pentru programele educaționale mecatronice și robotice. Acest fapt este datorat numărului mare de avantaje pe care îl oferă Robotino. Printre avantajele utilizării platformei se numără calitatea durabilă, de standart industrial a robotului, numărul mare de senzori cu care este dotat, sistemul de direcție omnidirecțional, posibilitatea de extindere a funcționalității prin conectarea de dispozitive adăugătoare, utilizarea a unui sistem de operare pe baza Linux și ROS(Robot Operating System) și altele. Mediul de programare de bază a sistemului, Robotino View, permite elaborarea algoritmilor de control al robotului chiar și pentru persoanele nefamiliare cu conceptele de programare. Principalul dezavantaj al platformei care împiedică adoptarea sa mai largă este costul ridicat al acesteia. Prețul sistemului începe de la suma de 10000 euro pentru modelul de bază și poate crește considerabil în dependență de configurația aleasă.

La moment toate programele de studiu elaborate pe baza lui Robotino nu sunt accesibile publicului larg ceea ce complică dezvoltarea de programe educaționale noi. Singurul suport didactic despre utilizarea lui Robotino ca platformă educațională este distribuită pe condiții comerciale de către compania Festo Didactic.

Aceast proiect reprezintă o cercetare a posibilităților de utilizare a sistemului robotic mobil Robotino în cadrul programelor de studiu. În cadrul proiectului au fost elaborate un șir de scenarii de utilizare a robotului precum și cu câte o soluție exemplu la fiecare scenariu. Acest proiect nu reprezintă o programă educațională completă ci doar o imagine a cum o astfel de programă ar putea arăta. Scopul acestui este menit să fie utilizat ca bază pentru elaborarea programelor de studiu ulterioare.

Din punct de vedere economic, dezvoltarea unui program educațional pe baza lui Robotino implică cheltuieli financiare relativ ridicate. Cota cea mai mare a cheltuielilor proiectului este reprezentă de cheltuielile legate de procurarea robotului. Pentru dezvoltarea unui program de studiu de succes este recomandată procurarea versiunii Professional al aplicației Robotino Sim precum și a suportului didactic Robotino Workbook

BIBLIOGRAFIE

DAVID BRADLEY and DAVID W, RUSSEL, Mechatronics in Action: Case Studies in Mechatronics – Applications and Education, Londra, Marea Britanie: Springer-Verlag London Limited, 2010, 263p. ISBN 978-1-84996-079-3.

ROBERT H. BISCHOP, MECHATRONICS: An Introduction, Austin, SUA: Taylor&Francis, 2006, 285p. ISBN 978-0-8493-6358-0.

PRŠIĆ D., STOJANOVIĆ V., DORDEVIĆ V. A Constructive Approach to Teaching with Robotino

CRNOKIĆ B., GRUBIŠIĆ M., VOLARIĆ T. Different Applications of Mobile Robots in Education

ROBERTO IEURSALIMSCHY, Programming in Lua, Second Edition, Rio de Janeiro, Brazilia, 2006, 329p. ISBN 85-903798-2-5

BJARNE STROUSTUP, The C++ Programming Language, Fourth Edition, New Jersey, SUA: Addison-Wesley, 2013, 1346p, ISBN 0-321-56384-0

Lego Group,” Mindstorms EV3 User Guide”, 2013

Festo,” Robotino Workbook”, 2013

https://www.festo-didactic.com/int-en/

http://wiki.openrobotino.org/index.php?title=EA09_realtime_tools

http://www.sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y0a21yk_e.pdf

STEPHEN PRATA, C++ Primer Plus, Sixth Edition, New Jersey, Sua: Addison-Wesley, 2012, 1438p, ISBN 0-321-77640-2

BJARNE STROUSTUP, A History of C++: 1979-1991, New Jersey, SUA, 55p,

https://cmake.org/

https://visualstudio.microsoft.com/?rr=https%3A%2F%2Fwww.google.com

ANEXA 1

Scriptul CMake pentru generarea proiectului Visual Studio

set(CMAKE_MODULE_PATH

$ENV{ROBOTINOAPI2_64_DIR}/cmake

$ENV{RECRPC64_DIR}

$ENV{ROBOTINOCOMMON64_DIR}/cmake

$ENV{ROBOTINO_QT_DIR}

)

find_package(RobotinoAPI2 REQUIRED)

find_package(RecRpc REQUIRED)

find_package(RobotinoCommon REQUIRED)

COPY_ROBOTINOAPI2_DLLS(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})

COPY_REC_RPC_DLLS(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})

COPY_ROBOTINOCOMMON_DLLS(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR})

include(MyQt)

add_executable(test2 "src/main.cpp" "src/MyCom.cpp" "src/MyOmniDrive.cpp" "src/MyOdometry.cpp")

target_link_libraries(

test2

${REC_ROBOTINO_API2_LIBRARY}

${REC_RPC_LIBRARY}

${REC_ROBOTINO_REC_LIBRARY}

${QT_LIBRARIES}

)

ANEXA 2

Codul sursă a algoritmului de deplasare a lui Robotino utilizând tastatura

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <rec/robotino/api2/all.h>

#include <windows.h>

#include <opencv2/opencv.hpp>

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>

#define VELOCITY 0.5f

HHOOK keyboardHook;

using namespace rec::robotino::api2;

using namespace cv;

using namespace std;

Com com;

OmniDrive omniDrive;

DistanceSensor distanceSensor;

float velocityX, velocityY, velocityZ = 0;

Camera cam1;

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)

{

PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lParam;

if (wParam == WM_KEYDOWN && nCode == HC_ACTION)

{

std::cout << key->vkCode << std::endl;

switch (key->vkCode) {

case 188:

velocityY = VELOCITY;

break;

case 38:

velocityX = VELOCITY;

break;

case 190:

velocityY = -VELOCITY;

break;

case 40:

velocityX = -VELOCITY;

break;

case 37:

velocityZ = 0.6;

break;

case 39:

velocityZ = -0.6;

break;

}

}

else if (wParam = WM_KEYUP && nCode == HC_ACTION)

{

switch (key->vkCode) {

case 37:

velocityZ = 0;

break;

case 38:

velocityX = 0;

break;

case 39:

velocityZ = 0;

break;

case 40:

velocityX = 0;

break;

case 188:

velocityY = 0;

break;

case 190:

velocityY = 0;

break;

}

}

omniDrive.setVelocity(velocityX, velocityY, velocityZ);

return CallNextHookEx(keyboardHook, nCode, wParam, lParam);

}

static void finishExecution(const int exitCode)

{

std::cout << "Press any key to exit … " << std::endl;

waitForKey();

shutdown();

exit(exitCode);

}

static void videostream() {

VideoCapture cap; //

cap.open("http://127.0.0.1/0");

if (!cap.isOpened()) // if not success, exit program

{

cout << "Cannot open the video cam" << endl;

return;

}

double dWidth = cap.get(CAP_PROP_FRAME_WIDTH); //get the width of frames of the video

double dHeight = cap.get(CAP_PROP_FRAME_HEIGHT); //get the height of frames of the video

cout << "Frame size : " << dWidth << " x " << dHeight << endl;

namedWindow("MyVideo", WINDOW_AUTOSIZE); //create a window called "MyVideo"

while (1)

{

Mat frame;

Mat contours;

bool bSuccess = cap.read(frame); // read a new frame from video

if (!bSuccess) //if not success, break loop

{

cout << "Cannot read a frame from video stream" << endl;

break;

}

flip(frame, frame, 1);

imshow("MyVideo", frame); //show the frame in "MyVideo" window

if (waitKey(30) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop

{

cout << "esc key is pressed by user" << endl;

break;

}

}

}

static void init(const std::string &hostname)

{

distanceSensor.setSensorNumber(0);

std::cout << "Connecting … ";

com.setAddress(hostname.c_str());

com.connectToServer(true);

if (false == com.isConnected())

{

std::cout << "fail" << std::endl

<< "Could not connect to " << com.address() << std::endl;

finishExecution(1);

}

std::cout << "success" << std::endl;

}

int main(int argc, const char **argv)

{

std::string hostname = "127.0.0.1";

if (argc > 1)

hostname = argv[1];

init(hostname);

keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, NULL);

MSG msg{ 0 };

while (GetMessage(&msg, NULL, 0, 0) != 0);

UnhookWindowsHookEx(keyboardHook);

return (0);

}

Similar Posts