BugBox(použitie DQN pri učení štvornohého robota optimálnej chôdze) - Martin Zvara

From RoboWiki
Jump to: navigation, search

Cieľ projektu

Cieľom projektu je naučiť štvornohého robota za pomoci Deep Q-Network 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
  • plastová krabička
  • 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 sa dá odstrániť jednoduchou izoláciou vodičov, na ktorú možno použiť 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 drž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 taktiež 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í o tom, aká je dôležitá budúca odmena (resp. ako dlho si robot pamätá svoje skúsenosti z predošlích pokusov). Optimálna stratégia <math>\pi</math> je taká ktorá vyberá maximalizujúce akcie

<math> \pi(S) = argmax[A](S, A) </math> 

Definujme stavy a akcie nášho robota. Pre jednoduchosť povoľme 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 premenné) nie je možné uložiť všetky hodnoty a tak by sme chceli túto hodnotu nejako aproximovať. Nato nám poslúži neurónová sieť.

Vstupom do neurónovej siete by mal byť stav, akcia a jej výstupom zas hodnota q-funkcie. Toto je však naivný prístup. Omnoho lepší 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ístupmi možno experimentovať a nájsť tak omnoho optimálnejšiu architektúru siete pre riešenie daného problému (napr. v našom riešení vstupujú 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 pravidlom 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 odhadnúť č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ď.

Zdrojový kód si môžete stiahnúť tu: BugBox.zip

Výsledky

Ukážky výherných pohybov

BugBox Walk 01.gif BugBox Walk 02.gif

V ukážke 1 (naľavo) si môžeme všimnúť, že robot sa pohybuje vpred podsunutím zadných nôh pod seba a následným odrazením. Tento pohyb si možno vysvetliť rozložením váhy robota. Ako som spomínal v časti Hardware, batérie (ktoré tvoria hlavnú časť váhy robota) sú umiestnené vpredu. Z pozorovaní robota pri preskúmávaním akcií som zistil, že zadné nohy robota pri pohybe zväčša prešmykujú a predné ho zas posunú podľa pohybu čo je vcelku logické keďže ťažisko robota je vpredu. Preto je pre robota výhodné spraviť jeden pohyb (podsunutie nôh pod seba - zaklonenie) ktorý ho nepotrestá ani neodmení a následne spraviť odmenujúci pohyb vpred.

V ukážke 2 (napravo) s jemne pozmenenými parametrami sa robot opäť dokázal naučiť podobnú chôdzu. Aj keď sa tu robot pohybuje častejšie dopredu jeho chôdza bola o trochu pomalšia ako na ukážke 1.

Robot sa dokázal naučiť chôdzu vykonaním 1700 - 2000 pohybov čo na pamäťové obmedzenia a celkový počet možných prechodov z jednej pozície do druhej (z každého stavu môžme prejsť do každého tj. <math>81^2 = 6561</math> prechodov) je dobrý výsledok.

Záver

Napriek všetkým HW a SW pochybeniam, výsledky splnili zadaný cieľ a preto považujem projekt za úspešný. Stále však existuje priestor na zlepšenie. Požitím microcontorlera Genuino 101 (novšia verzia Arduina s omnoho väčšou pamäťou), by vznikol priestor na implementáciu algoritmov minibatch backpropagation, prioritized experience replay, dueling alebo double DQN a taktiež v neposlednej rade optimalizácie architektúry neurónovej siete. S takýmto vylepšením by sa robot naučil chodiť za polovicu alebo menej celkového času (počtu pohybov) ako v momentálnej implementácií. Nakoniec by som rád poďakoval pánom Mgr. Pavel Petrovič, PhD. a Maroš Kvačkaj ktorý poskytli potrebné súčiastky na stavbu robota.