Sunteți pe pagina 1din 70

Universitatea “Politehnica ” din București

Facultatea de Electronică, Telecomunicații și Tehnologia Informației

Robot cu Raspberry Pi cu funcţie de navigare cu determinarea poziţiei

Proiect de diplomă

Prezentat ca cerință parțială pentru obținerea titlului de


Inginer în domeniul Electronică si Telecomunicații
programul de studii de licență Electronică Aplicată

Conducători științifici Absolvent


Conf. dr. ing. Mihai STANCIU George-Iulian NITROI

Anul 2018
Copyright © 2018 , George-Iulian Nitroi
Toate drepturile rezervate
Autorul acordă UPB dreptul de a reproduce și de a distribui public copii pe hârtie sau electronice
ale acestei lucrări, in formă integrală sau parțială
8
Cuprins
Listă de figuri ................................................................................................................................ 11
Listă de acronime .......................................................................................................................... 15
Introducere .................................................................................................................................... 17
Capitol 1 Noțiuni teoretice necesare dezvoltării practice ....................................................... 19
1.1 Descrierea computerului Raspberry Pi ........................................................................... 19
1.1.1 Descrierea succintă a portului GPIO....................................................................... 20
1.1.2 Caracteristici generale ale ARM Cortex-A53 ........................................................ 20
1.1.3 Domeniul de utilizare.............................................................................................. 22
1.2 Descrierea senzorului LIDAR-ului ................................................................................ 22
1.2.1 Caracteristi generale ale senzorului ....................................................................... 23
1.2.2 Principiul de funcţionare ......................................................................................... 24
1.3 Comunicația Wi-Fi ......................................................................................................... 25
1.4 Locomotia vehiculului.................................................................................................... 25
1.4.1 Motorul de curent continuu ..................................................................................... 25
1.4.2 Principiul locomoției diferențiale ........................................................................... 26
1.4.3 Controlul motoarelor ............................................................................................... 27
1.4.4 Modulaţia impulsurilor în durată ............................................................................ 29
1.4.5 Encodere optice ....................................................................................................... 30
Capitol 2 Implementarea hardware a vehiculului ................................................................... 33
2.1 Sistemul de control ......................................................................................................... 34
2.1.1 Percepția ................................................................................................................. 35
2.1.2 Cunoașterea ............................................................................................................ 35
2.1.3 Interfața operator ..................................................................................................... 35
2.2 Şasiul robotului .............................................................................................................. 36
2.3 Locomotia vehiculului.................................................................................................... 36
Capitol 3 Localizare şi mapare simultană ............................................................................... 39
3.1 Odometrie ....................................................................................................................... 39
3.2 Puncte de reper (Landmarks) ......................................................................................... 39
3.3 Cartografiere................................................................................................................... 40
3.4 Filtrul de particule Rao-Blackwellized .......................................................................... 42

9
Capitol 4 Implementarea software a vehicului ....................................................................... 43
4.1 Sistemul de operare al robotului..................................................................................... 43
4.1.1 Pachetele ................................................................................................................. 43
4.1.2 Arhitectura ROS...................................................................................................... 44
4.1.3 Fişierele de tip “Launch” ........................................................................................ 45
4.1.4 ROS pe mașini multiple .......................................................................................... 46
4.2 Mediul de dezvoltare ...................................................................................................... 46
4.3 Arhitectura aplicației ...................................................................................................... 47
4.3.1 Driver-ul Hokuyo URG-04lx .................................................................................. 48
4.3.2 Navigația și determinarea distanței parcurse de vehicul ......................................... 49
4.3.3 Controlul de la distanța ........................................................................................... 51
4.3.4 Softul pentru localizare şi mapare simultană .......................................................... 51
4.3.5 Vizualizarea rezultatelor ......................................................................................... 52
Capitol 5 Testarea vehicului ................................................................................................... 53
5.1 Scenariul 1: Balconul ..................................................................................................... 53
5.2 Scenariul 2: Holul........................................................................................................... 54
5.3 Scenariu 3: Camera ........................................................................................................ 55
Concluzii ....................................................................................................................................... 57
Bibliografie ................................................................................................................................... 59
Anexa 1 Imagini cu realizarea practică ......................................................................................... 61
Anexa 2 Cod sursă –Comanda navigației ..................................................................................... 62
Anexa 3 Cod sursă – Navigația și determinarea distanței parcurse de vehicul ............................ 63
Anexa 4 Cod sursă – Scriptul pentru lansarea aplicaților pe mobil .............................................. 69
Anexa 5 Cod sursă – Scriptul pentru algorimului SLAM............................................................. 70

10
Listă de figuri

Figura 1.1 Configuratia pinilor portului GPIO [2]........................................................................ 19


Figura 1.2 Schema bloc generală a microcontrolerului [3].......................................................... 21
Figura 1.3 Simulare minimalistă a robotului in Gazebo ............................................................... 23
Figura 1.4 Raza şi deschiderea senzorului .................................................................................... 24
Figura 1.5 Motor curent continuu ................................................................................................. 26
Figura 1.6 Locomoția diferențială [8] ........................................................................................... 26
Figura 1.7 Circuit de tip punte H [9]............................................................................................. 27
Figura 1.8 Circuit integrat L298 [10]............................................................................................ 28
Figura 1.9 Forma de undă a unui semnal PWM [11] .................................................................... 30
Figura 1.10 Traductor optic [12] ................................................................................................... 30
Figura 1.11 Codarea sectoarelor pe disc [12] ............................................................................... 31
Figura 1.12 Determinarea sensului de rotație [12]........................................................................ 31
Figura 1.13 Determinarea numărului de impulsuri [12] .............................................................. 32
Figura 2.1 Diagrama bloc a vehicului ........................................................................................... 33
Figura 2.2 Diagrama control supervizat [13] ................................................................................ 34
Figura 2.3 Şasiul robotului............................................................................................................ 36
Figura 2.4 Formele PWM de undă pentru mişcarea rectilinie, respectiv cea de rotaţie ............... 37
Figura 2.5 Ball caster vs Wheel caster .......................................................................................... 37
Figura 3.1 Pozitia in spaţiu a mobilului înainte si după metoda probabilistică [16] .................... 41
Figura 3.2 Estimarea poziţiei si a harţii [16]................................................................................. 41
Figura 3.3 Model grafic al procesului de localizare şi mapare simulatană [16] ........................... 41
Figura 3.4 Estimarea poziției in cazul algorimului Rao-Blackwellized ....................................... 42
Figura 3.5 Aplicație a algorimului [17] ........................................................................................ 42
Figura 4.1 Schema graf a nivelului de procesare [18] .................................................................. 44
Figura 4.2 Sublime Text si VIM ................................................................................................... 47
Figura 4.3 Arhitectura aplicației ................................................................................................... 48
Figura 4.4 Scan topic .................................................................................................................... 49
Figura 4.5 Viteza slave [19] .......................................................................................................... 50
Figura 4.6 Datele odometrice ........................................................................................................ 51
Figura 5.1 Scenariu 1: Model real................................................................................................. 53
Figura 5.2 Scenariu 1: Model obținut ........................................................................................... 54
Figura 5.3 Scenariu 2: Model real................................................................................................. 54
Figura 5.4 Scenariu 2: Model obținut ........................................................................................... 55
Figura 5.5 Scenariu 3: Model real................................................................................................. 55
Figura 5.6 Scenariu 3: Model obținut ........................................................................................... 56

11
12
Listă de tabele

Tabela 1.1 Moduri de funcționare a unui circuit de tip punte H ................................................... 28


Tabela 1.2 Tabel de adevăr pentru circuitul integrat .................................................................... 29
Tabela 1.3 Semnificația simbolurilor L ,H ................................................................................... 29

