Oryginalna strona colobot.cba.pl umarła, gdy cba.pl przestało oferować darmowy hosting. To jest statyczny mirror, pobrany w 2018. ~krzys_h
 
Polski Portal COLOBOTa
COLOBOT Polish Portal

COLOBOT ogólnie - Eksperyment - Dziwne wyniki

sajmon313 - 24-12-2009, 16:46
Temat postu: Eksperyment - Dziwne wyniki
Zrobiłem dziś eksperyment dot. szybkości różnych obiektów. Oto wyniki:
wszystkie prędkości podaję w m/s, zakres błędu: +- 0,2 m/s
wszystkie obiekty poruszające się po ziemi korzystały z 1 programu, a wszystkie latające z 2 programu, więc nie ma ryzyka błędu spowodowanego różnicom w programach

1) Na płaskim terenie
Kod:
WheeledGrabber               4,91
TrackedGrabber               3,59
LeggedGrabber                3,71
WingedGrabber (po ziemi)     4,71
WingedGrabber (w powietrzu) 11,01
Tech (po ziemi)              3,17
Tech (w powietrzu)           7,56
AlienAnt                     2,9
AlienSpider                  2,9
AlienWasp                   11,01
AlienWorm                    0,74
AlienQueen                   1,93

Wniosek jest jeden: lepiej latać.
Powyższe wyniki są w miarę normalne, ale dalej jest już conajmniej dziwnie.

2) pod górkę, Pitch= 21,8 (Z oznacza że utrzymuje pozycje - nie zsuwa sie po zatrzymaniu). Latające nie brały udziału
Kod:
WheeledGrabber               1,78
TrackedGrabber               3,07
LeggedGrabber                3,70 Z
WingedGrabber (po ziemi)     0,99
Tech (po ziemi)              2,01
AlienAnt                     3,03 Z
AlienSpider                  2,93 Z
AlienWorm                    0,80 (b.d.)
AlienQueen                   1,33

Można zauważyć, że mrówka, pająk i robal poruszają się szybciej pod górkę niż na płaskim terenie! Ale już LeggedGrabber nie.

3) pod górkę, Pitch= 38 (Z jak poprzednio, N - nie może podejść)
Kod:
WheeledGrabber               N
TrackedGrabber               1,29
LeggedGrabber                3,15
WingedGrabber (po ziemi)     N
Tech (po ziemi)              0,19
AlienAnt                     3,26 Z !
AlienSpider                  2,97 Z
AlienWorm                    0,95 (b.d.)
AlienQueen                   N

Obcy jeszcze bardziej przyspieszają! Ale roboty zachowują się normalnie (na razie). WheeledGrabber i WingedGrabber nie mogą podjechać pod tą górkę.

4) pod górkę, Pitch= ~60 (Z, N jak poprzednio)
Kod:
WheeledGrabber               1,16 !!!
TrackedGrabber               N
LeggedGrabber                1,37
WingedGrabber (po ziemi)     0,42 !!!
Tech (po ziemi)              N
AlienAnt                     3,04
AlienSpider                  2,45
AlienWorm                    1,4 (b.d.) !!!
AlienQueen                   N

Pająk i Mrówka wreszcie zaczęły zwalniać, Robal bardzo przyspieszył, ale najważniejsze:
WheeledGrabber i WingedGrabber mogą podjechać pod górkę pitch=60, a pod pitch=38 nie mogą !?
Bardzo dziwne.

W testach wykorzystałem relief21 dostępny standardowo w colobocie.

C ruels! - 24-12-2009, 17:35

Na każdej mapie/reliefie wyniki będą nieco inne.Chyba wziąłeś to pod uwagę?
Berserker - 24-12-2009, 17:50

Moge sie zapytac, w jaki sposob mierzyles predkosc? Kiedys mierzylem i wynik zalezal od tego jaka jednostke czasu wzialem.

Tech? WTF is that?

FE4R - 24-12-2009, 17:55

A co, na każdej mapie pitch równy tyle samo znaczy coś innego? :roll:

Jest taki bug w grze; jest również w temacie Ciekawostki - robot na kołach potrafi podjechać pod pionową ścianę, nawet robot na nogach tak nie potrafi. Dziwne, nieprawdaż?

To samo zauważyłem, gdy chciałem WingedGrabberem zabrać PowerCell ze ściany o nachyleniu większym niż 45 stopni.

Aha, i jeszcze jedno - czy mógłbyś mi na PW przesłać program, który wykorzystałeś do testowania prędkości?

EDIT:

Berserker napisał/a:
Moge sie zapytac, w jaki sposob mierzyles predkosc? Kiedys mierzylem i wynik zalezal od tego jaka jednostke czasu wzialem.

Tech? WTF is that?

Wyobraź sobie, że dystans przebyty w 0.1 sekundy będzie 10 mniejszy niż przebyty przez 1 sekundę... Jeśli chcesz mieć w m/s trzeba przemnożyć dystans przez 10.
A Tech to inżynier - widoczny w środku Centrum Kontroli Misji w Houston oraz na końcu Kampanii.

Berserker - 24-12-2009, 18:24

Cytat:
Wyobraź sobie, że dystans przebyty w 0.1 sekundy będzie 10 mniejszy niż przebyty przez 1 sekundę... Jeśli chcesz mieć w m/s trzeba przemnożyć dystans przez 10.

Ja nie licze dystansu, tylko predkosc przy maksymalnej mocy obu silnikow. teoretycznie ona powinna byc taka sama niezaleznie od kroku czasowego. Ale przy kroku czasowym wynoszacym 0.01 sekundy predkosc osy wychodzila mi 50-80 m/s

sajmon313 - 24-12-2009, 19:36

FE4R napisał/a:
Aha, i jeszcze jedno - czy mógłbyś mi na PW przesłać program, który wykorzystałeś do testowania prędkości?

Generalnie wykorzystywałem ten program:
Kod:
extern void object::wyscig()
{
 point c1,c2;
 motor(1,1);
 c1=position;
 wait(10);
 c2=position;
 message(category+" "+distance(c1,c2)/10+" m/s");
 motor(0,0);
if(c1.z<=c2.z) send(strleft("S"+category,7),distance(c1,c2)/10,200);
}

ale na płaskiej powierzchni było bez if (co nic nie zmienia, ale później musiałem dodać)

natomiast dla latających:
Kod:
extern void object::wysciglat()
{
 point c1,c2;
 jet(1);
 wait(2);
 jet(0);
 motor(1,1);
 c1=position;
 wait(10);
 c2=position;
 message(category+" "+distance(c1,c2)/10+" m/s");
 motor(0,0);
send(strleft("L"+category,7),distance(c1,c2)/10,200);
 jet(-1);
}


to L albo S przed category po to, żeby było wiadomo czy lata czy nie.

Wynik distance jest w (metrach colobotowych)*10 bo 10s, więc
Kod:
distance(c1,c2)/10

jest w metrach na sekundę.

Berserker napisał/a:
teoretycznie ona powinna byc taka sama niezaleznie od kroku czasowego. Ale przy kroku czasowym wynoszacym 0.01 sekundy predkosc osy wychodzila mi 50-80 m/s

Czym dłuższy czas pomiaru tym większa dokładność.
Mój eksperyment powtarzałem kilka razy i czasami wychodziły troszkę inne wyniki (stąd na początku pierwszego posta napisałem +-0,02 bo w takich granicach się zmieniało).

Berserker - 24-12-2009, 22:27

A, znalazlem jeden blad! :D
Roboty, zwlaszcza latajace, troche sie rozpedzaja. Ty zaczynasz pomiar predkosci odrazu bez rozpedzania sie. Moze to w niewielkim stopniu wplynac na pomiar. Niby sie czepiam, ale takie drobnostki moga byc zrodlem anomalii zwiazanymi z lazeniem mrowek.

sajmon313 - 24-12-2009, 22:48

Berserker napisał/a:
A, znalazlem jeden blad! :D
Roboty, zwlaszcza latajace, troche sie rozpedzaja. Ty zaczynasz pomiar predkosci odrazu bez rozpedzania sie. Moze to w niewielkim stopniu wplynac na pomiar. Niby sie czepiam, ale takie drobnostki moga byc zrodlem anomalii zwiazanymi z lazeniem mrowek.

Słuszna uwaga.
Do końca roku powtórze wszystkie testy, ale dodam wait(5) przed pomiarem pierwszej pozycji.

btw. mrówki nie są latające ;)

Berserker - 24-12-2009, 23:22

Dlatego napisalem 'lazeniem' :)
Chodzilo mi o fakt, ze mrowki szybciej chodza po powierzchniach pochylych :P

FE4R - 25-12-2009, 13:48

sajmon313 napisał/a:
Czym dłuższy czas pomiaru tym większa dokładność.Mój eksperyment powtarzałem kilka razy i czasami wychodziły troszkę inne wyniki (stąd na początku pierwszego posta napisałem +-0,02 bo w takich granicach się zmieniało).

Masz na myśli czas eksperymentu czy wartość, którą wstawiasz w wait();?
Bo jeśli to drugie - to nie. Im mniejszą wartość dasz, tym dokładniej wychodzi.

Berserker napisał/a:
Ja nie licze dystansu, tylko predkosc przy maksymalnej mocy obu silnikow. teoretycznie ona powinna byc taka sama niezaleznie od kroku czasowego. Ale przy kroku czasowym wynoszacym 0.01 sekundy predkosc osy wychodzila mi 50-80 m/s

A jak liczysz prędkość bez liczenia jaki dystans przebył robot?

Berserker - 25-12-2009, 14:19

Cytat:
A jak liczysz prędkość bez liczenia jaki dystans przebył robot?


Zdecyduj sie czego sie czepiasz. Najpierw probujesz mnie przekonac, ze ja otrzymalem dystans przebyty przez robota (jakbym nie umial predkosci liczyc).
Teraz sie mnie czepiasz, ze licze predkosc bez dystansu. Dystansu nie licze, dystans mam podany

Cytat:
Masz na myśli czas eksperymentu czy wartość, którą wstawiasz w wait();?
Bo jeśli to drugie - to nie. Im mniejszą wartość dasz, tym dokładniej wychodzi.

Podstawowa definicja ruchu jednostajnego: predkosc jest jednakowa w kazdym momencie ruchu. Niewazne, czy dasz 0.01s czy 100s, przebyta droga w tym czasie po podzieleniu przez ten czas da nam zawsze jednakowa predkosc.

A teraz ciekawostka:
Predkosc osy liczona przy kroku czasowym wynoszacym 2s:
Za pomoca wait() wynosi ~12.5m/s
Za pomoca abstime() wynosi ~9.5m/s
Niby mala roznica. A teraz przy kroku czasowym wynoszacym 0.01s:
Za pomoca wait() ~40m/s - O_O
Za pomoca abstime() ~0.45m/s - Q__Q

Wychodzi na to, ze nie da sie porzadnie zmierzyc predkosci chwilowej.

sajmon313 - 25-12-2009, 14:47

Berserker napisał/a:

Za pomoca abstime() wynosi ~9.5m/s

ale jak w ten sposób zmierzyłeś dokładnie prędkość?
Sam napisałeś wcześniej że roboty latające chwilę się rozpędzają...

[ Dodano: 25-12-2009, 16:41 ]
No więc wziąłem poprawkę na rozpędzanie się, ale obcy nadal są szybsi pod górkę.
I dodatkowo przetestowałem więcej robotów.

Prędkości: PhazerShooter, Shielder, Recycler i Thumper są dokładnie takie same, więc będę pisał tylko dla PhazerShooter.

Subber ma prędkość taką samą jak TrackedGrabber.

Zawsze myślałem że Me = Tech (poza czapką z daszkiem), ale okazało sie że nie:

1) Płaski teren
Kod:
WheeledGrabber               5,02
TrackedGrabber               3,76
LeggedGrabber                3,76
WingedGrabber (po ziemi)     4,18
WingedGrabber (w powietrzu) 12,52
PhazerShooter                2,51
Tech (po ziemi)              3,34
Tech (w powietrzu)          10,01
Me (po ziemi)                4,19
Me (w powietrzu)            12,52
AlienAnt                     3,01
AlienSpider                  3,01
AlienWasp                   12,52
AlienWorm                    0,75
AlienQueen                   2,01


2) Pitch = 21 (Z - nie zsuwa się po zatzrymaniu)
Kod:
WheeledGrabber               1,75
TrackedGrabber               3,2
LeggedGrabber                3,75 Z
WingedGrabber (po ziemi)     0,92
PhazerShooter                1,95
Tech (po ziemi)              2,09
Me (po ziemi)                1,84
AlienAnt                     3,13 Z
AlienSpider                  3,03 Z
AlienWorm                    0,81 Z
AlienQueen                   1,24


3) Pitch = 38 (N - nie może podejść)
Kod:
WheeledGrabber               N
TrackedGrabber               1,4
LeggedGrabber                3,21
WingedGrabber (po ziemi)     N
PhazerShooter                0,16
Tech (po ziemi)              0,04
Me (po ziemi)                N
AlienAnt                     3,37 Z
AlienSpider                  3,07 Z
AlienWorm                    0,96 Z
AlienQueen                   N

Me jest szybszy na płaskim, ale gdzie Me nie może, tam Tech podejdzie :)

4) Pitch = 60
Tu jak zwykle wyszły dziwne rzeczy:
Kod:
WheeledGrabber               1,25
TrackedGrabber               N
LeggedGrabber                1,4
WingedGrabber (po ziemi)     0,42
PhazerShooter                N
Tech (po ziemi)              N
Me (po ziemi)                0,79
AlienAnt                     3,14
AlienSpider                  2,25
AlienWorm                    1,42 Z
AlienQueen                   N

Do klubu dziwnie zachowujących się obiektów dołączył Me.

I nadal zostaje przy twierdzeniu, że czym dłuższy czas pomiaru tym dokładniejszy wynik, Poniżej uzasadnienie:

Przypuśćmy, że chcemy zmierzyć prędkość dla bardzo małego odcinka czasu. (np. 0.01s)
W colobocie pozycja podawana jest z dokładnością do 2 miejsc po przecinku.
Więc robot musi poruszać się w ten sposób:
Kod:
Zmień pozycję o 0.01
Czekaj ileśtam

Oczywiście można zmienić żeby przesuwał się z większą dokładnością, ale nigdy nie będzie to płynne przesunięcie.
Więc jeżeli zmierzysz tą prędkość akurat w czasie gdy zmienia położenie, to wyjdzie ogromna prędkość, a jak zmierzysz w czasie czekania to wyjdzie bardzo mała.
Przez dłuższy czas pomiaru uśredniamy wynik: dla moich 10 sekund pomiaru wahania wynosiły 0,02m/s, przy 100 sekundach byłyby 10 razy mniejsze

Berserker - 25-12-2009, 16:58

@up
Ja za pomoca petli robie tak, ze otrzymuje co jakis czas pomiar i po prostu licze srednia.
Kod:
float time, dist;
point start;
jet(1);
motor(0,0);
wait(2);
while(true)
{
jet(1);
motor(1, 1);
start = position;
time = abstime();
wait(0.01);
dist = distance(position, start);
message((dist/(abstime()-time))+"m/s; "+(dist/0.01)+"m/s", DisplayInfo);
wait(0.2);

}

sajmon313 - 25-12-2009, 17:30

Berserker napisał/a:
@up
Ja za pomoca petli robie tak, ze otrzymuje co jakis czas pomiar i po prostu licze srednia.
Kod:
float time, dist;
point start;
jet(1);
motor(0,0);
wait(2);
while(true)
{
jet(1);
motor(1, 1);
start = position;
time = abstime();
wait(0.01);
dist = distance(position, start);
message((dist/(abstime()-time))+"m/s; "+(dist/0.01)+"m/s", DisplayInfo);
wait(0.2);

}

