• Rezultati Niso Bili Najdeni

DIPLOMSKA NALOGA

N/A
N/A
Protected

Academic year: 2022

Share "DIPLOMSKA NALOGA"

Copied!
47
0
0

Celotno besedilo

(1)

za gradbeništvo in geodezijo

GAŠPER ODER

PREGLED TEHNOLOGIJ IN ZASNOVA SAMOVOZEČEGA VOZILA

DIPLOMSKA NALOGA

UNIVERZITETNI ŠTUDIJSKI PROGRAM PRVE STOPNJE GEODEZIJA IN GEOINFORMATIKA

Ljubljana, 2021

Hrbtna stran: ODER GAŠPER 2021

(2)

Fakulteta za gradbeništvo in geodezijo

Kandidat/-ka:

GAŠPER ODER

PREGLED TEHNOLOGIJ IN ZASNOVA SAMOVOZEČEGA VOZILA

Diplomska naloga št.:

SELF-DRIVING TECHNOLOGIES AND DESIGN OF SELF-DRIVING VEHICLE

Graduation thesis No.:

Mentor/-ica: Predsednik komisije:

prof. dr. Krištof Oštir

Somentor/-ica:

asist. dr. Jernej Tekavec Član komisije:

Ljubljana,

(3)

POPRAVKI – ERRATA

Stran z napako Vrstica z napako Namesto Naj bo

(4)

ZAHVALA

Zahvalil bi se mentorju, prof. dr. Krištofu Oštirju in somentorju, asist. dr. Jerneju Tekavcu, ki sta mi s svojim znanjem in idejami pomagala pri nastajanju diplomskega dela. Zahvalil bi se tudi za to, ker sta mi delo o tej temi omogočila. Zahvala gre tudi Fakulteti za gradbeništvo in geodezijo, ki mi je zagotovila vso potrebno opremo za izvedbo naloge.

Posebna zahvala gre moji družini, ki verjame vame in me na celotni študijski poti spodbuja, ter mi nudi še nadaljnji študij.

(5)

BIBLIOGRAFSKO-DOKUMENTACIJSKA STRAN IN IZVLEČEK

UDK: 629.3.014.9:656:71(043.2)

Avtor: Gašper Oder

Mentor: prof. dr. Krištof Oštir Somentor: asist. dr. Jernej Tekavec

Naslov: Pregled tehnologij in zasnova samovozečega vozila Tip dokumenta: Diplomska naloga – Univerzitetni študij

Obseg in oprema: 28 str., 16 sl., 1 en., 2 pril., 19 vir.

Ključne besede: avtonomno vozilo, avtonomna vožnja, Raspberry Pi

Izvleček

Vsa tehnologija se razvija v smeri vse večje avtomatizacije. To velja tudi za vozila, ki s hitrim razvojem v smeri avtonomne vožnje opozarjajo nase. Vsakodnevno se na cestah pojavljajo vozila z novimi asistenčnimi sistemi, ki pomagajo vozniku med vožnjo. Ti sistemi od voznika še vedno zahtevajo, da je med vožnjo prisoten in pripravljen prijeti za volan. Vprašanje je, kdaj bomo priča prvemu vozilu, ki se bo lahko brez voznika in celo brez volana ter pedalov zapeljal po kateri koli cesti.

V diplomski nalogi je predstavljena teoretična osnova avtonomnih vozil, predstavljene so stopnje, ki določujejo avtonomno vožnjo, ter senzorji, s katerimi vozila zaznavajo okolico, njihove prednosti in slabosti. Kot praktični primer uporabe te tehnologije, je v diplomski nalogi predstavljena zasnova in izgradnja samovozečega modela avtomobila na osnovi Raspberry Pi računalnika, ki za zaznavanje okolja uporablja optični senzor oz. kamero. Ukvarjali smo se z optimizacijo vozila, za uspešno vožnjo smo kamero nekoliko dvignili in ji nastavili optimalen kot opazovanja. Na tla smo nalepili moder lepilni trak, ki ga kamera zazna kot črte vozišča.

Ugotovili smo, da so za uspešno vožnjo najpomembnejši podatki, ki jih kamera zazna, saj se avtomobil, glede na te podatke odloči, kam naj zavije. Pomembno je, da v okolici avtomobila ni predmetov iste barve kot so črte in da kamera zajame dovolj podatkov, torej da ima dovolj širok kot opazovanja.

Pomembna je tudi računalniška moč, ki vse podatke obdela.

(6)

BIBLIOGRAPHIC-DOCUMENTALISTIC INFORMATION AND ABSTRACT

UDC: 629.3.014.9:656:71(043.2)

Author: Gašper Oder

Supervisor: prof. dr. Krištof Oštir Co-supervisor: asist. dr. Jernej Tekavec

Title: Self-driving technologies and design of self-driving vehicle Document type: Graduation Thesis – University Studies

Notes: 28 p., 16 fig., 1 eq., 2 ann., 19 ref.

Keywords: self-driving vehicle, autonomous driving, Raspberry Pi

Abstract

All technology is evolving towards automation. This also applies to vehicles that draw attention to themselves with their rapid development in the direction of autonomous driving. Vehicles with new assistance systems appear on the roads every day to help the driver while driving. This systems still require the driver to be present while driving and ready to grab the steering wheel. The question is, when will we witness the first vehicle that will be able to move on any road without a driver and even without a steering wheel and pedal.

This thesis presents the theoretical basis of autonomous vehicles, presents the levels of autonomous driving, describes sensors with which vehicles detect the environment, their advantages and disadvantages. As a practical example of the use of this technology, the thesis presents the design and construction of a self-driving car based on Raspberry Pi computer, that uses an optical sensor to detect the environment. We have optimized the vehicle, and for a successful ride, we raised the camera and set it to the optimal viewing angle. On the floor, however, we glued blue tape, which the camera detects as road lines.

We have found that the essential data for successful driving is the data detected by the camera, as the car decides where to turn based on this information. It is crucial that there are no objects of the same colour as the lines around the vehicle and that the camera captures enough data to have a wide enough angle of observation. Computer power, which processes all data, is also important.

(7)

KAZALO

POPRAVKI – ERRATA ... I ZAHVALA ... II BIBLIOGRAFSKO-DOKUMENTACIJSKA STRAN IN IZVLEČEK ... III BIBLIOGRAPHIC-DOCUMENTALISTIC INFORMATION AND ABSTRACT ... IV OKRAJŠAVE IN SIMBOLI / ABBREVIATIONS AND SYMBOLS ... VII

1 UVOD ... 1

2 PREGLED TEHNOLOGIJ AVTONOMNE VOŽNJE ... 5

2.1 Lidar ... 5

2.2 Optični senzor – kamera ... 7

2.3 Radar ... 8

2.4 Ultrazvočni senzor ... 9

2.5 Sprejemnik GNSS...10

2.6 Umetna inteligenca ...11

3 IZDELAVA IN TESTIRANJE MODELA SAMOVOZEČEGA AVTOMOBILA ...13

3.1 Gradnja avtomobila in instalacija programov ...15

3.2 Predstavitev programa, krmilnega programa in programa za avtonomno vožnjo ...15

3.2.1 Rob objekta oz. »ceste« ...16

3.2.2 Območje zanimanja ...17

3.2.3 Določitev linijskih segmentov ...18

3.2.4 Izračun povprečnega naklona ...19

3.2.5 Izračun kota zavijanja ...20

3.2.6 Stabilizacija kota zavijanja ...21

3.2.7 Razredi in vožnja ...22

4 DISKUSIJA ...23

5 ZAKLJUČEK ...25

6 VIRI ...27

(8)

KAZALO SLIK

Slika 1: Stopnje avtonomne vožnje [20]. ... 2

Slika 2: Senzorji, ki se uporabljajo za avtonomno vožnjo [21]. ... 5

Slika 3: Prikaz oblaka točk pridobljenega z lidarjem [22]. ... 7

Slika 4: Prikaz kaj med vožnjo vidi in prepozna kamera [23]. ... 8

Slika 5: Prikaz delovanja sistema radarjev na avtomobilu [24]... 9

Slika 6: Prikaz delovanja ultrazvočnih senzorjev med vzvratnim parkiranjem avtomobila [25]. ... 10

Slika 7: Prikaz območja, ki so ga zabeležili senzorji na vozilu [26]... 11

Slika 8: Slika avtomobila z označenimi elementi (spredaj). ... 14

Slika 9: Slika avtomobila z označenimi elementi (zadaj). ... 14