13
14
Listă de acronime
ROS: Robotic Operating System(Sistem de operare pentru roboţi)
PWM:Pulse-Width Modulation(Modulație in timp a impulsului)
SPI : Serial Peripheral Interface ( Interfață serială cu dispozitive periferice)
PDS:Procesor digital de semnal
SIMD:Single instruction, multiple data(Date multiple pe o singură instrucţiune=
SBC: Single-Board Computer (Computer pe o singură placută)
SoC:System on a chip(Sistem pe un singur chip)
LIDAR: Light Detection and Ranging(Detectare a luminii si a distanţei)
GPIO: General-purpose input/output(Pini de uz general de intrare/ieşire)
WLAN: Wireless Local Area Network(Reaţea fara fir locala)
SLAM: Simultaneous Localization And Mapping(Localizare şi mapare simultană)
SSH: Secure Shell(Shell securizat)
GPS: Global Positioning System(Sistem de Poziționare Globală)
RAM: Random Acces Memory (Memorie cu acces aleatoriu)
RISC: Reduced instruction set computing (Arhitectură de calcul cu set redus de instrucțiuni )
USB: Universal Serial Bus( Magistrală Serială Universală)
HDMI:High-Definition Multimedia Interface(Interfață multimedia de înaltă definiție)
MAC: Media Access Control(Control de acces media)
TTL : Transistor-Transistor logic (Logica tanzistor-tranzistor)
AP:Access Point(Punct de acces)
SSID: Service set identifier (Identificator al setului de servicii)
IP: Internet Protocol(Protocol de internet)
API: Application Programming Interface(Interfaţa de programare a aplicaţiilor)

15
16
Introducere

În zilele noastre dezvoltarea tehnologiei este mai rapidă pe zi ce trece. Din ce în ce mai
multe dispozitive robotizate autonome s-au infiltrat în viețile oamenilor pentru a o face mai
usoară. În foarte multe cazuri, dispozitivele robotizate autonome pot fi cea mai bună opțiune
pentru rezolvarea unei probleme. Un exemplu considerat este reprezentat de metodele de
explorare și mapare a unui spațiu interior greu de accesat omului. Utilizarea unui robot mobil
scade riscul accidentarilor sau accidentelor umane și poate returna unui utilizator date exacte
despre mediul in care acesta a fost trimis. Echipat cu dispozitive senzoriale speciale, vehiculul
autonom sau comandat de un utilizator va scana mediul și va trimite informații prețioase. În
șcenarii precum incendii, clădiri afectate sau zone lipsite de orice sursă de lumină un astfel de
robot este soluția optimală
De asemenea, pot exista și locuri în care utilizarea unui robot este singura modalitate
viabilă de acces. De exemplu, centralele nucleare, fabricile de produse chimice toxice sau orice
mediu ce ar putea fi dăunător omului, pot fi explorate de vehicule comandate de la distaţă pentru
realizarea diferitelor operațiuni. Realizarea unei harți ne poate fi de mare ajutor în aceste situații
in care pentru un individ poate fi foarte periculos sau imposibil chiar să ajungă în zona
respectivă.
Problema dezvoltării unui robot mobil de acest gen implică stăpânirea conceptului de
localizarea şi mapare simultană. În robotică localizarea și maparea simultană (SLAM -
simultaneous localization and mapping) reprezintă problema computării, construirii şi
actualizării unei hărți a unui mediu necunoscut, urmărind simultan localizarea unui agent în
cadrul acesteia. Inţial această problema pare a fi o problema de tipul „oul sau găina?” intrucât
pentru a ne putea localiza într-un loc avem nevoie de o hartă a acelui loc și, viceversa , pentru a
putea face o hartă a unui loc trebui să știm unde ne aflăm relativ de acel loc. Există mai mulți
algoritmi cunoscuți pentru rezolvarea acestei probleme, cel puțin aproximativ si în timp tractabil
pentru anumite medii. Cele mai populare soluţii aproximative includ filtrul de particule, filtrul
Kalman extins și Rao-Blackwellized.
Popularitatea problemei SLAM este corelată cu apariția robotizării mobile interioare.
Utilizarea GPS-ului nu are o soluţie de a determina eroarea de localizare pentru utilizarea în
interior. În plus, SLAM oferă o alternativă atrăgătoare pentru hărțile construite de utilizatori,
arătând că operarea robotului este accesibilă chiar și în absența unei infrastructuri de localizare a
obiectivelor.

Obiectivele propuse si realizate ale acestui proiect sunt urmatoarele:


 Dezvoltarea unui vehicul controlat de la distanţă
 Implementarea si testarea modulelor hardware pentru deplasare şi interfaţarea cu
mediul inconjurator

17
 Implementarea şi testarea unui algoritm care să determine harta incaperii in care
se află şi poziţia relativ cu această hartă

Proiectul este structurat în 5 capitole, fiecare prezentând detalii cu privire la diferite aspect
teoretice sau practice. Capitolul 1 prezintă o introducere in temă a proiectului si noțiunile
teoretice necesare dezvoltării acestuia. In capitolul 2 se descrie implementarea hardware a
mobilului, capitolul 3 prezintă succint câteva noțiuni legate de filtrele de particule şi cum
funcționează ele pentru a calcula poziția și harta mediului în care mobilul nostru se află, capitolul
4 vobește despre implementarea software și corectarea unor erori din hardware, iar în ultimul
capitol sunt discutate rezultatele obtinute în urma testării şi eventualele căi de dezvoltare ale
proiectului.

18
Capitol 1 Noțiuni teoretice necesare dezvoltării practice

1.1 Descrierea computerului Raspberry Pi

Vehiculul nostru utilizează calculatorul Raspberry Pi un SBC produs în Marea Britanie de către
Raspberry Pi Foundation cu scopul de a oferii o platformă de învatare a informaticii în scoli. Din toate
versiunile existente de Raspberry Pi am ales să foloseşte modelul 3 B care foloseşte un SoC Broadcom
BCM2837 cu 4 nuclee de procesare ARM Cortex-A53 cu o frecvenţă de 1.2Ghz fiind îndeajuns de
potent să prelucreze datele provenite pe diferite fire de execuţie eliminând astfel necesitatea
intreruperilor.Pe langă acestea, sistemul mai inglobeaza un procesor grafic VideoCore IV. [1]
O altă caracteristica extrem de folositoare proiectului a acestei ultime versiuni este adăugarea unui
BCM43438 Wi-Fi, cip folosit pentru interfaţarea cu orice dispozitiv ce e capabil să se conecteze la o
reţea WiFi .
La capitolul conectivitate Raspberry Pi dispune de:
 Un port HDMI
 patru port-uri USB 2.0
 un jack audio
 un port pentru alimentare pe micro-USB
 un port microSD
 Gigabit Ethernet pe interfata USB 2.0 (latime de banda maxima 300Mbps)
 MIPI DSI display port
 MIPI CSI camera port
 40-pin GPIO header

Ceea ce îl face ideal pentru utilizarea în aplicaţiile embedded este portul GPIO ce conţine pini care
pot fi folosiţi pentru a citi date de la senzori sau pentru a comanda diferite module cum este în cazul
proiectului nostru driver-ul de motoare.

Figura 1.1 Configuratia pinilor portului GPIO [2]

19
1.1.1 Descrierea succintă a portului GPIO
 Vcc : Se împart la randul lor in pini de 3.3V şi pini de 5V . Ambele tipuri pot fi folosite
pentru alimentare .Cei de 5V se pot folosi şi pentru alimentarea microcalculatorului.
 Gnd : Masa
 GPIO : Pot fi setaţi în cadrul programelor ca pini de intrare, pentru citirea datelor în
format digital sau ca pini de ieşire pentru comanda altor module. De asemena dispun şi
de alte funcţii mai specifice precum PWM (hardware doar pe pinii 12,13,18,19),
SPI,Serial (TX-GPIO14, RX-GPIO15)

1.1.2 Caracteristici generale ale ARM Cortex-A53 [3]


 Arhitectura de tip RISC:
 Dimensiunea instrucţiunii 64 biti
 Nuclee 1–4 per cluster
 L1 cache 8–64 KiB
 L2 cache 128 KiB – 2 MiB
 31 de regiştrii de uz general de 64 de biti
 Prezentare generală
 Procesor cu pipeline pe 8 stări
 Execuție superscalară în 2 direcții
 Extensiile PDS şi SIMD pentru fiecare nucleu
 Unitatea de virgulă mobila VFPv4 la bord (per nucleu)
 Suport pentru virtualizarea hardware
 Linii cache TLB L1 cu 10 intrări și TLB L2 de 512 de intrări
 Are registru dedicat de zero sau pointer de stiva (SP)
 Contorul de programe (PC) nu este direct accesibil ca registru

1.1.2.1 Schema bloc generală a microcontrolerului


In figura urmatoare este ilustrată schema bloc generală a microcontrolerului şi se vor prezenta
sumar cele mai importante blocuri funcţionale :

20
Figura 1.2 Schema bloc generală a microcontrolerului [3]

1.1.2.2 Unitatea de prelucrare a instrucţiunilor


Unitatea de preluare a instrucțiunilor conține controlerul cache-ului de instrucțiuni asociat cu
tamponul de completare a liniei de distribuire. Cache-ul de instrucțiuni Cortex-A53 MPCore este setat
în asociere cu două căi și utilizează linii de cache cu indexare fizică. Această unitate obține instrucțiuni
din cache-ul de instrucțiuni sau din memoria externă și prezice rezultatul ramurilor în fluxul de
instrucțiuni, apoi transmite instrucțiunile către unitatea de procesare a datelor pentru procesare.

1.1.2.3 Unitatea de procesare a datelor


Unitatea de procesare a datelor deține cea mai mare parte a stării vizibile a procesorului, cum ar
fi registrele de uz general și registrele de sistem. Oferă configurarea și controlul sistemului de memorie
și funcționalitatea asociată acestuia. Acesta decodează și execută instrucțiuni, operând pe date care sunt
ținute în registre în conformitate cu arhitectura ARMv8-A. Unitatea execută instrucțiuni care necesită
transferarea datelor către sau din sistemul de memorie prin interfațarea cu unitatea de cache de date,
care gestionează toate operațiile de încărcare și stocare.

1.1.2.4 Tamponul de căutare pentru traducere


Tamponul de căutare pentru traducere gestionează toate operațiunile de plimbare ale tabelului
de traducere pentru procesor. Intrările tamponului sunt stocate în interiorul unei memorii RAM
asociative cu 4 cai si 512 intrari. Datele din memoria RAM sunt protejate de un bit de paritate care
atunci cand este setat detectează orice eroare la nivel de bit. În cazul în care este gasită o eroare,
memoria este golită şi datele se aduc din nou in memorie.

21
1.1.2.5 Memoria cache
L1 cache
Controlerul cache de nivel 1 (L1) generează semnalele de control asociate datelor și arbitrează
între diferitele surse care solicită acces la resursele de memorie. Cache-ul de date este setat în 4 direcții
asociative și utilizează o schemă de indexare fizică ce determină un managment precis al adreselor din
sistem.
L2 cache
Alaturi de memoria de sistem aceasta are rolul de a menţine coerenta datelor intre cele 4 nuclee
ale grupului. Este important ca datele din memoria cache de nivel L1 să coincidă cu cele aflate în cea
L2.

1.1.3 Domeniul de utilizare

Cerințele de alimentare exacte depind în funcţie de aplicaţia în care se doreste a fi folosit SBC-
ul. În cazul în care acesta este neutilizată, este de obicei într-o stare de putere scăzută sau complet
dezactivată. Dacă aplicatia care rulează în momentul de fată nu utilizează grafică 3D, atunci o mare
parte din logica digitală de bază nu va porni niciodată și nu are nevoie de energie.Acest lucru este
valabil și pentru interfețele de cameră și de afișare, HDMI, interfețe USB, encodere video și decodoare
și așa mai departe.
Pinii GPIO pot fi utilizaţi şi ei pentru alimentarea altor module externe. Fiecare GPIO poate
furniza până la 16mA, curentul total pe bank nu trebuie să depășească 50mA.
Acestea fiind consemnate dacă alegem să alimentam SBC-ul via micro USB va trebui sa îi
viram acestuia 5V/2.5A , iar în cazul alimentarii via GPIO header 5V.
În ceea ce priveste temperatura de operare este intre 0–50°C. [1]

1.2 Descrierea senzorului LIDAR-ului


Vehiculul este proiectat sub forma unui robot mobil, ce se deplasează în interiorul unei cladiri la
comenzile unui utilizator pentru a scana mediul încojurator. Pentru a masura distanta la care robotul se
află faţă de pereţii incintei în care se află am utilizat un senzor LIDAR capabil să scaneze în mod
continuu orice modificare în proximitatea sa.
Pentru a determina distanţa robotului faţă de pereţii incaperii în care se află vom amplasa senzorul
în partea frontală a robotului şi relativ paralel cu cele 2 motoare ale robotului pentru a ne fi cât mai uşor
sa ne dăm seama de poziţia laserului faţa de mediul incojurător.

22
Figura 1.3 Simulare minimalistă a robotului in Gazebo

1.2.1 Caracteristi generale ale senzorului [4]


URG-04LX este un senzor laser pentru scanarea suprafeţelor. Sursa de lumină a senzorului este
un laser cu infraroșu de lungime de undă 785nm. Laserul se incadrează în clasa 1 in ceea ce priveşte
siguranţa, el fiind sigur pentru ochi iar expunerea indelugată la radiatiile acestuia nefiind daunatoare
pentru sanatate. Zona de scanare este de circa 240º semicerc cu raza maximă 4000mm. Rezoluţia de
deplasare a fasciculului luminos este de 0,36º și senzorul emite distanța măsurată la fiecare punct (683
de pași). Diametrul fasciculului laser este mai mic de 20mm la distanţa de 2000mm, cu o divergență
maximă de 40mm la 4000mm. Principiul de măsurare a distanței se bazează pe calculul diferenței de
fază, datorită căruia este posibil să se obțină măsurători stabile cu influență minimă de la culoarea și
reflexia obiectului. Se menţioneaza ca senzorul este proiectat pentru a fi folosit doar in înterior.
Parametrii generali ai senzorului:
 Tensiune de alimentare: 5V DC ±5%
 Curentul mediu consumat: 500mA
 Gama de detecţie: 20-5.600mm
 Perioada de actualizare: 100 ms
 Putere laser: 0.8mW
 Interfaţa: USB Version 2.0
 Viteză unghiulară: 360 grade/s

23
Figura 1.4 Raza şi deschiderea senzorului

1.2.2 Principiul de funcţionare

Principiul are la bază transmiterea unui fasciul mic de lumină la o suprafață și măsurarea
timpului necesar pentru a reveni la sursă. Când o sursa de lumină străluceşte pe o suprafață ceea ce
ochiul uman percepe este de fapt este lumina reflectată și revenind la retină. Lumina călătorește foarte
repede - aproximativ 300.000 de kilometri pe secundă, 186.000 mile pe secundă sau 0.3 metri pe
nanosecundă, astfel încât o lumină aprinsă este instantanee. Desigur, nu este! Echipamentul necesar
pentru a măsura acest lucru trebuie să funcționeze extrem de rapid.

R-Distanta masurată , R Rezoluţia cu care a fost masurată distanta


𝑇 𝑐t
R=𝑐 ; R=
2 2
c-viteza luminii
t-intervalul de timp dintre expedierea / primirea impulsului
t-intervalul de timp intre 2 măsuratori [5]

Instrumentul LiDAR emite impulsuri rapide ale luminii laser la o suprafață, unele cu până la
150.000 de impulsuri pe secundă. Un fotodetector de pe instrument măsoară durata de timp necesară
pentru ca fiecare puls să se întoarcă înapoi. Lumina se deplasează la o viteză constantă și cunoscută,
astfel încât instrumentul LiDAR poate calcula distanța dintre ea însăși și țintă cu o precizie ridicată.
Repetând acest lucru în succesiune rapidă, insturmentul construiește o "hartă" complexă a suprafeței pe
care o măsoară. Fotodetectorul este un dispozitiv care citește și înregistrează semnalul intors la senzor.

24
Cel mai adesea întâlnit senzor de lumină este fotodiodă ce convertește semnalul luminos în curent
electric.

1.3 Comunicația Wi-Fi

Wi-Fi este un mediu de difuzare ,care spre deosebire de ethernet nu are nevoie de un mediu
fizic, și care permite oricărui dispozitiv să asculte și să participe la o comunacţie prin conectarea la un
acces point. Este asadar o tehnologie radio folosită deseori la implementarea rețelelor locale de
calculatoare de tip rețea locală fără fir. Un WLAN este un sistem de comunicații implementat ca
extensie la, sau ca alternativă pentru o rețea locală cablată, combinând conectivitatea la viteză mare cu
mobilitatea utilizatorilor, într-o configurație mult simplificată. Avantajele evidente, cum ar fi
mobilitatea, flexibilitatea, simplitatea în instalare, costurile de întreținere reduse și scalabilitatea, au
impus Wi-Fi și WLAN ca o soluție tot mai mult utilizată in domeniul sistemelor integrate.
Domeniul de semnal Wi-Fi depinde de banda de frecvență, puterea de ieșire a radioului,
câștigul antenei și tipul antenei, precum și tehnica de modulare. Linia de vizibilitate a reţelei ne dă aria
reţelei, dar reflexia și refracția pot avea un impact semnificativ.
Rețelele Wi-Fi utilizează tehnologii radionumit IEEE 802.11 pentru a furniza servicii sigure
si conectivitate fără fir rapidă. O configurație- tipică Wi-Fi include unul sau mai multe puncte de acces
(AP) și unul sau mai mulți clienți. Un AP difuzează SSID-ul său (identificatorul setului de servicii sau
"numele rețelei") prin pachete ce sunt difuzate de obicei la fiecare 100 ms. Pachetele de identificare
sunt transmise la 1 Mbit / s, și sunt relativ de durată scurtă și, prin urmare, nu au un efect semnificativ
asupra performanței. 1 Mbit / s este cea mai mică rată care asigură clientul ca datele primite de la
reţeaua Wi-Fi sunt corecte. Pe baza setărilor, clientul poate decide dacă se va conecta la un AP.
Rețelele Wi-Fi funcționează la 2,4 GHz și 5 GHz, cu o frecvență de 11 Mbit / s sau 54 Mbit / s . Pentru
aplicații de tip embedded în care se doreşte trimiterea unor directive și interpretarea unor percepții
aceste viteze sunt adesea suficient de mari. [6]
1.4 Locomotia vehiculului
Vehiculul a fost realizat sub forma unui robot mobil cu locomoție diferențială concepută pe baza
unui șasiu cu 2 roți laterale și a unei roti cu rulment plasata anterior pentru echilibrarea întregului
sistem. Deplasarea sistemului diferențial a fost realizată cu ajutorul celor două motoare de curent
continuu”.

1.4.1 Motorul de curent continuu


Avem un motor cu perii conceput pentru a rula pe curent continuu, schimbarea vitezei fiind
realizată prin modificarea tensiunii de funcţionare. Acest motor miniatural constă dintr-un reductor cu
un raport de 48:1. Axul principal are diametrul de 3mm şi este în formă de “D”. Este prevazut și cu un
ax secundar de aceeasi forma, ce asigură fixarea encoderului optic. Caracterisici electrice ale
motorului: [7]
 Tensiune de alimentare motor: 3V - 6V DC;
 Cuplu: 0.8 kg * cm;
 RPM: 3V:125rpm, 5V:200rpm, 6V:230rpm;
 Curent: 3V:60mA, 5V:100mA, 6V:120mA.

25
Figura 1.5 Motor curent continuu

1.4.2 Principiul locomoției diferențiale


Un vehicul cu locomoție diferentială este caracterizat printr-un ansamblu alcătuit din două roți
motoare, amplasate pe o parte și de alta a șasiului și de o roata prinsa cu ajutorul unui rulment ce
asigură echilibrarea părtii frontale a robotului. Cele două motoare atașate roților vor fi responsabile
pentru deplasarea robotului și pentru mecanismul de direcție. Acest sistem permite robotului să
efectueze rotiri de 90 ̊ spre stânga/dreapta,cât și rotire de 180 ̊ în jurul punctului central dintre roți. În
funcție de construcția șasiului și a centrului de greutate a robotului se poate adaugă o bilă cu mișcare
liberă și frecare cât mai mică.
Diagrama de mai jos ilustrează principiul de funcționare al unității diferențiale :

Figura 1.6 Locomoția diferențială [8]

26
I. Cazul S = D

Când cele două roți se rotesc în aceeași direcție și cu aceeași viteză, robotul se va deplasa înainte
sub forma unei linii dreapte.
II. Cazul S < D

Când cele două roți se rotesc în aceeași direcție, dar cu viteze diferite, robotul se va roti spre
direcția motorului cu viteza mai mică. De exemplu, în cazul în care roata din dreapta se rotește cu o
viteză mai mare față de cea din stânga, robotul va vira spre stânga.
III. Cazul S = ─ D

Când cele două roți se rotesc cu aceeași viteză, dar în direcții opuse, robotul se va roti în jurulu axei
proprii pastrânduşi aceeaşi poziţie.Numele de sistem diferențial provine din modul în care robotul este
dirijat prin schimbarea vitezei și a direcției prin diferența dintre cele două roți .

1.4.3 Controlul motoarelor


Controlul celor două motoare de curent continuu a fost realizat cu ajutorul driverului de
motoare, “L298”. Acesta constă din 2 punți H.

1.4.3.1 Principiul de funcționare al unei punți H obișnuite


O punte H este un circuit electronic ce permite alimentarea unei sarcini în orice direcție dorită.
Aceste circuite sunt adesea folosite în domeniul roboticii, dar și în alte domenii, pentru a permite
motoarelor de curent continuu pentru a rula înainte și înapoi. Denumirea de “punte H” provine de la
reprezentare grafică a circuitului electronic, construit din 4 tranzistori sub forma literei “H”.Mai jos,
este ilustrată structura generală a unei punți H.

Figura 1.7 Circuit de tip punte H [9]

Conform structurii de mai sus, când comutatoarele S1 și S4 sunt închise, o tensiune pozitivă va
fi aplicată la terminalele motorului. Prin deschiderea comutatoarelor S1 și S4 și închiderea
comutatoarelor S2 și S3, această tensiune este inversată, permițând operarea inversă a motorului.
Comutatoarele S1 și S2 nu trebuie să fie închise în același timp, deoarece acest lucru ar provoca un
27
scurt circuit pe sursa de alimentare. Aceași condiție trebuie să fie îndeplinită de asemenea și de
comutatoarele S3 și S4. Functia de baza realizata de o punte H este de a inversa directia de deplasarea a
motorului, insa ea poate efectua si operatiuni precum franarea sau mersul in gol al acestuia. Următorul
tabel sumarizează modurile de funcționare a punții H în funcție de configurația celor 4 comutatoare:
S1 S2 S3 S4 Rezultat
1 0 0 0 Sens normal de mișcare
0 1 1 0 Sens invers de mișcare
0 0 0 0 Mers in gol
0 1 0 1 Frână
1 0 1 0 Frână
1 1 0 0 Scurt circuit alimentare
0 0 1 1 Scurt circuit alimentare
0 0 0 0 Scurt circuit alimentare
Tabela 1.1 Moduri de funcționare a unui circuit de tip punte H

1.4.3.2 Circuitul integrat “ L298”


L298 este un circuit integrat monolitic de inalta tensiune si curent ce contine 2 punti H si care
este comandat cu ajutorul nivelurilor standard de logica TTL. El poate conduce sarcini inductive cum
ar fi relee, slonedoide, curent continuu si motoare pas cu pas. Pe langa semnalele de comanda ilustrate
in Tabelul 1.1 mai sunt furnizate inca 2 intrari de activare a fiecarui motor in parte. Emițătorii
tranzistorilor inferiori ai fiecarei punti in parte sunt conectati împreună și cel corespunzător terminalul
extern poate fi utilizat pentru conectarea unui rezistor de detectare externă. [10]

Figura 1.8 Circuit integrat L298 [10]

28
În funcție de configurația aleasă pentru cele 2 semnale de intrare,”IN1” și “IN2”, se pot obține 4
moduri de control:
 Sens de rotatie orar
 Sens de rotatie anti-orar
 Frana scurta
 Mod de oprire

IEŞIRE
Intrare 1 Intrare 2 PWM Ieşire 1 Ieşire 2 Mod
H H H/L L L Frână scurtă
L H H L H Sens de rotaţie anti-orar
L L L Frână scurtă
H L H H L Sens de rotație orar
L L L Frână scurtă
L L H Oprit Oprit
Tabela 1.2 Tabel de adevăr pentru circuitul integrat

Simbol Comentarii
L Tranzistor inferior în conducţie, tranzistor superior în blocare
H Tranzistor inferior în blocare, tranzistor superior în conducţie
Tabela 1.3 Semnificația simbolurilor L ,H

Circuitul integrat “ L298” este caracterizat de urmatorii parametri: [10]


 Tensiunea de alimentare a motoarelor (Vmot) : 5V - 35V
 Tensiunea de alimentare a circuitului logic (Vcc) : 4.5 – 5.5 V
 Curentul de ieșire maximă : 2A per canal
 Curentul continuu de ieșire maxim: 36mA per canal
 Frecvență maximă de PWM : 40kHz

1.4.4 Modulaţia impulsurilor în durată


Variația vitezei celor două motoare a fost realizată de microcontroler, comandând circuitul
integrat L298 prin intermediul modulației inpulsurilor în durată. Modulația impulsurilor în perioadă
este o metodă simplă de a controla dispozitive analogice prin intermediu unui semnal digital. Această
tehnică constă în controlul lățimii impulsurilor, pe baza semnalului modulator, prin modificarea
factorului de umplere. Perioada de timp corespunzătoare valorii ON dintr-un ciclu ON-OFF se numește
factor de umplere și reprezintă, ce tensiune medie va primi dispozitivul electronic Factorul de umplere
se exprimă în procente și reprezintă cât la sută din perioada unui semnal acesta va fi pe nivelul ON.
In fgura de mai jos sunt prezentate semnale PWM cu diferiţi factori de umplere:

29
Figura 1.9 Forma de undă a unui semnal PWM [11]

Formula folosită pentru a obtine valoarea factorului de umplere (D) este următoarea:
TON Latimea pulsului
D= ∗ 100% = ∗ 100%
TON + TOFF perioada
unde :
TON este perioada de timp corespunzatoare valorii ON,tensiune de 5V
TOFF este perioda de timp corespunzatoare valorii OFF,tensiune de 0V

1.4.5 Encodere optice


Encoderul sau traductorul este un dispozitiv electro-mecanic ce transformă deplasarea rotativ-
liniară a unui motor într-un semnal digital. Encoderul optic este cel mai popular tip de traductor, care
constă dintr-un disc rotativ, o sursă de lumină și un fotodetector (senzor de lumină). Discul rotativ, care
este montat pe axul rotativ al motorului, are modele de sectoare opace și transparente, ce permit
trecerea fluxului luminos . [12]

Figura 1.10 Traductor optic [12]

Pe măsură ce se rotește discul, aceste sectoare decupate în interiorul discului vor permite
trecerea fluxului luminos spre fotodector, generând astfel un semnal de ieșire digital. Un encoder
incremental simplu, construit dintr-un singur detector nu ne poate oferi informația necesară obținerii
unei poziții absolute a axului motorului. [12]
30
Pentru a determina atât direcția cât și viteza de rotație a motorului se folosesc traductoare cu 2
canale, numite encodere în cuadratură. Acest tip de traductor utilizează doi senzori pentru detecția
luminii și 2 rânduri de sectoare opace decupate pe disc. Cel mai frecvent tip de traductor incremental în
cuadratură folosește două canale de ieșire ( A și B), pentru a determina poziția. Utilizând două sectoare
de cod, defazate cu 90 ̊ unul față de altul, vom determina atât poziția cât și direcția motorului, din
ieșirile celor două canale.

Figura 1.11 Codarea sectoarelor pe disc [12]

Dacă canalul A precede canalul B, discul se va roti în sensul acelor de ceasornic, iar în cazul în
care canalul B precede canalul A, deplasarea se va realiza în sens trigonometric(invers acelor de
ceasornic). Monitorizarea atât a numărului de impulsuri cât și a fazei relative a canalelor A și B,va
permite determinarea poziției și direcției de mișcare a discului rotativ.

Figura 1.12 Determinarea sensului de rotație [12]

În plus, unele encodere incrementale, includ și un al treilea canal de ieșire numit canal de
referință sau “semnal de zero”. Acest canal de referință determină doar un singur impuls digital pe
rotație, și poate fi utilizat pentru determinarea precisă a unei poziții de referință.
Atunci când este necesară o rezoluție mai mare, se va implementa un numărător ce va contoriza
atât fronturile pozitive cât și cele negative ale trenului de impulsuri generat de un singur canal, ceea ce
va dubla numărul de impulsuri pe rotație (x2). Numărarea ambelor fronturi ale trenului de impulsuri,
ale ambelor canale va conduce la un număr de 4 ori mai mare de impulsuri (x4).

31
Figura 1.13 Determinarea numărului de impulsuri [12]

32
Capitol 2 Implementarea hardware a vehiculului
In ceea ce privește proiectul de fața țin sa menționez că multe din componentele utilizate nu sunt
foarte precise ceea ce a afectat rezultatul final al masuratorilor efectuate de către acesta. S-a incercat
compensarea pe cât posibilă a neajunsurilor hardware prin corecții software.
Urmează să oferim o descriere amănunțită a designului funcțional al vehicului. Pentru alimentarea
driver-ului de motoare este folosit un acumulator reîncărcabil de 2200mAh în tehnologia litiu-ion.
Tensiunea nominală oferită de acest acumulator este de 11.1 V volți fiind alcătuit din trei celule
înseriate cu o capacitate de 3.7 volți fiecare, și cu o rată de descarcare de 20C. Alimentarea SBC-ului se
realizează separat de la o baterie externă ce scoate 5V și 1.5A, fiind indeajuns pentru a alimenta
senzorul LIDAR , cele 2 encodere de pe roți și pentru semnalele de comandă către driver-ul de
motoare.
Din motive de siguranță s-a ales adăugarea unei baterii externe în implementare. Modulul utilizat ce
conține driver-ul L298 are o ieșire de 5V ce in teorie ar fi fost suficientă alimentarii Raspberry Pi-ului
insă am constatat că amperajul dat de regulatorul de tensiune al modulului nu era destul de mare pentru
a susţine intregul sistem. Dat fiind costul financiar ridicat al senzorului cu care lucrăm alimentarea
prin portul GPIO ar fi reprezentat un risc intrucât aceștia nu au nici o protectie la supracurent riscând
sa ard placa și senzorul o dată cu acesta.
Plăcuța folosită pentru controlul motoarelor are la bază un circuit integrat de tip punte H. Tensiunea
logică de control a circuitului integrat este furnizată de pinii 7,11,13 și 15 ai SBC-ului, iar tensiunea de
alimentare a motoarelor vine direct de la bateria litiu-ion. Rolul punții H este de a controla viteza și
direcția celor două motoare. S-a aplicat un control PWM software cu un factor de umplere mic de la
Raspberry Pi pentru a nu distruge motoarele din cauza supratensiunii.

Figura 2.1 Diagrama bloc a vehicului

33
Comunicația dintre robot și laptop a fost realizată folosind un modul BCM43438 WiFi. Acest
modul a fost folosit pentru partajarea resurselor SBC-ului cu calculatorul, cât și pentru programarea,
dezvoltarea și testarea acestuia. Acest lucru permite ca robotul să fie controlat cu orice dispozitiv
capabil să se conecteze la un punctul de acces al reţelei Wi-Fi al modulului menţionat anterior, insă
pentru a obţine datele legate de poziţia curentă a robotului în incapere vom avea nevoie de o masină
care să ruleze şi ea ROS. Adresele IP au fost atribuite static fiecărei maşini în parte. Pentru a
iniţializa procesele de achiziţie a distanţelor de pe LIDAR şi de control al motoarelor, respectiv
publicare a datelor odometrice se poate folosi o conexiune SSH.
2.1 Sistemul de control
Controlul este de tip supervizat (intermitent, sau semiautonom), robotul fiind comandat printr-
o telecomanda, dar adaptandu-și comportamentul și în funcție de datele provenite de la senzori. Un
astfel de control e analog cu intercaţiunea supervizorului cu echipa subordonată.
Principiu
 operatorul partajează o problema intr-o secvenţa de sub-taskuri
 robotul le execută independent (fără asistenta)

Figura 2.2 Diagrama control supervizat [13]


34
2.1.1 Percepția [13]
Percepţia low-level realizează
a) achiziţia datelor senzoriale
b) procesul de extragere trăsături specifice
 mediului (muchii, pereţi, uşi)
 obiectelor care îl populează – (forme geometrice)

