CONTROLUL BRAȚULUI ROBOT IN TIMP REAL BAZAT PE SEMNALE ELECTROMIOGRAFICE [311289]

[anonimizat]:

Controlul brațului robot in timp real bazat pe semnale electromiografie

CONȚINUTUL lucrării de disertație

Cinci capitole

Bibliografie

Anexe

LOCUL DOCUMENTĂRII: [anonimizat]: Prof. Dr. Ing. Hedeșiu Horia

Data emiterii temei: 20 decembrie 2018

Termen de predare: 10 iulie 2020

[anonimizat]: [anonimizat]. Horia HEDEȘIU Ing. [anonimizat]: Deoarece acest proiect de diplomă/lucrare de disertație nu ar fi putut fi finalizat(ă) fără ajutorul membrilor departamentului ……………………….… și a [anonimizat].

Data: ………… Semnătura

Declarație: Subsemnatul …………………….……………… declar că am întocmit prezentul proiect de diplomă/[anonimizat], sub îndrumarea conducătorului științific și pe baza bibliografiei indicate de acesta.

Data: ………… Semnătura

Cuprins

CAPITOLUL I

[anonimizat], în prezent permit utilizatorilor să îmbunătățească calitatea vieții în multe domenii de aplicare. Astfel au fost inventate numeroase dispozitive care permit controlul de la distanță a activităților, fără interacțiunea directă umană.

[anonimizat] – [anonimizat]. [anonimizat](EMG).

Electromiografia este studiul funcției musculare prin analiza potențialului electric produs de către mușchi. EMG în zilele noastre a devenit un instrument important în aplicațiile biomedicale și clinice. Astfel, detectarea, prelucrarea și analiza semnalului EMG a [anonimizat] o [anonimizat], fizician la cercetător în domeniul informaticii. Dezvoltarea electromiografiei (EMG) a început cu documentația lui Francesco Redi în 1666. Documentul informează că unele grupe de mușchii ale țiparului generează electricitate. În 1773, Walsh a reușit să demonstreze că țesutul muscular al țiparului ar putea genera o scânteie de electricitate. În 1792 a apărut o publicație intitulată „Viribus Electricitatis in Motu Musculari Commentarius”, scrisă de A. Galvani, în care autorul a arătat că energia electrică ar putea declanșa contracții musculare.

Astfel pentru a [anonimizat]. [anonimizat] a [anonimizat]. Pentru

CAPITOLUL I

INTRODUCERE

Motivația

La momentul actual nevoia de utilizare a roboților nu mai poate fi negată. Datorită dezvoltării permanente a tehnologiilor, [anonimizat]. [anonimizat]se pentru a fi realizate de către oameni. Un exemplu este explorarea spațiului. Un alt exemplu fiind în domeniul medicinii unde adesea este nevoie de o precizie ridicată, de care un om nu este capabil să o aibă. Aici vine la ajutor un robot de precizie, de exemplu robotul chirurgical daVinci Xi cu o precizie înaltă și o invazie minimă, ceea ce reduce riscul de infecție.

Dorința de a crea un braț robotic prin care să-l controlez, mi-a trezit interesul să aprofundez cunoștințele în acest domeniu. Având la dispoziție o gamă largă de produse: de propulsie, de analiză, de control, de comandă, etc. am încercat cu pași înceți dar siguri să dezvolt acest produs, care în viitor să poată fi folosit în scop educativ, să fie modernizat ca comenzile de execuție să fie cu mult mai precise.

În această lucrare, interacțiunea dintre om – braț robotic este obținută prin folosirea dispozitivului de nouă generație Myo armband. Acest lucru este datorat prin recepționarea contracțiilor musculare, electromiografia(EMG). De asemenea, semnalele primite sunt trimise mai departe la dispozitivul NI myRIO, iar cu ajutorul programului creat în LabVIEW, să controlăm brațul robotic.

Introducere

Progresele tehnologice în domeniul producției dispozitivelor electronice inteligente, disponibile tot mai mult la costuri mai mici, în prezent permit utilizatorilor să îmbunătățească calitatea vieții în multe domenii de aplicare. Astfel au fost inventate numeroase dispozitive care permit controlul de la distanță în timp real a activităților, fără interacțiunea directă umană.

Dezvoltarea electromiografiei a început cu documentația lui Francesco Redi în 1666. Documentul specifică faptul că unele grupe de mușchi ale țiparului generează electricitate. În 1773, Walsh a reușit să demonstreze că țesutul muscular al țiparului ar putea genera o scânteie de electricitate. În 1792 a apărut o publicație intitulată „Viribus Electricitatis in Motu Musculari Commentarius”, scrisă de A. Galvani, în care autorul a arătat că energia electrică ar putea declanșa contracții musculare[2].

Electromiografia este studiul funcției musculare prin analiza potențialului electric produs de către mușchi. EMG în zilele noastre a devenit un instrument important în aplicațiile biomedicale și clinice. Astfel, detectarea, prelucrarea și analiza semnalului EMG a devenit un element major de cercetare în domeniul biomedical, care implică o gamă largă de experți de la medic, inginer, fizician la cercetător în domeniul informaticii.

Dispozitivul Myo armband, este dotat cu 8 electrozi electrografici pentru a identifica semnalele gesturilor. Când se poziționează dispozitivul pe mușchii antebrațului, în momentul când sunt contractați, electrozii EMG generează un semnal analogic de date a impulsurilor nervoase, care determină mișcarea mușchilor.

Brațe robotice

În ultimii 20 de ani domeniul de utilizare a brațelor robotice sunt în dezvoltare continuă, dar cel mai folosit fiind în industrie. Un robot industrial  este o mașină automată, staționară sau mobilă, constând dintr-un dispozitiv de acționare sub forma unui braț cu mai multe grade de mobilitate și un dispozitiv de control programat reprogramabil, care să îndeplinească funcții de control în procesul de producție[6] . Utilizarea roboților industriali, împreună cu alte mijloace de automatizare a producției (linii automate), este rentabil din punct de vedere economic și a managementul timpului. Începând cu anul 1998, la nivel mondial aprovizionarea de roboți industriali se estimează la circa 69 000 unități iar în anul 2018, la circa 422 271 de unități. Potrivit studiului Federației Internaționale de Robotică (IFR), la sfârșitul anului 2017 existau aproximativ 2 439 543 roboți industriali operaționali. Se estimează că acest număr să ajungă la 3 788 000 până la sfârșitul anului 2021. Cel mai mare client al roboților industriali este industria auto cu cota de piață cu 30%, apoi industria electrică / electronică cu 25%, industria metalelor și a mașinilor cu 10%, industria cauciucului și a plasticului cu 5%, industria alimentară cu 5%.  În industria textilelor, a îmbrăcămintei și a pielii, 1.580 de unități sunt funcționale[7].