Slika 10: Prikaz zaporedna delovanja funkcij, ki so potrebne za uspešno vožnjo zasnovanega avtomobila. ... 16

Slika 11: Zaznava modre barve, ki je na sliki predstavljena z belo barvo. ... 17

Slika 12: Zaznava robu vseh modrih objektov. ... 17

Slika 13: Določitev območja, ki nas zanima, in zabris ostalih podatkov. ... 18

Slika 14: Izračun linijskih segmentov in prikaz na zaslonu. ... 19

Slika 15: Izračun povprečnega naklona in izris dveh stranskih črt in ne samo ene. ... 19

Slika 16: Izračun povprečnega naklona in izris dveh stranskih črt. ... 20

Slika 17: Primer izračuna kota zavijanja. ... 21

Slika 18: Končna slika s stabiliziranim kotom zavijanja. ... 21

(9)

OKRAJŠAVE IN SIMBOLI / ABBREVIATIONS AND SYMBOLS

GNSS Global Navigation Satellite System – Globalni Navigacijski Satelitski Sistem SAE Society of Automotive Engineers – Mednarodno združenje avtomobilskih inžinerjev INS Inertial Navigation System – Inercialni navigacijski sistem

ALV Autonomous Land Vehicle – Avtonomno kopensko vozilo CCD Charge-Coupled Devices – Naprava s povezanimi naboji RGB Red-Green-Blue – Rdeča-Zelena-Modra

HSV Hue-Saturation-Value – Odtenek-Nasičenost-Vrednost

DARPA Defense Advanced Research Projects Agency – Ameriška agencija za napredne obrambne analize

(10)

»Ta stran je namenoma prazna.«

(11)

1 UVOD

Vožnja v današnjem modernem času predstavlja del našega vsakdana. Statistični podatki kažejo, da povprečen človek v Sloveniji v avtomobilu preživi 55 minut na dan [1]. Povedano drugače, to je približno 14 dni na leto. Svetovno povprečje je še nekoliko večje. Večina delovnih ljudi vsaj del tega časa preživi v zastojih, kjer je vožnja počasna in zelo monotona. Med monotono vožnjo se voznikova zbranost in budnost zmanjšata, zato se težje osredotoči na vožnjo. Neosredotočenost lahko v trenutku privede do prometne nesreče, česar si v prometu ne želimo. Na utrujenost vpliva tudi čas vožnje, ki je pri osebah, ki prevozijo nadpovprečno število kilometrov dnevno, lahko tudi zelo dolg [2]. Razlogov za povzročitev prometne nesreče je še mnogo. Raziskava od US Department of Transportation (Ameriškega oddelka za promet) pravi, da je kar za 94 % prometnih nesreč kriv človek [3]. Glavna motivacija razvijalcev avtonomnih vozil je, da bi jim uspelo narediti vozilo, ki ne bi potrebovalo voznika za vožnjo, hkrati pa bi bila vožnja z njim popolnoma varna.

Ker varnost ni edina prednost avtonomnih samovozečih avtomobilov, naj naštejem še nekaj drugih prednosti. Izpušne emisije vozil se bodo zmanjšale kar za 60 %, saj bodo avtonomna vozila lahko načrtovala boljše poti in prispevala k bolj učinkovitim upravljanjem vozila. Valovi ustavljanja in speljevanja bodo popolnoma izginili, to bo omogočal sistem komunikacije med vozili. Vožnja bo postala bolj ekonomična, k čemur bo pripomoglo boljše upravljanje vozila. Kapaciteta cest se bo po besedah študije iz univerze v Ohio povečala za petkrat, kar naj bi povečalo hitrost prometa za 20 %. Tako bi se zmanjšal potovalni čas ter čas iskanja parkirnega prostora [4].

Po drugi strani lahko v avtonomni vožnji vidimo tudi kar nekaj slabosti. Za enkrat popolna avtonomna vožnja predstavlja prevelik finančni zalogaj, saj je tehnologija še predraga. To se bo seveda s časom, ko bo tehnologija dostopnejša popravilo. Največja težava, ki jo ljudje vidimo v tem, je možnost, da tehnologija zataji. Kljub temu da bodo avtomobili pripravljeni na marsikaj, obstaja še vedno možnost, da bodo kaj spregledali in povzročili nesrečo [4]. Temu smo bili priča že nekajkrat v preteklosti, ko sistemi za pomoč vozniku med vožnjo niso prepoznali ovire ali pešca. Če oz. ko se bo to zgodilo, kdo bo krivec za nesrečo avtomobil ali človek? To vprašanje sproži veliko nestrinjanj, in je nanj težko odgovoriti, saj krivde noče prevzeti nihče. Slabost je tudi v tem, da če bo vzpostavljen sistem komunikacije med vozili, bodo podatki o naši lokaciji vedno v omrežju. To pomeni, da bodo tretje osebe oz. organizacije imele dostop do podatkov naše lokacije, kar predstavlja nevarnost, če kdo vdre v sistem [4].

Avtonomno vozilo je vozilo, ki za pravilno, zanesljivo in povsem varno vožnjo ne potrebuje voznika, saj je sposobno zaznavati okolico in voziti brez pomoči voznika. Takšna vozila predstavljajo eno izmed največjih inovacij današnjega časa [5]. Ker je implementacija popolnoma avtonomne vožnje težka, je združenje SAE (Society of Automotive Engineers) predlagalo več stopenj avtomatizacije. Določenih je

(12)

pet stopenj avtonomne vožnje in stopnja nič, kjer je vožnja v celoti odvisna od voznika. Stopnje so predstavljene na Sliki 1 in predstavljajo [6]:

- Stopnja 0: vožnja je popolnoma odvisna od voznika, avto ne pomaga.

- Stopnja 1: avto je sposoben prevzemati podatke s senzorjev ali kamer, voznik pa mora imeti še vedno popoln nadzor nad vozilom. Avtonomno zmožnost ima le en proces vožnje, to je lahko aktivni tempomat, ki se je pojavil v 90-ih letih prejšnjega stoletja in deluje na podlagi radarja, ali sistem za nenamerno menjavo voznega pasu, ki deluje z uporabo kamere.

- Stopnja 2: avto je sposoben držati smer ter prilagajati hitrost prometu. Podatke črpa iz več senzorjev ter jih združuje v smiselno celoto. Avtomobili v tej stopnji že znajo sami voziti v prometnih zamaških, ta stopnja pa je pri novejših avtomobilih najbolj pogosta. Kljub temu da vozniku pomaga več asistenčnih sistemov, je voznik še vedno glavni upravljavec vozila.

- Stopnja 3: stopnja je poimenovana tudi pogojna avtomatizacija, saj je sistem že dovolj dober, da v določenih pogojih vožnjo upravlja brez voznika. Voznik mora biti še vedno prisoten in pripravljen ukrepati.

- Stopnja 4: avto je sposoben popolne avtonomne vožnje pod že poznanimi pogoji. To pomeni, da morajo biti območja, kjer se bodo vozili avtomobili 4. stopnje, dobro pokrita z natančnimi podatki zemljevidov, avtomobili bodo komunicirali tudi med sabo in drug drugega opozarjali na nevarnosti. Voznik v tej stopnji naj ne bi bil potreben, avtomobili pa bodo namenjeni prevozu iz enega dela mesta do drugega.

- Stopnja 5: popolna avtonomna vožnja, avto je sposoben voziti sam pod vsemi pogoji in kjer koli, voznik bo postal potnik, v notranjosti pa ne bomo več potrebovali volana in pedal [7].

Slika 1: Stopnje avtonomne vožnje [20].

O vožnji brez voznika se je začelo govoriti že v začetku dvajsetih let prejšnjega stoletja. Z razvijanjem avtomatiziranega avtocestnega sistema se je o tem samo še več govorilo. Prvo samovozeče vozilo je bilo narejeno leta 1985 imenovalo se je ALV – Autonomous Land Vehicle (Avtonomno kopensko vozilo), ki ga je naredila DARPA (Defense Advanced Research Projects Agency, Ameriška agencija za napredne obrambne analize). Vozilo je bilo opremljeno s senzorji, med drugim tudi z lidarjem. Ker je ta

(13)

tehnologija še danes najdražja, so projekt zaradi prevelikih stroškov prekinili [8]. Veliko medijske pozornosti je avtonomni vožnji dalo podjetje Google, ko so predstavili svoj samovozeči avtomobil Waymo. To je pritegnilo veliko novih talentov, ki so začeli razvijati vedno boljša vozila [4].