Produce un percept utilizat


 de percepţia H-L
 in influenţarea acţiunilor robotului in mod direct (detectarea pereților şi a formelor din
mediu)

Percepţia high-level realizează


 interpretarea si modelarea mediului pe bază datelor furnizate de blocul anterior
 finalizează procesul de reprezentare internă

2.1.2 Cunoașterea [13]


Cogniţia preia doua categorii de informaţii:
a) informaţii transmise de operator
 precizarea scopurilor misiunilor (nivel strategic)
 modalitaţilor de realizare a acestora(nivel tactic).

b) Informaţii transmise de Percepţie H-L si Percepţie L-L referitoare la cele două nivele ale
interpretarii senzoriale. În cazul de față reglează vitezele celor 2 motoare şi le oprește dupa ce
robotul a parcurs distanța dorită.

2.1.3 Interfața operator


Servește utilizatorului un model asemănator unui joystick pentru deplasarea mobilului și
afișează datele de poziție şi cartografiere a mediului utilizatorului. Operatorul are control doar
asupra nivelului superior de cogniție și vede datele de la nivelul superior de percepție. Citirile
encoderelor sau ale laserului nu îi sunt accesibile utilizatorului de rând.

35
2.2 Şasiul robotului
Toate elementele funcţionale prezentate anterior în diagrama bloc din Figura 2.1 au fost
montate pe şasiul din Figura 2.3 .

