Table of Contents

1. Jim

1.1. sk.fiit.jim.agent.models.AgentPositionCalculator

Táto trieda sa stará o aktualizovanie polohy agenta. Volá sa v triede „AgentModel“ pri každej novej správe zo serveru. Volá sa v metóde „processNewServerMessage“ a ako vstupný parameter dostáva „data“ typu „ParsedData“.

1.1.1. updatePosition

Metóda slúži na nastavenie agentovej pozície. Ak agent nevidí žiadne fixné objekty, tak sa metóda ukončí. Inak sa prechádzajú všetky „flagy“ a následne podľa toho sa určí pozícia. V tejto metóde sa dá použiť aj regresia, ktorá využíva aj minulé pozície agenta.

Exception - Size 0

Nakoľko bola identifikovaná exception v triede AgentPositionCalculator keď funkcia dostala veľkosť 0, bola implementovaná podmienka v metóde updatePosition tak, že ak je veľkosť polohy 0, tak sa neupdatne poloha, updatne sa až po ďalšej zmene.

Po implementácii bol Agent viackrát otestovaný. Po zavolaní danej metódy agent pokračoval v hre a metóda už nehodila exception. Na správanie agenta implementácia metóda nemá výrazný vplyv.

Testovací scenár:

1.1.2. regress

Táto metóda slúži na vypočítanie regresie. Regresia sa ráta v dvoch krokoch samostatne pre x-ovú súradnicu a následne pre y-ovú súradnicu.

1. krok:

Inicializacia:

Počítanie:

2. krok:

To iste sa vyráta aj pre y-ovú súradnicu a následne sa agentovi nastaví pozícia s vyrátanými parametrami.

Princíp regresie: regresia slúži na predpovedanie ďalšej hodnoty, ktorá je úzko spätá s predchádzajúcimi hodnotami. To znamená, ak mám nejaký zoznam hodnôt, určí sa priemer týchto hodnôt a ďalšia hodnota sa vyráta z priemernej hodnoty. Rátanie je rozdelené do menších štvorcov a snažíme sa v konečnom dôsledku dostať „nejakú priamku“ – trajektóriu pohybu hráča.

Odkazy:

https://en.wikipedia.org/wiki/Coefficient_of_determination

http://www.ujfi.fei.stuba.sk/fyzika/navody/regresia-dodatok_20101022.pdf

1.2. sk.fiit.jim.agent.models.AgentRotationCalculator

Trieda je (aspoň by mala byť) určená na výpočet otočenia agenta na základe pevných bodov. Rotácia sa počíta na základe troch bodov.

1.2.1. Konštruktor

Vytvorí objekt a nastaví hodnotu konštanty agent na predaný parameter.

1.2.2. updateRotations

Táto metóda aktualizuje rotáciu agenta v aktuálnom AgentModel na základe dát zo servera.Rotácia sa vykoná, ak z jednej strany (sameSideFlags) agent vidi minimálne 3 vlajky. Vytvoria sa a naplnia sa 2 zoznamy pozícií vlajok (globálnych a vnímaných agentom), a pošlú sa ako argument do následne zavolanej metóde calculateRotation.

1.2.3. getFlagsOfSideWithMoreFlagsSeen

Funkcia vracia vlajky zo strany, na ktorej je ich viac. Vlajky sú rozdelené do dvoch strán („our“ – ľavá strana ihriska/ záporná x-ová súradnica a their – pravá strana ihriska / kladná x-ová súradnica). Ak agent vidí menej ako FLAGS_TO_COMPUTE_ROTATION (3) bodov, vráti sa prázdna mapa, inak sa vráti mapa s hodnotami strany, kde je viac videných bodov. Kľúčom je opäť reálna pozícia vlajky.

1.2.4. calculateRotation

Vypočíta rotáciu agenta na základe 3 vlajok, ktoré vidí agent. Usporiadajú sa hodnoty absolútnych pozícii vlajok pomocou metódy orderToFormAxes(absolute).

Hodnoty y1,y2 a z1 sa nastavia na základe zoradenia pomocou metódy orderToFormAxes

y1,y2 sa používajú na vytvorenie Y-ovej osí

z1, z2 sa používajú na vytvorenie Z-ovej osí

