Table of Contents

AgentModel.java

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.

processNewServerMessage

Typ: public

Parametre:
ParsedData data - Informácie získané zo servera

Spracovanie informácií prijatých zo servera:

  1. ID hráča
  2. Na ktorej strane hrá agent
  3. Bola vykonaná zmena strán alebo polčas
  4. Vymazanie histórie polohy, ak bola splnená príslušná podmienka
  5. Aktualizovanie nastavenia otočných kĺbov (updateJointPosition)
  6. Nastavenie natočenia agenta z dát z gyroskopu (adjustRotationFor)
  7. Aktualizovanie natočenia agenta na základe videných bodov (updateRotation a volanie AgentRotationCalculator.updateRotations)
  8. Aktualizovanie polohy na základe videných bodov (updatePosition a volanie AgentPositionCalculator.updatePosition)
  9. Výpočty pre ZMP (Zero moment point)
  10. Kedy naposledy bol videný kontrolný bod.
  11. Aktualizovanie histórie polohy agenta

extendHistory

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

adjustRotationsFor

Typ: private

Parametre:
Vector3D gyroscope - Informácia z gyroskopu

Aktualizuje natočenie agenta na základe informácií z gyroskopu.

deleteHistory

Typ: private

Parametre:
ParsedData data

Vymazanie histórie sa vykoná, ak stav/mód hry (prijatý zo servera) nie je:

updateHistory

Typ: private

Parametre:
ParsedData data

Aktualizovanie histórie,

sk.fiit.jim.agent.models.AgentModel

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).

updateZeroMomentPoint()

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.

updateCenterOfMass()

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.

setZMPallowed(boolean zmpAllowed)

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.

Možná optimalizácia

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