Figura 2.3 Şasiul robotului

Singurele limitări impuse de aceasta platformă au fost pozitia motoarelor şi spaţiul redus
pentru dimensiunea componentelor utilizate. A fost adaugată încă o plaforma pentru montarea
SBC-ului şi a beteriei externe, iar în ceea ce priveşte laserul a fost proiectată şi construită cu
ajutorul unei imprimante 3D o platfromă. Amplasarea finală pe şasiul robotului se poate vedea in
anexa 1.
Poziţia laserului pe saşiu era importantă datorită ipotezelor odometrice ce s-au făcut în cod.
Pentru a presupune cu o eroare relativ mică că în cazul unei rotaţii a mobilului la stânga sau la
dreapta , acesta rămane in acelaşi loc in cameră şi doar orientarea lui se schimbă el trebuie sa fie
amplasat paralel cu cele 2 roţi ce asigură tracţiunea robotului, lucru ce interfera cu encoderele de pe
motoare.

Prevederi constructive:
 Masa totală: 735 g
 Lungime maximă:26 cm
 Lăţime maximă:18 cm
 Înaltime maximă:15 cm

2.3 Locomotia vehiculului


Un parametru important al algoritmului de SLAM îl reprezinta datele legate de odometria
robotului şi poziţia laserului. Astfel nu se poate face presupunerea că cele 2 motoare motoare se
miscă identic la aceeaşi tensiune. Viteza motoarelor poate fi variată din prin PWM, ceea ce ne
permite sa corectăm eventualele diferenţe intre vitezele de rotaţie ale motoarelor. Utilizând
encoderele de pe fiecare roată în parte se poate calcula o viteza de deplasare a fiecarei roţi si pe
36
baza diferenţei de viteză dintre acestea, să se regleze in mod individual PWM-ul pe fiecare roată în
parte pentru a se ajunge la un echilibru şi pentru ca traiectoria robotului să ramană liniară şi
uniformă.
În funcţie de suprafaţa pe care acesta se deplasează trebuiesc selectate pragurile minime şi
maxime ale vitezei roţilor robotului. Dacă viteza este prea mare mobilul poate să derapeze la
pornire sau să alunece la oprire iar dacă viteza e prea mică exista riscul ca acesta sa nu plece de pe
loc. Au fost alese viteze diferite pentru roţi atunci cand acesta trebuie să se deplaseze liniar în faţă
sau în spate, faţă de cazul în care robotul efectuează o miscare de rotaţie in jurul axei proprii. In
figura 3.3 sunt prezentate formele PWM de undă pentru mişcarea rectilinie, respectiv cea de rotaţie.

Figura 2.4 Formele PWM de undă pentru mişcarea rectilinie, respectiv cea de rotaţie

Pentru a echilibra șasiul, robotului i se mai adaugă in partea dorsală un punct de sprijin ce
poate fi, incă o roată care este prinsă cu ajutorul unui rulment pentru ai oferi un grad de libertate sau
o bilă cu mișcare liberă. S-au facut incercări atât cu un suport cu bilă , cât si cu o roata prinsă cu
rulment.

Figura 2.5 Ball caster vs Wheel caster

Wheel caster-ul asigură o miscare fluidă a mobilului și nu a ingreunat miscarea mobilului pe


nici una din suprafețele pe care a fost testat. Puterea consumată de motoare este mai mică în cazul
wheel caster-ului și nu au existat cazuri în care acesta să ramană ințepenit pe suprafețe ușor
denivelate cum ar fi intre flisele de gresie, lucru care se intamplă cu ball casterul ce are dimensiuni
mai reduse. Sistemul de prindere cu 4 șuruburi asigură o rigiditate mai buna decât cea a bilei cu
37
miscare liberă. Pentru aplicația noastră insă, wheel caster-ul introduce erori pe care nu le putem
anticipa sau corecta din soft. Dacă utilizatorul decide să miște mobilul dintr-un sens in altul, adică
din față in spate sau viceversa, sistemul de prindere cu rulment va roti roata conform tracțiunii
aplicate. In acest moment parametrii odometriei se schimbă fiind deviat ușor de la traiectoria pe
care noi in software presupunem ca o are. Nu se poate anticipa sensul în care sistemul de prindere
se va roti, astfel deși mişcarea va fi in sensul opus direcția se va modifica ușor spre stânga sau spre
dreapta. O rezolvare ar fi să îi permitem robotului sa se miște doar intr-un singur sens si pentru a-și
schimba sensul să efectueze o miscare de rotație la 180 de grade.