În funcție de cerințele existente, este selectată opțiunea optimă, care specifică tipul de roboți necesari sarcinii date, numărul acestora și, de asemenea, abordarea problemelor infrastructurii energetice (alimentare, alimentare lichid de răcire – în cazul utilizării răcirii cu lichid a elementelor de scule) și integrarea în procesul de producție (furnizarea cu semifabricate / semifabricate și returnarea produsului finit la o linie automată pentru transferul următoarei operații tehnologice). Roboții industriali în procesul de producție sunt capabili să efectueze operațiuni tehnologice de bază și auxiliare . Principalele operații tehnologice includ operațiunile de modelare directă, modificarea dimensiunilor liniare ale piesei de prelucrat, etc.

Operațiunile tehnologice auxiliare includ operațiunile de transport, inclusiv operațiunile de încărcare și descărcare a echipamentelor tehnologice. Printre cele mai răspândite acțiuni efectuate de roboții industriali se numără următoarele [6] :

sudare cu arc și la fața locului;

forjare și ștanțare;

acoperire prin pulverizare;

montaj piese mecanice, electrice și electronice;

controlul calității produselor;

Roboți autonomi

Un pas important în evoluția roboticii a fost crearea roboților autonomi. Roboții autonomi sunt roboții care execută sau îndeplinesc diverse sarcini cu un grad sporit de autonomie. Aceștia sunt extrem de necesari în cele mai diverse domenii precum explorarea spațiului, gestionarea gospodăriilor, tratarea apelor uzate, livrarea de bunuri și servicii. Procesul de dezvoltare a roboților autonomi a avut un drum lung, care a început cu mecanisme simple, care efectuau o singură acțiune conform unui model bine prestabilit. Roboții moderni nu sunt doar mult mai complicați, ci și necesită din ce în ce mai puțin control în fiecare etapă, iar în viitorul apropiat aceștia vor putea executa majoritatea sarcinilor fără intervenția umană. Electronica menține pasul cu procesul de evoluție și acoperă necesitățile, care apar din ce în ce mai multe pentru o operare mai rapidă și mai precisă, decât ar fi făcut-o un operator. De exemplu, poziționarea unei drone în spațiu este estimată la zeci și sute de ori pe secundă. Stabilizarea acesteia poate fi efectuată atât de rapid, încât activitatea sa este vizibilă numai la obținerea unui rezultat final. Una din problemele principale ale roboticii este crearea tuturor condițiilor pentru un robot, ca acesta să-și poată îndeplini toate sarcinile care îi sunt atribuite în orice mediu: pe sol, sub apă, în aer, subteran sau în spațiu[9].

În prezent se presupune că în componența roboților intelectuali trebuie să intre următoarele sisteme:

Mecanisme de execuție – manipulatoare, șasiu și alte dispozitive cu ajutorul cărora robotul poate acționa asupra obiectelor de mediu. După structura lor acestea sunt dispozitive tehnice complexe, care au în componența lor servoacționare, piese mecatronicii, senzori și sisteme de control. Ca și în cazul organismelor vii, acestea sunt mâinile și picioarele robotului.

Senzori – sisteme de viziune tehnică, auz, palpare, senzori de distanta, localizatori și alte dispozitive care permit primirea informațiilor din lumea exterioară.

Sistemul de control – este creierul robotului, care trebuie să primească informația de la senzori și să controleze totul cu ajutorul mecanismelor de execuție. În componența sistemului de control al robotului intelectual trebuie să intre următoarele componente:

Modelul mondial – reflectă starea mediului înconjurător robotului prin intermediul unor termeni convenabili pentru depozitare și prelucrare.

Sistemul de recunoaștere – sistemele de recunoaștere a imaginilor, recunoașterea vorbirii etc. Sarcina sistemului de recunoaștere este identificarea lucrurilor care-l înconjoară pe robot și amplasarea lor în spațiu.

Sistemul de planificarea a acțiunilor – realizează o transformare virtuală a modelului mondial cu scopul de-a obține o oarecare acțiune. La această etapă, de obicei, se verifică cât de realizabil este obiectivul pus. Rezultatul lucrului sistemului de planificare a acțiunilor este elaborarea planurilor.

Sistemul de execuție – încearcă să efectueze acțiunile planificate, dând comanda mecanismelor de execuție și controlând, totodată, procesul de execuție.

Sistemul de gestionare a obiectivelor – stabilește semnificația și ordinea realizării obiectivelor puse. Un atribut important al sistemului de gestionare este capacitatea de învățare și adaptare, precum și capacitatea de a-și adapta comportamentul la schimbarea condițiilor de mediu în scopul atingerii obiectivelor. [8]

Sistemul de navigație –    îndeplinește funcția de orientare a robotului într-o lume tridimensională, precum și funcția de trasa rute raționale pentru deplasarea optimă a robotului.

Exemple de progrese în domeniul roboților comerciali autonomi

Autoservire

Prima cerință în subiectul autonomiei depline a robotului este capacitatea lui de a avea grija de sine. În prezent, mulți roboți care se alimentează de la baterii sunt capabili să găsească sursa de alimentare și să se conecteze la acestea de sine stătător. Procesul de autoservire se bazează pe principiul „proprioceptiv” sau evaluarea propriului statut intern. De exemplu, în cazul unui dispozitiv de încărcare a bateriei, un robot poate spune, în mod proprioceptiv (după ce și-a evaluat starea), că are o baterie scăzută, prin urmare, robotul va începe să încerce să-și caute încărcătorul. Alt senzor proprioceptiv comun este controlul încălzirii. Capacitățile proprioceptive adecvate sunt necesare pentru ca roboții să lucreze independent într-un mod eficient sau în condiții extrem de dure.

Senzori proprioceptivi comuni:

Senzorul termal;

Senzorul optic;

Senzorul ultrasonic;

Scanarea mediului înconjurător

Exteroceptia este o evaluare a parametrilor de mediu. Roboții autonomi trebuie să aibă o varietate de senzori de mediu pentru a-și îndeplini sarcinile și pentru a evita problemele.

Senzori exteroceptivi comuni:

Senzorii spectrului electromagnetic;

Senzori de sunet;

Senzori tactili;

Senzori chimici (miros);

Senzori de temperatură;

Senzori pentru evaluarea distanței față de obiect;

Senzori de estimare a poziției (în raport cu obiectele);

Realizarea sarcinilor