Razvoj avtonomnih vozil se je stopnjeval in glavni proizvajalci so bili prepričani, da bomo do leta 2021 imeli na cestah že veliko samovozečih avtomobilov, vendar temu ni tako. Dandanes je večina najnovejših in najnaprednejših avtomobilov na cesti zmožnih predvsem avtonomne vožnje druge stopnje, čeprav imajo dodane določene sisteme za vožnjo kot jo opredeljuje stopnja 3. Obstaja tudi nekaj testnih avtomobilov, ki se vozijo po znanih območjih, in spadajo pod avtonomno vožnjo stopnje štiri.

Ker se razvoj samovozečih avtomobilov odvija zelo hitro, je težko najdi podatke za avto, ki je na tem področju trenutno najboljši.

(14)

»Ta stran je namenoma prazna.«

(15)

2 PREGLED TEHNOLOGIJ AVTONOMNE VOŽNJE

Da bi dosegli avtonomno vožnjo vozila v vseh situacijah, mora sočasno sodelovati več sistemov. Med njimi so zaznavanje okolja, položaj in nadzor avtomobila ter načrtovanje. Za to so potrebni pravi senzorji, med katere spadajo: lidar, optični senzor (kamera), ultrazvočni senzorji, radar in sprejemnik GNSS. Pomembno je tudi povezovanje teh senzorjev med seboj in računalniška ter programska oprema na vozilu, ki je potrebna za obdelavo vseh pridobljenih podatkov iz senzorjev [9].

Slika 2: Senzorji, ki se uporabljajo za avtonomno vožnjo [21].

2.1 Lidar

Lidar oz. svetlobno zaznavanje in merjenje razdalj (light detection and ranging), je instrument, ki proti opazovanim predmetom pošilja kratke laserske impulze in opazuje njihov odboj. Laserski impulzi so lahko v bližnjem infrardečem ali v vidnem elektromagnetnem spektru. Iz sprejetih elektromagnetnih impulzov lahko na podlagi časa potovanja teh impulzov določimo dolžino od instrumenta do merjenega objekta. To lahko izračunamo s formulo (1),

𝑅𝑅= 12∙ 𝑐𝑐 ∙ 𝑡𝑡, (1)

kjer R predstavlja razdaljo od instrumenta do objekta, c je hitrost svetlobe in t, ki predstavlja čas potovanja žarka. Natančnost razdalje pa je povezana s časovno ločljivostjo instrumenta, in je lahko tudi

(16)

boljša od centimetra. Tehnologija torej omogoča pridobivanje zelo natančnih podatkov o objektih in trenutno velja za najbolj natančno tehniko pridobivanja in izdelave digitalnih modelov [10].

Lidar je aktivni senzor, kar pomeni, da za pridobivanje podatkov uporablja lastni vir elektromagnetnega valovanja. Meri tudi intenziteto odbitega signala. Podatki, ki jih lidar pridobi, so diskretne točke in ne zvezne površine. Za snemanje uporablja mehanski snemalnik, ker ima laserska svetloba zelo majhno razpršenost, imajo snemalniki zelo ozko vidno polje. Da snemalnik posname točke vse okoli osi vozila, mora imeti vgrajeno lečo, ki se vrti okoli svoje osi. Laserski skener tako posname samo razdalje do točk, pravi položaj pa določimo z obdelavo podatkov, s tem, da poznamo točen položaj in usmerjenost senzorja. Položaj imamo določen z anteno GNSS na vozilu, usmerjenost pa določimo z inercialnim navigacijskim sistemom v samem instrumentu (INS) [10].

Poleg omenjenih mehanskih snemalnikov, poznamo še t.i. solid state sisteme. Sestavljeni so iz oddajnika, sprejemnika in procesorja ter ne vsebujejo premikajočih se delov. So primernejši za uporabo na avtomobilih, saj je njihova cena precej nižja kot cena mehanskih lidarjev. Sistem ima več diod, ki oddajajo laserske žarke, ti se od objekta odbijejo in potujejo do sprejemnika, ki ga prav tako sestavlja več sprejemnikov, vsak sprejme določeno količino svetlobe. Objektiv oddano svetlobo spremeni v širok vodoravni žarek, sprejeto svetlobo pa spremeni v navpični žarek, ki pade na enega od sprejemnikov [18], [19].

Lidar je sposoben meriti do razdalje 200 m, tudi od objektov z manj odbojnosti. Njegova položajna natančnost je odvisna od razdalje in znaša do nekaj centimetrov. Kar je dovolj za uspešno identifikacijo objektov iz okolja [6].

Po obdelavi podatkov dobimo oblake točk, ki nam prikažejo obliko okolice, kot je prikazano na Sliki 3.

Na sliki so jasno vidne ovire in razdalja do njih, določiti moramo še kaj ovira predstavlja. Današnja infrastruktura prometne ceste lidarju onemogoča branje prometnih znakov in ostalih vizualnih informacij. To z odliko naredijo optični senzorji oz. kamere.

(17)

Slika 3: Prikaz oblaka točk pridobljenega z lidarjem [22].

2.2 Optični senzor – kamera

Optični senzor deluje kot pasivni senzor, kar pomeni, da zazna odbito svetlobo, ki jo ustvari drugi vir (bodisi sonce bodisi avtomobilski žarometi). Elektromagnetno valovanje pade na lečo, ki ga preusmeri na mrežo senzorjev CCD, kjer se zapiše vrednost elektromagnetnega naboja kot številska vrednost [10].

Kamere se v največ primerih uporabljajo kot pomoč vozniku pri parkiranju ali vzvratni vožnji, saj tako vozniku omogočajo boljši pogled tik pred in tik za vozilo. Zadolžene so predvsem za pridobivanje vizualnih informacij okolice, kot na primer ali na semaforju gori zelena ali rdeča luč. S kamerami vozilo prepoznava tudi prometne znake, prehode za pešce ter ostale označbe na cesti. Z uporabo dveh kamer pa lahko računalnik izračuna še razdaljo do objekta in s tem pripomore k uspešnejšemu delovanju asistenčnih sistemov med vožnjo. Primer, kako kamera v sodelovanju z umetno inteligenco prepozna okolico na avtomobilu znamke Tesla, je prikazan na Sliki 4.

Ločljivost posnetka do neke meje ne vpliva na prepoznavanje objekta in merjenja razdalje do le-tega.

Zato za hitrejšo obdelavo slike pogosto zmanjšajo. Tako lahko iz slike velikosti 6000 x 4000 pikslov, brez težav obdelamo sliko velikosti 600 x 400 pikslov. Natančnost merjenja razdalje kljub temu ostane dovolj dobra tudi na razdalji do 160 m [11].

Pomanjkljivost optičnih senzorjev se pokaže predvsem takrat, ko vidljivost na cesti ni najboljša, recimo ponoči, ko so edini vir svetlobe avtomobilski žarometi ali kadar je leča kamere umazana oz. jo nekaj prekriva. Zato vozilu med vožnjo v megli, dežju ali snegu pomaga še radar.

(18)

Slika 4: Prikaz kaj med vožnjo vidi in prepozna kamera [23].

2.3 Radar

Radar (radio detection and ranging) oz. radijsko zaznavanje in določanje razdalje deluje v mikrovalovnem spektru elektromagnetnih valov, ki se razlikuje od vidnega dela, kjer deluje optična kamera. Valovanje, ki ga oddaja radar, je daljših valovnih dolžin in prodira skozi meglo ali padavine, kar je glavna ovira kamere. Ker je radar aktivni senzor, za pridobivanje podatkov uporablja lasten vir elektromagnetnega valovanja in je zelo učinkovit tudi ponoči [10]. Za oddajanje in sprejemanje valov uporablja antene, ki merijo jakost mikrovalovnega signala, za pridobivanje podatkov potrebujemo še računalnik, ki obdela sprejete valove. Valovanje potuje z enako hitrostjo kot svetloba, zato lahko oddaljenost predmeta od antene izračunamo na enak način kot pri tehnologiji lidarja (1). Pri radarju so pomembni tudi dejavniki, ki določajo kolikšen delež elektromagnetnih valov se odbije nazaj v smeri antene. Ti dejavniki so: vpadni kot, pod katerim valovanje pade na površino objekta, razgibanost terena in prevodnost oz. dialektičnost površja [10].

