Plánovanie a vykonávanie pohybov
Z RoboCupTP wiki
Cieľom tejto stránky je opísať proces spracovania high skillov a low skillov (spravidla býva jeden low skill na jeden XML súbor, čiže to čo my voláme "pohyb" je low skill) od načítania až po vykonanie plánovačom. Kód ktorý sa na tom podieľa je dosť roztrúsený a veľmi zle alebo vôbec okomentovaný. Tento dokument by mal tvoriť základ pre návrh procesu plánovania a tvorby zložitejších pohybov - high skillov.
Obsah |
Dodatočné informácie k tomuto dokumentu
Určité veci sa od napísania tohto dokumentu zmenili a nestihol byť ešte updatnutý. Konkrétne sa jedná o:
- Ruby-LowSkill sa už vo väčšine plánovačov príliš nepoužíva, boli implementované iné funkčné high skilly
- Podpora viac plánovačov, už sa nepoužíva len trieda Plan
Štruktúry a názvoslovie
Niektoré z tried existujú aj v Jave a rovnaké alebo podobné triedy sú aj v Ruby skriptoch. Preto u každej z tried pri prvom spomenutí uvediem, v akom jazyku je napísaná. Pri triedach LowSkill a HighSkill to budem uvádzať vždy. V nasledovnom zozname vidno čo budem písať a čo tým myslím:
- Java-LowSkill - trieda sk.fiit.jim.agent.moves.LowSkill
- Java-HighSkill - trieda sk.fiit.jim.agent.skills.HighSkill
- Ruby-HighSkill - trieda RubyHighSkill z scripts/high_skills/ruby_high_skill.rb, ktorá dedí triedu Java-HighSkill
- Ruby-LowSkill - trieda LowSkill z scripts/high_skills/low_skill.rb, ktorá dedí triedu Ruby-HighSkill
Diagram týchto a niektorých ďalších tried vidno na nasledovnom obrázku
Nevidno tu kompletné diagramy tried, sú vybrané len časti (metódy atď.) relevantné pre tento dokument.
Z XML sú načítané Java-LowSkill a Phase, pričom sa k nim dá dostať pomocou ich jedinečného mena.
Ako vidno, abstraktná (prakticky, nechcem teraz riešiť detaily ohľadom jazyka) trieda Ruby-HighSkill dedí abstraktnú triedu Java-HighSkill. Okrem toho že obsahuje metódu na získanie Java-LowSkillu skillu podľa mena (volá sa get_skill, to potom v obrázku fixnem) je to len veľmi tenký obal okolo Java-HighSkill triedy - nič iné navyše v nej nie je.
Túto triedu dedia konkrétne high skilly, ktoré sú implementované v ruby, napríklad Beam, ktorá sa používa na počiatočné umiestnenie hráča.
Z pohľadu tohto dokumentu je najzaujímavejší z týchto "high skillov" ten v triede Ruby-LowSkill. Jedná sa o high skill, ktorého jedinou úlohou je vykonať vybraný Java-LowSkill. Opäť obsahuje veľmi malé množstvo kódu - jediné čo robí je, že vyberie Java-LowSkill v konštruktore a zabezpečí aby sa vykonal len raz.
Podmienky pre fázy
Tieto podmienky sa kontrolujú pri načítavaní z XML
- musí mať meno a trvanie
- ak nemá nasledovníka, musí mať isFinal=true (môže ale mať obe naraz)
- ak má isFinal=true, musí mať aj finalize fázu
Plánovanie pohybov v hlavnom cykle
Hlavný cyklus, bežiaci po inicializácii a načítaní všetkých potrebných vecí, prebieha zjednodušene nejak takto
- čaká sa na správu od servera
- príchodzia správa sa spracuje, updatnú sa hodnoty perceptorov a modely
- spustí sa plánovač: Jeho meno sa nastavuje v settings.rb pomocou prikazu Settings.setValue("Planner", "Nazov_Triedy_Planovaca")
- dá sa dokopy výsledná správa, ktorá sa odošle serveru
Všetko spracovanie pohybov je tak volané z metódy control v triede Plan.
Vykonávanie high skillov
Pravidlá pre XML súbory (low skilly)
XML súbory s low skillmi a fázami musia pre použitie v high skilloch okrem vyššie uvedených požiadaviek spĺňať nasledovné
- každý musí mať aspoň jednu fázu s isFinal=true
Priebeh vykonávania
Pri skončení každej isFinal fázy sa volá pickLowSkill. V prípade, že sa vráti null (čo značí koniec celého high skillu), alebo iný než súčasný low skill, finalizuje sa súčasný low skill a následne sa vyberie nový. V prípade že pickLowSkill vráti súčasný low skill, pokračuje sa next fázou a finalizácia sa nevykoná.
Ruby-LowSkill vždy pri druhom a ďalšom volaní pickLowSkill vracia null, takže vždy finalizuje pohyb pri prvej príležitosti. Toto dokonca viedlo k odtráneniu isFinal vlastností z mnohých XML súborov - tie tam treba vrátiť.
Na testovanie cyklických pohybov ako je chôdza bol vytvorený nový HighSkill s názvom CyclicHighSkill, ktorého metóda pickLowSkill vždy vracia ten istý lowSkill. Tiež som vytvoril testovací high skill s názvom LinkedHighSkill, ktorý používa pole pohybov.
walk.rb bol upravený aby využíval nové pohyby
Tvorba high skillov
High skilly sa dajú písať v ruby aj v jave. Musia dediť triedu Java-HighSkill
Hlavou úlohou je implementácia metódy pickLowSkill. Tá sa bude volať na začiatku vykonávania pohybu a zakaždým, keď skončí fáza s isFinal=true.
Vrátiť musí objekt triedy Java-LowSkill.
Metóda checkProgress sa volá aj počas priebehu fázy, ak fáza ešte neskončila. Vyhodením výnimky by mala môcť ukončiť high skill bez čakania na finalizáciu fázy low skillu. To je použíteľné napríklad ak agent spadol.
Hlavný cyklus agenta
Nasledovný diagram znázorňuje zjednodušený hlavný cyklus agenta so zameraním na vykonávanie naplánovaných high skillov. Prerušovaná čiara znamená, že high skill prejde do nového stavu. Kód v tomto novom stave sa však nevykoná ihneď, ale až v nasledovnom cykle. Metódy pickLowSkill a checkProgress, ktoré treba pre high skilly implementovať, sú zvýraznené. Notácia je viacmenej vymyslená, ale snáď je jasné, čo ktorá časť znamená.