Błędy:
jet(1) w pętli - dlaczego lecisz w górę? jak już tak chcesz to zastosuj distance2d.
po co wait w dwóch miejscach?

Dowiesz się, dlaczego robisz to źle, jak zmienisz message na:
Kod:
message((abstime()-time)+"s; "+(dist/0.01)+"m/s", DisplayInfo);

U mnie pokazuje: 4-6 s!
a jak usunąłem jet(1) z pętli i tylko dałem żeby an początku przez 2 sekundy zwiększał wysokość, to 2-3s

Wniosek:
wykonanie instrukcji która nie porusza robotem też zabiera trochę czasu.

adiblol - 25-12-2009, 18:57

Jak dokładnie policzyć?
Kod:

motor(1,1);
wait(4); //rozpedzamy sie
point s_p = this.position;
float s_t = this.lifetime;
wait(5); //mierzymy
point e_p = this.position;
float e_t = this.lifetime;

float v = (e_p-s_p)/(e_t-s_t);
message("Predkosc: "+v);

Można też zrobić kilka pomiarów (np. co sekundę) i średnią wyliczyć...

A tak w ogóle to abstime() ssie bo jak się przerwie grę przez wyjście do menu to on NADAL LICZY (WTF?).

FE4R - 25-12-2009, 21:08

Berserker napisał/a:
Zdecyduj sie czego sie czepiasz. Najpierw probujesz mnie przekonac, ze ja otrzymalem dystans przebyty przez robota (jakbym nie umial predkosci liczyc).
Teraz sie mnie czepiasz, ze licze predkosc bez dystansu. Dystansu nie licze, dystans mam podany

Czepiać to się można na ściance wspinaczkowej. Po prostu nie rozumiem, jakiego Ty programu używasz, że wszystko tak niezrozumiale liczysz.
Cytat:
Podstawowa definicja ruchu jednostajnego: predkosc jest jednakowa w kazdym momencie ruchu. Niewazne, czy dasz 0.01s czy 100s, przebyta droga w tym czasie po podzieleniu przez ten czas da nam zawsze jednakowa predkosc.

Robot, szczególnie latający nie porusza się ruchem jednostajnym, jak to sam zauważyłeś.
Prędkość nie jest taka sama; tak jak wcześniej - robot latający będzie miał zmienną prędkość, szczególnie przy opadaniu / wznoszeniu. To samo tyczy się robotów naziemnych przy zmiennym 'pitch'.
Chodziło mi o to, że jeśli w wait(); wpiszesz 10, dostaniesz wynik po 10 sekundach. Gdy wpiszesz 0.1 sekundy - dostaniesz więcej wyników i możesz uchwycić np. maksymalną prędkość robota latającego (wyniosło chyba 20-21 m/s).

Cytat:
Wychodzi na to, ze nie da sie porzadnie zmierzyc predkosci chwilowej.

W końcu nie planujemy wyprawy w kosmos, ale sprawdzamy prędkość robotów w prostej gierce.

sajmon313 napisał/a:
Błędy: jet(1) w pętli - dlaczego lecisz w górę? jak już tak chcesz to zastosuj distance2d.

Przecież gdy robot się wznosi, to chyba nazwiesz to prędkością, prawda?

Berserker - 25-12-2009, 21:20

Cytat:
jet(1) w pętli - dlaczego lecisz w górę? jak już tak chcesz to zastosuj distance2d.
po co wait w dwóch miejscach?

To jest program dla osy - mam nadzieje, ze wyjasnilem wszystko?

Cytat:
Robot, szczególnie latający nie porusza się ruchem jednostajnym, jak to sam zauważyłeś.
Prędkość nie jest taka sama; tak jak wcześniej - robot latający będzie miał zmienną prędkość, szczególnie przy opadaniu / wznoszeniu.

To nie znaczy, ze wahania beda wynosily ponad 10m/s.
Cytat:
Gdy wpiszesz 0.1 sekundy - dostaniesz więcej wyników i możesz uchwycić np. maksymalną prędkość robota latającego (wyniosło chyba 20-21 m/s).