Pri radarju dobimo veliko šuma, ki ne predstavlja nobenega objekta, in odmev valov, ki prav tako ne predstavljajo objekta. Da se tega znebimo, lahko uporabimo sistem, ki vključuje več radarjev, ki se jim polja vidnosti prekrivajo (Slika 5). Na tak način lahko ostranimo šum, za objekte pa lahko z gotovostjo trdimo, da so res objekti [12].

(19)

Slika 5: Prikaz delovanja sistema radarjev na avtomobilu [24].

2.4 Ultrazvočni senzor

Ultrazvočni senzorji delujejo podobno kot radar, le da namesto mikrovalov oddajajo zvočne valove.

Zvok, ki ga senzor oddaja, je sestavljen iz višjih frekvenc, kot jih človeško uho lahko zazna. Iz tega tudi ime ultrazvočni senzor. Valovi, ki jih pretvornik v senzorju odda, se od objekta odbijejo in potujejo nazaj do pretvornika, kjer se iz ultrazvočnih valov spremenijo nazaj v električno energijo. To omogoča računalniku, ki obdeluje sprejete podatke, da izračuna razdaljo do objekta, od katerega so se valovi odbili. Poznavanje hitrosti zvoka omogoča, da oddaljenost objekta izračunamo z enako formulo kot pri tehnologiji radarja in lidarja (1), le da namesto hitrosti svetlobe vzamemo hitrost zvoka [13].

Ker ima vsak senzor kakšno slabost, jo ima tudi ultrazvočni senzor. Njegova slabost je razdalja med senzorjem in objektom. Objekt lahko zaznajo ko je blizu, razdalja pa je odvisna od frekvenc na katerih deluje senzor. Med vožnjo so uporabni predvsem pri menjavi pasov. Njihova uporabnost se najbolj pokaže pri parkiranju vozila (Slika 6), saj lahko s pod centimetrsko natančnostjo določijo razdaljo do sosednjega vozila. Ena izmed slabosti je tudi to, da mora biti objekt, ki ga senzor lahko zazna, maksimalno pod kotom ±30°. To pojasni, zakaj je na avtomobilu tudi do 12 ultrazvočnih senzorjev [14].

Zaradi lažjega vpliva na hitrost zvoka, se natančnost ultrazvočnih senzorjev ob nenavadnih okoljskih pogojih slabša. Nanjo lahko vplivamo s spreminjanjem tlaka, med vožnjo lahko to enačimo z vetrom.

Ali s spreminjanjem temperature, ki ima veliko močnejši vpliv na natančnost meritev kot tlak.

(20)

Slika 6: Prikaz delovanja ultrazvočnih senzorjev med vzvratnim parkiranjem avtomobila [25].

2.5 Sprejemnik GNSS

Na vozilu je nameščena tudi antena za pridobivanje informacij o lokaciji vozila. GNSS ali Globalni navigacijski satelitski sistem, so sistemi za določevanje položaja na podlagi opazovanih razdalj do satelitov. Poznamo več sistemov: GPS, Glonass, Galileo, BeiDou,… GNSS sestavljajo trije segmenti [15]:

- Vesoljski segment, to so vsi sateliti, ki uporabnikom oddajajo signal,

- Kontrolni segment, ki ga sestavljajo kontrolne postaje na Zemlji, spremljajo delovanje satelitov, izračunavajo parametre tirnic satelitov, ki so potrebne za izračun položajev satelitov v določenem trenutku,

- Uporabniški segment, ki ga sestavljamo uporabniki storitev, kateri z opazovanjem signala določamo svoj položaj.

Ta sistem je pomemben predvsem za navigacijo, poleg tega dopolnjuje ostale sisteme, saj lahko podatke iz ostalih senzorjev geolociramo. To pripomore tudi k sporazumevanju vozil, da se le-ti med vožnjo opozarjajo na morebitne zastoje, nevarnosti, nesreči in podobno.

(21)

Slika 7: Prikaz območja, ki so ga zabeležili senzorji na vozilu [26].

2.6 Umetna inteligenca

Poleg vseh senzorjev so na vozilu nameščeni še zelo zmogljivi računalniki, ki sproti obdelujejo podatke in jih združujejo v smiselno celoto. Ker računalnik kot tak podatkov ne razume in ne ve kaj ti predstavljajo, mu rešitev na določenih področjih nudi umetna inteligenca. Umetna inteligenca se ukvarja z zasnovo in izdelavo inteligentnih strojev in računalniških programov. Povezana je z razumevanjem človeške inteligence z uporabo računalnikov. Programi so, z uporabo umetne inteligence, sposobni sprejeti odločitve, za katere so potrebne človeške izkušnje in znanja. Raziskave na tem področju so se začele po drugi svetovni vojni, ko so inženirji začeli razvijat inteligentne stroje. Deluje kot simulacija človeških možganov, tako lahko računalnik prepozna, da skupina pikslov oz. določen odboj žarkov predstavlja pešca ali kakšno drugo določeno oviro. Ker brez človeške pomoči zaenkrat še ne gre, programu razvijalci prej pokažejo, kako naj bi izgledala določena ovira, računalnik pa jo potem sam prepozna. Da to deluje, je potrebno računalniku zagotoviti čim več že poznanih podatkov in mu povedati kaj podatek predstavlja [16].

Z umetno inteligenco avto ne prepozna samo pešcev, ampak skoraj vse, tako kot to razumejo človeški možgani. Sprogramiran je tako, da ve, kaj mora v določeni situaciji oz. okolju narediti. Umetna inteligenca s svojim razvojem zelo hitro napreduje, to dokazuje tudi dejstvo, da je v prometu že veliko avtomobilov z asistenčnimi sistemi, ki uporabljajo umetno inteligenco.

Ker celotna obdelava podatkov, prepoznavanje podatkov in načrtovanje potez avtomobila, zahteva ogromno delovnega pomnilnika, mora imeti vozilo zelo visokozmogljive računalnike. Ti računalniki so potem sposobni informacije obdelati kar se da hitro. To pomeni, da lahko vozilo vozi hitreje, podatki pa so kljub temu dovolj kvalitetni. Zato imamo primere avtomobilov, ki jim asistenčni sistemi delujejo samo do vožnje s hitrostjo 50 ali 60 km/h.

(22)

»Ta stran je namenoma prazna.«

(23)

3 IZDELAVA IN TESTIRANJE MODELA SAMOVOZEČEGA AVTOMOBILA

Praktični del raziskovalnega dela se nanaša na izdelavo in zasnovo samovozečega avtomobila.

Avtomobil smo najprej sestavili in pripravili potrebno opremo, ki je opisana v nadaljevanju. Napisati smo morali še program, ki se bo izvajal med vožnjo avtomobila. V nadaljevanju je opisan po delih, ki si sledijo in omogočajo zaznavo objektov. Sestavljen je iz dveh večjih delov in sicer krmilnega programa in programa za avtonomno vožnjo. Priložena sta v PRILOGI A in PRILOGI B.

Avto s kamero usmerjeno predse opazuje svojo okolico in prepozna objekte pred sabo. Program, ki teče med samo vožnjo avtomobila, je sestavljen tako, da prepozna črte, ki so pred njim. Črte iz rastrske slike prepiše v vektorski zapis in jih razume, kot da so to črte na cesti, med katerimi mora voziti. Vključeno ima tudi varnostno kodo. Če se zgodi, da avto zapelje izven črt in ne vidi nobene več, se program in avto ustavita.

Vozilo je opremljeno z dvema motorjema, ki poganjata zadnji kolesi, in še z dvema manjšima motorčkoma. Eden je namenjen rotaciji za usmerjanje kamere, drugi za premikanje sprednjih dveh koles, kar omogoča zavijanje vozila. Avto ima pritrjeno še USB kamero, ki je ključna za prepoznavanje okolice. Kamera ima 120° vidni kot, da lahko zajame čim več podatkov. Vse skupaj povezujejo tri plošče ali tiskana vezja, ki so sestavljena iz plastične podlage in prevodnih bakrenih žic. Na eno sta vezana glavna motorja, na drugo manjša motorčka, tretja pa je pritrjena na Raspberry Pi kartico, ki je glavni računalnik avtomobila. Zaradi bolšjega pregleda črt, med katerimi avto vozi, ima kamero nekoliko dvignjeno na podstavku, ki smo ga naredili na fakulteti. Za hlajenje Raspberry Pi kartice, uporablja ventilator, ki je bil kartici priložen.

(24)

Slika 8: Slika avtomobila z označenimi elementi (spredaj).

Slika 9: Slika avtomobila z označenimi elementi (zadaj).

(25)

3.1 Gradnja avtomobila in instalacija programov