double rotationX - natočenie agenta v závislosti od osi X

double rotationY - natočenie agenta v závislosti od osi Y

double rotationZ - natočenie agenta v závislosti od osi Z

Uhol rotácie musí patriť intervalu (0, 2π), čo sa dosahuje pomocou metódy normalize.

1.2.5. orderToFormAxes

Metóda vracia pole troch hodnôt. Určí, ktoré dva body sa použijú na vytvorenie y-ovej (nultá a prvá hodnota poľa) osi a ktorý bod bude použitý na vytvorenie z-tovej osy (kolmej na y-ovú).

* Podmienky sa vyhodnocujú v poradí, v akom sú uvedené (zhora na dol), vracia sa prvá zhoda.

1.3. sk.fiit.jim.agent.models.FixedObject

Mapovanie hodnôt (objektov) FixedObject na kontrolne body ihriska

1.3.1. positions_0_6_7, positions_0_6_5, positions_0_6_2

Metódy, ktoré vytvoria mapu kontrolných bodov so súradnicami v závislosti od verzie serveru (volanej funkcie)

1.3.2. namesInServerMessages

Mapovanie správ zo servera (s-výrazov) na objekty typu FixedObject

1.3.3. fromServerId

Vráti objekt požadovaného kontrolného bodu.

1.4. sk.fiit.jim.agent.parsing.ParsedData

Trieda je určená na uchovávanie informácii získaných zo správ zo servera.

2. RoboCupLibrary

2.1. sk.fiit.robocup.library.geometry.Angles

Táto trieda poskytuje funkcie na prácu s uhlami. Reprezentuje interval medzi 2 uhlami. Tie sú pôvodne v radiánoch, no dajú sa previesť na stupne pomocou metódy setDegree(). Obsahuje 2 konštruktory, jeden prázdny a jeden s parametrami double from a double to, ktorý priradí lokálnym rovnomenným premenným hodnoty uhlov v stupňoch.

Analýza možných zlepšení

V tejto triede sa nevykonávajú žiadne výpočty okrem prevádzania uhlov v stupňoch na radiány, normalizujú sa uhly, prípadne sa počítajú rozdiely medzi uhlami. V rámci optimalizácie som nenašiel nič čo by mohlo vylepšiť časovú zložitosť.

2.1.1. setRadian

Táto metóda priradí lokálnym rovnomenným premenným hodnoty uhlov v radiánoch.

2.1.2. setDegree

Táto metóda priradí lokálnym rovnomenným premenným hodnoty uhlov v stupňoch.

Použitý matematický výpočet: uholvstupňoch=uholvradiánoch/ 180 * π

2.1.3. include

Táto metóda vráti hodnotu true, ak sa vstupný parameter nachádza v intervale (from, to). Ak nie, vráti hodnotu false.

2.1.4. angleDiff

Táto metóda vráti menšiu hodnotu z normalizovaných rozdielov (z intervalu <0; 2π>) vstupných parametrov v radiánoch.

2.1.5. angleDiffInDeg

Táto metóda vráti menšiu hodnotu z normalizovaných rozdielov vstupných parametrov v stupňoch.

2.1.6. normalize

Táto metóda vráti uhol v normalizovanej forme, t.j. v intervale <0; 2π>. Ak je vstupný uhol už v tomto intervale, tak sa vráti nezmenený. Ak nie, vypočíta sa takýmto spôsobom:

closest = angle - (2π * (angle / 2π))Ak je vypočítaná hodnota menšia ako nula, pripočíta sa k nej hodnota 2π a vráti sa. Ak nie je, tak sa rovno vráti.

2.2. sk.fiit.robocup.library.geometry.Circle

Táto trieda reprezentuje kruh ako matematický 2D útvar. Obsahuje 2 konštruktory, jeden bez parametrov, ktorý vytvorí kruh so stredom so súradnicami [0;0] a polomerom 0. Druhý, s parametrami Point2D center, double radius vytvorí kruh ako objekt s danými parametrami.

Analýza možných zlepšení

V tejto triede neprebiehajú žiadne výpočty, iba sa nastavuje kruh pomocou stredu a polomeru, a tieto hodnoty sa pomocou get metód dajú naspať získať. Nie je tu nič na optimalizáciu.