Următorul pas în dezvoltarea comportamentului autonom este capacitatea de a îndeplini unele sarcini fizice. Apariția noilor aspiratoare de tip robot, cum ar fi iRobot și Electrolux 2002 a dat mari speranțe în dezvoltarea acestui domeniu de robotică. Deși încă există careva probleme cu nivelul de inteligență a acestor sisteme robotizate, ele deja pot lucra și pe suprafețe mari și în spatii înghesuite, manevrând eficient în interior, deoarece folosesc senzori de contact și de proximitate.

Probleme și provocări în procesul dezvoltarea industriei a robotului autonom

Există o mulțime de probleme  în dezvoltarea roboților autonomi. Principala dintre acestea fiind crearea inteligenței artificiale. Mai există multe alte probleme mai mici, dar tot întra-atât de semnificative.

Problema creării intelectului artificial

Pentru crearea unui program de acțiuni unui robot autonom, e nevoie de fiecare data să i se scrie noi algoritmi: mașina nu are liber arbitru chiar și în cadrul îndeplinirii sarcinilor: ea execută doar codul programului, selectează opțiunile pentru executarea cea mai eficientă a sarcinii.  Atunci când sarcina este finalizată, robotul pierde motivul funcționării. Robotului nu i se pot da instrucțiuni abstracte, pentru că nu există o interpretare a conceptului de „instrucțiune abstractă” sub forma unei „instrucțiuni specifice”.  Singura calea de ieșire din această situație este crearea unui sistem care să creeze singur algoritmii de acțiune, comportamentul sau judecată. Acestea trebuie realizat pentru fiecare caz în parte, iar acest sistem ar trebui să acumuleze informații/experiență și să analizeze, să facă concluzii și generalizări reieșind din astea toate. Un sistem de așa gen, care face generalizări – face construcții abstracte, și nu calcule aritmetice, si, prin urmare, trebuie privit ca o formă de inteligenta. Natura lui artificială stă la baza caracterizării lui ca “inteligență artificială”. Autonomia robotului în mare măsură depinde de crearea inteligenței artificiale. Evoluțiile științifice în domeniul inteligenței artificiale se află într-un impas. Nu există o opinie generală ce-ar însemna inteligenta artificială. Dar în schimb, fiecare conferință nouă dă naștere la noi “concepții”, care au aceleași defecte. Foarte rar apar idei noi, cu ar fi, idea rețelelor neuronale. În ziua de azi e nevoie de improvizație, gândire abstractă, lucru de care mașinile nu sunt încă capabile, și din păcate încă nu există ieșire din această situație, nici în plan filosofic, nici în plan matematic[8].

Problema alimentării

Una din problemele principale în procesul creării roboților complet autonomi este problema furnizării lor cu energie. Una din posibilele soluții ar fi echiparea acestora cu baterii solare, dar o asemenea soluție nu este mereu accesibilă. O metodă promițătoare ar fi “învățarea” robotului sa-și dobândească de sine stătător energia. Dar cu toate astea, intervine problema dobândirii unei biometrii calitative pentru alimentare acestuia. În anul 2004, profesorul Chris Melhuish de la Universitatea din vestul Angliei împreună cu echipa sa au creat robotul “EcoBot II”, care genera energie pentru “viața” sa alimentându-se cu muște și cu bucățele de mere putrezite. Varianta lui mai modernizată și avansată este “EcoBot III”. În anul 2010 acest robot a fost învățat să scape de

deșeurile apărute în urma activităților bacteriilor în așa fel, încât beceriile, care asigură

funcționarea pilei de combustie microbiene, sa nu moara din cauza propriilor „impurități”. Astăzi deja se montează un nou model al robotului “EcoBot IV”, ale cărui pile de combustie, despre care dezvoltatorii si proiectanții lui cred ca ar putea să funcționeze 20-30 de ani, pentru că în pila de combustie microbiana nu exista particule în mișcare. Funcționează doar bateriile, ceea ce înseamnă ca nu exista practic nimic ce s-ar putea deteriora[9] [11].

Problema navigării

Până în prezent, problema cea mai principală a tuturor dispozitivelor mobile existente, care se deplasează de sine stătător, fără intervenția omului, rămâne a fi navigarea.

În legătură cu toate încercările de a crea o modalitate autonomă de deplasare apar o serie de problem, denumite colectiv «probleme de navigație». Navigația este știința despre controlul deplasării robotului mobil sau a unui alt obiect în spațiu. Pentru o navigare reușită în spațiu, sistemul de bord al robotului trebuie să poată:

să creeze un traseu/o traiectorie;

să gestioneze parametrii de mișcare, și anume să seteze unghiul de rotație a roților/ volanului și viteza de rotație a acestora;

să interpreteze într-un mod corect toate informațiile despre lumea înconjurătoare, care au fost primite de la senzori;

mereu sa urmărească și să tina cont de propriile coordonate;

Sarcinile de navigație includ în sine două sub activități, care pot fi împărțite în timp:

localizarea în spațiu;

planificarea traseului.

Localizarea constă în evaluarea poziției curente a robotului față de anumite puncte de referință cunoscute a mediu înconjurător, exprimate în coordonate absolute.

Planificarea constă în căutarea, dacă acest lucru e posibil, a traseului celui mai scurt și în deplasarea spre destinație. [9] [10]

Oamenii vor aborda în mod constant problema inteligenței artificiale, confruntându-se constant cu noi probleme. Iar acest lucru pare, să nu fie rezolvat în următoarele decenii.

CAPITOLUL II

Considerații teoretice

Componentele care au stat la baza funcționării acestui proiect sunt:

Myo armband;

myRIO – National Instruments și Motor Adapter for NI myRIO – Digilent;

Braț robotic cu 6 grade de libertate – LeArm: Hiwonder 6DOF;

2.1 Myo

Myo armband este produs de către compania Thalmic Labs Canadian, și după cum s-a discutat, permite să controlați dispozitivele electronice cu simple gesturi de mână și braț. Prevăzut cu opt electrozi electrografici, o unitate de măsură inerțială cu 9 axe și un modul de transmisie (Bluetooth), Myo măsoară activitatea musculară pentru a detecta gesturile făcute cu mana, respectiv determină poziția brațului.

Este capabil să recunoască 5 gesturi(Figură. 2.4), cu posibilitatea de a completa această listă. Folosind senzorii de poziție unghiulară (IMU) cu 9 axe (giroscop cu 3 axe, accelerometru cu 3 axe și magnetometru cu 3 axe), află cu exactitate mișcarea, orientarea și rotația antebrațului, iar toate informațiile sunt transmise printr-o conexiune Bluetooth Smart unui dispozitiv compatibil.

Mai jos sunt prezentate două exemple de grafice EMG. În figura 2.2 este reprezentat semnalul EMG recepționat din contracțiile musculare, în momentul când strângi degetele în pumn iar figura 2.3 este reprezentat semnalul EMG recepționat din contracțiile musculare, în momentul când desfaci degetele.