Avtomobil PiCar-V proizvajalca SunFounder, ki je namenjen prav takim projektom kot je naš, smo naročili in sestavili. Na glavno kartico smo ga povezali z ustreznimi kabli.

Na modelu smo uporabili kartico Raspberry Pi 4, ki predstavlja glavni računalnik avtomobila in ima 8 GB delovnega pomnilnika. Da smo lahko nanjo naložili program za avtonomno vožnjo, smo morali najprej naložiti operacijski sistem Raspberry Pi OS, ki je temelji na operacijskemu sistemu Linux in instalirati programski jezik Python, v katerem smo program napisali. Ker koda potrebuje tudi nekaj Pythonovih knjižnic, smo instalirali še OpenCV, NumPy, SciPy in PiCar.

Pred samo vožnjo avtomobila, smo morali na tla nalepiti še barvi lepilni trak, ki predstavlja cestišče oziroma oznake na njem. Odločili smo se za modro barvo, saj se dobro loči od podlage. Del traka je nalepljenega v ravni liniji, drugi del rahlo v ovinek, da lahko avto preizkusimo, kako se odziva v obeh situacijah. Trak je po celotni dolžini nalepljen z razmikom približno 30 cm. Med samim poskusom smo pazili, da trasa ni bila pod nizkim kotom direktno osvetljena, saj bi odboj svetlobe od tal kameri preprečil zaznavo črte.

3.2 Predstavitev programa, krmilnega programa in programa za avtonomno vožnjo

Koda, ki poganja avto, je sestavljena iz več delov in deluje v zaporedju, kot je prikazano na Sliki 10.

Vse podatke dobi iz USB kamere, ki omogoča pogled v realnem času. Program najprej prepozna barvo, s katero je označena cesta, potem nekaj odvečnih podatkov iz slike izreže in iz uporabnih podatkov ustvari več linijskih segmentov. Iz več segmentov izračuna povprečen naklon in tvori eno oz. dve črti.

Ko ima izračunani pravi črti, ki sta sedaj zapisani vektorsko, izračuna potreben kot zasuka koles, da bo vozilo po premiku ostalo med linijama. Ta kot potem še stabilizira, da onemogoči nepotrebno zavijanje od ene črte do druge. Vse to je povezano skupaj v funkciji, ki prikazuje črte, v realnem času, na zaslonu in v funkciji, ki je namenjena premikanju vozila in motorčkov.

(26)

Slika 10: Prikaz zaporedja delovanja funkcij, ki so potrebne za uspešno vožnjo zasnovanega avtomobila.

3.2.1 Rob objekta oz. »ceste«

Da lahko program dovolj dobro zazna trak, s katerim je označena cesta, mora sliko iz RGB spremeniti v obliko barvnega zapisa HSV. To omogoča, da na zaznavo traka ne vpliva različna osvetlitev prostora.

Da to lahko naredi, mu moramo podati podatek o barvi traku. V našem primeru je trak modre barve, zato mu določimo celotni modri barvni razpon, kar znaša od 120 do 300 stopinj na HSV barvnem krogu, z razponom 0-360 stopinj (hue). Za intenzivnost (saturation) in svetlost (value), smo iz poskusov ugotovili, da je najbolje, če vrednosti nastavimo med 40 in 255.

(27)

Slika 11: Zaznava modre barve, ki je na sliki predstavljena z belo barvo.

Ko program zazna vse elemente z zahtevanimi parametri, naredi masko, elementom, ki ustrezajo parametrom, dodeli vrednost 0, ostalim 1. Ustrezni elementi so na Sliki 11 označeni z belo. Ker nas zanimajo samo piksli na robu zaznanega območja, uporabimo še funkcijo Canny iz knjižnice OpenCV, ki poišče robove objekta, ki nas zanima. Končni izdelek funkcije za zaznavo roba objekta prikazuje Slika 12.

Slika 12: Zaznava robu vseh modrih objektov.

3.2.2 Območje zanimanja

Ker nas zanima samo območje, kjer so prikazane črte in ne okolica, moramo v program napisati, naj ostalih objektov ne upošteva. Zanima nas torej območje na spodnji strani ekrana. Zgornje območje predstavlja matrika, ki je definirana tako, da je v obliki kvadrata, ki po širini zapolni celotno območje, po dolžini pa samo 30 % zgornjega dela območja prikazanega na slikah. Na tak način je zgornje območje prekrito in uporabljeno samo spodnje. Slika, ki jo po koncu funkcije vidi avto, je prikazana na Sliki 13.

(28)

Slika 13: Določitev območja, ki nas zanima, in zabris ostalih podatkov.

3.2.3 Določitev linijskih segmentov

Pri prejšnjem koraku smo torej dobili piksle, ki nas zanimajo, saj predstavljajo cesto, po kateri se mora avto peljati. Naslednji korak je, da iz pikslov program naredi linijske segmente, ki so samo približek končnim črtam. To naredi s funkcijo HoughLinesP knjižnice OpenCV, ki sosednje piksle poveže v več črt. Da funkcija deluje pravilno, moramo definirati še nekaj parametrov, in sicer kako daleč od vsakega izbranega piksla naj funkcija preveri ostale piksle ter na koliko kotnih stopinj preveri sosednje piksle.

Oba parametra sta nastavljena na 1, kar pomeni, da naj funkcija preveri piksle do najdaljše možne razdalje in za vsako kotno stopinjo. Definirati moramo še minimalno število povezanih oz. sosednih pikslov, ki je nastavljena na 10. To pomeni, da če je najmanj 10 pikslov v vrsti, le-ti predstavljajo črto.

Črte so zapisane z (x,y) koordinatama začetne točke in končne točke. To prikazuje Slika 14.

(29)

Slika 14: Izračun linijskih segmentov in prikaz na zaslonu.

3.2.4 Izračun povprečnega naklona

Ker nas zanima samo ena smer oz. naklon, moramo iz več linijskih segmentov dobiti samo eno linijo, katere naklon in začetno vrednost kasneje uporabimo za izračun smeri vožnje. Problema smo se lotili tako, da program najprej za vse linijske segmente iz prejšnje funkcije izračuna naklon in jih s k-means razvrščanjem razdeli v dve skupini. Segmente z naklonom v desno razvrsti v skupino levih črt in obratno.

Nato izračuna kolikšen je delež enih in drugih, delež obeh skupaj znaša 100 %. Če je delež obeh skupin črt večji od 20 %, program to razume kot da sta zaznani obe črti, torej leva in desna stran ceste. Če je enih črt več in drugih manj kot 20 %, to razume kot da je na cesti samo ena črta. Dodan je še dodaten korak, ki v primeru, da sta zaznani dve črti, preveri, ali se naklona razlikujeta za manj kot 30 %, in če se, to pomeni, da je program eno črto prepoznal kot dve črti. Do takšne situacije pride, ko avto zapelje čisto na črto in je v objektivu ena črta, vendar je ta debelejša (Slika 15). Vrednosti za pragove razvrščanja smo določili empirično.

Slika 15: Izračun povprečnega naklona in izris dveh stranskih črt in ne samo ene.

(30)

Končni dve črti (ali ena) sta torej na koncu definirani z naklonom in začetno vrednostjo. Ker nas zanimajo točke črt, smo dodali funkcijo, ki iz znanih podatkov izračuna začetno in končno točko stranskih črt. Točke so potrebne tudi za izris črt na zaslon (Slika 16). Zdaj, ko je program prepoznal, kako sta stranski črti obrnjeni sledi izračun kota zavijanja, ki je predstavljen v naslednjem podpoglavju.

Slika 16: Izračun povprečnega naklona in izris dveh stranskih črt.

3.2.5 Izračun kota zavijanja

Sledi funkcija, ki izračuna za kolikšen kot mora avtomobil zasukati sprednja kolesa, da bo držal smer linij. To lahko izračuna tako, da uporabi podatke iz prejšnje funkcije, in sicer točke črte, ki je izračunana iz povprečnega naklona in začetne vrednosti. Funkcija je napisana tako, da deluje drugače, če je zaznana samo ena črta, vedno pa upošteva x in y koordinato začetne in končne točke črt. Če je vidna samo ena črta, funkcija vzame x koordinato iz končne in iz začetne točke ter izračuna razliko. Ko sta vidni dve črti, program za določitev x koordinate prvo izračuna sredino med x koordinatama stranskih črt in ji odšteje polovico širine celotne slike. Koordinata y se v obeh primerih izračuna enako in je konstanta.

Skica izračuna je prikazana na Sliki 17.