2.2.1. getCenter

Metóda vráti stred kruhu.

2.2.2. getRadius

Metóda vráti polomer kruhu.

2.2.3. toString

Metóda preťažuje klasickú metódu toString vo formáte “Circle [center=” center “, radius=” radius “]”, kde center je stred kruhu a radius je jeho polomer.

2.3. sk.fiit.robocup.library.geometry.Line2D

Táto trieda reprezentuje čiaru ako matematický 2D útvar. Obsahuje 2 konštruktory, kde na vytvorenie čiary použijeme buď 2 body (ich x a y súradnice), alebo 1 bod a smerový vektor. Sú tu použité základné matematické výpočty pre výpočet smerového vektoru a normálového vektoru a nakoniec aj samotných koeficientov a, b a c.

Analýza možných zlepšení

V tejto triede sa na základe dvoch bodov alebo jedného bodu a smerového vektoru dopočíta normálový vektor, smerový vektor alebo druhý bod a rovnica čiary ax+ by + c = 0. Čo sa týka výpočtov prebieha tu ešte počítanie prieniku čiary a inej čiary, a taktiež čiary a kružnice. Avšak ani tu som nenašiel priestor na optimalizáciu

2.3.1. getNormalVector

Metóda vráti normálový vektor ako 2D bod.

2.3.2. solveGeneralEqation

Metóda vráti výsledok rovnice a*x b*yc.

2.3.3. getCircleIntersection

Metóda vráti zoznam bodov danej priamky, ktoré pretínajú kruh zo vstupného parametru. Najprv sa vypočíta euklidovská vzdialenosť medzi 2 bodmi čiary ako odmocnina zo súčtu druhých mocnín ich rozdielov x a y súradníc. Matematicky je to vyjadrené takto:

Následne sa vypočíta smerový vektor D z bodu A do bodu B.

Potom sa počíta t, čo je najbližší bod čiary od stredu kruhu, vypočíta sa takto:

Takto sa môže vypočítať bod E, ktorý leží na čiare a je najbližšie ku kruhu.

Ďalej sa vypočíta euklidovská vzdialenosť LEC bodu E od kruhu (podobne ako pri LAB). Ak je táto vzdialenosť menšia ako polomer kruhu, tak sa vypočítajú 2 priesečníky čiary s kruhom. Najprv sa vypočíta dt, čo je (euklidovská) vzdialenosť t od prieniku čiary a kruhu. Potom sa počítajú spomínané priesečníky F a G.

Nakoniec sa tieto 2 body pridajú do zoznamu, ktorý sa vráti. Ak vzdialenosť nebola menšia ako polomer kruhu, ale rovná, tým pádom je čiara dotyčnica ku kruhu a vráti sa zoznam obsahujúci len bod E. V iných prípadoch sa vráti prázdny zoznam.

2.3.4. toString

Metóda preťažuje klasickú metódu toString vo formáte “ Line2D [x1=” x1 “, y1=” y1 “, x2=” x2 “, y2=” y2 “, a=” a “, b=” b “, c=” c “, nx=” nx “, ny=” ny “, kx=” kx “, ky=” ky “]”, kde sa využívajú lokálne premenné popísané v časti 1.3.

2.3.5. gettre

V triede sa nachádzajú metódy pre prístup ku všetkým lokálnym premenným (x1, y1, x2, y2, a, b, c, nx, ny, kx, ky).

2.4. sk.fiit.robocup.library.geometry.MEC

Táto trieda slúži na počítanie najmenšieho ohraničujúceho kruhu (angl. Minimal Enclosing Circle) z daných bodov.

Analýza možných zlepšení

V tejto triede sa počíta minimálna kružnica, ktorá obsahuje všetky body vstupného listu. Počíta sa pre 1, 2 alebo 3 body. Testovaním som zistil, že táto trieda sa zrejme vôbec nepoužíva.

2.4.1. minEnclosingCircle

Táto metóda vráti zo zoznamu bodov najmenší ohraničujúci kruh. Volanie tejto metódy podnecuje volanie pomocnej rekurzívnej metódy minCircle, ktorá je opísaná nižšie.

