Nejaky projekt - moje meno

From RoboWiki
Revision as of 00:03, 26 June 2017 by Robot (talk | contribs) (Realizácia projektu)
Jump to: navigation, search

Cieľ projektu

Cieľom projektu je vytvoriť štvornohého robota ktorý sa za pomoci Deep Q-Network naučí chodiť dopredu.

Realizácia projektu

Hardware

Na zostrojenie robota boli použité nasledovné časti:

  • Arduino Uno R3
  • 4x micro servo
  • Ultrasonický senzor na meranie vzdialenosti HC-SR04
  • Držiak batérií AA 4x
  • 4x NiHm batéria(1.2V, 2300 mah)
  • mini breadboard + vodiče na prepojenie jednotlivých častí


Vizualizácia obvodu je nasledovna

BugBox Schematics.png

Schéma zapojenia nie je zložitá a preto nie je problém robota zostrojiť. Za povšimnutie stojí, že môže dochádzať k interferencii signálov jednotlivých servo motorov čo sa v realite prejavý občasným trhnutím serva. Tento problém je možné odstrániť jednoduchov izoláciou vodičov, na ktorú možno použit napr. obyčajný alobal(hliníkovú fóliu). Taktiež je potrebné aby napätie batérií odpovedalo potrebnému napätiu servo motora a aby batérie boli schopné dodať prúd štyrom, plne zaťaženým, servo motorom.

Ukážka zostrojeného robota

BugBox 2000.jpg

Hardvérová realizácia má však niekoľko nedostatkov. Pretože tvar džiaka batérií nedovolil ich umiestnenie nikam inam než dopredu k ultrasonickému senzoru, ťažisko robota je vpredu čo sa odrazí na nájdení optimálnej chôdze. Ďalej nôžky robota sú od seba výškovo vychýlené o niekoľko mm čo takiež môže pozmeniť finálny výsledok.

Software

Na realizáciu softvérovej časti použijeme Deep Q-Network. Jedná sa o spojenie reinforcement learning algoritmu Q-learning a neurónovej siete. Q-lerning možno v jednoduchosti popísať ako funkciu <math>Q(S, A) -> S</math> ktorá po vykonaní akcie A1 v stave S1 aktualizuje svoju hodnotu na základe odmeny/trestu r. Pre aktualizáciu funkcie sa používa value iteration update v tvare

<math>Q(S1, A1) <- Q(S1, A1) + \alpha * ((r + \gamma * argmax[A](S2, A)) - Q(S1, A1)) </math>

kde <math>\alpha</math> je rýchlosť učenia a <math>\gamma</math> hovorí v podste o tom, ako dlho si robot pamätá svoje skúsenosti z predošlích pokusov.

Následne môžeme definovť stavy a akcie nášho robota. Pre jednoduchosť povolme každému servu tri pozície a to 70, 90 a 110 stupňov alebo 1, 2, 3. Ak má každé servo povolené 3 pozície znamená to, že mame dokopy <math>3^4 = 81</math> stavov. Pri zamyslení sa nad softvérovou realizáciou q-learning algoritmu, kde si musíme ukladať jednotlivé hodnoty q-funkcie do tabuľky zistíme, že pri pamäti arduina (2048 bajtov pre premené) nie je možné uložiť všetky hodnoty a tak by sme chceli túto hodnotu nejak aproximovať. Nato nám poslúži neurónová sieť.

Vstupom do nerónovej siete by mal byť stav, akcia a jej výstupom zas hodnota q-funkcie. Toto je však naivný prístup. Omnoho leší prístup je použiť pre vstup momentálny stav a ako výstup hodnotu q-funkcie pre každú možnú akciu. S podanými prístupmy možno experimentovať a najsť tak omnoho optimálnejšiu architektúru siete pre riešenie daného problému (napr. v našom riešení vstupujeú do site momentálne pozície servo motorov a predošlé pozície a výstupom je 12 hodnôt -> prvé štyri sú hodnoty q-funkcie pre pozície servo motorov 1 druhé štyri pre pozície 2 a ďalšie pre pozície 3). Pre úpravu váh sa použije algoritmus backpopagation s chybou definovanou v súlade update pravidla q-funkcie.

<math> E:((r + \gamma * argmax[A](S2, A, \theta(t-1))) - Q(S1, A1, \theta(t))^2 </math>

Všimnime si že pre výpočet maximálnej hodnoty q-funkcie zo stavu S2 sa použijú staré váhy a preto je potrebné si tieto hodnoty pred úpravou váh prepočítať a niekde uložiť. Okrem implementácie neurónovej siete a funkcií pre jej chod je potrebne aj správne definovať odmeňujúcu funkciu, správne odhodúť čas medzi prieskumom nových akcií vs rozvojom maximalizujúcich akcií (napr. použitím <math>\epsilon</math>-greedy stratégie), správne naladiť parametre učenia atď.