Tako v vsakem primeru dobimo eno točko z dvema koordinatama. Ker lahko koordinate dobljene točke vzamemo tudi kot odmike od izhodišča, lahko s funkcijo tangens izračunamo kot za katerega mora avto zasukati kolesa. Ta kot iz radianov pretvorimo v stopinje in mu dodamo 90 stopinj, saj avto kot 90 stopinj razume kot vožnjo naravnost.

(31)

Slika 17: Primer izračuna kota zavijanja.

3.2.6 Stabilizacija kota zavijanja

Kot vožnje je potrebno stabilizirati oz. popravit zato, da avto ne zavija prehitro oziroma ves čas. Če tega ne bi naredili, avto ne bi nikoli vozil naravnost, ker bi se vedno »odbijal« od ene do druge črte. Funkcija je zapisana tako, da ima določeno maksimalno razliko kota, če sta vidni dve črti in maksimalno razliko, ko je vidna samo ena črta. Kot argument zahteva kot zavijanja v prejšnjem položaju avtomobila in kot zavijanja, izračunan za trenutni položaj, iz prejšnje funkcije. Prejšnjega odšteje od novega in če je razlika večja od maksimalne razlike, prejšnji kot popravi za podano maksimalno razliko oz. popravek. To omogoča, da avtomobil bolj rahlo zavija in da dlje časa lahko vozi naravnost, če je tako narejena trasa.

Sledi funkcija, ki je podobna funkciji za izris stranskih črt, vendar ta izriše glavno sredinsko črto (Slika 18).

Slika 18: Končna slika s stabiliziranim kotom zavijanja.

(32)

3.2.7 Razredi in vožnja

Sedaj ima program vse, kar potrebuje za uspešno vožnjo med črtama. Ker je programski jezik Python objektno orientiran, smo še vse funkcije povezali v nekaj metod in jih dodali v en razred. Naredili smo še nekaj funkcij za samo vožnjo avtomobila, kjer ima avto določeno kalibracijo vseh motorčkov, to pomeni, da smo avtomobilu določili, kako naj ima obrnjeno kamero, in hitrost vožnje. Hitrost vožnje je nastavljena na 20 %, zato se avtomobil vozi dokaj počasi, če bi bila nastavljena hitreje, avtomobil ne bi uspel obdelati vseh slik in vožnje med črtama ne bi bil zmožen. V ta del kode je povezan tudi razred za prepoznavanje linij, da lahko vse skupaj deluje. Koda se požene za vsako sliko, ki jo kamera posname, zato je dobro, da je čim hitrejša.

(33)

4 DISKUSIJA

Ključen del diplomske naloge je bil ustvariti delujočo in učinkovito kodo, ki avtomobilu omogoča samodejno vožnjo. Zato je bilo v to vloženega največ časa in ugotovitve izhajajo iz tega. Najprej bi omenili kamero, ki je ključna za zaznavo okolja pri tem modelu. Pri konceptu avtomobila naj bi bila kamera nameščena na sprednjem delu avtomobila, v sredini in dvignjena samo nekaj centimetrov od tal.

Že po prvih poizkusnih vožnjah, smo ugotovili, da je slika, ki jo vidi kamera, približno 30 cm pred vozilom. To pomeni, da je program zaznal ovinek, ko je bil le še 30 cm oddaljen od njega. Zato je avtomobil zavil prehitro in pred vsakim ovinkom zapeljal izven črt. Vožnje potem ni mogel nadaljevati, ker črt ni več videl. Na ravnem delu ceste je po nekaj korekcijah parametrov v kodi lahko vozil brez težav.

Težavo smo rešili tako, da smo kamero nekoliko dvignili in pomaknili proti sredini avtomobila. Ker avto ni imel možnosti premika kamere, smo v AutoCadu izrisali 3D model za podstavek za kamero, ki smo ga na Fakulteti za gradbeništvo in geodezijo s 3D tiskalnikom natisnili. Na podstavek smo pritrdili samo motorček za premikanje pogleda kamere v navpični smeri. Podstavek lahko kamero drži na višini 20 cm od tal, zato mora biti nekoliko nagnjena navzdol, da lahko zazna črte, ki so tik pred avtomobilom.

S tem smo težavo rešili in ugotovili, da je položaj senzorja zelo pomemben, saj je od tega odvisno, koliko in kakšne informacije program dobi.

Pri kameri sta pomembna tudi ločljivost, kot gledanja in osveževanje slike. Ločljivost je bila na kameri dovolj dobra, saj se na sliki jasno vidijo črte. Avto bi lahko izboljšali, če bi imeli kamero s širšim kotom gledanja, saj nam tako ne bi bilo treba narediti podstavka, ker bi kamera videla že dovolj.

Zelo pomemben del avtonomnega vozila je tudi računalnik oz. enota, ki obdela in združi vse podatke.

V našem primeru je bila to računalnik RaspberryPi 4, ki ima na voljo 8 Gb delovnega pomnilnika. To je bilo za naš primer dovolj, saj ni bil nikoli zaseden celoten prostor pomnilnika. Če pa bi bilo na avtomobilu več senzorjev ali zmogljivejša kamera, 8 Gb ne bi bilo dovolj za uspešno obdelavo vseh podatkov.

Uspešnost vožnje med črtama, je odvisna tudi od objektov ob črti. Če je ob črti objekt, ki nima nobenega modrega odtenka oz. odtenka, ki ga avto lahko zazna, potem ga program ne prepozna. Problem nastane, če je v bližini objekt, ki je modre barve ali pa, če se od objekta odbija svetloba od drugega modrega predmeta v sobi. Potem se program nekoliko zmede in se lahko zgodi, da zapelje s ceste v smeri objekta.

(34)

»Ta stran je namenoma prazna.«

(35)

5 ZAKLJUČEK

V diplomski nalogi smo do dobra spoznali, zakaj na cesti še ni avtonomnih vozil. Velika prepreka je še vedno tehnologija, ki s svojo ceno preprečuje masovno proizvodnjo avtonomnih vozil. Na to ni pripravljena niti cestna infrastruktura, ki bi za avtonomno vožnjo lahko bila drugačna, prilagojena vozilu in ne več vozniku. Poleg tehnologije potrebujemo še izpopolnjeno programsko opremo, ki bi vse skupaj povezovala in delala brez napak. Na vse zadnje, mora biti tudi človek pripravljen na avtonomno vožnjo, to pomeni, da mora vozilu popolnoma zaupati in imeti urejeno pravno podlago za vožnjo avtonomnih vozil.

Programska oprema mora biti izpopolnjena, saj vedno drugačne situacije položaja avtomobila glede na smer črt, vodijo do tega, da napisana koda ne deluje kot bi morala. Tudi ko program že nekajkrat popraviš, bo avto slej kot prej prišel na tak kot opazovanja črte, da smeri vožnje ne bo prepoznal tako kot bi jo moral in bo zapeljal izven ceste. Pri pravih avtomobilih, kjer so dodani še ostali senzorji, se to lahko zgodi še prej, zato mora biti program napisan še bolje. Vsi senzorji morajo biti zelo natančni in imeti dovolj dobro ločljivost, da lahko brez dvoma prepoznajo vse objekte. Senzorjev mora biti dovolj in biti morajo pravilno nameščeni, da lahko delujejo optimalno.

Razvoj prvega popolnoma avtonomnega vozila se nadaljuje, vendar mislim, da ga še kar nekaj let ne bo na cesti. Kljub temu, da skoraj vsakodnevno kakšno podjetje napove oz. proizvede novejši, boljši in zmogljivejši avtomobil, je do izdelave avtomobila na 5. stopnji avtonomne vožnje še daleč. Trenutno je večina najnaprednejši avtomobilov na cesti še vedno na 2. stopnji, pojavljajo pa se avtomobili, ki so med drugo in tretjo stopnjo, saj imajo samo nekaj asistenčnih sistemov takšnih, ki se uvrščajo v tretjo stopnjo [17].

Problem, ki ga predstavlja uvedba avtonomnih vozil, še zdaleč ni samo tehnološki, ampak tudi pravni.

Preden bodo narejeni takšni avtomobili, morajo države sprejeti potrebno zakonodajo, da se avtonomna vozila pri njih lahko vozijo. Odločiti se morajo tudi glede tega, kdo bo v nesreči prevzel krivdo, kar ne bo lahka odločitev. Ker smo v promet vključeni tudi ljudje, morajo biti avtonomna vozila še toliko bolj zanesljiva in razvoj naj traja še toliko časa, da bomo v prometu lahko vsi popolnoma varni.