38
Capitol 3 Localizare şi mapare simultană
Modelarea mediilor în care operează un robot mobil presupune determinarea formelor,
poziţiilor şi dimensiunilor obiectelor şi obstacolelor precum: pereţi, stalpi, obiecte de mobilier etc.
Utilizarea distanţelor rezultate dintr-o înregistrare laser stau la baza elaborării unei hărţi necesare
pentru planificarea traseelor de navigare. Problema navigării roboţilor mobili, inclusiv a celor
industriali, în mediile care operează, presupune parcurgerea următoarelor etape: localizare (absolută
sau relativă) bazată pe senzori (percepţie), generare hartă locală (mapare), planificarea traseului
(căii) şi urmărirea acestuia. În practica modelării mediilor de operare primele două etape sunt strans
legate. Pentru a realiza localizarea mobilului avem nevoie de o hartă a mediului şi pentru a
determina o hartă este necesar sa ştim unde ne situăm relativ cu mediul, o problemă de tipul ou sau
găina.
SLAM este alcatuit din mai multe părți. Extracția punctului de referință, asocierea datelor,
estimarea stării actuale a mobilului, actualizarea stării și actualizarea punctului de reper. Există
multe modalități de a rezolva fiecare parte. Asta înseamnă ca şi aceste parţi ale algorimului pot fi
înlocuite la răndul lor de un nou mod de a obţine rezultatele necesare cartografierii. In acest proiect
am decis să ne concentrăm asupra unui robot mobil într-un mediu interior. SLAM este aplicabil atât
pentru mișcarea 2D cât și 3D. Vom analiza numai 2D mişcare. [14]
3.1 Odometrie
Cuvântul "odometrie" este alcătuit din cuvântul grecesc odos ,adică "traseu", și metron ,adică
"măsură". Odometria este utilizarea datelor de la senzorii de mișcare pentru a estima schimbarea
poziției în timp. Este folosit în robotică de către niște roboți cu picioare sau roți pentru a-și estima
poziția față de o locație de plecare. Această metodă este sensibilă la erori datorită integrării
măsurătorilor de viteză în timp pentru a da estimări ale poziției. Colectarea rapidă și precisă a
datelor, calibrarea instrumentului și prelucrarea sunt necesare în majoritatea cazurilor pentru
utilizarea eficientă a odometriei. [15]
În navigație, odometria reprezinta utilizarea datelor de la actuatorii de mişcare pentru a estima
schimbarea poziției în timp prin dispozitive precum encodere rotative pentru măsurarea rotației
roților. Aceasta metodă este utilă pentru majoritatea vehiculelor pe roți sau pe șenile insă tehnicile
tradiționale de odometrie nu pot fi aplicate roboților mobili cu metode de locomoție nestandard,
cum ar fi roboții cu picioare. În plus, odometria suferă în mod universal de probleme de precizie,
deoarece roțile tind să derapeze și să alunece pe podea, creând o distanță neuniformă parcursă în
comparație cu rotația roților. Eroarea se complică atunci când vehiculul funcționează pe suprafețe
văluroase,accidentate. Măsurătorile odometrice devin din ce în ce mai nesigure, aceste erori
acumulânduse în timp.
Odomometria vizuală este procesul de determinare a informațiilor echivalente de odometrie
folosind imagini secvențiale ale camerei pentru a estima distanța parcursă. Odomometria vizuală
permite o precizie sporită de navigație în roboți sau vehicule care utilizează orice tip de locomoție
pe orice suprafață. [15]

3.2 Puncte de reper (Landmarks)


Reperele sunt caracteristici care pot fi ușor observate și diferenţate cu ușurință de mediu
inconjurator. Acestea sunt folosite de robot pentru a afla unde este (pentru a se localiza). Exact ca în
cazul unui om legat la ochi care pentru a nu se pierde intr-un mediu foloseşte simţul tactil pentru a
39
işi face o ideea de locul în care se află, robotul foloseşte aceste repere pentru a se ghida. Lucruri
caracteristice, cum ar fi cele simțite prin atingerea unei uşi va pot ajuta în stabilirea unei estimări a
locului în care vă aflați. Sonarele și scanerele cu laser sunt simţurile tactile ale roboţilor
Punctele de reper trebuie re-observate, permițându-le, de exemplu, să fie vizualizate
(detectate) din poziții unghiuri diferite. Reperele trebuie să fie distincte, astfel încât să poată fi ușor
identificate de la unul faţă de altul, fără a le amesteca. Cu alte cuvinte, dacă re-observi două repere,
într-un moment ulterior, ar trebui să fie ușor de determinat care dintre ele reprezintă un punct de
reper nou si care dintre ele a fost observat anterior. Dacă sunt două repere foarte aproape unul de
celălalt poate ingreuna identificarea. [15]
Dacă numarul de repere nu este destul de mare în mediul pe care robotul îl are de explorat,
acesta riscă să se piardă. Principala carecteristică a unui reper este ca acesta să fie staționar.
Utilizarea unei persoane ca punct de reper este ca o idee rea. Motivul pentru acest criteriu este că
dacă omul işi schimbă poziţia robotul nu va putea să asocieze reperul cu spaţiul in care se află.
3.3 Cartografiere
Ințelegem prin cartografiere un robot care se deplasează prin mediu și crează un model pentru
utilizator. Ne propunem obținerea harții mediului și a poziției mobilului pe baza poziției sale și a
observațiilor venite de la laser. Vom incerca sa facem o descriere succintă a modului in care un
filtru de particule imbină datele pentru a obţine o hartă actualizata in timp real.
Având date urmatoarele date:
Comenzile asupra robotului

u1:T={u1,u2,u3…..,uT}
Observaţiile laser-ului

z1:T={z1,z2,z3…..,zT}
Dorim sa obţinem:
Harta mediului

m
Drumul robotului

x0:T={x0,x1,z2…..,xT}
Ultimele 2 marimi conţin erori mai ales pe perioadă indelungată de utilizare şi care în timp
se vor acumula şi vor rezulta intr-o percepţie eronată a realitaţii pentru mobilul nostru. Aşa cum s-a
menţionat anterior în acest capitol, erorile pot fi datorate mecanismului de locomoţie şi a
instrumentului de determinare a distanţelor. Folosirea unei motode probabilistice pentru a ne
apropia de adevarata hartă a mediului a fost necesară în acest caz.
Utilizarea metodei probabilistice modifică asumţia “Robotul este exact aici” în “Robotul
este undeva aici”. Utilizand o distribuţie Gaussiana putem privi poziţia robotului ca pe o
probabilitate şi nu ca pe o certitudine lucru ce ne va ajuta să remediem eventualele erori ale
întregului mecanism mecanic. [16]

40
Figura 3.1 Pozitia in spaţiu a mobilului înainte si după metoda probabilistică [16]

Asadar rezultatul SLAM-ului este o estimare a drumului pe care îl parcurge robotul şi a


harţii asa cum o percepe.

Figura 3.2 Estimarea poziţiei si a harţii [16]

Figura 3.3 Model grafic al procesului de localizare şi mapare simulatană [16]

Pentru fiecare actualizare a harţii p, sau particula, codifică ipoteza ponderată a poziţiei
robotului şi modelul harţii.

41
3.4 Filtrul de particule Rao-Blackwellized
Pachetul Gmapping utilizat in aplicația noastră folosește pentru obținerea harții un filtru de
particule Rao-Blackwellized care spre deosebire de algoritmul prezentat la punctul anterior are
câteva particularitați.

În Rao-Blackwellized fiecare particulă reprezintă o posibilă traiectoria robotului, care menține


propia ei hartă și care este actualizată cu fiecare nouă poziție cunoscută. Practic se obțin mai multe
harți separate de fiecare dată cand robotul va ajunge din nou intr-o poziție anterioară. Are ca scop să
mai elimine din erorile de poziție ale robotului reușindu-se astfel să se obțină o hartă mai apropiată
de modelul real al mediului. Argmax calculează argumentul pentru care funcţia ia valoarea maxima,
adica cordonata x corespunzătoare varfului Gaussienei

Figura 3.4 Estimarea poziției in cazul algorimului Rao-Blackwellized

Algorimul este capabil să facă corespondența intre scanarile făcute din aceeși poziție la
momente diferite de timp pentru a corecta scurte secvențe odometrice. Acest lucru devine util mai
ales când spațiul explorat are o structură circulară si mobilul poate realiza mai multe ture în mediu,
calitatea informației crescând la fiecare tură.

Figura 3.5 Aplicație a algorimului [17]


42
Capitol 4 Implementarea software a vehicului

Aplicația este compusă din mai multe soft-uri ce vor rula separat și care pot rula independent
unele faţă de celelalte. O parte din acestea se regasesc în pachetele ROS, fiind open-source, și au
fost instalate pe distribuția noastră. Parțile de cod care se vor descrie in detaliu sunt cele pe care le-
am conceput pentru a putea naviga mobilul de la distanță și pentru a obține informații legate de
poziția sa.
4.1 Sistemul de operare al robotului
Prezentul capitol are ca scop să ofere o descriere a instrumentului care a stat la baza întregii
functioanlitaţi a robotului. ROS sau sistemul de operare pentru roboți este o extensie a sistemului de
operare deja prezent pe o mașină, în cazul acesta este vorba de Raspian, ce oferă servicii pentru
aplicații software peste cele deja disponibile pe distribuția nativă a Raspberry Pi-ului.
Deși puterea de calcul a unui Raspberry Pi este superioară față de cea unui microcontroler
obișnuit, pentru realizarea aplicaţiei a fost necesară partajarea resurselor unui calulator cu cele ale
SBC-ului. Astfel s-a ajuns ca robotul să realizeze funcțiile de bază precum comandarea driverului
de motoare, citirea și prelucrarea datelor de pe senzorii atașați, iar calculatorului îi revin cele mai
costisitoare sarcini precum calcularea hârţii și vizualizarea ei pe baza datelor primite de la robot.
Deși ROS nu este un sistem de operare în adevaratul sens al cuvantului, precum Linux sau
Windows, acesta oferă servicii concepute pentru clusterul heterogen al calculatorului, cum ar fi
abstractizarea hardware-ului, controlul dispozitivului la un nivel scăzut, asigurarea comunicarii intre
diferite procese ,indiferent dacă acestea rulează pe maşini diferite și gestionarea pachetelor de date
transmise intre acestea. Procesele sunt numite în arhitectura ROS noduri, iar acestea sunt capabile
de a receptiona,posta şi multiplexa date legate de senzori, control, stare, planificare, actuatori sau
alte informaţii. Astfel se poate crea o rețea in care toate procesele sunt conectate intre ele. Orice nod
poate accesa rețeaua, interacționa cu celelalte noduri, utiliza informația pe care acestea o postează și
transmite propiile date in rețea.
Pentru a putea vedea harta actualizată în timp real am utilizat Rviz, un instrument din suita
ROS ce transpune datele numerice returnate de pachetul Gmapping intr-un format vizual uşor de
inteles pentru orice utilizator. Alături de Gmapping, Rviz este un pachet pe care îl putem instala
prin intermediul ROS.

4.1.1 Pachetele
Software-ul în ROS este organizat în pachete. Un pachet poate conține noduri ROS, biblioteci
independente de ROS, un set de date, fișiere de configurare, o bucată de software terță parte sau
orice altceva care constituie în mod logic un modul util. Scopul acestor pachete este să furnizeze
această funcționalitate utilă într-o manieră ușor de consumat, astfel încât software-ul să poată fi
reutilizat cu ușurință. În general, pachetele ROS respectă un principiu "Goldilocks": suficientă
funcționalitate pentru a fi utilă, dar nu prea mult ca pachetul să fie greu și dificil de folosit de alte
programe.

Pachetele sunt ușor de creat manual sau cu unelte cum ar fi catkin_create_pkg. Un pachet ROS
este pur și simplu un director derivat din ROS_PACKAGE_PATH care are un fișier package.xml în
el. Pachetele sunt cea mai atomică unitate de construcție și unitatea de eliberare. Acest lucru

43
înseamnă că un pachet este cel mai mic lucru individual pe care îl puteți construi în ROS și este
modul în care software-ul este asociat pentru instalare/downloadare exact cum ați instala un soft din
linia de comandă.
In ROS pachetele tind să urmeze o structură comună. Vom mentiona cele mai importante
directoare și fișiere prezente intr-un pachet.
 include / nume_pachet: fisiere C++ de tip header
 msg : Folder care conține mesaje de obicei definite de utilizator și structura acestora.
 src/package_name : Fișierele sursă Python sau C++ care sunt exportate în alte pachete.
 srv: Folder care conține tipuri de servicii.
 scripturi: script-uri executabile scrise in Python.
 CMakeLists.txt: Fișierul CMake build pentru construirea de pachete software.
 package.xml: definește proprietățile pachetului, cum ar fi numele pachetului, numerele
de versiune, autori, întreținere și dependențe de alte pachete

