Statikus gyalogos az út közepén, egy kis "csalással" a rewardolás közben, imitation learning-es beütéssel.
- Minden 5. epizódban nem a neurális hálózat irányít, hanem egy előre leprogramozott gyalogoskikerülő
- Zaj frekvenciájának csökkentése az által, hogy csak minden 15. lépésben változik a zaj mértéke. Ezzel konzisztensebb viselkedést lehet elérni
- Zaj csak akkor adódik hozzá az akcióhoz, ha a gyalogos látótávolságban van
- Gyalogos észlelése 8 és 18 méteres távolság között
- Neurális háló beállítása
- TD3, tehát 1 actor, 2 critic
- Carla indítása
- Epizód indítása
- Kezdeti állapot feltöltése 0-kkal
- Lépések:
- 15 lépésenként új zaj, csak akkor, ha a gyalogos látótávon belül van
- Step az akciók alapján
- bufferhez való hozzáadás
- (esetleg a szimmetrikus állapotok hozzáadása, ebben a verzióban nem kell, mert csak balra kerüli ki az autó a gyalogost)
- Tanulás, minden második lépésben a hálók frissítése
- Epizód befejezése
- Minden 3. lépés után a háló elmentése külön mappába
- Epizód főbb tulajdonságainak fájlba írása
- Újraindítás
- spect_cam:
- a kameraállás beállítása (12 méterrel az autó felett, felülnézetből)
- start2:
- kliens beállítása, város betöltése, megjelenítési és számítási beállítások, spawn pont beállítása, gyalogos észlelési távolságának random beállíása
- kill:
- actor-ok törlése
- collevent:
- akkor hívódik meg, ha ütközést észlel a Carla. Ha a gyalogossal ütközik, igaz-ra állít egy változót (collosion_with_ped)
- setup_car:
- alapból hamisra állítja a collosion_with_ped változót
- beállítja a járművet (Audi E-Tron)
- beállítja az ütközés szenzort
- beállít néhány változót, ami fontos lesz (út szélessége, sáv ID-je, autó sebessége, gyalogos látható-e)
- setup_pedestrian:
- megpróbálja inicializálni a gyalogost, és elindítani
- lerakja egy fix pontban
- rendel hozzá egy sebességet úgy, hogy az autó elüsse
- ez a rész enyhén bug-os a Carla-ban, ezért try-except-tel kellett megoldani, néha nem engedi elindítani a gyalogost
- braking_distance:
- kiszámolja a gyalogos távolságának és az adott sebességnél való féktáv hányadosát
- itt nem használjuk
- ped_sensor:
- kiszámolja az autó és a gyalogos távolságát és szögét
- az autó helyzetéhez hozzáad 2.5 métert, mert az autó közepét veszi alapból, nem pedig az elejét
- ha 0 a távolság, akkor 0.001-et ad meg, hogy ne legyen probléma a 0-val való osztással
- mert a távolság reciprokát adja meg (hogy amikor a gyalogos nem látszik, akkor lehessen 0-t adni a távolságértéknek)
- snap_to_s_t:
- a world_snapshotot neurális háló számára elfogadható bemenetté alakítja
- world snapshotból kinyeri az autó és a gyalogos snapshotját
- számol sávhibát, szöghibát, x és y irányú sebességet, legyezési szögsebességet, x és y irányú gyorsulást, gyalogos távolságot és szöget
- mivel a road_waypoint-nál az autó tartózkodási sávjának közepére vetíti az autót, ezért ha nem a saját sávjában van, akkor addig változtatja az y értéket, amíg az autó eredeti sávjába nem esik, és azt vetíti le sávközépre
- ha ez nem lenne, akkor a szembejövő sáv közepénél is 0 sávhibát adna
- automated_drive:
- egy sima kontroller, ami az autót sávközépen tartja és sebességet tart
- ha a brakes paraméter True, akkor az y irányú sebességet is próbálja egy bizonyos értéken tartani (hogy kanyarokban ne sodródjon ki)
- ha az avoid paraméter True, akkor kikerüli a gyalogost úgy, hogy az ellenkező sáv közepére próbál tartani (statikus gyalogos esetén)
- visszaadja a jármű irányítási értékeit
- throttlecontrol:
- sebességtartó, tempomat
- step:
- frissíti a amera helyzetét, snapshotot csinál, eldönti, hogy automatán vezessen-e a jármű, rewardot számol és eldönti, hogy vége legyen-e az epizódnak
- minden 5. epizódnál automatán vezet
- ha 10 méternél közelebb van a gyalogoshoz, akkor a másik sávba tart, de ha 8 méternél közelebb, visszatérne a saját sávjába (így tudja pont kikerülni a gyalogost) (csak automata üzemmódban)
- beállítja a sebességfokozatot
- rewardot számol
- ugyanaz a reward, mint a TORCS-ban, csak minél közelebb van a gyalogoshoz, annál inkább kisebb szorzóval
- ha nagyon közel van, akkor -1-hez közelít a szorzó, így a saját sávjában negatív jutalmat kap, azonban ha elkezd átmenni a másik sávba, akkor pozitívat
- epizódok végén ha nekimegy valaminek, vagy nagy a sávhíba, vagy visszafordulna, akkor -10-et kap
- ha kikerülte a gyalogost, és utána megy neki valaminek, akkor 10-et kap
- ha elütötte, akkor -100 -at
- ha kikerülte és nem ütközött, akkor 100*cos(szöghiba)*szigmoid(sávhiba)
- a szigmoid függvény 1-et ad, ha a sávhiba 0, és 0-t ad, ha nagy
- a "csalás": mivel tudom, hogy az út vektorának iránya (-1,0,0), és a gyalogos is fix helyen jelenik meg, csak az észlelési távolsága változik, ezért nem a gyalogoshoz viszonyítom az autó helyzetével kapcsolatos rewardokat, hanem az autó koordinátáit használom.
A jármű szépen, egyenesen halad, azonban felemás eredményeket hoz. Volt olyan még egy előző jutalomrendszerrel, hogy kikerülte a gyalogost, visszatért a sávjába, de nem kormányzott egyenesbe elég hamar, és nekiment egy oszlopnak. Volt olyan, hogy már sokkal korábban átment a szembejövő sávba, mint indokolt lett volna. Olyan is volt, hogy szépen kikerülte 7-800 epizód után, de utána ugyanúgy nekiment a gyalogosnak. Azért statikus még a gyalogos, mert elképzeléseim szeirnt ha ezt ki tudja kerülni, akkor valszeg a sétáló gyalogost is. Ugyanúgy, mint ahogy először egyenesen menni tanítottam meg a járművet, most statikus gyalogost kikerülni, aztán ha azt tudja, akkor sétáló gyalgost is. A neurális hálób bemeneti és kimeneti dimenziójával nincsen probléma, mert azt szabadon tudom szerkeszteni. Egyenesen menni 7 dimenzióval tanult meg, utána a súlyokat magában foglaló .h5 fájban a táblázatba hozzáadtam még két oszlopot, és 10-20 epizódnyi tanulás után ugyanúgy ment egyenesen, kis megingás után.
A gyalogos távolsága és szöge helyett az autóhoz viszonyított x és y irányú koordinátái kellenek. Ugyanis jelen helyzetben ha lát egy gyalogost a szembesávban, akkor is a szembesávba próbál majd áttérni. Így a jutalmazást sem a gyalogoshoz mért távolsággal kell majd megoldani, hanem a gyalogos x és y irányú távolságával (nagy x irányú távolság --> y irányú távolság mindegy, csak maradjon sávközépen, kis x irányú távolság --> nagy y irányú távolság a kívánt, mert ki akarjuk kerülni. Ez a ma esti projekt.)