(36)

»Ta stran je namenoma prazna.«

(37)

6 VIRI

[1] Statistični urad RS. SiStat. SURS. 2020.

https://pxweb.stat.si/SiStat/sl/Podrocja/Index/48/transport. (9. 6. 2021.)

[2] Schmidt, A. E., Schrauf, M., Simon, M., Fritzsche, M., Bruchner, A., W. E. Kincses, E. W.

2009. Drivers' misjudgement of vigilance state during prolonged monotonous daytime driving.

Accident Analysis and Prevention, št. 41, str. 1087-1093.

[3] National Center for Statistics and Analysis. 2015. Critical reasons for crashes investigated in the national motor vehicle crash causation survey. National Highway Traffic Safety

Administration. Washington DC.

[4] Subramanian, M. R., Linkedh, S., Haritha, S., Janani, V. 2021. Sensors in Autonomous Cars, International jurnal of advanced engineering science and information technology, Izv. 5, št. 5, str. 22-28.

[5] Du, H., Zhu, G., Zheng, J. Why travelers trust and accept self-driving cars: An empirical study. Travel Behaviour and Society. Izv. 22, str. 1-9, 2021.

[6] Hecht, J. 2018. Optics and photonics news. Lidar for self-driving cars. str. 26-33.

[7] Pirman, G. AvtoMoto. siol.net. 2018. https://siol.net/avtomoto/zgodbe/to-je-pet-stopenj- avtomobilske-samostojne-voznje-457861. (8. 7. 2021.)

[8] Shapiro, D. 2008. Three anecdotes from the DARPA autonomous land vehicle project. AI Magazine. Izv. 29, št. 2, str. 40.

[9] Levinson, J., Askeland, J., Becker, J., Dolson, J., Held, D., Kammel, S., Kolter, J. Z., Langer, D., Pink, O., Pratt, V., Sokolsky, M., Stanek, G., Stavens, D., Teichman, A., Werling, M., Thrun, S. IEEE Xplore, Towards fully autonomous driving: Systems and algorithms. 2011.

https://ieeexplore.ieee.org/document/5940562. (10. 8. 2021.) [10] Oštir, K. 2006. Daljinsko zaznavanje. Ljubljana: ZRC.

[11] Salman, D. Y., Ku-Mahamud, R. K., Kamioka, E. 2017. Distance measurement for self- driving cars using stereo camera. 6th Internacional Conference on Computing and Informatics.

Kuala Lumpur.

[12] University of California. 2020. Upgraded radar can enable self-driving cars to see clearly no matter the weather. Science Daily. San Diego.

[13] Jost, D. 2019. What is Ultrasonic sensor?. Fierce electronics. Framingham.

[14] Singh, A. N., Borschbach, M. 2017. Effect of External Factors on Accuracy of Distance Measurement using Ultrasonic Sensors. International Conference on Signals and Systems.

Bali.

[15] G. U. R. S. Geodetska uprava – GNSS. Ministrsvo za okolje in prostor. https://gu- signal.si/gnss/. (16. 8. 2021.)

[16] Education, C. Artificial Intelligence. IBM. 2020. https://www.ibm.com/cloud/learn/what-is- artificial-intelligence. (16. 8. 2021.)

[17] Petrie, G. Best self-driving cars. Heycar. London. 2021.

(38)

[18] LeddarTech. 3D Flash LiDAR Fundamentals. YouTube. 2021.

https://www.youtube.com/watch?v=Gg-K7SZXhFQ (26.8. 2021.)

[19] Natale, J. D., Tutwiler, L. R., Baran, S. M., Durkin, R. J. 2010. Using full motion 3D Flash LIDAR video for target detection, segmentation, and tracking. 2010 IEEE Southwest Symposium on Image Analisys & Interpretation (SSIAI). Austin.

[20] Slika 1: https://www.autodrivetech.com/solutions/automotive-oems/ (6.7.2021) [21] Slika 2:

https://media.wired.com/photos/598502fbcb6c5a3d07a017ac/master/w_2400,h_1800,c_limit/

CarSensors-Inline.jpg (20.8.2021)

[22] Slika 3: https://roboticsandautomationnews.com/wp-content/uploads/2021/01/nvidia-drive- lidar-1.png (20.8.2021)

[23] Slika 4: https://cleantechnica.com/files/2020/06/Tesla-Autopilot-What-It-Sees-SIgns-Water- Road.png (20.8.2021)

[24] Slika 5: https://www.all-electronics.de/files/upload/post/all/wp- content/uploads/2020/09/Bild3.jpg (20.8.2021)

[25] Slika 6: https://analyticsindiamag.com/wp-

content/uploads/2020/06/1_NP4Xtj6Q8zeo5UxA3dEgzw.jpeg (20.8.2021) [26] Slika 7: https://geospatialmedia.s3.amazonaws.com/wp-

content/uploads/2017/08/pointcloud.png (20.8.2021)

(39)

Krmilni program import cv2

import numpy as np import logging import math

from datetime import datetime

from scipy.cluster.vq import kmeans, vq, whiten

def detect_line(frame):

global lane_lines, line_segments, lane_lines_image logging.debug('Zaznavanje črt...')

edges= detect_edges(frame)

cropped_edges = region_of_interest(edges) line_segments = detect_line_segments(cropped_edges) line_segment_image = display_lines(frame, line_segments) lane_lines = average_slope_intercept(frame, line_segments)

lane_lines_image = display_lines(frame, lane_lines, line_width=10) return lane_lines, lane_lines_image

def detect_edges(frame):

global edges, mask

hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) show_image("hsv", hsv)

lower_blue = np.array([60, 40, 40]) upper_blue = np.array([150, 255, 255])

mask = cv2.inRange(hsv, lower_blue, upper_blue) edges = cv2.Canny(mask, 200, 400) return edges

def region_of_interest(edges):

global cropped_edges

height, width = edges.shape mask = np.zeros_like(edges) polygon = np.array([[

(0, height * 0.30),

(40)

(width, height * 0.30), (width, height),

(0, height), ]], np.int32)

cv2.fillPoly(mask, polygon, color=[255,0,40]) cropped_edges = cv2.bitwise_and(edges, mask)

return cropped_edges

def detect_line_segments(cropped_edges):

global line_segments

rho = 1 angle = np.pi / 180 min_treshold = 10 line_segments = cv2.HoughLinesP(cropped_edges, rho, angle, min_treshold, np.array([]), minLineLength = 8, maxLineGap= 4) return line_segments

def average_slope_intercept(frame, line_segments):

height, width = 480, 640 seg_tresh = 0.2

slo_tresh = 0.3

lane_lines = []

left_fit = []

right_fit = []

np_ls = np.array(line_segments) np_ls = np_ls[:, 0, :]

filter = np.where(np_ls[:, 0] == np_ls[:, 2]) np_ls = np.delete(np_ls, filter, axis=0)

x1 = np_ls[:, 0]

y1 = np_ls[:, 1]

x2 = np_ls[:, 2]

(41)

y2 = np_ls[:, 3]

dy = (y2 - y1) dx = (x2 - x1) slope = dy / dx

seg_xs = np.column_stack(((x1 + x2) / 2, slope)) seg_xs

centroids, _ = kmeans(seg_xs, 2)

clx, _ = vq(seg_xs, centroids)

left_fit = np_ls[clx == 0, :]

right_fit = np_ls[clx == 1, :]

seg_l = len(left_fit) / (len(left_fit) + len(right_fit)) seg_r = len(right_fit) / (len(left_fit) + len(right_fit)) x_range = range(width)

if seg_l > seg_tresh:

x = np.concatenate((left_fit[:, 0], left_fit[:, 2]), axis=0) y = np.concatenate((left_fit[:, 1], left_fit[:, 3]), axis=0) fit_poly = np.polyfit(x, y, 1)

lane_lines.append(make_points(frame,fit_poly))

if seg_r > seg_tresh:

x = np.concatenate((right_fit[:, 0], right_fit[:, 2]), axis=0) y = np.concatenate((right_fit[:, 1], right_fit[:, 3]), axis=0) fit_poly = np.polyfit(x, y, 1)

lane_lines.append(make_points(frame,fit_poly))

x = np.concatenate((x1, x2), axis=0) y = np.concatenate((y1, y2), axis=0)

if len(lane_lines) == 2:

slope_dist = abs( (lane_lines[1][0][3]-

lane_lines[1][0][1])/(lane_lines[1][0][2]-lane_lines[1][0][0]) -

(42)

(lane_lines[0][0][3]-

lane_lines[0][0][1])/(lane_lines[0][0][2]-lane_lines[0][0][0])) if slope_dist < slo_tresh:

lane_lines = []

fit_poly = np.polyfit(x, y, 1)

lane_lines.append(make_points(frame,fit_poly))

return lane_lines

def display_lines(frame, lines, line_color=(0,255,0), line_width=5):

line_image = np.zeros_like(frame)

if lines is not None:

for line in lines:

for x1, y1, x2, y2 in line:

cv2.line(line_image, (x1, y1), (x2,y2), line_color, line_width)

else:

print("matrika je prazna")

line_image = cv2.addWeighted(frame, 0.8, line_image, 1,1) show_image("proba", line_image)

return line_image

def make_points(frame, line):

height, width, _ = frame.shape slope, intercept = line

y1 = height y2 = int(y1 * 0.33) v

x1 = max(-width, min(2* width, int((y1-intercept) / slope))) x2 = max(-width, min(2* width, int((y2-intercept) / slope))) return [[x1, y1, x2, y2]]

def compute_steering_angle(frame, lane_lines):

global steering_angle if len(lane_lines) == 0:

logging.info('Ni bilo zaznane črte') return -90

height, width, _ = frame.shape

(43)

if len(lane_lines) == 1:

logging.debug('Zaznana samo ena črta. Ji sledi. %s' % lane_lines[0]) x1, _, x2, _ = lane_lines[0][0]

x_offset = x2- x1

else:

_, _, left_x2, _ = lane_lines[0][0]

_, _, right_x2, _ = lane_lines[1][0]

camera_mid_offset_percent = 0.02 mid = int(width / 2 * (1 + camera_mid_offset_percent)) x_offset = (left_x2 + right_x2) / 2 - mid

y_offset = int(height / 2)

angle_to_mid_radian = math.atan(x_offset / y_offset) angle_to_mid_deg = int(angle_to_mid_radian * 180 / math.pi) steering_angle = angle_to_mid_deg + 90

logging.debug('nov kot vožnje: %s' % steering_angle) return steering_angle

def stabilize_steering_angle(curr_steering_angle, new_steering_angle, num_of_lane_lines, max_angle_deviation_two_lines=5,

max_angle_deviation_one_lane=1):

if num_of_lane_lines == 2:

max_angle_deviation = max_angle_deviation_two_lines else:

max_angle_deviation = max_angle_deviation_one_lane

angle_deviation = new_steering_angle - curr_steering_angle if abs(angle_deviation) > max_angle_deviation:

stabilize_steering_angle = int(curr_steering_angle + max_angle_deviation * angle_deviation / abs(angle_deviation))

else:

stabilize_steering_angle = new_steering_angle

logging.info('Prejšnji kot; %s, Stabiliziran kot: %s' % (new_steering_angle, stabilize_steering_angle))

(44)

return stabilize_steering_angle

def display_heading_line(frame, steering_angle, line_color=(0,0,255), line_width=20):

heading_image = np.zeros_like(frame) height, width, _ = frame.shape

steering_angle_radian = steering_angle / 180 * math.pi x1 = int(width / 2 )

y1 = height

x2 = int(x1 - height / 2 / math.tan(steering_angle_radian)) y2 = int(height / 3)

cv2.line(heading_image, (x1,y1), (x2,y2), line_color, line_width) glavna_crta = cv2.addWeighted(frame, 0.8, heading_image, 1,1) show_image('Glavna crta', glavna_crta)

return glavna_crta

(45)

Program za avtonomno vožnjo import logging

import picar import cv2 import datetime

from lane_detection_nova1 import HandCodedLaneFollower

class DeepPiCar(object):

__INITIAL_SPEED = 0 __SCREEN_WIDTH = 960 __SCREEN_HEIGHT = 720

def __init__(self):

logging.info('Creating a DeepPiCar...') picar.setup()

logging.debug('Set up camera') self.camera = cv2.VideoCapture(-1) self.camera.set(3, self.__SCREEN_WIDTH) self.camera.set(4, self.__SCREEN_HEIGHT) self.pan_servo = picar.Servo.Servo(1) self.pan_servo.offset = -10

self.pan_servo.write(90)

self.tilt_servo = picar.Servo.Servo(2) self.tilt_servo.offset = 10

self.tilt_servo.write(90)

logging.debug('Set up back wheels')

self.back_wheels = picar.back_wheels.Back_Wheels() self.back_wheels.speed = 0

logging.debug('Set up front wheels')

self.front_wheels = picar.front_wheels.Front_Wheels() self.front_wheels.turning_offset = -10

self.front_wheels.turn(90)

self.lane_follower = HandCodedLaneFollower(self) self.fourcc = cv2.VideoWriter_fourcc(*'XVID')

datestr = datetime.datetime.now().strftime("%y%m%d_%H%M%S")

self.video_orig = self.create_video_recorder('../data/tmp/car_video%s.avi'

% datestr)

self.video_lane =

self.create_video_recorder('../data/tmp/car_video_lane%s.avi' % datestr)

(46)

self.video_objs =

self.create_video_recorder('../data/tmp/car_video_objs%s.avi' % datestr) logging.info('Created a DeepPiCar')

def create_video_recorder(self, path):

return cv2.VideoWriter(path, self.fourcc, 20.0, (self.__SCREEN_WIDTH, self.__SCREEN_HEIGHT))

def __enter__(self):

return self

def __exit__(self, _type, value, traceback):

if traceback is not None:

logging.error('Exiting with statement with exception %s' % traceback) self.cleanup()

def cleanup(self):

logging.info('Stopping the car, resetting hardware.') self.back_wheels.speed = 0

self.front_wheels.turn(90) self.camera.release() self.video_orig.release() self.video_lane.release() self.video_objs.release() cv2.destroyAllWindows()

def drive(self, speed=__INITIAL_SPEED):

logging.info('Starting to drive at speed %s...' % speed) self.back_wheels.speed = speed

i = 0

while self.camera.isOpened():

_, image_lane = self.camera.read() image_objs = image_lane.copy() i += 1

self.video_orig.write(image_lane)

image_lane = self.follow_lane(image_lane) self.video_lane.write(image_lane)

show_image('Lane Lines', image_lane) if cv2.waitKey(1) & 0xFF == ord('q'):

(47)

self.cleanup() break

def follow_lane(self, image):

image = self.lane_follower.follow_line(image) return image

def show_image(title, frame, show=_SHOW_IMAGE):

if show:

cv2.imshow(title, frame)

def main():

with DeepPiCar() as car:

car.drive(20)

if __name__ == '__main__':

logging.basicConfig(level=logging.DEBUG, format='%(levelname)-5s:%(asctime)s:

%(message)s')

main()

Reference

POVEZANI DOKUMENTI

Naloga ima enolično rešitev, vendar pogoji niso potrebni (vsaj en pogoj bi lahko izpustili in bi naloga še vedno imela enolično rešitev).. Naloga ima enolično rešitev in pogoji

Naloga ima enolično rešitev, vendar pogoji niso potrebni (vsaj en pogoj bi lahko izpustili in bi naloga še vedno imela enolično rešitev).. Naloga ima enolično rešitev in pogoji

Naloga ima enolično rešitev, vendar pogoji niso potrebni (vsaj en pogoj bi lahko izpustili in bi naloga še vedno imela enolično rešitev).. Naloga ima enolično rešitev in pogoji

Naloga ima enolično rešitev, vendar pogoji niso potrebni (vsaj en pogoj bi lahko izpustili in bi naloga še vedno imela enolično rešitev).. Naloga ima enolično rešitev in pogoji

Naloga ima enolično rešitev, vendar pogoji niso potrebni (vsaj en pogoj bi lahko izpustili in bi naloga še vedno imela enolično rešitev).. Naloga ima enolično rešitev in pogoji

Naloga ima enolično rešitev, vendar pogoji niso potrebni (vsaj en pogoj bi lahko izpustili in bi naloga še vedno imela enolično rešitev).. Naloga ima enolično rešitev in pogoji

V poskusu, kjer smo uporabili mešanico različnih preučevanih snovi, smo vzeli razmerje 1:1 in naredili mešanice vseh snovi: apnena moka+zeolit, apnena moka + apneni

Od 8 vzorcev, kjer smo RNK norovirusov določili z začetnimi oligonukleotidi JV12Y in JV13I, samo v enem primeru nismo določili RNK norovirusov z drugim parom začetnih