Proiectul meu consta in construirea si programarea unui robotel mic in scopul de a genera in mod autonom harta unei incaperi. Am plecat de la ideea unui aspirator autonom, aceasta fiind si una din posibilele utilitati ale unui astfel de robot. Alte posibile aplicatii ar putea fi explorarea zonelor periculoase/greu accesibile pentru oameni. (Desigur, cu o varianta mai complexa al aceluiasi principiu)
Robotul are capacitatea de a fi controlat si a transmite in timp real pozitia sa si pozitia obstacolelor pe care le detecteaza pe o retea WiFi. Localizarea este realizata cu ajutorul encoderelor de pe micromotoare, iar detectarea obstacolelor este facuta de trei senzori ultrasonici. Microcontroller-ul ce are la baza chip-ul ESP-WROOM-32 se ocupa pe de o parte de controlul si calculele de pe robot, cat si de comunicarea wireless, dubland ca un AP la retea.
Piese utilizate:
Design-ul robotului a fost realizat integral in Fusion360, iar modelul final este open source, disponibil aici.
Am urmarit cateva principii de-a lungul realizarii sale:
Toate componentele electronice sunt fie montate pe sasiu cu cate un suport special, fie sunt montate pe o placuta de prototipare care este apoi prinsa de sasiu. Am optat pentru lipirea unor headeri de pini pe placutele de prototipare, in locul lipirii direct a pieselor pentru inlocuirea usoara a acestora in caz de defect. De asemenea, nu riscam sa defectez piesele in timp ce lucram la lipituri.
Partea software a presupus doua provocari diferite:
Unicul mecanism utilizat pentru localizarea robotului sunt encoderele de pe motoare. Valorile encoderelor sunt calculate utilizand intreruperi, iar la fiecare trecere prin bucla este calculata o estimare a deplasarii robotului din momentul ultimului update. Nu putem fi siguri ce traseu a urmat robotul intre doua treceri prin bucla, dar putem presupune cum s-a deplasat, iar la o frecventa suficient de mare a acestor update-uri putem avea o localizare good enough. Totusi, aceasta metoda acumuleaza erori la fiecare calcul si nu este o metoda fiabila pentru mult timp. Acest lucru ar putea fi imbunatatit prin adaugarea si a altor metode de localizare.
La fiecare trecere prin bucla, putem vedea cat de mult s-au modificat valorile celor doua encodere:
$$\Delta encoder = encoder\_count - previous\_encoder\_count$$.
Putem calcula cat de mult s-a deplasat o roata a robotului, stiind cate tick-uri are un encoder per rotatie:
$$d = \frac{\Delta encoder}{ticks\_per\_rotation} * 2 \pi radius_{wheel}$$
Putem calcula si cat de mult s-a rotit robotul, gandindu-ne ca s-a deplasat de-a lungul cercului pe care se situeaza cele doua roti:
$$\Delta \Theta = \frac{\Delta encoder_{left} - \Delta encoder_{right}}{\pi * distance_{wheels}}$$
Pentru a actualiza pozitia curenta, vom presupune ca robotul s-a deplasat pe o distanta $d_{m} = \frac{d_{left} + d_{right}}{2}$ la un unghi $\Theta_{m}=\Theta + \frac{\Delta \Theta}{2}$, actualizand in final coordonatele:
$$x_{t+1} = x_{t} + d_{m}cos(\Theta_{m})$$ $$y_{t+1} = y_{t} + d_{m}sin(\Theta_{m})$$ $$\Theta_{t+1} = \Theta_{t} + \Delta \Theta$$
Initial ma gandeam ca robotul sa salveze harta pe un card SD si sa poata fi apoi vizionata. Apoi m-am gandit ca e foarte neinteresant si ca ar fi mult mai smecher sa o transmita in timp real pe laptop pentru vizionare. Aceasta idee a atras dupa sine si o provocare: programul meu ar deveni IO bound, ceea ce ar distruge complet ideea de localizare mai sus mentionata.
Din fericire, placuta bazata pe chip-ul ESP-WROOM-32 are capacitati integrate de WiFi, asa ca am ales acest mediu pentru transmitere.
La pornirea codului, robotul creeaza o retea WiFi pentru care este si AP. Apoi asteapta conectarea unui alt dispozitiv la aceasta retea.
Partea de comunicare este compusa din:
La fiecare trecere prin bucla robotul:
Clientul:
Pentru comunicare am ales sa folosesc protocolul UDP. Am facut aceasta alegere din mai multe motive:
Asa cum am mentionat, trebuie ca robotul sa indeplineasca doua task-uri cu sarcini complet diferite:
Din acest motiv, am impartit rularea codului pe cele doua core-uri in cel mai firesc mod posibil:
Sunt foarte multumit de rezultat, am avut multe provocari si cred ca am reusit sa aduc robotul intr-o forma buna. Am invatat multe lucruri de-a lungul acestui proiect si m-am distrat realizandu-l. Totodata, deja am multe idei pentru imbunatatiri ale unor versiuni viitoare: