Robotic Arm

Vasile Vlad-Andrei

Grupa: 331CB

Introducere

Scopul proiectului este acela de a controla un brat robotic prin intermediul unor gesturi realiate de utilizator.

Bratul este una dintre cele mai utile si versatile unelte pe care le are omul la dispozitie, consider ca ideea de a controla un “brat” robotic de la distanta prin intermediul gesturilor poate avea o multitudine de aplicatii in viata reala, de la o “mana” de ajutor in plus pentru task-urile zilnice, la folosirea acestui brat in locuri greu accesibile, in domeniul medical, etc.

Descriere generală

In functie de gestul realizat de utilizator si inregistrat prin intermediul camerei web, unul dintre cele 3 servomotoare se va roti astfel incat sa realizeze miscarea bratului robotic. Va exista un servomotor pentru fiecare directie din spatiul 3D si acestea vor putea fi rotite la 90 de grade intr-o parte si in cealalta fata de pozitia initiala.

O miscare stanga - dreapta a mainii, de exemplu, va fi inregistrata de camera, va fi prelucrata cu ajutorul librariei Mediapipe astfel incat sa rezulte coordonatele la care trebuie sa ajunga bratul si vor fi transmise prin interfata seriala catre Arduino, acesta mutand cursorul servomotorului responsabil pentru directia respectiva.

Schema bloc

 Schema bloc

Hardware Design

Lista piese

  • Arduino UNO
  • Breadboard
  • 3x Servomotoare
  • Ecran LCD 16×2 I2C
  • Camera Web
  • Fire de legatura

Schema electrica

 Schema electrica

Software Design

Cod Arduino

Mediu de dezvoltare: Arduino IDE

Biblioteci externe:

  • LiquidCrystal_I2C.h
  • Servo.h

Programul va citi mesajele primite prin interfata seriala, in urma rularii programului scris in Python. Un mesaj contine unghiurile celor 3 servomotoare separate prin spatiu. Dupa parsarea mesajului, va roti servomotoarele corespunzator, miscand componentele bratului de care acestea sunt lipite. Se vor afisa pe LCD coordonatele fiecarui servomotor.

Cod Python

Mediu de dezvoltare: Pycharm

Module externe:

  • mediapipe - detectarea mainii
  • cv2 - inregistrarea si afisarea imaginii obtinute de la camera web
  • serial - comunicarea seriala cu arduino

Se va initializa legatura seriala cu Arduino-ul conectat prin portul USB, comunicand prin interfata seriala cu un baud rate de 115.2 kbps, setat atat in programul in Python cat si cel pentru Arduino. Aceasta valoare este cea mai mare pe care am putut sa o setez, in cadrul testarii nu a prezentat nicio eroare, un baud rate mai mare rezultand in erori aparute instantaneu. Datele obtinute de la camera se genereaza totusi cu o frecventa mult mai rapida, un baud rate mai mare ar fi fost util pentru a avea un brat mai sensibil la orice miscare, intrucat in programul implementat datele se vor trimite la fieare 8 iteratii (cadre) pentru a permite microcontrolerului sa citeasca si sa prelucrezele datele si sa pozitioneze servomotoarele corespunzator.

Cu ajutorul modulului Open Computer Vision (cv2), se vor prelua imaginile generate de camera Web, care vor fi prelucrate de programul de detectie a mainilor implementat in modulul mediapipe. In momentul in care se detecteaza o mana, programul va prelua coordonatele indiciilor 5 si 17 conform imaginii de mai jos (inceputul aratatorului si inceputul degetului mic).

Mediapipe Indici Mana

Etapa de initializare presupune pozitionarea mainii intr-un dreptunghi pentru prima rulare a programului, daca aceasta iese din cadru sau in cazul in care se misca mult prea rapid si nu este detectata de algoritmul de detectie al mainilor intr-un anumit cadru. Aceasta initializare are rolul de a reprezenta un punct de start apropiat de pozitia initiala a bratului, care are servomotoarele rotite la un unghi de 90 de grade (initializarea are in general valori cuprinse intre 80 si 100 de grade, pentru diferite pozitionari si dimensiuni ale mainii)

Coordonatele pentru primele 2 servomotoare (X si Y) se obtin prin maparea pozitiei mainii din intervalul ferestrei (1280×720) din care se scad dimensiunile curente ale mainii in intervalul 0-180. Coordonata celui de-al treila servomotor (Z) se obtine prin calcularea distantei euclidiene intre cele doua puncte ale mainii, rezultand valori ridicate in momentul in care se apropie mana, respectiv valori scazute atunci cand aceasta se departeaza. Aceasta distanta este de asemenea mapata in intervalul 0-180.

Rezultate Obţinute

Concluzii

Consider ca proiectul a fost unul util, intrucat am aplicat atat cunostiinte aflate in cadrul laboratorului dar am si dobandit diverse cunostinte in lucrul cu modulele Python folosite. Constructia bratului robotic a durat mai mult decat m-as fi asteptat (mai intai gasirea materialelor potrivite si apoi mai multe retusuri precum adaugarea de pietre in cutia cu primul servomotor, pilirea colturilor riglei pentru cel de al doilea brat pentru a nu se ridica la unghiurile extreme de 0/180 de grade, lipirea riglei de servomotor in diferite moduri si de foarte multe ori, intrucat acestea cedeau datorita greutatii). Ideea initiala a fost realizarea unui brat mai util, insa utilizarea acestuia din final a fost aceea de a avea atasat la capat o carioaca (cel mai interactiv si cu o greutate ce poate fi sustinuta de puterea servomotoarelor si banda dublu adeziva). Implementarea software consider ca a fost reusita, insa este constransa de limitarile microprocesorului si servomotoarelor, datele fiind transmise la fiecare 8 iteratii si existand un delay vizibil.

Download

Jurnal

  • 6.05.2022: Completare pagina wiki - Milestone 1
  • 16.05.2022-18.05.2022: Implementarea codului software
  • 20.05.2022-22.05.2022: Construire brat si finalizare implementare
  • 22.05.2022: Completare pagina wiki - Milestone 2

Bibliografie/Resurse

pm/prj2022/agmocanu/robotic_arm.txt · Last modified: 2022/05/22 23:00 by vlad.vasile1907
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0