În următoarea figură este reprezentat cele 5 gesturi cunoscute de către dispozitivul Myo. Datorită programului Myo Connect, se poate seta unui gest o anumită comandă, de exemplu pumn să fie setat ca un clic al unui mouse sau în momentul când desfaci degetele să începi o prezentare cu pointer.

Pentru a detecta mișcarea, orientarea și rotația la antebraț, Myo folosește InvenSense MPU-9150. Este primul dispozitiv pentru urmărirea mișcării pe 9 axe din lume. A fost conceput pentru cerințele de putere redusă, costuri reduse și performanțe ale echipamentelor electronice de consum, cum ar fi smartphone-uri, tablete și senzori de purtat. Datorită tehnologiei MotionFusion și calibrarea în timp real al firmware, oferă costuri reduse și garantează că algoritmii de interacțiune a senzorilor și procedurilor de calibrare oferă performanțe optime pentru consumatori [3].

2.2 myRIO – National Instruments și Motor Adapter for NI myRIO – Digilent

2.2.1 myRIO – National Instruments

NI myRIO este un dispozitiv portabil reconfigurabil I/O, care se poate utiliza pentru a concepe sisteme de control în timp real în diferite domenii de utilizare(robotică, mecatronică, etc.). Comunicarea myRIO cu un alt dispozitiv se realizează prin intrările si ieșirile analogice și digitale. De asemenea, myRIO are un modul de transmitere WI-FI, care permite comunicare la distanță, dar poate fi conectat și la un dispozitiv compatibil cu un port USB.

Este echipat cu procesorul Xilinx Z-7010 cu viteza de operare de 667 MHz și are memorie DDR3 512MB, 533MHz, 16bits, care îl face capabil să opereze rapid numeroase operațiuni complexe. Are în componență și un accelerometru pe 3 axe, care determină mișcările realizate, fiind folosit cu ușurință ca un modul de control a unei mașini. În figura 2.6 sunt reprezentați porturile de conectorii MXP A si B, care au seturi de semnale identice fiind specificați fiecare conector de la 1 pană la 34. În figura 2.7 sunt specificate porturile de conectare MSP cu fiecare detaliu aferent fiecărui pin.

NI myRIO are intrare analogică (AI), ieșire analogică (AO), intrare digitală și ieșire digitală (DIO), intrare și ieșire audio.

2.2.2 Motor Adapter for NI myRIO – Digilent

Motor Adapter for NI myRIO este oferit de către producătorul Digilent și poate fi conectat la myRIO prin conectorii MXP. Permite cu ușurință conectarea și controlul la un motor pas cu pas, două motoare de curent continuu sau două servomotoare în mod independent. A fost proiectat astfel încât să nu fie necesare circuite suplimentare pentru acționarea motoarelor. Placa utilizează procesorul Allegro A4973 și este dotat cu un controler de motor PWM bidirecțional. [14]

Printre caracteristicile principale se enumeră:

Conectare directă prin conectorul MPX;

Poate fi configurat să funcționeze cu 2 motoare de curent continuu, 1 motor pas cu pas sau 2 servomotoare în același timp;

Tensiune de intrare 6V – 16V;

Protecție la supra curent;

Două ieșiri 1.5A full – bridge;

Controlul de curent intern PWM;

Indicator LED de alimentare;

Motoarele servo sunt conectate prin anteturi standard cu 3 pini, în timp ce motoarele DC sunt conectate prin intermediul conectorilor terminali cu 6 pini sau cu șurub, iar motoarele pas cu pas sunt conectate cu borne cu șurub. Semnalele PWM de la dispozitivul myRIO direcționate către intrările motorului de curent continuu și servomotor. Intrările codificatorului motorului 0 în quadratură sunt direcționate către intrările codificatorului myRIO și motorul 1 este dirijat către I/O digitale de uz general. Tensiunea și curentul motorului filtrat sunt redirecționate către intrările analogice myRIO pentru a permite monitorizarea în timp real. [14]

Figura 2.5.2 Motor Adapter for NI myRIO

Figura 2.6. NI myRIO portul de conectorii MXP

Figura 2.7. NI myRIO porturi de conectorii MSP

2.3 LeArm: Hiwonder 6DOF

Brațul robotic are o construcție metalică în felul următor:

Placă inferioară din metal;

Suport metalic;

Suporți din aliaj dur de aluminiu;

Designul structural 6DOF face ca brațul robotic să se deplaseze flexibil, astfel încât să poată apuca obiectele din orice direcție. Mecanismul de prindere este unul simplu, se deschide și se închide, astfel este nevoie de un singur servomotor.

Brațului este echipat cu servomotoare de înaltă precizie de tip:

LDX-218:

Cuplu mare de acționare – 17 kg(7.4V);

Viteza de operare – 0,16sec/60ș;

Rulment cu bilă dublă;

LFD-06:

Rezistent la temperaturi ridicate;

Împiedică rotorul blocat;

Pentru al putea deplasa spre un punct dorit, am folosit rover vehicle de la producătorul Tetrix Prime, care este echipat cu 2 motoare IG22 – 12V cu encoder. Acest motor poate atinge viteza de la 3.8 rot/min până la 1650 rot/min. Este fiabil și rezistent la sarcinile constante sau variabile de schimbare a direcției directă sau inversă. Cuplul generat la o turație de 5 rot/min este de 6000g/cm, iar la turația de 1405 de 80 g/cm.

Controlul motoarelor este realizat prin Motor Adapter for NI myRIO de la producătorul Digilent, conectate la portul de 6 pini Motor 0 și Motor 1.

Fiind echipat cu 2 acumulatoare, unul de 12V pentru alimentarea myRIO și a motoarelor de curent continuu și al doilea de 6V pentru alimentarea servomotoarelor, masa totală a ansamblului este de circa 3.2kg, ce m-ai mare parte o are robotul, de 1.91 Kg.

2.4 Roboți industriali

Robotul combină tehnologia mecanică cu cea electronică fiind o componentă evoluată de automatizare care înglobează electronica de tip cibernetic cu sistemele avansate de acționare pentru a realiza un echipament independent de mare flexibilitate.[12] [13]

Dezvoltarea roboților industriali a fost determinat de către George C. Deval care a creat în anul 1954 un dispozitiv de transfer automat, dezvoltat în anul 1958 de firma americană Consolidated Control Inc. În anul 1959 Joseph Engelberger achiziționează invenția lui Deval și realizează în 1960 primul robot industrial Unimate în cadrul firmei Unimation Inc. Izbucnirea roboților industriali a avut loc în anul 1963 când a fost pus în funcțiune robot industrial la uzinele Trenton (S.U.A.), care aparținea companiei General Motors.