Albo te zmiany sa az tak krotkotrwale, ze nie da sie ich zauwazyc w czasie normalnej gry, albo potrzebuje mocniejsze okulary (cholerna okulista!).

Cytat:
Przecież gdy robot się wznosi, to chyba nazwiesz to prędkością, prawda?

Ja wole predkosc w poziomie, ma wieksze zastosowanie w programach do celowania.

sajmon313 - 26-12-2009, 00:29

FE4R napisał/a:

sajmon313 napisał/a:
Błędy: jet(1) w pętli - dlaczego lecisz w górę? jak już tak chcesz to zastosuj distance2d.

Przecież gdy robot się wznosi, to chyba nazwiesz to prędkością, prawda?


Berserker napisał/a:

Cytat:
Przecież gdy robot się wznosi, to chyba nazwiesz to prędkością, prawda?

Ja wole predkosc w poziomie, ma wieksze zastosowanie w programach do celowania.


No więc chodzi o prędkość w poziomie, bo:
1) żeby można było ją porównać z prędkoścą obiektów naziemnych
2) przydaje się w celowaniu
3) większość map w colobocie mo bardzo niskie ograniczenie wysokości lotu (ok. 100m), a w poziomie jest ponad 700m (od końca do końca mapy).

A jeszcze w kwestii technicznej:
Czy roboty latające mają osobny silnik do jet(), a osobny do motor() ?
Eksperyment wyglądasłby tak:
zmierzyć distance2d w czasie gdy na jakiejś wysokości leci z motor(1,1);
oraz zmierzyć distance2d w czasie gdy będzie lecieć z motor(1,1) i jet(1).

I jeszcze jedna kwestia techniczna:
Czy wiatr na pewno nie wpływa na prędkość robotów latających?

FE4R - 26-12-2009, 00:45

Berserker napisał/a:
Albo te zmiany sa az tak krotkotrwale, ze nie da sie ich zauwazyc w czasie normalnej gry, albo potrzebuje mocniejsze okulary (cholerna okulista!).

Lecz, gdy chcesz to wykorzystać do programów przeciwko obcym, to jest pewien problem, gdyż średni altitude osy to 7.88 metra nad powierzchnią (zakładając, że cały czas leci na jet(1);). Jeśli z wyższego punktu zleci do doliny, to będzie znacznie szybsza, co tyczy się też opadających robotów (u mnie prędkość wzrosła od 14 m/s do 22 m/s).
A tak na marginesie to chyba nie potrzeba wiedzieć aż tylu stałych (średnich?), aby zestrzelić osę z Epsitecowskim programem.

sajmon313 napisał/a:
A jeszcze w kwestii technicznej:
Czy roboty latające mają osobny silnik do jet(), a osobny do motor() ?

Tak.

Cytat:
I jeszcze jedna kwestia techniczna:
Czy wiatr na pewno nie wpływa na prędkość robotów latających?

Nie.

dasdads - 01-03-2010, 17:14

wyjasniam o co może chodzic:
po pierwsze primo-ultimo pomiar (funkcje i linkjki) np.

x=this.position\dist=distance(position,start)/

zajmuje troche czasu, proponuje zmieżyć ile (wpisując w program cala i jedynie sekwencje pomiaru czasu, jesli wyjdzie 0 to sie myle, ale raczej nie wyjdzie

po grudo secundo jeśli nie wyjdzie 0 to ważne jest co sprawdzisz pierwsze czas czy odległość, proponuje podczas ruchu jedynie zdjąć pomiary, a dopiero po zatrzymaniu przeliczyc, gdyż to tesz może zafałszowaćpomiar (chyba)

po trzecie tetrio

jak postawiłeś techników, niszczonc houston czy przez /// produce(position,0,?Tech?,"");/// ??

ty robiłeś mape, czy robiłeś to podczas misji/swobodnej gry?



//moja sugestia// proponuje sprawdzić czy niesienie ładunku/rodzaj ogniwa i ładuku wpływa na prędkość


Powered by phpBB modified by Przemo & WRIM © 2003 phpBB Group