2.4.2. minCircle

Táto metóda slúži na výpočet stredu a polomeru najmenšej kružnice, ktorá obsahuje body zo vstupného poľa bodov. Pri volaní z predchádzajúcej metódy minEnclosingCircle sa zavolá 4x, až sa v poslednom volaní zavolá metóda findCenterRadius s 3 bodmi tvoriacimi najmenší obklopujúci kruh.

2.4.3. findCenterRadius

Táto metóda na základe vstupných 3 bodov tvoriacich kruh vypočíta jeho stred a polomer. To sa počíta takto:

Stred kruhu má teda tieto súradnice x a y. Polomer kruhu sa vypočíta ako (euklidovská) vzdialenosť jedného bodu z kružnice od stredu, tu sa používa bod p1. Nakoniec sa vráti kruh so známym stredom aj polomerom.

2.5. sk.fiit.robocup.library.geometry.Point2D

Táto trieda reprezentuje bod s dvoma súradnicami. Obsahuje konštruktor, ktorý ma 2 parametre, konkrétne double x a double y. Trieda obsahuje základné funkcie get a set pre vyššie spomínané premenné.

Analýza možných zlepšení

V tejto triede je reprezentovaný 2D bod. Výpočty ktoré prebiehajú sú interpolácia medzi 2 bodmi,a zisťovanie vzdialeností dvoch bodov. Nenašiel som priestor na optimalizáciu.

2.5.1. interpolate

Point2D from – začiatočný bod, Point2D to – koncový bod, double timelinePosition – premenná na posunutie

Táto metóda interpoluje dva body, teda zisťuje v podstate, kam sa posunie bod v určenom smere.

2.5.2. distance

Táto metóda zisťuje vzdialenosť medzi prvým a druhým bodom, pričom prvý bod je definovaný globálne (aké ma súradnice??).

2.5.3. toString

Metóda preťažuje klasickú metódu toString vo formáte “ Vector2 [x=” x “, y=” y “]”.

2. sk.fiit.robocup.library.geometry.ParsedLineWithFlags

V tejto triede jediné výpočty ktoré prebiehajú sú jednoduché if-y (zisťovanie či je uhol v rozmedzí -58 až 58), počítanie vzdialeností medzi dvoma vektormi (čiarami). Nenašiel som priestor na optimalizáciu.

2.6. sk.fiit.robocup.library.geometry.Point3D

Táto trieda reprezentuje bod s troma súradnicami. Obsahuje konštruktor, ktorý ma 3 parametre, konkrétne double x, double y a double z. Trieda obsahuje základné funkcie get a set pre vyššie spomínané premenné.

Analýza možných zlepšení

V tejto triede nie sú žiadne výpočty, iba konštruktor na vytvorenie 3D bodu a metódy get na získanie jednotlivých súradníc.

2.6.1. toString

Metóda preťažuje klasickú metódu toString vo formáte “ %1$.4f %2$.4f %3$.4f”, x, y, z“.

2.7. sk.fiit.robocup.library.geometry.Vector2D

Táto trieda reprezentuje 2D vektor a definuje možné operácie s nimi. Obsahuje jeden prázdny konštruktor, jeden konštruktor s 2 vstupnými parametrami – double x, double y a jeden konštruktor s dvojicou súradníc. Trieda obsahuje základné funkcie get a set pre vyššie spomínané premenné.

Analýza možných zlepšení

V tejto triede je reprezentovaný dvojrozmerný vektor, prebiehajú tu výpočty veľkosti uhla medzi dvoma vektormi a zisťovanie či sú dva vektory totožné (je tu miera 0.01 v rozdiely hodnôt x aj y).

2.7.1. angle

Metóda vráti uhol, ktorý zvierajú 2 vektory, prostredníctvom príslušnej matematickej operácie.

2.7.2. equals

Metóda porovná vstupný objekt s vektorom, pričom vráti true ak je identický alebo zhodný len s malou odchýlkou (0,01). V iných prípadoch vráti false.

2.8. sk.fiit.robocup.library.geometry.Vector3D