Primul succes industrial a avut loc în anul 1968 când în fabrica din Lordstown s-a montat prima linie de sudare a caroseriilor de automobile, având în echipare 38 de roboți Unimate. Prin urmare s-a demonstrat că robotul era cel mai bun automat de sudură în puncte.

În România, în anul 1980 s-a dezvoltat primul robot RIP63 la Automatica București după modelul A.S.E.A.. Prima aplicație industrială al acestui robot a fost sudarea a unei componente a șasiului unui autobuz, în arc electric în anul 1982 la Autobuzul București. În 1984 roboții au fost introduși și la Semănătoarea București. Coordonarea științifică a colectivului „MEROTEHNICA”, de la catedra de „Teoria Mecanismelor și a Roboților” din „Universitatea Politehnica București”, sub conducerea regretatului Prof. Christian Pelecudi, fondatorul SRR (Societatea Română de Robotică), azi ARR (Asociația Română de Robotică). Colectivul TMR a avut dea lungul timpului 80 colaborări cu firmele nipone și datorită Prof. Bogdan Radu, au fost aduși și implementați în țară roboți Fanuc, fiind de ultimă generație în acei ani.[13]

2.4.1 Clasificarea roboților industriali

Roboții industriali (R.I.) se clasifică după următoarele criterii:

După informații de intrare și modul de învățare:

manipulator manual – care este controlat de om;

robot secvențial – care execută o procedură prestabilită fixă sau variabilă, după care poate fi modificată;

robot repetitor (robot play back) – acesta memorează un mod de execuție efectuat de către un om, după care o repetă.

robot cu control numeric (N. C. robot) – execută operațiile numerice setate de către un operator despre poziții, succesiuni de operații și condiții.

robot inteligent – singur își stabilește mișcările pe baza informațiilor primite de la senzorii integrați și prin capacitatea de recunoaștere.

După comandă și gradul de dezvoltare al inteligenței artificiale: roboții industriali se clasifică în generații sau nivele:

R.I. din generația 1, acționează pe baza unui program flexibil dar prestabilit de programator și care nu se poate schimba în timpul execuției operațiilor.

R.I. din generația a 2-a se caracterizează prin faptul că programul flexibil prestabilit de programator poate fi modificat în măsură restrânsă în urma unor reacții specifice ale mediului.

R.I. din generația a 3-a posedă capacitatea de a-și adapta singuri cu ajutorul unor dispozitive logice, într-o măsură restrânsă propriul program la condițiile concrete ale mediului ambiant în vederea optimizării operațiilor pe care le execută.

După numărul gradelor de libertate ale mișcării robotului:

Numărul gradelor de libertate poate varia între 2 și 6. Cele șase grade de libertate care le poate avea un robot sunt 3 translații de-a lungul axelor de coordonate și 3 rotații în jurul acestora. Respectiv acești roboții se clasifică în patru opțiuni constructive în funcție de mișcările executate (notate R- rotație și T-translație):

robot cartezian (TTT) este robotul al cărui braț operează într-un spațiu definit de coordonate carteziene (x,y,z) (Figura 2.10);

robot cilindric (RTT) al cărui braț operează într-un spațiu definit de coordonate cilindrice (r, α, y) (Figura 2.11);

robot sferic (RRT) a cărui spațiu de lucru este sferic, definit de coordonatele sferice (α, φ, r) (Figura 2.12);

robot antropomorf (RRR) la care deplasarea piesei se face după exteriorul unei zone sferice. Parametrii care determină poziția brațului fiind coordonatele (α, φ, ψ) (Figura 2.13);

4. După existenta unor bucle interioare în construcția robotului:

cu lanț cinematic deschis, roboți seriali;

cu lanț cinematic închis, roboții paraleli. Structura roboților paraleli cuprinde unul sau mai multe contururi poligonale închise, fapt care permite realizarea unor spatii de lucru de o geometrie mai complicată și conduce la o mai mare rigiditate a sistemului mecanic.

2.4.2 Geometria și cinematica directă la sistemele MP-3R

Cinematica manipulatoarelor și roboților seriali se va explica pentru modelul cinematic 3R (Figura 2.14) [13]

Figura 2.14 Geometria și cinematica unui MP-3R

Mai întâi de toate se scrie matricea vectorului (A01) de schimbare a coordonatelor originii sistemului de coordonate, prin translatarea din O0 în O1, axele rămân paralele cu ele însăși în permanentă:

(2.1)

După se scrie matricea T01 de rotație a sistemului x1O1y1z1 fată de sistemul x0O0y0z0:

(2.2)

Pe prima coloană se trec coordonatele versorului lui O1x1 fată de axele vechiului sistem:

(2.3)

Pe a doua coloană se trec coordonatele versorului axei O1y1 față de axele vechiului sistem:

(2.4)

Pe a treia coloană se trec coordonatele versorului axei O1z1 față de axele vechiului sistem:

(2.5)

În acest caz, versorul lui O1x1, O1y1, O1z1 are față de vechiul sistem de axe x0O0y0z0 translatat în O1 fără rotație următoarele coordonate:

(2.6)

(2.7)

(2.8)

Trecerea de la sistemul x1O1y1z1 la sistemul de coordonate x2O2y2z2 se face în două etape.

Prima este o translație a întregului sistem astfel încât (axele fiind paralele cu ele însăși) central O1 să se deplaseze în O2;

A doua în care are loc o rotație a sistemului axele rotindu-se iar centrul O rămânând în permanență fix. Translația sistemului de la 1 la 2 se marchează prin matricea de tip vector coloană A12.

(2.9)

Versorul lui O2x2, O2y2 și O2z2 are față de sistemul x1O1y1z1 (translatat, dar nu și rotit) coordonatele:

(2.10)

(2.11)

(2.12)

Deoarece axa O2z2 a luat locul axei O1y1 fiind însă de sens opus ei, matricea pătrată de transfer (de rotație) se scrie:

(2.13)

Trecerea de la sistemul x2O2y2z2 la sistemul de coordonate x3O3y3z3 se face tot în două etape, o translație și o rotație. [13]

O2 translatează în O3 (axele păstrându-se paralele cu ele însăși).

(2.14)

Apoi O3 stă pe loc și axele se rotesc.

Versorul lui O3x3, O3y3, O3z3 are față de sistemul de axe x2O2y2z2 translatat în O3 (nerotit) coordonatele :

(2.15)

(2.16)

(2.17)

Practic sistemul x3O3y3z3 nu s-a rotit absolut deloc față de sistemul x2O2y2z2 (de la 2 la 3 a avut loc doar o translație). Matricea de rotație în acest caz este matricea unitate.

(2.18)

