Server SimSpark je fyzikálny simulačný multiagentový systém pre agentov v troj-dimenzionálnom priestore. Sever je vytvorený v jazykoch C++ a Ruby a na vizualizáciu sú použité dve knižnice OpenGL a SDL. Keďže jadro simulátora nebolo nikdy prispôsobené pre simuláciu futbalu, všetky služby simulátora prispôsobené futbalu boli implementované ako pluginy.
SimsSpark implementuje jednoduchý model na ošetrovanie eventov simulácie a na ošetrovanie všetkých akcií, ktoré prichádzajú od agenta. Keďže server sa nesnaží vyrovnávať oneskorenie v sieti alebo výpočtové zdroje agentov, opakujúce sa simulácie môžu mať rôzny výstup. Hlavná slučka simulácie(Simulation update loop) v simsparku je plne modifikovateľná, pretože je vytvorená z pluginov nazývaných „simcontrol nodes“. Pri štarte servera je vyvolaný init event a pri ukončovaní jeho behu done event. Simulačný server taktiež zaznamenáva údaj o dĺžke trvania posledného cyklu. Simcontrol nodes sa stará o meranie času a synchronizáciu simulačného času s reálnym časom použitým na renderovanie scény. Simulačná slučka sa snaží aby každý cyklus trval rovnako (20ms). Pokiaľ je simulácia rýchlejšia, zvyšný čas server čaká. Naopak ak je pomalšia, aktualizuje sa len fyzika a server nekomunikuje s agentmi.
V každom cykle je najskôr vyvolaný „sense event“ a potom „action event“, dôsledkom čoho akcie ktoré agent poslal v ntom cykle budú vykonané v nasledujúcom (n+1)cykle (Obrázok 1).
Keďže dnešné počítače umožňujú spracovávať paralelizmus, je možné server aby server bežal v multi-thread režime. V tomto režime „simcontrol nodes“ sú spúšťané paralelne, a aj výpočet fyziky je pustený v samostatnom vlákne.
Rcssserver3d je oficiálne prostredie pre 3D Soccer Simulation League v RoboCupe. Implementuje simuláciu futbalového zápasu, v ktorom dva tímy až jedenástich robotov hrajú proti sebe. Súčasným modelom robota je robot nazývaný Nao. Množstvo pravidiel zápasu je možné automaticky kontrolovať, aj keď veľa situácií ako je napríklad neférové správanie hráčov musí byť kontrolovaných ľudským rozhodcom cez Monitor.
Komunikácia so serverom prebieha pomocou TCP/IP protokol u. Správy posielané a prijímané serverom sú vo formáte S-výrazov. Správy sú vytvárané z ASCII znakov, čo umožňuje zakódovanie jedného znaku do jedného bytu. Správa má 32bitovú hlavičku(big endian), v ktorej je uložené poradové číslo správy. Nao robot Nao je humanoidný robot používaný pri RoboCupe s reálnymi hráčmi. Jeho výška je 57cm a váha 4,5kg. Podľa neho je vytvorený model Nao robota na simulačnom serveri rcssserver3d. Je vybavený množstvom perceptorov a efektorov, pomocou ktorých agent získava informácie o stave robota na serveri(perceptory) a manipuluje s ním(efektory). Obsahuje 22 kĺbov, pričom každý kĺb je možné natočiť len jedným smerov(na rozdiel od starších verzií, ktoré obsahovali aj univerzálny kĺb). Zložitejšie kĺby ako je napríklad bedrový kĺb alebo ramenný je zložený z viacerých jednoduchých kĺbov.
Na vnímanie sveta v RoboCup 3D slúžia perceptory. Server zasiela agentovi informácie o samotnom agentovi, videných objektoch a podobne.
GyroRate slúži na opis orientácie tela robota vzhľadom k jednotlivým osiam. Tento perceptor je umiestnený v hornej časti robota Nao.
Message format: | (GYR (n <name>) (rt <x> <y> <z>)) |
---|---|
<name>: | The name of the body containing the gyro rate perceptor. |
<x> <y> <z>: | The current angular velocities along the three axes of freedom of the corresponding body in degrees per second and an accuracy of two digits. |
Example message: | (GYR (n torso) (rt 0.01 0.07 0.46)) |
Frequency: | Every cycle |
Noise model: | None |
HingeJoint určuje o koľko stupňov je ktorý kĺb natočený.
Message format: | (HJ (n <name>) (ax <ax>)) |
---|---|
<name>: | The name of the corresponding hinge joint. |
<ax>: | The current position angle in degrees and an accuracy of two digits. |
Example message: | (HJ (n laj3) (ax -1.02)) |
Frequency: | Every cycle |
Noise Model: | None |
ForceResistance perceptor slúži na oznámenie o pôsobiacej sile na časť tela a jej vektore. Správa obsahuje dvoje súradnice, jedny určujú bod, na ktorý sila pôsobí a druhé súradnice určujú vektor tejto sily
Message format: | (FRP (n <name>) (c <px> <py> <pz>) (f <fx> <fy> <fz>)) |
---|---|
<name>: | The name of the body, to which the force resistance perceptor belongs. |
<px> <py> <pz>: | The local coordinates of the origin of the applied force in meter and an accuracy of two digits. |
<fx> <fy> <fz>: | The components of the force vector with an accuracy of two digits, while the length of the force vector represents the given force in newton (kg m/s2 ). |
Example message: | (FRP (n lf) (c -0.14 0.08 -0.05) (f 1.12 -0.26 13.07)) |
Frequency: | Every cycle, but only in case of an present collision. |
Noise model: | None |
Accelerometer perceptor umiestnený v hornej časti tela počíta zrýchlenie.
Message format: | (ACC (n <name>) (a <x> <y> <z>)) |
---|---|
<name>: | The name of the body containing the accelerometer. |
<x> <y> <z>: | The current acceleration along the three axes of freedom of the corresponding body in m/s2 and an accuracy of two digits. |
Example message: | (ACC (n torso) (a 0.00 0.00 9.81)) |
Frequency: | Every cycle |
Noise model: | None |
Vision perceptor dostáva informácie o objektoch videných agentom (ostatní agenti, lopta, statické body ihriska). Zorné pole robota Nao je 120°.
Chyby vnášané do vision perceptora: Malá kalibračná chyba je pridávaná do pozície kamery. Pre každú os z intervalu -0.005 m až 0.005 m. Chyba je vypočítaná raz a zostáva nemenná počas celého zápasu. Dynamický šum s normálnym rozdelením okolo 0 Chyba vzdialenosti: σ = 0.0965 Chyba φ: µ = 0.1225 Chyba ϑ : µ = 0.1480
GameState vysiela niekoľko základných informácií o aktuálnom stave hry.
Message format: | (GS (t <time>) (pm <playmode>)) |
---|---|
<time>: | The current play time in seconds. |
<playmode>: | The current play mode of the soccer game. |
Example message: | (GS (t 0.00) (pm BeforeKickOff)) |
Frequency: | Every cycle |
HearPerceptor – priama komunikácia medzi robotmi nie je povolená, ale môžu si vymieňať správy cez simulačný server. Na túto komunikáciu slúži tento perceptor.
Message format: | (hear <time> self/<direction> <message>) |
---|---|
<time>: | The simulation time at which the given message was heard in seconds (a real number.) |
<direction>: | Either a relative horizontal direction in degrees indicating where the sound originated, or selfindicating that the player is hearing their own words. (TODO: check of the direction is relative to the orientation of the head.) |
<message>: | Up to 20 characters, which may be taken from the ASCII printing character subset [0x20, 0x7E]except the white space character and the normal brackets (and ) |
Example messages: | (hear 12.3 self helloworld) (hear 12.3 -12.7 helloyourself) |
Frequency: | Head capacity model |
Na tento perceptor sa vzťahujú nasledujúce obmedzenia: Maximálna dĺžka správy je 20 bytov Správa môže obsahovať iba znaky <0x20, 0x7E> okrem medzery a obyčajných zátvoriek Správa vyslaná zo vzdialenosti viac ako 50m nie je ,,počutá“ Každý hráč môže v jednom okamihu počuť najviac jednu správu z každého tímu. Perióda obnovovania senzoru je 0,4 sekundy. Ak príde viacero správ toho istého tímu, sú spracované v poradí, v akom prišli a zvyšné správy sú ignorované. Hráč počuje svoje správy vždy.
Oficiálna wiki stránka SimSparku: https://gitlab.com/robocup-sim/SimSpark/wikis/Perceptors
Create – v momente ako je agent pripojený na server nie je viditeľný a nemôže zasiahnuť do simulácie. Pomocou Create hráč odovzdá serveru cestu ku konfiguračnému súboru, ktorý definuje fyzickú reprezentáciu agenta a množinu jeho perceptorov a efektorov.
Message format | (scene ) |
---|---|
Example message | (scene rsg/agent/nao/nao.rsg) |
HingeJoint efektor dávajúci príkaz na ohnutie kĺbu.
Message format | (<name> <ax>) |
---|---|
Example message | (lae3 5.3) |
Beam efektor určuje umiestnenie agenta na hracej ploche pred začatím polčasu
Message format | (beam <x> <y> <rot>) |
---|---|
Example message | (beam 10.0 -10.0 0.0) |
Say efektor slúži na odoslanie správy pre komunikáciu medzi hráčmi.
Message format | (say <message>) |
---|---|
Example message | (say helloworld) |
Init priradí hráča k tímu a pridelí mu číslo. Ak agent posiela ako číslo 0, server priradí hráčovi najbižšie voľné číslo automaticky
Message format | (init (unum <playernumber>)(teamname <yourteamname>)) |
---|---|
Example message | (init (unum 1)(teamname FHO)) |
Odkaz na ofici8lnu wiki str8nku SimSparku> https://gitlab.com/robocup-sim/SimSpark/wikis/Effectors
Šírka ihriska je 20 metrov a jeho dĺžka 30 metrov (pozn. Platí pre najnovšiu verziu serveru, predtým boli rozmery 21×14 metrov). V strede je kruh s polomerom 2 metre. V skutočnosti ale nejde o skutočný kruh, ale je vymodelovaný z niekoľkých krátkych úsečiek. Bránky sú široké 2.1 metra, vysoké 0.8 metra a hlboké 0.6 metra. Rozmery bránkoviska sú 3.9m x 1.8m. Ihrisko je ohraničené hranicou širokou 10 metrov v každom smere. Po tejto ploche mimo ihriska sa agent pohybovať nemôže. 7 Ihrisko obsahuje 8 orientačných statických bodov rozpoznateľných agentmi. Štyri sa nachádzajú v rohoch ihriska (F1L, F2L, F1R, F2R) v nulovej výške (súradnica Z – 0.0). Ďalšie 4 sa nachádzajú na bránkach (G1L, G2L, G1R, G2R), konkrétne na žŕdkach vo výške 0.8 metra.
Lopta nachádzajúca sa v simulačnom prostredí má rádius 0.04 metra a jej váha je 26 gramov.
Fyzika pri pohybe lopty
Pohyb lopty je rozdelený do dvoch fáz.
Prvá fáza:
Vektor sily pri pohybe lopty je definovaný ako <math>F_k</math>, kde
Druhá fáza:
Celkové sily sú
Súčiniteľ odporu pre loptu
Hráčov (agentov) reprezentujú humanoidné roboty Nao. Ich výška je približne 57 cm a váha asi 4.5 kg. Nao má 22 kĺbov, 6 v každej nohe, 4 v každej ruke a 2 v krku.
No. | Description | Hinge Joint | Perceptor name | Effector name |
---|---|---|---|---|
1 | Neck Yaw | [0][0] | hj1 | he1 |
2 | Neck Pitch | [0][1] | hj2 | he2 |
3 | Left Shoulder Pitch | [1][0] | laj1 | lae1 |
4 | Left Shoulder Yaw | [1][1] | laj2 | lae2 |
5 | Left Arm Roll | [1][2] | laj3 | lae3 |
6 | Left Arm Yaw | [1][3] | laj4 | lae4 |
7 | Left Hip YawPitch | [2][0] | llj1 | lle1 |
8 | Left Hip Roll | [2][1] | llj2 | lle2 |
9 | Left Hip Pitch | [2][2] | llj3 | lle3 |
10 | Left Knee Pitch | [2][3] | llj4 | lle4 |
11 | Left Foot Pitch | [2][4] | llj5 | lle5 |
12 | Left Foot Roll | [2][5] | llj6 | lle6 |
13 | Right Hip YawPitch | [3][0] | rlj1 | rle1 |
14 | Right Hip Roll | [3][1] | rlj2 | rle2 |
15 | Right Hip Pitch | [3][2] | rlj3 | rle3 |
16 | Right Knee Pitch | [3][3] | rlj4 | rle4 |
17 | Right Foot Pitch | [3][4] | rlj5 | rle5 |
18 | Right Foot Roll | [3][5] | rlj6 | rle6 |
19 | Right Shoulder Pitch | [4][0] | raj1 | rae1 |
20 | Right Shoulder Yaw | [4][1] | raj2 | rae2 |
21 | Right Arm Roll | [4][2] | raj3 | rae3 |
22 | Right Arm Yaw | [4][3] | raj4 | rae4 |
Body part | Hinge Joint | ||||||||
---|---|---|---|---|---|---|---|---|---|
Name | Parent | Translation | Mass | Geometry | Name | Anchor | Axis | Min | Max |
torso | 1.2171 | Box 0.1, 0.1, 0.18 | |||||||
neck | torso | 0, 0, 0.09 | 0.05 | Cylinder L: 0.08 R: 0.015 | HJ1 | 0, 0, 0 | 0,0,1 | -120 | 120 |
head | neck | 0, 0, 0.065 | 0.35 | Sphere 0.065 | HJ2 | 0, 0,-0.005 | 1,0,0 | -45 | 45 |
shoulder | torso | 0.098, 0, 0.075® -0.098, 0, 0.075(l) | 0.07 | Sphere 0.01 | AJ1 | 0, 0, 0 | 1,0,0 | -120 | 120 |
upperarm | shoulder | 0.01, 0.02, 0® -0.01, 0.02, 0(l) | 0.150 | Box 0.07, 0.08, 0.06 | AJ2 | -Translation | 0,0,1 | -95® -1(l) | 1® 95(l) |
elbow | upperarm | -0.01, 0.07, 0.009® 0.01, 0.07, 0.009(l) | 0.035 | Sphere 0.01 | AJ3 | 0, 0, 0 | 0,1,0 | -120 | 120 |
lowerarm | elbow | 0, 0.05, 0 | 0.2 | Box 0.05, 0.11, 0.05 | AJ4 | -Translation | 0,0,1 | -1® -90(l) | 90® 1(l) |
hip1 | torso | 0.055, -0.01, -0.115® -0.055, -0.01,-0.115(l) | 0.09 | Sphere 0.01 | LJ1 | 0, 0, 0 | -0.7071,0,0.7071® -0.7071,0,-0.7071(l) | -90 | 1 |
hip2 | hip1 | 0, 0, 0 | 0.125 | Sphere 0.01 | LJ2 | 0, 0, 0 | 0,1,0 | -45® -25(l) | 25® 45(l) |
thigh | hip2 | 0, 0.01, -0.04 | 0.275 | Box 0.07, 0.07, 0.14 | LJ3 | -Translation | 1,0,0 | -25 | 100 |
shank | thigh | 0,0.005,-0.125 | 0.225 | Box 0.08, 0.07, 0.11 | LJ4 | 0,-0.01, 0.045 | 1,0,0 | -130 | 1 |
ankle | shank | 0, -0.01,-0.055 | 0.125 | Sphere 0.01 | LJ5 | 0, 0, 0 | 1,0,0 | -45 | 75 |
foot | ankle | 0, 0.03,-0.040 | 0.2 | Box 0.08, 0.16, 0.02 | LJ6 | -Translation | 0,1,0 | -25® -45(l) | 45® 25(l) |