DOKUMENTACIJA IZVEDENIH LASTNOSTI - Jasa132/Projektni-pratikum-Gaseri Wiki

1 Krmiljenje vozila in glavno vozlišče

1.1 Namen implementacije

Namen implementacije je seznanitev s Carla simulatorjem in priprava glavnega vozlišča, ki bo kasneje povezovalo vse funkcionalnosti, ki jih bomo uspeli implementirati pri ostalih predmetih. Prav tako je namen implementacije narediti program s katerim bodo lahko uporabniki aplikacije krmilili vozilo.

1.2 Način implementacije

Za implementacijo smo uporabili programski jezik Python.

1.2.1 Koraki pri izvedbi implementacije

  • Pregled in seznanitev z dokumentacijo simulatorja Carla (najdeno na naslovu: https://carla.readthedocs.io/en/latest/ )

  • Pregled skript, ki so bile pred pripravljene s strani razvijalcev Carla simulatorja

  • Ustvarjanje razreda Avtomobil v katerem bodo shranjeni vsi podatki glede upravljanega vozila, kot so senzorji, ki so pripeti na vozilo, ime in id vozila, hitrost, naklon volana…

  • Priprava glavnega vozlišča

  • Priprava sveta in dodajanje avtomobila v simulacijo

  • Postavitev kamere, ki bo prikazovala naš avtomobil (sliko prikazujemo s pomočjo pygame)

  • Pisanje kode, ki bo omogočala, da bo naše vozilo lahko pospeševalo, zavijalo in zaviralo

  • Priprava glavne funkcije programa, ki bo skrbela za posodabljane simulacije in stanja dodanega vozila

  • Preizkušanje in popravljanje odzivnosti avtomobila pri pritisku na določeno tipko

1.3 Način uporabe

Vozilo lahko sedaj s pomočjo tipkovnice (WASD) premikamo po svetu. Kasneje bomo avtomobilu lahko dodajali tudi razne senzorje in druge funkcionalnosti, kot so prepoznava črt, znakov in vozil, preverjanje ali lahko avtomobil varno zamenja vozni pas, aktivni tempomat z možnostjo samostojnega in varnega prehitevanja.

2 Dodajanje senzorjev vozilu

2.1 Namen implementacije

Namen implementacije je dodajanje senzorjev vozilu, ki jih bomo kasneje uporabili za detekcijo vozil (RGB kamera), detekcijo prometnih znakov in detekcijo črt na vozišču, merjenje razdalje in opazovanje okolice… Prav tako bomo podatke, ki jih bomo iz senzorjev pridobili shranili (v obliki HDF5 datotek) in bodo kasneje lahko uporabljeni za analizo in pomoč pri pisanju programov in funkcionalnosti, tako iz strani razvijalcev, kot uporabnikov končne aplikacije.

2.2 Način implementacije

Implementacije smo se lotili tako, da smo najprej izbrali senzorje, ki smo jih želeli dodati našemu vozilu oziroma senzorje, ki so se nam zdeli za naš primer pomembni in bi jih morda lahko uporabiti v prihodnosti. Na začetku smo pripravili modul za en senzor (sprednjo RGB kamero), ki je omogočal zajem in pred obdelavo senzorski podatkov, ter shranjevanje zajetih podatkov in shranjevanje podatkov, ki opisujejo stanje vozila (hitrost, zaviranje, prestava, naklon volana…). Prvi modul nam je tako sodil, kot šablona za ostale module (zadnja RGB kamera, radar senzor in detektor ovir). Ko smo dodali vse željene senzorje in smo implementirali vse module smo implementirali še modul, ki lahko vizualizira zajete in shranjene podatke.

3.2.1 Koraki pri izvedbi implementacije:

  • Naslednje korake smo ponovili za različne senzorje (Sprednja RGB kamera, zadnja RGB kamera, radar senzor, detektor ovir):

  • Nastavitev atributov senzorja (se razlikuje za vsak dodan senzor)

  • Postavitev senzorja na vozilo (se razlikuje za vsak dodan senzor)

  • Zajem in obdelava podatkov, tukaj smo morali podatke, ki jih vračajo senzorji pretvoriti v nam poznano obliko, ki jo znamo kasneje tudi shraniti in vizualizirati (se razlikuje za vsak dodan senzor)

  • Shranjevanje senzorskih podatkov s pomočjo HDF5 formata

  • Shranjevanje podatkov, ki predstavljajo stanje vozila

Ko smo končali z implementacijo modulov za zajem in hrambo podatkov, smo implementirali še modul za vizualizacijo shranjenih podatkov:

  • Za vsak senzor smo napisali funkcijo, ki vizualizira pridobljene podatke. Na primer v primeru RGB kamer se predvaja video, ki ga je zajela kamera, v primeru radar senzorja pa se zajeti podatki predstavijo v obliki grafa. Za prikazovanje videa smo uporabili cv2, za izrisovanje grafov pa smo uporabili matplotlyb.

  • Napisali smo funkcijo, ki v obliki grafov predstavi podatke, ki so vezani na vozilo (hitrost, naklon volana, prestava…).

2.3 Način uporabe

Uporabnik oziroma razvijalec lahko sedaj vklopi posamezen senzor s pomočjo tipkovnice. Senzor bo nato začel s pridobivanjem podatkov, ti podatki se bodo obdelali in shranjevali v mapo Shranjeni_podatki. Nato pa lahko uporabnik te podatke vizualizira s pomočjo modula data_visualization.py in sicer na naslednji način:

python data_visualization.py -s [RGB_back/RBG_front/obstacle_d/radar]

3 Prepoznava vozil

3.1 Namen implementacije

Namen je implementirati detekcijo vozil iz RGB kamere. Prepoznava vozil nam bo kasneje služila kot orodje s pomočjo katerega bomo implementirali še ostalo logiko, kot je:

  • s pomočjo zaznave vozila pred seboj in globinske kamere bomo lahko izmerili razdaljo med našim vozilom in vozilom pred nami

  • implementacija PID krmilnika, ki bo upravljal s hitrostjo našega vozila glede na oddaljenost vozila pred nami (tako, da bo med voziloma vedno varnostna razdalja)

  • implementacija varnega prehitevanja

3.2 Način implementacije

Najprej smo se spoznali z različnimi načini kako bi lahko implementirali zaznavo vozil, (YOLO algoritem, knjižnici TensorFlow in PyTorch…). Za implementacijo smo se odločili za uporabo knjižnice TensorFlow, na začetku smo implementirali razpoznavo vozil iz slike, nato pa smo to nadgradili s prepoznavanjem iz posnetka.

3.2.1 Koraki izvedbe:

  • Spoznavanje z dokumentacijo YOLO, TensorFlow, in PyTorch

  • Uporaba knjižnice TensorFlow za implementacijo detekcije vozili (celotna koda je prikazana na slikah)

  • Pri implementaciji smo uporabili model: ssd_mobilenet_v1_coco_11_06_2017, ta model je bil izbran, saj njegova arhitektura zmanjšuje stroške računanja in je potrebna zelo nizka računalniška moč za izvajanje učenja.

  • Sledilo je le še testiranje delovanja detekcije v različnih vremenskih pogojih (WetSunset, HardRainNoon, HardRainSunset) in na različnih tipih in znamkah vozil.

3.3 Način uporabe

Detekcijo vozil lahko uporabnik uporabi s pritiskom na gumb na tipkovnici, pri tem se mu bo odprlo okno katero bo realno časovno predvajalo detekcijo vozil. Prav tako pa se bo detekcija uporabila skupaj s PID krmilnikom, tako da ko bomo zaznali avtomobil pred nami se bo vključil PID krmilnik.

4 PID krmilnik

4.1 Namen implementacije

Namen je implementacija PID krmilnika, ki bo upravljal s hitrostjo vozila na podlagi oddaljenosti od vozila pred nami. PID krmilnik se bo lahko vključil s pritiskom na tipko ali pa se bo vklopil avtomatsko, ko bo s pomočjo RGB kamere in detekcije vozil ugotovljeno, da se pred nami nahaja vozilo.

4.2 Način implementacije

4.2.1 Koraki implementacije

  • Seznanitev s tem kaj je PID krmilnik, kako in kje vse se lahko uporablja in kako bi ga lahko implementirali

  • Implementacija PID krmilnika (koda je vidna na spodnjih slikah)

  • Preizkušanje PID krmilnika na različnih vremenskih pogojih (ClearNoon, WetNoon, MidRainyNoon, HardRainNoon)

  • Preizkušanje in nastavljanje koeficientov, ki določijo kako močno se naj upošteva posamezen del(P, I in D)

4.3 Način uporabe

Uporabnik lahko s pritiskom na gum vklopi PID krmilnik, ki bo uspešno sledil vozilu pred nami na določeni razdalji. Krmilnik se lahko prav tako vklopi avtomatsko, ko je pred našim vozilom zaznano drugo vozilo.

5 Varna menjava voznega pasu s pomočjo lidar senzorja

5.1 Namen implementacije

Namen je implementirati program, ki bo s pomočjo semantičnega lidar senzorja lahko zaznal ali se v okolici našega vozila nahajajo ostala vozila, in ali je možno varno menjati vozni pas. To funkcionalnost bomo kasneje uporabili pri implementaciji varnega prehitevanja vozil na avtocesti.

5.2 Način implementacije

5.2.1 Koraki implementacije

  • Preverjanje Carla dokumentacije o delovanju semantičnega lidar senzorja

  • Iz množice točk, ki nam jih vrne lidar senzor smo izločile samo tiste, ki nas zanimajo (torej točke, ki predstavljajo vozila)

  • Te točke smo nato s pomočjo DBSCAN algoritma, združili v skupine, ki predstavljajo vozila, ki se nahajajo v naši okolici

  • Nad pridobljenimi točkami, smo izračunali konveksne lupine, to smo storili, da smo se znebili nepotrebnih točk in v nadaljevanju nepotrebnega računanja

  • Okoli našega avtomobila smo postavili BBox in preverili ali je katera izmed dobljenih množic točk znotraj BBox-a

  • Glede na to ali je kakšna točka v BBox-u ali ne se lahko odločimo ali lahko vozilo varno zamenja vozni pas ali ne

5.3 Način uporabe

Uporabnik lahko vklopi funkcionalnost s pritiskom na tipko -> l, potem pa lahko s tipkama 4 in 6 preveri ali lahko avto varno menja vozni pas v levo (4) ali v desno(6).

6 Detekcija voznega pasu

6.1 Namen implementacije

Namen je implementirati modul, ki bo sprejemal podatke iz RGB kamere, jih obdelal ter vrnil sliko z zaznanimi robovi voznega pasu. Ta implementacija bo v prihodnje služila za ohranjanje vozila znotraj vozišča v času vožnje.

6.2 Način implementacije

6.2.1 Koraki implementacije

  • Preverjanje Carla dokumentacije o delovanju RGB kamere

  • Sliko iz carla_image formata pretvorimo v RGB

  • Iz RGB smo sliko pretvorili v črno-belo za boljšo izostritev črt

  • Določimo območje, ki ga želimo obdelati(ne želimo celotne slike vendar samo to kaj je pred vozilom)

  • Nad črno-belo sliko izvedemo canny-edge postopek, ki nam vrne želene črte

  • Črte nato prelepimo nad začetno sliko

6.3 Način uporabe

Uporabnik lahko vklopi funkcionalnost s pritiskom na tipko -> B, pri tem se odpre novo okno, ki izrisuje sliko posneto z RGB kamereo na kateri so vidne črte vozišča.

7. Detekcija in prepoznava znakov

7.1 Namen implementacije:

Name je implementirati zaznavanje in prepoznavanje prometnih znakov ob in na cestišču s pomočjo RGB kamere. Prepoznane znake bomo uporabili za implementacijo logike prilagajanja hitrosti med vožnjo.

7.2 Način implementacije:

Prvi korak pri implementaciji je bil razumevanje in poznavanje orodij in knjižnic s katerimi bomo programirali (Darknet, YOLO, TensorFLow …). Za zaznavanje prometnih znakov smo uporabili knjižnice TensorFlow in Keras.

Najprej smo naredili svoj model za prepoznavo znakov. Za to smo morali najti zbirko slik prometnih znakov s katerimi bomo učili in preverjali model. Ustvarjen model smo shranili in ga kasneje uporabili pri prepoznavi. V drugi skripti smo najprej prepoznali, da vsebuje znak, ter osamili zaznan znak za lažjo obdelavo nato pa s pomočjo ustvarjenega modela prepoznali za kateri znak gre. Nato pa glede na zaznano hitrost iz znaka tudi prilagodili hitrost vožnje avta. Na primer, če je zaznan znak omejitev 70 km/h bo avtomobil postopoma pospešil na to hitrost ali pa upočasnil, če je vozil hitreje.

8.2.1 Koraki izvedbe:

  • Iskanje in spoznavanje dokumentacije (Yolo, Darknet, Keras)

  • Iskanje slik za učenje modela za prepoznavo

  • Uporaba zbirke slik in izdelava modela

  • Uporaba knjižnic Keras in TensorFlow za prepoznavo in zaznavo prometnih znakov

  • Dodajanje funkcionalnosti za prilagajanje hitrosti glede na zaznan znak

7.3 Način uporabe:

Ob zagonu skripte bo program naložil potrebno in začel z prepoznavo znakov ob cestišču in izpisoval zaznano.