Matricea vector care poziționează punctul M în sistemul de coordonate x3O3y3z3 se scrie:

(2.19)

Coordonatele punctului M în sistemul (2) x2O2y2z2 (adică față de el) se obțin printr-o transformare matriceală de forma:

(2.20)

Se efectuează întâi produsul matricelor

(2.21)

Se calculează apoi X2M.

(2.22)

Coordonatele punctului M în (față de) sistemul (1) x1O1y1z1 se obțin astfel:

(2.23)

(2.24)

(2.25)

Coordonatele punctului M în sistemul fix x0O0y0z0 se scriu:

(2.26)

(2.27)

(2.28)

(2.29)

X0M se pune sub forma:

(2.30)

Prin cinematica directă se obțin coordonatele carteziene xM, yM, zM ale punctului M în funcție de cele trei deplasări unghiulare independente 10, 20, 30, obținute cu ajutorul (2.31-2.32).

Calculele se fac cu deplasările unghiulare absolute, dar deplasările actuatorilor nu coincid toate cu cele independente. Ele se determină astfel (2.33):

(2.33)

Primele două rotații relative ale actuatorilor coincid cu rotațiile independente, dar a treia rotație relativă a ultimului actuator se obține ca o diferență între două rotații absolute.

Vitezele și accelerațiile se obțin prin derivarea relațiilor (2.32) cu timpul. [13]

CAPITOLUL III

Controlul brațului robot în timp real bazat pe semnale EMG

3.1 Controlul brațului robot

Ideea pornește de la asamblarea unui braț robotic și crearea unui soft pentru ca să execute comenzi predefinite. Pe măsura avansării în execuția proiectului, am dorit ca acest braț să ,,știe,, mai multe, să fie capabil nu doar să execute comenzile impuse, dar și să existe posibilitatea de a-l controla în timp real. Pentru a pune în aplicare ideea a fost nevoie de un dispozitiv înzestrat cu senzori de poziție, accelerație ca să fie capabil să cunoască mișcările brațului. Acest dispozitiv a fost Myo armband. Următoare dificultate întâlnită era cum să se realizeze transferul de date de pe Myo cu programul creat in aplicația LabVIEW. Echipa Thalmic Labs pune la dispoziție un program care îți oferă șansa să vizualizezi semnalele achiziționate în timp real, dar pentru a folosi aceste semnale a fost nevoie de creat in C++ un program, care să configurezi un port de legătură cu programul LabVIEW. Programul scris este prezentat în Anexa 1.

Figure 3.1 Schema bloc pentru controlul brațului robot

3.1.1 Comunicarea dintre Myo și myRIO

Comunicare este realizată prin protocolul de comunicare UDP (eng. User Datagram Protocol). Protocolul UDP este un mijloc de transmitere a unor pachete de date fără importanță critică, de dimensiuni reduse (cca. 65kb), către unul sau mai mulți destinatari configurând un port. Portul este locația unde se transmite sau se colectează datele[4].

În figura 3.2 sunt reprezentate principalele elemente ale funcției UDP utilizate la dezvoltarea programului.

UDP Open – Opens a UDP socket on the port or service name.

UDP Read – Reads a datagram from a UDP socket, returning the results in data out.

UDP Close – Closes a UDP socket [5].

În figura 3.3 este arătat diagrama bloc pentru colectarea datelor oferite de dispozitivul Myo. Preluarea datelor este posibilă atunci când se rulează simultan 2 programe:

Primul program este scris in C++ (EMG data sample) și este rulat de către Windows. Informațiile sunt preluate cu ajutorul modulului bluetooth, care face legătura dintre PC și dispozitivul Myo. Datele sunt transferate prin portul predefinit, către al doilea program.

Iar al doilea program rulat este LabVIEW, care primește datele de la portul configurat prin protocolul de comunicare UDP în programul C++.

Datele primite sunt atribuite unor variabilele, care pot fi transmise altor dispozitive conectate la aceeași rețea. Rețeaua este formată din 3 myRIO, unul fiind gazdă și este conectat direct la calculator prin portul USB. myRIO gazdă este asemeni unui router, creează rețeaua iar cele două dispozitive myRIO se conectează prin modulul WIFI pentru a prelua variabilele.

3.1.2 Deplasarea brațului robot

Datorită faptului că myRIO este înzestrat cu un accelerometru de 3 axe, acesta va fi folosit nu doar pe post de router, dar în același timp și un joystick pentru controlul motoarelor de direcție. În figura 3.4 este prezentată diagrama bloc pentru colectarea datelor oferite de către accelerometrul(X, Y). Semnalele recepționate, sunt atribuite unor variabile care sunt transmise prin modului WIFI către un alt myRIO. Programul fiind înscris în myRIO, sunt nevoie doar de datele colectate, care acestea fiind filtrate (Figura 3.5) și analizate, se poate stabili comanda pentru motoarelor de direcție și a direcționa robotul spre punctul dorit. Cu ajutorul PWM, controlăm viteza de rotație a motorului. Pentru a stabili sensul de rotație, folosim două semnale digitale de ieșire, conectate la un buton. Acesta fiind acționat, sensul de rotație a motoarelor își schimbă direcția.

3.1.3 Comanda servomotoarelor

În figura 3.6 sunt prezentate programele de comandă pentru fiecare servomotor al robotului. Pentru fiecare motor este alocată o variabila primită de la dispozitivul Myo (Pose , Roll, Pitch și Yaw). Pose reprezintă cele 5 gesturi cunoscute reprezentate in figura 2.4. Fiecare gest îi este atribuit un număr, acestea fiind pumn – 1, mană înclinată spre dreapta – 2, mană înclinată spre stânga – 3, degete desfăcute – 4 și atingerea a doua degete rapid – 5. Roll reprezintă rotația brațului, pitch direcția în sus sau în jos și yaw direcția spre dreapta sau stânga a brațului.

Aceste date fiind primite, sunt analizate și procesate în programul creat. Ulterior sunt alocate la blocul eng. Set Duty Cycle and Frequency, frecvența este stabilită la 50 Hz, iar duty cycle, este valoare primită de către dispozitivul Myo. Frecvența fiind frecvența semnalului PWM, iar duty cycle reprezintă procentul de timp în care semnalul PWM rămâne ridicat peste un ciclu PWM.

CAPITOLUL IV

SIMULAREA CONTROLULUI BRAȚULUI ROBOT

Deplasarea brațului robot

În următoarele figuri sunt reprezentate semnalele recepționate de la accelerometrul myRIO router, pentru deplasarea brațului robot. Semnalele de pe axa Y sunt destinate pentru acționarea robotului înainte sau înapoi, respectiv semnalele de pe axa X pentru virarea spre dreapta sau stânga. Valorile colectate sunt cuprinse în intervalul 0 – 1, unde 1 este viteza maximă.