Táto trieda reprezentuje 3D vektor a definuje možné operácie s nimi. Obsahuje jeden prázdny konštruktor, pričom je povedané, že vytvárať 3D vektor je možné len cez jednu z metód a nie priamo cez konštruktor. Trieda obsahuje základné metódy get a set pre vyššie spomínané premenné.

Analýza možných zlepšení

V tejto triede sa nachádzajú 2 metódy, ktoré podľa yourkitu zaberajú významný čas počas behu programu.

caretsian(double,double,double) calculateSpherical()

V metóde cartesian(double,double,double) sú len jednoduché priradenia (vytvorenie nového vektoru a naplnenie hodnotami) a volanie metódy calculateSpherical(). V metóde calculateSpherical sa z karteziánskych súradníc x,y,z počítajú uhly theta a phi, ktoré sa následne normalizujú.

Takže ani v tejto triede som nenašiel priestor na optimalizáciu.

2.8.1. cartesian

Táto metóda vytvorí 3D vektor zo vstupného 2D bodu a tretej súradnice z, reprezentujúcej tretiu súradnicu v priestore.

2.8.2. cartesian

Táto metóda vytvorí 3D vektor zo vstupných súradníc v priestore, pomocou prepočtu karteziánskych súradníc na sférické.

2.8.3. calculateSpherical

Táto metóda vypočíta sférické súradnice z karteziánskych súradníc.

2.8.4. calculateCartesian

Táto metóda vypočíta karteziánske súradnice zo sférických súradníc.

2.8.5. add - metódy

Tieto metódy pripočítavajú dĺžku ku konkrétnym reprezentáciám (karteziánska/sférická) súradníc, resp. pripočítanie celého vektora.

2.8.6. substract

Táto metóda odčíta vstupný vektor od globálne definovaného vektora a vráti výsledný vektor.

2.8.7. multiply

Táto metóda vynásobí súradnice vstupného vektoru a súradnice globálne definovaného vektora a vráti výsledný vektor.

2.8.8. divide

Táto metóda vydelí súradnice vstupného vektoru a súradnice globálne definovaného vektora a vráti výsledný vektor.

2.8.9. negate

Táto metóda otočí globálne definovaný vektor do opačného smeru a vráti výsledný vektor.

2.8.10. toUnitVector

Táto metóda vráti vektor dĺžky 1.

2.8.11. rotateOverSúradnica - metódy

Tieto metódy vracajú vektory, ktoré boli otočené okolo konkrétnej súradnicovej osi.

2.8.12. crossProduct

​​​​​​​Táto metóda vracia vektorový súčin 2 vektorov vo výslednom vektore.

2.8.13. dotProduct

Táto metóda vracia skalárny súčin 2 vektorov vo výslednom vektore.

2.8.14. asPoint3D

​​​​​​​Táto metóda vráti definovaný vektor ako (počiatočný) bod s 3 súradnicami.

2.8.15. getXYDistanceFrom

Táto metóda vráti vzdialenosť vstupného vektora od definovaného vektora.

2.8.16. toString

Metóda preťažuje klasickú metódu toString vo formáte ” “x, y, z: [%.2f, %.2f, %.2f] r, phi, theta: [%.2f, %.2f, %.2f]”, x, y, z, r, phi, theta“.

2.8.17. equals

Metóda porovná vstupný objekt s vektorom, pričom vráti true, ak je identický alebo zhodný len s malou odchýlkou (0,01). V iných prípadoch vráti false.

2.8.18. normalize

Metóda vráti normálový vektor.

2.8.19. rotateOver

Metóda vráti vektor, ktorý je otočený okolo vstupného vektora axis vo vstupnom uhle angleInRad.

2.8.20. flatten

​​​​​​​Metóda vráti vektor, pričom vynuluje jeho z-ovú (priestorovú) súradnicu.

2.9. Kalmanov filter

Kalmanov filter je algoritmus, ktorý z dát zaťaženými nepresnosťami a šumom, odhaduje neznáme hodnoty premenných. Využíva k tomu nielen naposledy namerané dáta a model systému, ale tiež vektor údajov o predchádzajúcom stave systému. Kalmanov filter je široko využívaný pre spracovanie signálov, navigáciu a iné úlohy.

