Harrastajate kestvussõiduvõistkond · 2026
LapTimer: ringiaegade mõõtja ja kestvussõidu strateeg
Isetehtud Android-äpp, mis mõõdab ringiaegu millisekundi täpsusega eraldi GPS-seadme abil ja arvutab kestvussõidus sõitjate parima vahetuste järjekorra.
Eesmärk
Kuueliikmelisel harrastajate võistkonnal (8-tunnised kestvussõidud, kus hinnatakse ringikiiruste ühtlust, mitte kiirust) polnud taskukohast ja piisavalt täpset viisi ringiaegu mõõta ega sõitjate vahetusi planeerida. Valmislahendused on kallid või ei anna meeskonnale reaalajas ligipääsu oma andmetele. Seepärast ehitasin ise kõik: Android-äpi, veebis töötava boksiseina ja strateegia arvutuse.
Tulemus numbrites
Mis muutus
10 Hz+
GPS-i uuendussagedus eraldi seadmega (telefoni enda GPS umbes 1 Hz)
±2 s
ringi lõpuaja ennustuse sihttäpsus uue loogikaga (vana loogika eksis kuni ±30 s)
191
mõõdetud ringi ühel 8-tunnisel võistlusel
56%
meeskonna ühtluse kaotusest tuli boksipeatustest: just seda strateegia nüüd parandab
Olukord
Selles kestvussõidus ei võida kõige kiirem meeskond, vaid kõige ühtlasem. Iga ringi kohta arvutatakse keskmine kiirus ja hinnatakse, kui palju need kiirused kogu 8 tunni jooksul kõiguvad (standardhälve, km/h). Arvesse lähevad kõik ringid, ka need, mille sees on boksipeatus ja sõitjavahetus. Seepärast mõjutavad sõitjate järjekord ja vahetuste kiirus tulemust sama palju kui see, kui hästi keegi sõidab.
Meeskonnal olid rada ja autod, aga puudus kaks asja. Esiteks tööriist, mis ütleks sõitjale reaalajas, kas praegune ring vastab sihtajale. Teiseks andmed, mille järgi otsustada, kes sõidab millal ja kui kaua. Ehitasin mõlemad üksi: Android-äpi, mis loeb eraldi GPS-seadet, ennustab ringi lõppu ja saadab kõik pilve, ning analüüsi, mis arvutab sealt strateegia.
Esimene päris proov oli aprillis 2026 Audru ringrajal toimunud 8-tunnine võistlus. Paljud allpool kirjeldatud lahendused sündisid just sellest, mis seal või enne seda testides ei töötanud.
Piirangud
- Telefoni enda GPS uueneb umbes kord sekundis ja hüpleb liiga palju, et teada, millisel sekundi murdosal auto finišijoone ületas.
- Äpp peab töötama tunde järjest ekraan väljas, ilma et telefon asukohateenust taustal välja lülitaks.
- Telefon peab vastu pidama terve 8-tunnise võistluspäeva, ka siis, kui see seisab pikalt boksis.
- Raja pikkus ja kuju ei tohi olla koodi sisse kirjutatud. Äpp peab töötama igal rajal.
- Erinevad autod annavad mootori kohta erinevat infot. Vale päring teeb lugemise aeglaseks või ei anna vastust üldse.
Lahendus
Kuidas lahendasin
Täpsus
Kuidas saada finišijoone ületamise hetk sekundi murdosa täpsusega, kui telefoni GPS uueneb harva ja pole piisavalt täpne?
Telefoni enda GPS annab umbes ühe punkti sekundis. 144 km/h (40 m/s) juures on punktide vahel 40 meetrit ja finišijoon võib olla ükskõik kus nende vahel, nii et viga võib olla terve sekund. Seepärast ühendub äpp USB kaudu eraldi GPS-seadmega (u-blox) ja loeb selle andmeid otse, 10 korda sekundis. Siis on punktide vahel 4 meetrit ja 0,1 sekundit. Iga andmerida kontrollitakse, häiretega read visatakse kohe minema ja katkenud USB-ühendus taastub ise.
Ka 0,1 sekundit on liiga palju, et võtta lihtsalt esimese joone taga oleva punkti aeg. Seega arvutab äpp ületuse hetke kahe punkti vahelt välja: viimane punkt enne joont (A) ja esimene punkt pärast joont (B). See käib neljas sammus.
1. Kas joon ületati? Iga uue punkti B korral vaadatakse lõiku eelmisest punktist A kuni B-ni ja kontrollitakse, kas see lõikab finišijoont. Joont pikendatakse mõlemale poole umbes 15 meetrit, et GPS-i väike külgnihe ei jätaks ületust märkamata. Soovi korral kontrollitakse ka sõidusuunda, et vales suunas ületus ringi ei lõpetaks. Kahe ületuse vahel peab olema vähemalt 25 sekundit, nii et joone juures hüplev GPS ei saa ühte ringi kaheks lugeda.
2. Kus joon täpselt oli? Arvutatakse, mitme protsendi peal lõigust A→B joon asub. Teisel joonisel on A joonest 2,8 m enne ja B 1,2 m pärast, kokku 4 m. Joon on 70% peal ehk A-st 2,8 meetri kaugusel.
3. Mis hetkel auto sinna jõudis? GPS-seade mõõdab kiirust ise, raadiosignaali sageduse nihke järgi, mitte asukohtade vahe järgi, ja see kiirus on palju täpsem kui asukoht. Kui A-s oli kiirus 40 m/s, jõudis auto jooneni 2,8 / 40 = 0,070 sekundit pärast A-d. Kui võtta lihtsalt B aeg, oleks see ring 30 ms vale.
4. Kas tulemus on usutav? GPS-i asukohal on müra. Kui punktid näivad teineteisest kaugemal, kui auto tegelikult sõitis, võib kiiruse järgi arvutatud hetk jääda A ja B vahelt välja: kolmandal joonisel tuleb 120 ms, kuigi B mõõdeti juba 100 ms pärast A-d. Sellist tulemust äpp ei usu ja arvutab aja protsendi järgi: joon oli 80% peal, seega 80% × 100 ms = 80 ms. Sama varuarvutus käib siis, kui seade kiirust ei andnud või auto peaaegu seisis.
Lõpuks parandatakse antenni asukoht. Antenn on katusel, aga ajavõtt mõõdab auto nina. Seadetes saab sisestada nende vahe millimeetrites ja äpp lahutab vastava aja maha: 2 meetrit 40 m/s juures on 50 ms. Aeg tuleb telefoni kellast, mis loeb aega telefoni käivitusest ja ei hüppa kunagi, ka siis, kui telefon kellaaega võrgust parandab. Ringiaeg on kahe järjestikuse ületuse vahe.
Kui täpne see päriselt oli? Audru võistlusel võrdlesin äpi ringiaegu ametliku ajavõtuga. 182 ringi puhul, mida sai üks-ühele kokku viia, oli erinevuse mediaan 56 ms ja 92% ringidest erines alla 0,5 sekundi. Suuremad erinevused tulid sageli paaris: kui üks ületus mõõdeti 1,3 s hiljem, oli see ring 1,3 s pikem ja järgmine peaaegu täpselt sama palju lühem. Päris viga oli ka: ühe korra jäi ületus märkamata ja kaks ringi said üheks. Kokku logis äpp 189 ringi ja ametlik ajavõtt 191, sest ühe boksipeatuse juures on ringid kahes süsteemis ka erinevalt jagatud.
Ennustus
Esimene versioon ennustas ringi lõppu nii, nagu sõidaks auto kogu ringi sama kiirusega. Viga oli kuni 30 sekundit.
Mis ei töötanud: vana valem jagas läbitud maa kiirusega. Sellel oli kolm viga korraga. Rada ei sõideta ühtlase kiirusega: sirgel 120 ja kurvis 40 km/h. Raja pikkus (3 200 m) oli koodi sisse kirjutatud. Ja GPS-i järgi kokku liidetud maa triivib ringi jooksul, nii et „läbitud 60%” võis tegelikult olla 55% või 65%. Tulemus oli kuni ±30 sekundit vale.
Kuidas see nüüd käib: igal sõitjal on oma võrdlusring, mis on salvestatud 200 punktina ühtlaste vahedega. Iga uue GPS-punkti puhul otsitakse võrdlusringilt kõige lähem koht ja vaadatakse, kui palju aega sinna jõudmiseks võrdlusringil kulus. Vahe praeguse ja võrdlusringi aja vahel ongi see, kui palju sõitja on eest või taga.
Otsing käib ainult ettepoole ja kitsas aknas (20 punkti), et kurvis, kus rada iseenda lähedalt mööda läheb, ei hüppaks see kogemata vale rajalõigu peale. Aken liigub edasi ka aja järgi: kui auto seisab liikluses, ei jää ennustus paigale kinni. Uue loogika sihttäpsus on ±2 sekundit.
Liiklus
Kuidas vältida, et üks aeglane ring (liiklus, külm ring pärast vahetust) rikuks võrdlusringi, kuid näidata sõitjale ikka ausalt tema päris aega?
Ennustus ei külmu kunagi, ka liikluses mitte. Sõitja näeb alati ausalt, kui palju ring venib. Liikluses sõidetud ring ei tohi aga võrdlusringi muuta. Ring loetakse liiklusringiks, kui auto sõitis üle 15% ringist tavalisest tempost oluliselt aeglasemalt (alla 60% võrdlusringi kiirusest).
Võrdlusringi uuendavad ainult „puhtad” ringid: mitte boksist väljasõidu ring, mitte liiklusring ja mitte ring, mis on sõitja keskmisest üle 25% kõrval. Uus puhas ring mõjutab võrdlusringi 30% ulatuses ja pärast kümmet ringi ainult 15% ulatuses. Nii näitab võrdlusring sõitja tavalist tempot, mitte tema parimat ega halvimat ringi. GPS-i väike värin silutakse viie viimase punkti kaalutud keskmisega.
Kui sõitjal endal võrdlusringi veel pole, kasutatakse sellelt rajalt salvestatud ringi või teise sõitja ringi, mis on selle sõitja tempo järgi ümber arvutatud. Nii töötab ennustus kohe, mitte alles pärast mitut ringi kogumist.
Vea parandus
Testis ei tekkinud võrdlusringi üldse ja ennustus jäi tühjaks.
Mis ei töötanud: ringi salvestamisel oli kvaliteedifilter, mis viskas välja kõik punktid, mille GPS-i täpsus oli halvem kui 20 meetrit. Paberil mõistlik, aga päris rajal viskas see välja nii palju punkte, et ringist jäi alles liiga vähe ja otsing ei leidnud enam midagi. Filter tegi andmed „puhtamaks” ja ennustuse kasutuks.
Kuidas see nüüd käib: piir on 50 meetrit, sest 200 punkti sisse ühtlustamine ja silumine võtavad väikese müra niikuinii ära. Boksist väljasõidu ringe, mida võrdlusringiks ei kasutata, on nüüd üks, mitte kaks, nii et võrdlusring tekib ringi võrra varem. Leidsin ka teise vea: kui andmebaasi oli kunagi jäänud tühi, 0 punktiga võrdlusring, jooksis äpp selle laadimisel kokku. Nüüd sellist ringi ei laadita ja äpp teeb uue.
Reaalajas jälgimine
Boksis tahetakse näha ringiaegu, GPS-i olekut ja praegust sõitjat reaalajas, ilma rajaäärde minemata.
Äpp saadab iga ringi alguse, lõpu, jooksva aja, kiiruse ja GPS-i oleku kohe pilve. Veebis töötav boksisein näitab seda otse brauseris, koos jooksva ühtluse edetabeliga. Kui on aeg sõitja boksi kutsuda, annab äpp sõitjale helisignaali. Sõitjate ja sessioonide nimesid saab muuta veebis ja muudatus jõuab ise telefoni tagasi.
8 tunni jooksul läheb andmeid palju, seega on iga saadetud teade tehtud võimalikult väikeseks: saadetakse ainult see, mis muutus. Konkurentide ringiajad loeb eraldi skript võistluse avalikust ajavõtust iga 15 sekundi järel ja kirjutab need samasse kohta, nii et boksiseinal on näha ka teiste meeskondade seis.
Konkurentide ringiaegadest saab välja lugeda ka nende strateegia. Ring alla 40 km/h tähendab boksipeatust, nii et boksiseinal on näha, mitu vahetust keegi on teinud ja mitu neil tõenäoliselt veel ees on. Esimesel võistlusel oli selgelt näha kahe lähima rivaali erinev tee: võitja tegi ühe boksipeatuse, lähim rivaal kolm, aga sõitis kõige rohkem ringe.
Auto andmed
Kuidas lugeda auto enda andmeid (pöördeid, jahutusvedeliku temperatuuri, pinget), kui eri autod annavad eri infot?
Äpp ühendub Bluetoothi kaudu auto diagnostikapesa (OBD-II) adapteriga, iseenesest, ilma et keegi peaks ühendust käsitsi looma. Kõigepealt küsib äpp autolt, milliseid andmeid see üldse annab. Pärast seda küsitakse ainult neid, mis päriselt vastuse annavad, selle asemel et iga puuduva näitaja puhul vastust oodata. Nii jääb uuendussagedus kiireks ka autodel, mis annavad vähe infot.
Analüüs
Esimese 8-tunnise võistluse tulemus oli 11,5 km/h. Kust see kõikumine tegelikult tuli?
191 ringi andmed näitasid midagi, mida silmaga poleks märganud. Ilma boksiringideta oleks meeskonna tulemus olnud 5,1 km/h. Boksipeatused tegid seega 56% kogu kahjust. Seitsmest sõitjavahetusest tekkis 12 aeglast ringi (mõni vahetus jäi kahe ringi peale) ja kolm aeglasemat ringi (6:49, 5:13 ja 5:06) andsid suurema osa sellest üksi.
Põhjus on hindamise matemaatikas. Standardhälve võtab iga kõrvalekalde ruutu: kaks korda suurem kõrvalekalle maksab neli korda rohkem. Üks väga aeglane ring teeb rohkem kahju kui kümme natuke aeglast. Seda kinnitas ka võitja: tema tegi kogu võistluse jooksul ainult ühe boksipeatuse ja tema tulemus oli 6,5 km/h.
Sellest tuli esimene konkreetne reegel: iga vahetus peab mahtuma 2:30 kuni 3:00 sisse. Mitte kiirustades, vaid harjutatud korraga.
Arvudes näeb see välja nii. Kui meeskonna keskmine ringikiirus on 81 km/h ja boksiring sõidetakse keskmiselt 30 km/h, on selle ringi „trahv” (30 − 81)² = 2 601. Kui boksiring sõita 60 km/h, on trahv (60 − 81)² = 441, ehk 83% väiksem, iga vahetuse juures. Esimese võistluse kolm kõige aeglasemat boksiringi andsid üksi 7 893 sellist ühikut, suurema osa kogu meeskonna kahjust.
Strateegia
Kuidas otsustada andmete põhjal, mis järjekorras ja kui kaua iga sõitja sõidab?
Sõitjate vahe ühtluses oli suurem, kui keegi arvas. Kõige ühtlasem sõitja oli viis korda stabiilsem kui kõige kõikuvam: ringiaegade hajuvus 1,9 sekundit versus 10,1 sekundit. Kõikuvama sõitja andmetes oli selge muster: ta alustas ringidega 1:39–1:43 ja langes siis 1:53–1:55 peale. Probleem polnud kiirus, vaid liiga kiire algus. Lahendus on sihtvahemik, mida äpp sõitjale jooksvalt näitab.
Iga sõitja sihtaeg on tema enda tavaline tempo (mediaan), mitte kõige kiirema oma. Kiireima ja aeglaseima vahe oli 13,6 sekundit ringil (10,1 km/h) ja seda ühe võistlusega ei muuda. Ühtlust iga sõitja enda tempos aga saab.
Nende andmete põhjal on plaan selline: kõige ühtlasem sõitja alustab ja lõpetab, kokku 8 vahetust ja 7 sõitjavahetust. Simulatsioon annab selle plaaniga tulemuseks umbes 6,0–7,0 km/h, eelmise 11,5 asemel. Väsimust andmetes peaaegu polnud: ainult üks vahetus aeglustus lõpu poole (+3,9 sekundit), teised läksid soojenedes hoopis kiiremaks.
Raja olukord
Kui ringiajad lähevad aeglasemaks, kas väsis sõitja või muutus rada?
Kui vastust ei tea, võib asjata sõitja välja vahetada ja see tähendab veel üht boksiringi. Seepärast võrdleb analüüs iga hetk kõigi meeskondade tempot. Kui üle 60% meeskondadest aeglustub korraga üle 3%, on põhjus rajas, mitte sõitjas.
Esimesel võistlusel oli see selgelt näha kaks korda: kell 13 aeglustusid kõik meeskonnad keskmiselt 8,8 km/h ja kell 15 11,9 km/h, tõenäoliselt vihma tõttu. Kui sama juhtub järgmisel korral, näeb boksisein kohe, et sõitjal on kõik korras.
Tulemus
Esimesel päris kestvusvõistlusel mõõtis äpp ringe 8 tundi järjest ja selle ringiajad erinesid ametlikust ajavõtust mediaanina 56 ms. Analüüs muutis meeskonna kõhutunde arvudeks: 56% ühtluse kaotusest tuli boksipeatustest, kõige kõikuvama sõitja probleem oli liiga kiire algus ja kaks suurt aeglustust tulid rajast, mitte sõitjatest.
Sellest tulid konkreetsed reeglid järgmiseks võistluseks: vahetus 2:30–3:00, iga sõitja oma sihtvahemikuga ja sõitjate järjekord, mille simuleeritud tulemus on umbes 6–7 km/h eelmise 11,5 asemel.
Edasi
Järgmine võistlus paneb plaani päris proovile: kas simulatsiooni 6–7 km/h peab ka rajal. Pärast seda võrdlen tulemust simulatsiooniga ja parandan mudelit seal, kus see eksis.