Table of Contents

Mapping Robot - Luca Seritan 333CA

Introducere

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)

Descriere generală

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.

Schema Bloc

Schema bloc

Hardware Design

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:

Etape proiectare 3D

Etape proiectare 3D

Etapa Screenshot Fusion360
Forma intiala sasiu
Amplasare aproximativa componente
Crearea suportilor
Adaugare placuta senzori si baterie
Adaugare componente electrice si cosmetizare

Randari cu modelul final

Randari cu modelul final

Randare stangaRandare centruRandare dreapta

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.

Lipituri

Lipituri

Placa prototipare centruPlaca prototipare senzoriHeaderi pini

Daca le numaram cu grija, observam ca din placuta din poza centrala, cea care corespunde celor trei senzori ultrasonici ies doar 6 fire (pentru 12 pini). Acest lucru se datoreaza pe de o parte faptului ca GND si 3.3V sunt comune celor trei senzori, iar mai putin evident este faptul ca putem lega in paralel si cei trei pini de pulse ai senzorilor. Acest lucru face economie de doua fire si doi pini si pastreaza functionalitatea. (Cand vrem sa citim un senzor, putem trimite o unda din toti senzorii de-o data si sa citim impulsul de echo doar de pe cel care ne intereseaza, iar senzorii nu vor interfera intre ei datorita pozitionarii perpendiculare)

2 fire si 2 pini

Software Design

Partea software a presupus doua provocari diferite:

Localizare

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$$

Comunicarea

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:

Organizarea sarcinilor

Asa cum am mentionat, trebuie ca robotul sa indeplineasca doua task-uri cu sarcini complet diferite:

Din fericire, acest microcontroller este dual core.

Din acest motiv, am impartit rularea codului pe cele doua core-uri in cel mai firesc mod posibil:

Rezultate Obţinute

Robotul este functional (cel putin ca proof of concept).

 Roomba final

Concluzii

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:

Download

Codul este disponibil pentru download pe github.

Bibliografie/Resurse

Datasheet ESP32

Multithreading pe ESP32

Tutorial HC-SR04

Tutorial WiFi ESP32

Export to PDF