Kalmanov filter hľadá optimálny faktor zmeny pre nasledujúci stav meranej veličiny. Vychádza sa z predpokladu, že nevieme presne veličinu zmerať ani odhadnúť so 100% istotou. Predpoklad je mať buď linearizovaný model správania, alebo v pokročilej verzii algoritmu sa meraný model linearizuje. Do úvahy sa berú tiež predchádzajúce stavy a ich odhady.

podrobnejšie info tu:

http://bilgin.esme.org/BitsAndBytes/KalmanFilterforDummies

​​​​​​​https://www.cl.cam.ac.uk/~rmf25/papers/Understanding%20the%20Basis%20of%20the%20Kalman%20Filter.pdf

2.10. sk.fiit.robocup.library.math.KalmanForVariable

Kalman filter tracing a single observable variable

2.10.1. update

Metóda pre update pôvodnej hodnoty zo správy pomocou Kalmanovho algoritmu. Q a R sú konštanty pre filter sa berú z sk.fiit.jim.Settings a tie sa získavajú v praxi len experimentom.

2.11. sk.fiit.robocup.library.math.KalmanForVector

Trieda pre 3D vektor miesto jedného bodu/hodnoty. Metóda update() spracováva 3 súradnice.

2.11.1. update

Metóda pre optimalizáciu 3D vektora pomocou Kalmanovho filtra. Aktualizujú sa hodnoty postupne pre x, y a z súradnice a vracia sa výsledný 3D vektor.

2.12. sk.fiit.jim.agent.models.KalmanAdjuster

Trieda upravuje sledované koordináty lopty a zástaviek agentom pomocou Kalmanovho filtra

Snaha je znížiť zašumenie týmto spôsobom pred ďalšími výpočtami. V projekte je implementovaný ako observer KalmanAdjuster, ktorý je naviazaný na prijatú správu zo servera. Implementované je to spôsobom, že sa automaticky optimalizuje/odhaduje poloha lopty a pevné rohy ihriska – vlajky.

2.12.1. processNewServerMessage

Public metóda pre spracovania dát z novej správy zo servera. Spúšťa sa optimalizácia zašumenia polohy lopty na ihrisku a poloha rohových bodov.

2.12.2. adjustBallPosition

Aplikuje Kalmanov filter pre polohu lopty, ak jej posledná videná poloha je staršia než 250ms. Výsledná hodnota sa ukladá späť do správy zo servera.

2.12.3. adjustFixedPointsPosition

Aplikuje Kalmanov filter pre pevný bod na mape. Vstupný parameter je hash mapa objektov typu ihrisková vlajka a vektor 3D súradníc ich polohy. Spracované hodnoty sa vracajú späť do spracovanej správy zo servera.

2.12.4. freshKalman

Konštanty pre filter sa berú z sk.fiit.jim.Settings a vracia objekt KalmanForVector().

2.12.5. isObsolete

Metóda vracajúca true, ak je spracovaná správa zo servera staršia než 250ms. Porovnáva sa čas when s aktuálnym časom simulácie.

2.13. sk.fiit.robocup.library.math.MathExpressionEvaluator

Transformuje matematický výraz vo formáte reťazca do číselného výsledku

Príkald: new{@link MathExpressionEvaluator}(“7+5”).getInt() == 12

2.13.1. getInt

Vracia integer hodnotu reťazce expression. Vychádza z návratovej hodnoty getDouble(), ktorú pretypuje.

2.13.2. getDouble

Vyhodnocuje reťazec expression ako double hodnotu.

2.14. sk.fiit.robocup.library.math.TransformationMatrix

Trieda reprezentujúca operácie na transformáciu trojrozmernej projekcie. Využíva sa to v TestFrameworku pri vykresľovaní viacerých komponentov na 2D plochu.

2.14.1. toString

Preťažená metóda toString(), ktorá upravuje výstupný formát double čísel do [ ] a na pevný počet miest.

2.14.2. compareWith

Porovnávanie dvoch matíc medzi sebou, vracia true, ak sú matice zhodné, inak vracia false.

2.14.3. multiply

Násobenie dvoch báz ( matíc ) a vracia novú vypočítanú maticu.

2.14.4. getTranslation

Výpočet posunu ako 3D vektor.

2.14.5. getRotation

Výpočet rotácie ako 3D vektor.