Diagrama bloc de colectare a semnalelor este reprezentată în figura 3.4.

Figură 4.1 Semnale X, Y – Deplasare înainte.

Figură 3.2 Semnale X, Y – Deplasare înapoi.

Figură 4.3 Semnale X, Y – Virare spre dreapta.

Figură 4.4 Semnale X, Y – Virare spre stânga.

Datele colectate sunt filtrate și analizate conform diagramei bloc din figura 3.5. În urma acestei analize se determină starea de comandă .

În figurile ce urmează sunt prezentate valoarea semnalelor X, Y, iar în urma analizei se determină starea actuală și valoarea trimisă către motorul 1 și motorul 2.

Figură 4.5 Controlul M1 și M2 – Stop

Figură 4.6 Controlul M1 și M2 – Înainte Figură 4.7 Controlul M1 și M2 – Înapoi

Figură 4.6 Controlul M1 și M2 – Dreapta Figură 4.7 Controlul M1 și M2 – Stânga

Comanda servomotoarelor

Pentru a putea vizualiza datele preluate de la brățara Myo reprezentate în figura 4.9.1 și figura 4.9.2, cum s-a menționat la subcapitolul 3.1.1, este necesar deschiderea unui program creat in C++ și rulat de către Windows. În figura 4.8.1 și figura 4.8.2 se poate vizualiza cum sunt preluate datele.

Primele opt coloane reprezintă valorile, de pe fiecare electrod electrografic, în urma contracțiilor musculare, care simultan sunt analizate pentru stabilirea gestului la acel moment. Următoarele trei coloane ilustrează semnalele de pe accelerometru, Roll, Pitch și Yaw. Ultima coloană prezintă toate datele de pe cei 8 electrozi la un loc.

Figură 4.8.1 Preluarea semnalelor Myo

Figură 4.8.2 Preluarea semnalelor Myo

În figura 4.8 și figura 4.9 sunt reprezentate semnalele colectate de la Myo. Valorile sunt cuprinse în intervalul 0 – 18 pentru Roll, Pitch și Yaw. Iar pentru Pose intervalul este de la 0 –5, care reprezintă gesturi cunoscute reprezentate in figura 2.4, acestea fiind pumn – 1, mană înclinată spre dreapta – 2, mană înclinată spre stânga – 3, degete desfăcute – 4 și atingerea a doua degete rapid –

Figură 4.9.1 Semnale Myo

Figură 4.9.2 Semnale Myo

Conform programului realizat pentru controlul servomotoarelor, figura 3.6, fiecare semnal este alocat unui servomotor. De exemplu în figura 4.10 este reprezentat comanda pentru Gripper. În momentul când Pose este 1, cleștele de prindere tinde să se închidă. Valoarea când acesta este total închis este de 200. Iar când Pose este 4 acesta începe să se deschidă.

Figură 4.10 Controlul servomotoarelor – Gripper.

Pitch reprezintă direcția în sus sau în jos a brațului robotic. Programul realizat in LabVIEW împarte intervalul 0 – 18, în 3 intervale. În momentul când este în intervalul 0 – 7 brațul robotic coboară, 10 – 13 se află în poziție neutră și 15 – 18 brațul robotic urcă. În figura 4.10 este reprezentat graficul cum acesta îndeplinește comanda. La valoarea -200, brațul robotic este complet aplecat, iar în momentul când intervalul este între 15 – 18, acesta urcă. Se poate observa și momentele când este în stare neutră.

Figură 4.10 Controlul servomotoarelor – Pitch.

Yaw reprezintă direcția spre dreapta sau stânga a brațului. La valoarea -100 acesta este direcționat spre dreapta, respectiv 100 spre stânga. La fel ca la Pitch, intervalul 0 – 18, a fost împărțit în 3 intervale. În momentul când brațul este înclinat spre dreapta, semnalele care sunt recepționate pe Myo i-au valori între 15 – 18 și brațul robotic se rotește spre dreapta.

Figură 4.10 Controlul servomotoarelor – Yaw.

CAPITOLUL V

CONCLUZII

Obiectivul propus inițial a fost de a programa un braț robotic în LabVIEW și să execute comenzi simple, cum ar fi deplasarea și preluarea a uni obiect din punctul X în punctul Y. După ce am reușit să realizăm acest obiectiv, adevărata provocare a început prin ideea de a încercarea să-l controlăm în timp real.

Având la îndemână dispozitivul Myo, am căutat informații despre posibilitatea de a prelua acele semnale și integra în programul de comandă. Echipa Thalmic Labs pune la dispoziție un program care îți oferă șansa să vizualizezi semnalele achiziționate în timp real, dar pentru a folosi aceste semnale a fost nevoie de scris un program in C++. Fiind necesare cunoștințe mai aprofundate în acest limbaj de programare, am apelat la ajutorul a unui coleg din cadrul companiei National Instruments și îi sunt foarte recunoscător și îi mulțumesc pentru sprijinul acordat, fără de care nu ar fi existat posibilitatea de a continua al doilea obiectiv propus.

Următoarea dificultate a fost transmiterea acestor date pe dispozitivul myRIO. Problemă era cât se poate de simplă, myRIO care transmitea datele, nu era în aceeași rețea cu myRIO care primea datele. De aceea în schema bloc reprezentă în figura 3.1, se poate observa cum transferul de date este realizat prin modulul WIFI fiind un myRIO router, care la rândul său comunică cu calculatorul prin USB.

Având cunoștințele de bază dobândite în cadrul cursului Sisteme Flexibile de Fabricatie, am avut interesul de a le profunda prin crearea unui sistem de control în programul LabVIEW. A fost mai dificil de cât mă gândeam, însă având la dispoziție biblioteca imensă de tutoriale pe internet și îndrumările oferite de către domnul profesor, am reușit să-mi ating obiectivul.

Într-un final am ajuns la concluzia că nu este greu la momentul actual de a dezvolta un asemenea prototip, având în vedere numeroasele componentele puse la dispoziție pe piață și de a alege un limbaj de programare prin care să fie controlat.

Următorul pas în vederea dezvoltării brațului robotic îi revine optimizării programului printr-un control mai fin și cu mai mare precizie, iar pentru comoditate există posibilitatea de a-l echipa cu o cameră video și să fie controlat din fața calculatorului.

BIBLIOGRAFIE

***http://www.romedic.ro/ce-este-electromiografia-0F27118;

Teză de doctorat: ing. Rîsteiu Marius-Nicolae, ”Contribuții privind conducerea unui sistem de tip exoschelet”, Petroșani 2019;

*** https://invensense.tdk.com/products/motion-tracking/9-axis/mpu-9150/;

***https://zone.ni.com/reference/en-XX/help/371361R-01/lvconcepts/using_labview_with_tcp_ip_and_udp/;

***LabVIEW Help;

***https://ru.wikipedia.org/wiki/Промышленный_робот

Промышленный робот ( Robot industrial);

***https://en.wikipedia.org/wiki/Industrial_robot;

***http://www.raai.org/about/persons/dobrynin/pages/kii2006-pln.html Интеллектуальные роботы ( Roboți intelectuali );

*** https://ru.wikipedia.org/wiki/Автономный_робот

Автономный робот ( Robot autonom);

***http://www.ref.by/refs/90/20628/1.html Проблемы искусственного интеллекта ( Problemele inteligenței artificiale );

***https://myrobot.ru/news/2012/02/20120220_1.php . Автономные роботы на топливных элементах нового типа ( Robiții autonomi echipați cu celule de combustibil de generație nouă);

Corina, BURCEA & Petrescu, Florian Ion. (2014). OPTIMIZAREA SISTEMELOR MECATRONICE MOBILE SERIALE;

Florian Petrescu & Relly Petrescu, LULU PUBLISHER, LONDON (2011). SISTEME MECANICE SERIALE ȘI PARALELE;

***https://reference.digilentinc.com/ni:mxp_motor_adapter:refmanual;

Anexa 1

#define _USE_MATH_DEFINES

#include <cmath>

#include <array>

#include <iostream>

#include <iomanip>

#include <sstream>

#include <stdexcept>

#include <string>

#include<stdio.h>

#include<winsock2.h>

#pragma comment(lib,"ws2_32.lib")

#define PORT 54321

#include <myo/myo.hpp>

class DataCollector : public myo::DeviceListener {

private:

SOCKET s;

struct sockaddr_in server, si_other;

int slen, recv_len;

WSADATA wsa;

bool connected = false;

void startUDP()

{

if (connected) {

return;

}

if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)

{

printf("Could not create socket : % d ", WSAGetLastError());

}

printf("Socket created.\n ");

si_other.sin_family = AF_INET;

si_other.sin_addr.S_un.S_addr = inet_addr("172.22.11.2");

si_other.sin_port = htons(PORT);

connected = true;

}

std::string buf;

public:

int roll_w, pitch_w, yaw_w;

myo::Pose currentPose;

DataCollector()

: roll_w(0), pitch_w(0), yaw_w(0), emgSamples(), currentPose()

{

slen = sizeof(si_other);

printf("\nInitialising Winsock…");

if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)

{

printf("Failed.Error Code : % d ", WSAGetLastError());

exit(EXIT_FAILURE);

}

printf("Initialised.\n");

startUDP();

}

~DataCollector()

{

if (connected) {

closesocket(s);

}

WSACleanup();

}

void onUnpair(myo::Myo* myo, uint64_t timestamp)

{

emgSamples.fill(0);

}

void onEmgData(myo::Myo* myo, uint64_t timestamp, const int8_t* emg)

{

for (int i = 0; i < 8; i++) {

emgSamples[i] = emg[i];

}

}

void onOrientationData(myo::Myo* myo, uint64_t timestamp, const myo::Quaternion<float>& quat)

{

using std::atan2;

using std::asin;

using std::sqrt;

using std::max;

using std::min;

float roll = atan2(2.0f * (quat.w() * quat.x() + quat.y() * quat.z()),

1.0f – 2.0f * (quat.x() * quat.x() + quat.y() * quat.y()));

float pitch = asin(max(-1.0f, min(1.0f, 2.0f * (quat.w() * quat.y() – quat.z() * quat.x()))));

float yaw = atan2(2.0f * (quat.w() * quat.z() + quat.x() * quat.y()),

1.0f – 2.0f * (quat.y() * quat.y() + quat.z() * quat.z()));

roll_w = static_cast<int>((roll + (float)M_PI) / (M_PI * 2.0f) * 18);

pitch_w = static_cast<int>((pitch + (float)M_PI / 2.0f) / M_PI * 18);

yaw_w = static_cast<int>((yaw + (float)M_PI) / (M_PI * 2.0f) * 18);

}

void onPose(myo::Myo* myo, uint64_t timestamp, myo::Pose pose)

{

currentPose = pose;

if (pose != myo::Pose::unknown && pose != myo::Pose::rest) {

myo->unlock(myo::Myo::unlockHold);

}

else {

myo->unlock(myo::Myo::unlockHold);

}

}

void print_emg()

{

std::cout << '\r';

buf = "";

for (size_t i = 0; i < emgSamples.size(); i++) {

std::ostringstream oss;

oss << static_cast<int>(emgSamples[i]);

std::string emgString = oss.str();

std::cout << '[' << emgString << std::string(4 – emgString.size(), ' ') << ']';

buf += emgString + ",";

}

std::cout << std::flush;

}

void print_orientation()

{

std::ostringstream oss;

oss.clear();

oss << static_cast<int>(roll_w) << "," << static_cast<int>(pitch_w) << "," << static_cast<int>(yaw_w) << "," << static_cast<int>(currentPose.type()) << ",";

buf += oss.str();

std::cout << '[' << std::string(roll_w, '*') << std::string(18 – roll_w, ' ') << ']'

<< '[' << std::string(pitch_w, '*') << std::string(18 – pitch_w, ' ') << ']'

<< '[' << std::string(yaw_w, '*') << std::string(18 – yaw_w, ' ') << ']'

<< buf;

std::cout << std::flush;

}

void sendUDP()

{

startUDP();

if (connected && sendto(s, buf.c_str(), buf.length(), 0, (struct sockaddr*)&si_other, slen) == SOCKET_ERROR)

{

printf("sendto() failed with error code : % d ", WSAGetLastError());

connected = false;

}

}

std::array<int8_t, 8> emgSamples;

};

int main(int argc, char** argv)

{

try {

myo::Hub hub("com.example.emg-data-sample");

std::cout << "Attempting to find a Myo…" << std::endl;

myo::Myo* myo = hub.waitForMyo(10000);

if (!myo) {

throw std::runtime_error("Unable to find a Myo!");

}

std::cout << "Connected to a Myo armband!" << std::endl << std::endl;

myo->setStreamEmg(myo::Myo::streamEmgEnabled);

DataCollector collector;

hub.addListener(&collector);

while (1) {

hub.run(1000/20);

collector.print_emg();

collector.print_orientation();

collector.sendUDP();

}

} catch (const std::exception& e) {

std::cerr << "Error: " << e.what() << std::endl;

std::cerr << "Press enter to continue.";

std::cin.ignore();

return 1;

}

}

Similar Posts