4.1.2 Arhitectura ROS


În figura urmatoare este ilustrată schema bloc generală a nivelului de procesare si se vor
prezenta sumar blocurile funcţionale utilizate :

Figura 4.1 Schema graf a nivelului de procesare [18]

Nodurile
Nodurile sunt procesele unde calculele sunt efectuate. Dacă dorim ca procesul nostru să
comunice cu alte noduri, suntem nevoiți sa cream un nod cu acest proces cu care să ne conectam
la rețeaua ROS. In mod uzual este bine sa avem cat mai multe noduri care să efectueze sarcini
simple pentru a asigura modularitatea si robustețea sistemului. O dată creat nodul el este
indepent din punct de vedere al funcționalitații fața de restul proiectului, el nefolosind metode
sau funcții incluse în alte fișiere,lucru ce permite reutilizarea lui în alte proiecte. ROS oferă
suport pentru limbajele de programare Python și C++. Nodurile sunt scrise cu librarii propietare
ROS cum ar fi roscpp și rospy. [18]

44
Master-ul
Acesta pune la dispoziție intregii arhitecturi numele și serviciul de cautare pentru restul
nodurilor. De asemenea stabilește conexiunile între noduri. Daca acesta nu este în sistem
comunicația cu nodurile, servicile si mesajele nu va putea fi posibila. Pentru a inițializa master-
ul se scrie comanda “roscore” într-un shell de comandă linux. Dacă sistemul este alcatuit din
mai multe computere aflate intr-o retea WLAN sau LAN vom avea Master-ul doar pe un singur
calculator. [18]
Serverul pentru parametri
Serverul pentru parametri ne oferă posibilitatea de a utiliza chei pentru a stoca date într-o
locaţie centrală. Cu aceste date stocate, avem posibilitatea de a configura comportamentul
nodurilor în timp ce se execută sau pentru a schimba parametrii de lucru a unui nod. [18]
Mesajele
Nodurile comunică intre ele cu mesaje. Mesajele reprezinta datele care sunt oferite altor
noduri din reţea. Un mesaj poate fi o structură de date simplă precum: Integer, Float, Byte,
Boolean, String sau poate avea o structură de date compusă din cele primitive. ROS pune la
dispoziție multe tipuri de mesaje, insă ele pot fi de asemenea dezvoltate de utilizator in funcție
de necesitațile proiectului. [18]
Topice
Fiecare mesaj trebuie să poarte un nume ca el sa poată fi direcționat de către rețea. Cănd un
nod trimite date in rețea se numește ca publică pe un topic. Cănd un nod citește date de pe o
rețea acest lucru se numește că subscrie la un topic. Un nod poate subscrie la un topic chiar dacă
nimeni nu publică date pe acel topic. Este important ca numele topicului sa fie unic pentru a nu
apărea confuzii intre mesajele de pe rețea. [18]
Servicii
Serviciile au apărut ca necesitate de a cere informații de la un nod. Deși topicele pot trimite
datele în multe moduri, un nod subscris la un topic nu poate sa ceară date. La fel ca topicele,
serviciile trebuie sa aibă un nume unic. Orice nod din rețea poate cere informații de la un nod ce
administreaza un serviciu lucru care asigură interacțiunea intre noduri. [18]

4.1.3 Fişierele de tip “Launch”


In cadrul proiectului au fost folosite mai multe noduri pentru a se citi datele de pe senzori,
pentru a se asigura funcția de navigare a robotului, pentru funcția de comandă a motoarelor și
pentru algoritmul de construire al harții. Fiecare nod trebuie să ruleze în propiul lor shell iar testarea
unui întreg ansamblu se poate dovedi extrem de dificilă. Fișierele cu extensia .launch ușurează
munca dezvoltatorului facilitănd lansarea mai multor noduri cu un singur script.
Structura unui fișier de tip .launch este tip .xml. În momemntul în care pornim o aplicație cu
comanda „roslaunch” dintr-un shell de comandă nu mai este necesar sa inițializam master-ul, el
inițializandu-se de pe prima masina care a rulat un fișier de tip .launch.

45
Exemplu de fisier tip .launch: [18]
<?xml version="1.0"?>
<launch>
<node name ="example1_a" pkg="chapter2_tutorials" type="example1_a"/>
<node name ="example1_b" pkg="chapter2_tutorials" type="example1_b"/>
</launch>

Pentru a se identifica nodurile pe care dorim să le lansăm în interiorul unui fișier de acest tip
este necesar să mentionam numele nodului, adică numele fișierului în care se află codul, pachetul în
care vom gasi nodul menționat anterior și numele nodului plus extensia fisierului .cpp sau .py

4.1.4 ROS pe mașini multiple


Una din marile probleme ale acestui proiect a reprezentat nevoia unei puteri de procesare
mai mare decăt ceea ce putea oferi Raspberry Pi. Acest lucru a determinat utilizarea unui sistem de
tip ROS pentru partajarea resurselor unui calculator cu cele ale SBC-ului.
Am menționat anterior ca intr-un sistem, chiar dacă acesta este distribuit pe mai multe
mașini, trebuie să ruleze la un moment doar o singură instanța a Master-ului. Așa ca scopul a fost să
efectuam cele mai costisitoare procese pe un calculator. Am transformat asadar Raspberry Pi într-un
punct de acces al unei rețele WLAN pentru a ne putea conecta la acesta de la distantă şi comunica
cu el. Calculatorului i-a fost setata o adresa IP statică pe baza MAC-ului pentru ca ambele parți să
fie uşor de identificat in rețea .
Pasul următor a fost sa modificăm in fişierul /.bashrc de pe distribuţia SBC-ului adresa IP
a master-ului. În momentul instalarii ROS iși va configura adresa sub formă de localhost. Comanda
utilizată pentru a efectua acest lucru este:
export ROS_MASTER_URI=http://10.42.0.54:11311
4.2 Mediul de dezvoltare
Modulele de navigație și determinare a pozitției sunt scrise în python. Atat laptopul cât şi
Raspberry Pi rulează distribuții de linux pe care au fost instalate Python 3.0. Codul a fost mai întai
scris pe laptop și apoi a fost transferat via GitHub pe SBC unde a fost testat și modificat.
Sublime Text este un editor de cod sursă cross-platform, cu o interfață de programare a
aplicațiilor Python (API). Aceasta sprijină nativ multe limbaje de programare și limbaje de marcare,
iar funcțiile pot fi adăugate de utilizatori cu plugin-uri, construite în mod obișnuit în comunitate și
întreținute prin licențe software gratuite. Cele mai notabile caracteristici ale acestui editor de cod
sunt:
 "Goto Anything", navigare rapidă către fișiere, simboluri sau linii
 Editare simultană: efectuarea simultană a aceleași modificări interactive în mai multe
locuri selectate
 Python-based API plugin
 Preferințe specifice fiecărui proiect, posibilitatea de auto indentare a fișierelor de cod in
funcție de limbajul ales;
 Cross-platform (Windows, MacOS și Linux) și Plugin-uri pentru a susține cross-
platform.
46
 Completarea automată : oferă completarea numelor funcțiilor în timp ce acestea sunt
scrise de utilizator și în funcție de limbajul utilizat. Completează în interiorul codului
variabilele create de utilizator

Orice modificari ulterioare asupra codului, o dată incărcat pe SBC, se făceau tot prin
intermediul laptopului insă printr-o conexiune SSH utilizând editorul de text VIM. VIM este un
editor de text extrem de configurabil construit pentru a permite editarea eficientă a textului. Este o
versiune îmbunătățită a editorului vi distribuit cu majoritatea sistemelor UNIX. Acesta este
proiectat pentru utilizare atât de la o interfață de linie de comandă, cât și ca aplicație independentă
într-o interfață grafică de utilizator, insă pentru proiectul de fata, editarea in linie de comanda s-a
dovedit extrem de utilă scutind necesitatea unor periferice suplimentare pentru Raspberry Pi.

Figura 4.2 Sublime Text si VIM

4.3 Arhitectura aplicației


Aplicația este alcatuită din şase software-uri, patru din acestea sunt prezente în Figura 4.3.
Din cele şase, două vor rula pe Raspberry Pi şi patru pe calculatorul utilizatorului una din acestea
fiind Master-ul. Aplicația nu poate rula dacă utilizatorul nu folosește o distribuție Linux care să aibe
instalată ROS, și pachetele utilizate în aplicație. De asemenea este important ca SBC-ul să
recunoasca adresa MAC a calculatorului pentru ai permite accesul la rețea. Cea din urmă a fost
implementată ca masură de securitate.

47
In diagrama următoare sunt prezentate in dreptunghi-uri topicele active și în ovale nodurile.

Figura 4.3 Arhitectura aplicației

Vom incepe cu nodurile care rulează pe Raspberry Pi sub_motors și urg_node ce corespund


nivelurilor de cogniție si percepție conform figurii 28. Ele gestionează datele provenite de la senzori
și asigură funcția de deplasare a mobilului. Pentru a fi pornite in acelaşi timp s-a utilizat un script de
tip .launch prezent în anexa 4.

4.3.1 Driver-ul Hokuyo URG-04lx


Fasciculul laser al senzorului se rotește în sens trigonometric, similar cu lumina unui far,
returnând 1024 de măsuratori ale distanței. Astfel se obține o masuratoare de distanța o data la 0.36
de grade. Insă din cele 1024 masuratori doar 768 sunt relevante, reprezentând deschiderea de 240 de
grade a laserului.
Urg_node este un pachet oferit de ROS ce oferă un driver ușor de folosit pentru aplicații de
scanare a mediului. Fiecarei rotații a laserului îi este atribuită o secvență în care se regasesc:
 Header : timpul la care a avut loc prima achiziție
 angle_min : unghiul de la care a început prima achiziţie
 angle_max: unghiul la care s-a oprit scanarea
 angle_increment: distanța unghiulara intre măsurători
 time_increment: timpul intre masurători
 scan_time: timpul între scanări
 range_min: distanța minimă masurată
 range_max: distanța maximă masurată
 [] ranges: un vector cu toate distanțele măsurate pe 240 de grade

48
Figura 4.4 Scan topic

4.3.2 Navigația și determinarea distanței parcurse de vehicul

Cele 2 funcții au fost implementate în cadrul aceluiași nod. Contrar ideologiei menționate
anterior de a ține nodurile cât mai simple cu putința și dedicate unei singure funcții, acest lucru nu a
fost posibil in situația de fața intrucât ambele funcții se folosesc de portul GPIO al Raspberry Pi-
ului iar acesta putea fi inițializat o singură dată. Ambele funcții utilizeaza metodele de citire a
encoderelor pentru a-și îndeplini sarcina și ambele sunt dependente de parametrul “directive” al
clasei Motor. Acest nod este subscris topicului direction pe care sunt publicate mesaje precum
“W,A,S,D” ce modifică directiva actuală nodului. Aceste mesaje reprezintă comenzile date de
utilizator pentru deplasare față, spate, rotorie stânga și rotire dreapta. Nodul a fost conceput ca o
clasă in care sunt ințializați mai mulți parametri ce țin de inițializarea pinilor, controlul în PWM al
motoarelor, calibrarea motoarelor și poziția inițiala a mașinii. Dupa ce a fost creat un obiect din
aceasta clasă cu o frecvența bine stabilită sunt apelate funcții ale obiectului.

