Typ: public
Implementované rozhrania:
sk.fiit.jim.agent.parsing.ParsedDataObserver
java.io.Serializable
Konštanty:
AgentModel instance
…
Premenné:
double rotationX - Natočenie agenta v závislosti od x-ovej osi
double rotationY - Natočenie agenta v závislosti od y-ovej osi
double rotationZ - Natočenie agenta v závislosti od z-ovej osi
Vector3D position - Pozícia agenta na ihrisku
List<PositionHistory> positionHistory - história pozícií agenta
…
Trieda uchováva informácie o aktuálnom stave agenta.
Typ: public
Parametre:
ParsedData data - Informácie získané zo servera
Spracovanie informácií prijatých zo servera:
Typ: private
Návratová hodnota: boolean
Parametre:
Vector3D gyroscope - Informácia z gyroskopu
Vráti hodnotu true, ak agent videl nejaké objekty (čiary a/alebo kontrolné body) a zároveň nespadol / nevstáva.
Funkcia sa volá 2x v každej iterácii:
1. Keď sa má vypočítavať poloha agenta
- ak agent padol / vstáva, nie je potrebné vykonávať aktualizáciu polohy agenta (je naklonený, nevidí dobre objekty, výpočet polohy aj tak bude zlý),
-a ak agent nevidí žiaden objekt, nie je možné určiť polohu agenta
2. Keď sa rozhoduje o pridaní nového prvku do histórie polohy agenta (ak prebehla).
- ak funkcia vráti hodnotu true – pridá sa nový prvok do histórie
- inak sa aktualizuje accDistance z posledného záznamu v histórii
Typ: private
Parametre:
Vector3D gyroscope - Informácia z gyroskopu
Aktualizuje natočenie agenta na základe informácií z gyroskopu.
Typ: private
Parametre:
ParsedData data
Vymazanie histórie sa vykoná, ak stav/mód hry (prijatý zo servera) nie je:
Táto trieda je najpodstatnejšia pre ZMP, nakoľko v nej prebiehajú všetky výpočty spojené so ZMP. Obsahuje 3 podstatné metódy: updateZeroMomentPoint(), updateCenterOfMass() a setZMPallowed(boolean zmpAllowed).
Táto metóda počíta samotný ZMP. Síce sa na začiatku vytvoria premenné x, y, z s prednastavenou hodnotou 0, no z súradnica sa počas výpočtov vôbec nemení. Už v 2. riadku tejto metódy vidíme TODO na opravu stredu accelerometra.
Vzorec použitý na výpočet xzmp a yzmp je:
Potom sa pomocou karteziánskeho súčinu vzniknutých x,y a z vypočíta hodnota ZMP a tá sa zapíše do LinkedListu obsahujúceho históriu vypočítaných ZMP. Následne sa ako ZMP vypočíta priemer posledných 5 vypočítaných ZMP hodnôt.
Na výpočet je použitý vzorec:
Kde n je počet súčiastok robota, p je poloha súčiastky, m je hmotnosť súčiastky. V cykle sa pre každú súčiastku pridáva do 3D vektora centerOfMass súčin pozície súčiastky a jej váha. Do celkovej hmotnosti totalMass sa postupne pripočítava hmotnosť aktuálnej súčiastky. Nakoniec sa vektor centerOfMass vydelí totalMass a vznikne z toho výsledný COM.
Táto trieda má za účel zapnutie a vypnutie ZMP. Taktiež prispôsobí minimálne hodnoty Thety na prednastavené hodnoty. Zaujímavé je, že hodnoty Theta sa využívajú len pri zisťovaní pádu a sú rozličné pri zapnutom a vypnutom ZMP. Taktiež nie je žiadne volanie, ktoré by zisťovalo či je ZMP zapnuté alebo nie. Túto metódu volajú s parametrom true dve triedy v balíčku sk.fiit.jim.agent.highskill.move WalkFastZMP a WalkFastZMPOld. Triedu WalkFastZMP využíva taktika DefaultTactic a triedu WalkFastZMPOld využívajú taktiky FastWalkTactic a StabilityWalkTactic.
Metóda updateZeroMomentPoint() vôbec nemení premennú z počas výpočtu a necháva ju rovnú 0 – preto je dôležité overiť a prípadne opraviť tento výpočet. Taktiež obsahuje TODO časť v komentári, ktorú poznačuje na možný nesprávny výpočet ZMP. Vo výpočte je používaný LinkedList a je prehľadávaný cyklom for – tento cyklus je neefektívny pre prehľadávanie LinkedListu a odporúčam optimalizovanie pomocou foreachu. Do histórie sa počas behu tejto metódy pridáva jeden prvok, preto by bolo vhodné namiesto while cyklu použiť jednoduchú if podmienku pri zisťovaní prekročenia maximálnej veľkosti a následnom vyprázdňovaní prvkov z LinkedListu. Maximálna veľkosť LinkedListu je nastavená na 1000 prvkov, no pracujeme len s 5-timi, preto je zbytočné udržiavať ostatných 955 prvkov v zozname.
Pozi aj: Analýza modelu sveta