4.3.2.1 Navigația
Funcțiile dedicate navigației preiau datele provenite de pe nodul de comandă ce rulează pe
laptop și efectuază deplasările. Deplasările se efectuează pe distanța fixă, aceasta fiind masurată cu
ajutorul encoderelor optice de pe motoare. De asemenea aceasta se asigură că cele 2 motoare se
rotesc cu aceeași viteză indiferent de directiva primită.
Pentru a ne asigura că roțile se deplasează cu aceeași viteză am utilizat o metodă de
controlul derivat proporțional. Folosim un motor ca motor “Master", la care se aplică o putere
constantă și un motor "slave" caruia iniţial i se va da aceeaşi putere,dar pe care o vom putea varia
ulterior a ne asigura că merge cu aceeași viteză ca primul motor.
Diferența dintre viteza master-ului și viteza slave-ului se numește "eroare". Dacă se întâmplă
exact același ritm, valoarea erorii va fi zero. Dacă slave-ul este prea lent, eroarea este pozitivă. Dacă
slave-ul merge prea repede, eroarea este negativă. Eroarea este definită ca:
Eroare = Viteza master - Viteza slave.
Se înmulțeste eroarea cu o valoare kp. Dacă kp subunitară pentru a nu supra compensa
viteza slave-ului și pentru a tinde către o diferență de viteză nula intr-un numar redus de calibrări.

49
Eroarea gasita în momentul de timp anterior se v-a inmulți cu un coeficient kd iar produsul obținut
reprezintă componenta derivativă. Viteza slave-ului va fi astfel incrementată cu cele 2 componente,
iar diferența dintre cele 2 motoare va tinde conform graficului de mai jos.

Figura 4.5 Viteza slave [2]

Folosind asumția ca motoarele se deplasează cu aceeași viteză s-a determinat experimental


numărul de citiri pe encodăre pentru o rotație de 45 de grade oferind utilizatorului suficiente grade
de libertate pentru a efectua manevre în mediu. Imediat dupa rotație robotul se va deplasa in fața 12
cm pentru a aduce wheel-caster-ul în poziția in care se găsea inainte de a incepe rotația. S-a
constatat că lasand robotul să efectueze mișcari de rotație repetate neștiind poziția roții dorsale
determina erori ce nu pot fi corectate. Codul sursă pentru controlul motoarelor se poate găsi în
anexa 3.

4.3.2.2 Determinarea distanței parcurse de vehicul


Se va folosi ca punct e referință punctul din care a fost facută prima scanare de către laser,
adică punctul în care robotul a fost plasat inițial. Datele de poziție sunt actualizate o dată la 0.1
secunde. Poziția robotului în timp este exprimată cu ajutorul unui tuplu de coordonate de viteză
liniară (x,y,z)(pentru a exprima translația acestuia in spațiu) și viteză unghiură (pentru a exprima
orientarea acestuia). Deoarece harta este realizată în 2D, iar mobilul are 2 grade e libertate ne
interesează doar x,y liniar şi z unghiular.
S-a determinat prin experimente apriori și s-a calculat numarul de citiri de la fiecare encoder
pentru a realiza deplasări pe distanța fixă la primirea unei comenzi. Astfel că dupa fiecare comandă
coordonatele de poziție sunt incrementate cu o valoare fixă. Pentru determinarea coordonatelor
globale au fost utilizate formulele:
𝑋𝑙𝑖𝑛𝑒𝑎𝑟 = 𝑋𝑙𝑖𝑛𝑒𝑎𝑟 + 𝑣𝑋 ∗ cos(𝑍𝑢𝑛𝑔ℎ𝑖𝑢𝑙𝑎𝑟)
𝑌𝑙𝑖𝑛𝑒𝑎𝑟 = 𝑌𝑙𝑖𝑛𝑒𝑎𝑟 + 𝑣𝑋 ∗ sin(𝑍𝑢𝑛𝑔ℎ𝑖𝑢𝑙𝑎𝑟)

50
𝑍𝑢𝑛𝑔ℎ𝑖𝑢𝑙𝑎𝑟 = 𝑍𝑢𝑛𝑔ℎ𝑖𝑢𝑙𝑎𝑟 + 𝑣𝑍𝑡ℎ
unde vX si vZth sunt valorile fixe menționate anterior. Z liniar ,x unghiular si y unghiular vor
ramane 0. Pe langă acestea pe topicul tf se mai postează si date ce ţin de momentul achiziției acestor
date.

Figura 4.6 Datele odometrice

4.3.3 Controlul de la distanța


Controlul de la distanța este realizat de nodul Motor_Publisher. In cadrul unui Shell sunt
preluate caractere de la tastatură și se verifică dacă acestea corespund cu directivele soft-ului de
navigare. Se verifică daca caracterul introdus este unul din caracterele “W,A,S,D,Q” și se postează
mesajul pe topicul “/direction”. In caz contrar un mesaj de avertizare se va afișa utilizatorului.
Softul permite introducerea unui caracter o dată la 2 secunde, pentru a oferi timp suficient robotului
să efectueze directiva anterioară. În cazul în care mobilul primește directiva “Q” softurile ce rulează
pe mobil se vor închide. Pentru a reporni din nou aplicația este necesar să ne conectam din nou la
mobil via SSH și să reinițializăm procesele, însă mobilul nu va mai ține cont de harta si datele
odometrice obținute anterior. Anexa 1 conţine intregul cod aferent controlului la distanţă.

4.3.4 Softul pentru localizare şi mapare simultană


Pachetul gmapping pune la dispoziție filtrul de particule Rao-Blackwellized pentru invațarea
harților pe baza datelor odometrice și a scanărilor obținute de la nodurile ce rulează pe mobil.
Această abordare utilizează un filtru de particule în care fiecare particulă poartă o hartă individuală
a mediului. Această versiune este optimizată pentru scanere laser cu rază lungă de acțiune, cum ar fi
scanerul SICK LMS sau PLS. Laserele cu rază scurtă de timp, cum ar fi scanerul Hokuyo, nu vor
funcționa atât de bine cu setările standard ale parametrilor. Așa că pentru a lansa nodul am utilizat
un fișier tip .launch pentru a adapta algorimul la specificațiile LIDAR-ului nostru.
51
Experimental s-au variat pe rând parametrii ce țin de eroarea odometriei:
 srr: eroarea translației funcție de translație (vX/vX)
 srt: eroarea translației funcție de rotație (vX/vZth)
 str: eroarea rotației funcție de translație (vZth/vX)
 stt: eroarea rotației funcție de rotație (vZth/vZth)

S-a ales numarul de particule din filtru și de asemenea s-au setat parametrii ce țin de distanța
maxima la care laserul poate să bată. Fiecare particulă reprezintă un eşantion ce conţine poziţii ale
robotului corelate cu scanări din acea instanţă oferind astfel un istoric. Codul din fişierul tip .launch
utilizat pentru a lansa nodul gmapping se poate găsi în anexa 5.

4.3.5 Vizualizarea rezultatelor


Pentru a vizualiza în timp real matricea ce reprezintă harta mediului construită de filtrul nostru
s-a utilizat pachetul rviz. Acest pachet este un vizualizator 3D pentru afișarea datelor senzorilor și a
informațiilor de stare oferit de ROS. Acesta este capabil s-ă interpreteze topicul map și sa transpună
datele intr-un format ușor inteligibil.

52
Capitol 5 Testarea vehicului
Pentru verificarea funcționalității implementării hardware și software a fost necesară utilizarea
mobilului în diferite scenarii pentru a compara raspunsul robotului cu modelul real al mediul.
Fiecare din mediile alese pentru testare prezintă particularitați ce testează pe rănd sau simultan
anumite aspecte ale navigaţiei și determinării poziției. Se menționeaza ca datorită suprafețelor
diferite pe care robotul s-a deplasat anumite modificări în parametrii ce țin de controlul motoarelor
au fost efectuate pentru a-l adapta. Suportul mecanic este imprevizibil în ceea ce privește aderența
asa că pentru a obține o deplasare cât mai exactă viteza trebuie adaptată la mediu. Numarul de citiri
de pe encoder pentru 45 de grade a fost și el adjustat de la un caz la altul.
Vom realiza o legendă bazată pe culori a modelelor obținute de robot
 Negru: Liniile negre reprezintă suprafețele de pe care fasciculul laser s-a reflectat înapoi la
sursa. Cu negru vom găsi conturate toate suprafețele obiectelor întalnite de mobil.
 Alb: Culoarea indică faptul că spațiul a fost explorat și este liber, nici un obiect solid nu se
alfă in acea zonă
 Cenușiu: Reprezintă spațiul neexplorat de către robot. Este posibil să întalnim mici pete
cenușii pe zonele albe. Acestea artefacte sunt datorate nepotrivirilor la un moment de timp T
dintre mesajele de scanare și cele de odometrie.

5.1 Scenariul 1: Balconul


Particularitatea acestui scenariu o reprezintă dimensiunea redusa a spațiului explorat. În teorie
spațiul ar putea fi mapat complet printr-o rotație la 180 de grade. Urmărim așadar sa testăm precizia
cu care robotul nostru poate efectua rotații și fidelitatea datelor odometrice ce țin de viteza de
rotație. Pentru a obține harta de mai jos s-a afectuat un drum dus-întors pe lungimea balconului.

Figura 5.1 Scenariu 1: Model real

53
Figura 5.2 Scenariu 1: Model obținut

5.2 Scenariul 2: Holul


Scenariul urmărește abilitatea mobilului de a se mișca in linie dreaptă pe distanțe mari. Mediul
este reprezentat de etajul unei cladiri unde găsim 2 holuri de circa 30 de metri fiecare conectate
intre ele printr-o incăpere de circa 5 metri pătrați în care se află două deschizături pentru
ascensoare.

Figura 5.3 Scenariu 2: Model real


54
Figura 5.4 Scenariu 2: Model obținut

Se observa că deși robotul a reusit sa mențina o traiectorie dreaptă pe parcursul primului


culoar, în momentul in care acesta a ajuns în încaperea de legatură a fost nevoie de o coamandă de
recentrare pentru cel de al doilea culoar lucru ce a determinat ca al doilea culoar să nu mai fie
paralel cu primul în modelul obținut.
5.3 Scenariu 3: Camera
Ultimul scenariu testează toate funcționalitațile robotului care a trebuit să funcționeze intr-un
mediu ce nu are o geometrie aparte ca cele explorate explorate anterior. Pentru obținerea modelului
robotul a trebuit să efectueze mișcari cât mai precise de rotație și translație intrucăt s-a urmărit
plecarea dintr-un punct al camerei și intoarcerea in același punct. Dacă scanările s-ar fi efectuat din
același punct fizic în mediu, dar datele odometrice ar indica locații diferite, scanările ar fi fost
suprapuse iar harta noastră ar fi fost afectată de zgomot.

Figura 5.5 Scenariu 3: Model real

55
Figura 5.6 Scenariu 3: Model obținut

Datorită suportului mecanic, se poate observa ca în cea de a 2-a masurătoare facută la


momentul intoarcerii mobilului în punctul de plecare, orientarea s-a era decalată cu aproximativ 45
de grade. Această eroare este determinată atât de mișcarile de rotație care nu se pot face mereu cu
exact 45 de grade, cât și de cele de translație care nu sunt mereu rectilinii.

56
Concluzii

Această lucrare prezintă dezvoltarea unui vehicul capabil să ofere infomaţii utilizatorului
despre poziţia şi structura mediului în care îl folosim. Au fost accentuate diversele probleme tehnice
apărute pe tot parcursul implementării și prezentate soluțiile de rezolvare găsite. Imagini ale
dezvoltării practice le puteți găsi in Anexa 1.
Testarea și calibrarea vehicului a fost realizată urmărind mai multe direcții de dezvoltare și
utilizare. Rezultatele testelor realizate sunt satisfăcătoare și în concordanță cu obiectivele propuse la
începutul proiectului. Conform acestora, vehiculul poate fi utilizat ca robot de recunoaștere in
timpul operațiunilor de salvare și transmiterea de informații către o bază de control aflată la
distanță.
Proiectarea și implementarea vehicului s-a axat pe obţinerea unor rezultate cat mai precise cu
putinţă utilizând componente cu un cost redus şi cu performanţe mediocre. S-au testat pe rănd mai
multe soluţii atât hardware cât şi software şi s-au ales din acestea cele care per total au avut cele mai
bune rezultate în aplicaţia noastră. Rezultatele obținute in urma testării aplicaţiei insuflă increderea
și convingerea utilizarii unui astfel de mobil în misiuni de recunoaştere a mediului.
Vehiculul este capabil să mențină o comunicație activă cu un computer echipat cu un modul
Wi-Fi, distanța maximă testată pentru menținerea unei conexiuni active intre vehicul și laptop fiind
de 10m.
Pentru a avea un astfel de vehicul capabil să exploreze orice fel de teren ar fi necesar un kit
robotic mai performant care sa pună la dispoziţie facilitaţile de natura mecanică asemanătoare cu ce
vedem pe maşinile de teren.
Eventuale îmbunătățiri ale sistemului :
 Utilizarea unor senzori suplimentari pentru determinarea odometriei cum ar fi un senzor
giroscopic sau un accelerometru cu care sa prevenim înregistrarea datelor odometrice atunci
când robotul s-a ciocnit de ceva
 Utilizarea unor şenile in loc de roţi pentru un control mai precis in momemntul rotaţiilor si
pentru o centrare mai eficientă al senzorului LIDAR
 Echiparea vehicului cu o cameră de filmat pentru transmiterea in timp real de imagini
 Utilizarea unui șasiu cu sistem de suspensie cu amortizoare pentru deplasarea indiferent de
caracteristicile mediului
 Utilizarea unei singure surse de alimentare pentru Raspberry pi şi sistemul de deplasare

În concluzie putem spune ca proiectul reuşeşte să obţină un set de rezultate convingătoare


asupra problemei mapării şi localizării simultane, demonstrând potenţialul unei astfel de aplicaţii şi
aplicabilitatea ei în diferite domenii.

57
58
Bibliografie

[1] „RP3DataSheet,” 2008. [Interactiv]. Available: https://static.raspberrypi.org/files/product-


briefs/Raspberry-Pi-Model-Bplus-Product-Brief.pdf. [Accesat 5 2018].
[2] „Projects RPI3,” 2016. [Interactiv]. Available:
https://projects.raspberrypi.org/en/projects/robotPID/4. [Accesat 2018].
[3] „CortexA53DataSheet,” 2013-2014. [Interactiv]. Available:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0500e/index.html. [Accesat 6
2018].
[4] „LaserDataSheet,” 2009. [Interactiv]. Available:
https://www.robotshop.com/media/files/pdf/hokuyo-urg-04lx-ug01-specifications.pdf.
[Accesat 5 2018].
[5] „How does LiDAR work?,” Lidar-uk, 2018. [Interactiv]. Available: http://www.lidar-
uk.com/how-lidar-works/. [Accesat 6 2018].
[6] T. Markus, „Application Level Energy and Performance Measurements in a Wireless LAN,”
2018.
[7] „Specificaţii motoare,” 2018. [Interactiv]. Available:
https://www.optimusdigital.ro/ro/motoare-altele/139-motor-cu-reductor-si-roata.html. [Accesat
5 2018].
[8] Stan, „Differential drive with continuous rotation servos and Arduino,” 42 Bots , 2014.
[9] „H bridge,” 2018. [Interactiv]. Available: http://www.mcmanis.com/chuck/robotics/tutorial/h-
bridge/. [Accesat 6 2018].
[10] „L298-DUAL FULL-BRIDGE DRIVER,” STMicroelectronics, 2000.
[11] „PWM Introduction,” 2011. [Interactiv]. Available:
https://hekilledmywire.wordpress.com/2011/08/03/introduction-to-pwm-part-7/. [Accesat 6
2018].
[12] „Incremental Encoder,” 2008. [Interactiv]. Available: https://www.pc-
control.co.uk/incremental_encoders.htm. [Accesat 6 2018].
[13] C. Negrescu, „Curs Robotica,” 2018.
[14] S. R. a. M. R. Blas, „SLAM for Dummies,” MIT, [Interactiv]. Available:
https://ocw.mit.edu/courses/aeronautics-and-astronautics/16-412j-cognitive-robotics-spring-
2005/projects/1aslam_blas_repo.pdf. [Accesat 6 2018].
[15] G. Lucas, „Using a PID-based Technique For Competitive Odometry and Dead-Reckoning,”
http://www.seattlerobotics.org/encoder/200108/using_a_pid.html.
[16] C. Stachniss, „Introduction to Robot Mapping,” 2013, Frieburg.
[17] D. Hähnel, „Robot Mapping,” 2014, Freiburg, 2012.

59
[18] L. S. E. F. A. M. Anil Mahtani, Effective Robotics Programming with ROS, 2016.

60
Anexa 1 Imagini cu realizarea practică

61
Anexa 2 Cod sursă –Comanda navigației
#!/usr/bin/env python
#motorp.py

import rospy
import curses
from std_msgs.msg import String

screen = curses.initscr()
curses.noecho()
curses.cbreak()
screen.keypad(True)

rospy.init_node('Motor_Publisher')
pub = rospy.Publisher('direction', String, queue_size=10)
print 'Enter W/A/S/D to control the robot: '
while not rospy.is_shutdown():
rate = rospy.Rate(1)
print 'Input:'
try:
data = chr(screen.getch())
except:
data= 'y'
print('Invalid input')
data = data.upper()
print data

if data in ("W","S","A","D","Q"):
pub.publish(data)
rate.sleep()

62
Anexa 3 Cod sursă – Navigația și determinarea distanței parcurse
de vehicul
#!/usr/bin/env python
#motorp.py

import time
import os
import rospy
from std_msgs.msg import String
from geometry_msgs.msg import Twist, Quaternion, TransformStamped, Point
from nav_msgs.msg import Odometry
import RPi.GPIO as GPIO
import sys, math, tf
GPIO.cleanup()
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7,GPIO.OUT)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(13,GPIO.OUT)
GPIO.setup(15,GPIO.OUT)
GPIO.setup(40,GPIO.IN)
GPIO.setup(32,GPIO.IN)

class Motor():
def __init__(self):
sub = rospy.Subscriber('direction', String, self.callback)

self.d=0
#setup pwm
self.fs=GPIO.PWM(11,50)
self.fd=GPIO.PWM(15,50)
self.ss=GPIO.PWM(7,50)
self.sd=GPIO.PWM(13,50)
self.state=self.directive='X'
self.master=self.slave=0
self.kp=0.2
self.kd=0.1
self.rot=0.3925
self.trans=0.50
self.ticks=0
self.error=0
self.impD=self.impS=0
63
self.readS=GPIO.input(40)
self.readD=GPIO.input(32)
self.distS=0
self.distD=0
self.speed=0
self.turnspeed=0
self.nt=time.time()
self.pub_odom = rospy.Publisher('odom', Odometry, queue_size=10)
self.bc_odom = tf.TransformBroadcaster()
self.lastpost=time.time()
self.x, self.y, self.th = 0.0, 0.0, 0.0
self.vx, self.vth = 0.0, 0.0
self.actual=False
self.cur_time = rospy.Time.now()
self.last_time = self.cur_time

def distanceS(self):
read=GPIO.input(40)
if read==self.readS:
return 0
else:
self.readS=read
self.impS+=1
return 1

def distanceD(self):
read=GPIO.input(32)
if read==self.readD:
return 0
else:
self.readD=read
self.impD+=1
return 1

def speedCalibration(self):
self.distD+=self.distanceD()
self.distS+=self.distanceS()
t=time.time()
dt=t-self.nt
if dt>0.03:
speedS=self.distS/dt
64
speedD=self.distD/dt
print ("viteza pe roata dreapta este: %d iar pwm-ul e de %d iar pe roata stanga este: %d iar pwm-ul e
de %d " % ( speedD,self.slave,speedS,self.master))
prev_error=self.error
self.error=speedS-speedD
self.slave+=self.error*self.kp + prev_error*self.kd
if self.slave>100:
self.slave=99
elif self.slave<1:
self.slave=1
self.distS=self.distD=0.0001
self.nt=time.time()

def send_odom(self):
self.cur_time = rospy.Time.now()
currentTime=time.time()
self.x += self.vx * math.cos(self.th)
self.y += self.vx * math.sin(self.th)
self.th += self.vth
q = tf.transformations.quaternion_from_euler(0, 0, self.th)
self.bc_odom.sendTransform((self.x,self.y,0.0), q, self.cur_time,"base_link","odom")
odom = Odometry()
odom.header.stamp = self.cur_time
odom.header.frame_id = "odom"
odom.pose.pose.position = Point(self.x,self.y,0)
odom.pose.pose.orientation = Quaternion(*q)
odom.child_frame_id = "base_link"
odom.twist.twist.linear.x = self.vx
odom.twist.twist.linear.y = 0.0
odom.twist.twist.angular.z = self.vth
self.pub_odom.publish(odom)
self.vx, self.vth = 0.0, 0.0

def forward(self):
self.fs.start(self.master)
self.fd.start(self.slave)
self.ss.stop()
self.sd.stop()

def backwards(self):
self.ss.start(self.master)
self.sd.start(self.slave)

65
self.fs.stop()
self.fd.stop()

def turnRight(self):
self.sd.start(self.slave)
self.fs.start(self.master)
self.fd.stop()
self.ss.stop()

def turnLeft(self):
self.ss.start(self.master)
self.fd.start(self.slave)
self.fs.stop()
self.sd.stop()

def stop(self):
self.ss.stop()
self.sd.stop()
self.fs.stop()
self.fd.stop()

def CurrentPosition(self):
if self.state=="W":
self.vx+=self.trans
elif self.state == "S":
self.vx-=self.trans
elif self.state == "D":
self.vth-=0.3925
self.vx+=0.12
elif self.state == "A":
self.vth+=0.3925
self.vx+=0.12
self.state=self.directive="X"
self.impD=self.impS=0
self.stop()

def motorFunction(self):
self.d=(self.impD+self.impS)/2
if self.directive=="W" and self.d<self.ticks:
self.forward()
elif self.directive == "S" and self.d<self.ticks:
66
self.backwards()
elif self.directive == "D" and self.d<self.ticks :
self.turnRight()
elif self.directive == "A" and self.d<self.ticks:
self.turnLeft()
elif self.directive == "A" or self.directive == "D":
self.stop()
time.sleep(0.2)
self.impD=self.impS=0
self.ticks=24
self.directive="W"
else:
self.CurrentPosition()

def callback(self,msg):
self.state=self.directive=msg.data
if self.directive =="W" or self.directive=="S":
self.master=16
self.slave=16
self.ticks=100
elif self.directive =="A" or self.directive =="D":
self.master=self.slave=16
self.ticks=10
self.nt=time.time()
distD=distS=0

if __name__ == '__main__':
rospy.init_node('Motor_Subscriber')
m = Motor()
rate = rospy.Rate(500)
while not rospy.is_shutdown():
if m.directive == "Q":
GPIO.cleanup()
ros.shutdown()
currentTime=time.time()
if currentTime-m.lastpost >0.1:
m.send_odom()
m.lastpost=currentTime
if m.directive !="X":
m.motorFunction()
67
m.speedCalibration()
rate.sleep()
GPIO.cleanup()

68
Anexa 4 Cod sursă – Scriptul pentru lansarea aplicaților pe mobil
<launch>
<!--
<node pkg="robot_slam" name="motorp" type="motorp.py" required="true" />
-->
<node pkg="robot_slam" name="motors" type="motors.py" required="true" />
<!--
<node pkg="urg_node" name="urg_node" type="urg_node" required="true" >
<param name="frame_id" value="base_link"/>
</node>
-->
</launch>

69
Anexa 5 Cod sursă – Scriptul pentru algorimului SLAM

<launch>
<arg name="scan_topic" default="/scan" />
<arg name="odom_topic" default="/odom" />

<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">


<param name="base_frame" value="base_link"/>
<param name="odom_frame" value="odom"/>

<param name="maxUrange" value="4.0"/>


<param name="maxRange" value="4.0"/>

<param name="srr" value="0.3"/>


<param name="srt" value="0.1"/>
<param name="str" value="0.1"/>
<param name="stt" value="0.3"/>

<param name="particles" value="100"/>


</node>
</launch>

70