Uncategorized

Aplink Lietuvą (APL) 2020

Po viso to sėdėjimo namie “nes šalta” ir “nes virusas”, bet labiau nes šalta, šis 2020 pavasaris taip visai nedžiugino gerais orais, pagaliau išsiruošėm į savo tradicinį APL’ą. Pasitikrinom Facebook memorius – šis APL mums jau šeštas.

Labai smagu prisiminti ištakas – viskas yra apie tai kaip tas mūsų motociklizmas prasidėjo: prieš gerus šešis metus įsigijom 80cc kinietišką mopedą ir kai tik bent kažkiek išmokau negriūdamas važiuoti iškart susikrovėm ant jo didžiausią mantą ir išvažiavom daugiau nei savaitei aplink Lietuvą. Nuo tos pirmosios kelionės jau daug vandens nutekėjo, keitėsi motociklai, važinėjom vis daugiau ir daugiau, bet šis pavasarinis raidukas prigijo ir mielai jį kasmet kartojam. Ta Lietuva tokia skersai išilgai jau mūsų išmaišyta, bet kaip tik šiemet kalbėjomės apie tai – važiuojant žinomais keliais suveikia teletabių efektas: smegenys žino kas bus už sekančio posūkio, ir kai pamatai tai kas yra už to sekančio posūkio smegenys nudžiunga “matai, matai, buvome teisios!”. Ir taip pusantro tūkstančio kilometrų. Visai verta kartoti, žiauriai smagus reikalas. Dar vienas efektas “savose teritorijose” – viskas jau žinoma, nereikia įsidėmėti dauga naujų dalykų, gali ramiai atsijungti ir pasilikti tik minimum įspūdžių, gaunasi tokia sanatorija kvadrtatu.

Fiziškai, kiekvienas važiavimas motociklu yra darbas, po gerų keturių dienų (šiemet važiavom atsipalaidavę ir nevarėm, kaip kad kažkuriais metais, kai šį maršrutą nuvažiavom per dvi dienas) nuovargis jaučiasi kaip reikiant, bet tai taip pat yra dalis smagumo – “work hard, play harder” – visas mūsų geriausias laikas yra mažas žingsniukas iš savo komforto zonos. Kitaip jau nė nesigautų, bandėm sąžiningai. Net kokias dvidešimt minučių išdrybsojom prie jūros ant rankšluostėlių. O po to šovėm nuotykiaut. Bet dabar ne apie tai.

Trumpa kelionės santrauka:

Distance:1259.71 kmAverage speed:54.79 km/h
Total ascent:4554 mAvg. moving speed:75.93 km/h
Total descent:4586 mMaximum speed:129.46 km/h
Total time:22:59:30.0Moving time:16:35:19.0
zūmo® 595LM

Šiemet iš Salomėjos dovanų gavau Garmin Zūmo 595LM ir nemaža kelionės dalis buvo apie jo bandymą bei kai kurių įkyrių Garmino kliurkų debuginimą.

Nes pardavimo buklete. Pardavimo buklete viskas skamba gražiai: “per bluetooth dalinatės taškais ir kelionėmis ir tik smagiai važiuojate, dulkės tik rūksta…”, na, žodžiu supratote. Realybė gi, realybė yra tokia, kad Garminas, nors ir (o gal kaip tik dėl to) būdamas nr. 1 navigatorių gamintojas nė kiek nesivargina dėl jų connectivity. Jei esate įpratę prie Linux OS… Na, žodžiu tie daiktai veikia tik su Windows arba (gal) su Mac’ais, nors su mac’ais mano aasmenine nuomone niekas neveikia, nes jie patys ten nelabai veikia. Pakanka pažiūrėti kaip struggle’ina normalūs techniniai žmonės prie tų obuolių… Žodžiu ir vėl mes ne apie tai. Esmė yra ta – Garminas per bluetooth dalinasi kelionėmis tik su tokiais pačiais Garminais… Oh well, kaip čia mes juos ne du iškart pirkom. Taigi, oficialus kelias planuoti keliones Garmino devaisams jau daug metų yra tas pats: imate savo kompiuterį, jame su Garmin Basecamp susidėliojate kelionę ir per USB ją įkeliate į savo navigatorių. Ha ha. Viena maža detalė – mes didelių kelionių neplanuojame centimetro tikslumu namie ir, kaip netikėta, nesame įpratę į motociklo bagažą pasiimti nei stacionaraus nei nešiojamo kompiuterio. O šito juk negali numatyti būdamas nr. 1 navigacijų gamintojas pasaulyje, ar ne? Taigi.

Mano ilgos keturios naktys iki kelionės yra ne maršruto planavimas. Maršrutą aš žinau mintinai ir per kelias minutes jį galiu suklikinti į bet kurią normalią navigaciją. Mano naktys yra apie tai, kad išmokti į Garmin devaisus perkelti GPX track’ą sudarytą mano mėgamame OsmAnd+ appse telefone. Ir čia jau prasideda kosmosas. Nes OsmAnd nuo 2005 metų vis dar nėra pataisęs (ak, kaip netikėta) vieno annoying bug’o ir Garminai jo suformuoto GPX tiesiog neskaito. Ar tai man yra kliūtis? Kaip ir ne, nes iš OsmAnd+ eksportuoju GPX failą, tada jį su vienu papildomu appsu sukonvertuoju į normalų XML’ą ir tada su kitu appsu jį paverčiu tokiu, kurį gali nuskaityti Garminas. Kažkaip per daug darbo, ar ne? Žiauriai nepatogu, jau įsivaizduoju, kaip būdamas gerokai pavargęs kelionėje planuoju rytdienos maršrutą, tada vienas eksportas, tada kitas, tada importas į garminą, tada užkrauni navigatorių, patikrini – ir randi kokią kliurką. Na tarkim ne ten posūkis. Viską reiktų daryti iš naujo. Nelabai patogu. Žodžiu, čia aš dar paieškose, šiam momentui geriausia ką radau yra maršruto suvedinėjimas tiesiai į navigatorių, kas yra kaip ir nieko, bet juk telefone viskas tikrai daug patogiau. Gali būti, kad susiprogramuosiu šį bei tą, bet pamatysim.

Grįžtant prie kelionės: kaip mes labiausiai ir mėgstam išvažiuojam penktadienį po darbų.

Pirma diena 108 km, 1h 47 min. Asfaltas iki pat Varėnos rajono, ten smagiai šokam į žvyrkelį. Taip smagiai ir taip dėmesingai vežu bijančią pirmo žvyrkelio šį sezoną Salomėją, kad kažkaip tiesiog nepastebim kaip šiltas vasarinis lietus įsilyja ir į Ūlos ežero stovyklavietę atvažiuojam jau kiaurai šlapi. Kol pastatom palapinę pila jau net ne katėmis ir šunimis, o briedžiais ir šernais, tai palapinėje ją pastačius jau yra nedidelis kiekis vandens, bet užtat esam vieni stovyklavietėje ir net įsikuriam visiškai šalia medinės stoginės. Joje sausa, tad ištempiam virvę ir pasikabinam striukes, kad bent kiek nuvarvėtų iki ryto. Tada arbata, pypkė ir jau tas laikas kai reikia miegoti. Paryčiais (04:00) atvažiuoja žvejas, iš tų, kur vairuodami tvarkingai kalba telefonu per automobilinę laisvų rankų įrangą. Bet kalba, čia aš taip taupiai pasakiau, iš tikro tai liejasi nenutrūkstamas žodžių srautas, o garsas toks, kad girdim ne tik mes jau iš anos pusės ežero, kol dar atvažiuoja. Girdi pusė Čepkelių rezervato. Garsas tai garsu, bet man visad daro įspūdį tie žmonės, kurie telefonu gali kalbėti nesustodami tiek laiko. Šitoks informacijos srautas. Reikia turėti ką pasakyti. Kažkur ten pro miegus girdim iš tos mašinos “o, palapinė stovi” ir po to viskas nutyla, durelės trinkt trinkt, valtis čiūžt nuo stogo ir tada jau tyliai valtyje sumerkę meškeres sėdi. Tarsi nė nemokėtų tiek daug kalbėti.

Antra diena: 460 km, 7h 27min kelio. Ryte išsiverdam porą kavų, susipakuojam daiktus ir kokias dešimt minučių pakovoję su Garminu pradedam dienos maršrutą.

Vienas mano mėgstamiausių kelių Lynežeris – Marcinkonys (žvyrkelis), o po to jau šokam į asfaltą ir su keliom dešimtim kilometrų išimties, kai Garminas, kažkodėl “paoptimizavo” mano sudėliotą track’ą ir praskipino Vištytį žvyrkeliais… Kai pastebim tą kliurką – grįžtam dvidešimt kilometrų bet jau asfaltu iki Vištyčio, kažkodėl aš optimistiškai galvojau, kad ten rasim kur papietauti. Ha ha ha. Papietaujam degalinėje ties Keturnaujiena. Ne taip ir neskanu kaip galima tikėtis iš lietuviško tinklo degalinės, o mes prie degalinių turizmo kaip ir pripratę, taigi, tiesiog normali savo eiga tekanti kelionė. Už Jurbarko ši puiki vasara pasirodo besanti kiek šaltoka, tai bendru sutarimu skipinam Kintus ir traukiam tiesiai į Šventąją. Šventojoje kiekvienais metais apsistojam tame pačiame kempinge, mus jau kaip ir atpažįsta, o kempingas iš tikro yra vokiškos kokybės, tad mielai grįžtam čia dar ir dar. Išsipakavus lieka jėgų nueiti iki “miesto” ir iki jūros, po to jau į lovą ir net nepastebim kaip ateina rytas.

Trečia diena: 369 km, 8h 37 min.

Šįkart sudėlioju kelionę tiesiai garmine (nors ir turiu po paruoštą GPX’ą kiekvienai dienai) – noriu išbandyti kiek lanksčiau (ir ar lanksčiau) kelionę planuoti devaise, vietoj bandymo jį priversti judėti fiksuotu track’u. Čia turiu padaryti vakar dienos garmino retrospektyvą: priversti garminą rodyti statinį GPX’ą jo neperskaičuojant galima tik išjungus “recalculate route” funkciją, gelbėjančią kiekvieną kartą kai tik ne ten pasuki. Tad tai nėra pats patogiausias būdas naudoti vieną modernesnių navigacijų prikimštą visokių ten kelioninių fyčeriukų. Todėl ieškau kas veiktų geriau.

Šiaip, Zūmo navigacijos turi vieną tokį super fyčerą skirtą išimtinai moto keliautojams – Garmin Adventurous Routing. Paslankioji slaiderius kiek smarkiai nori vingiuoto kelio, kiek kalnų, kiek nori vengti didelių kelių ir Garminas tau sudėlioja nuostabiausią kelionę pasaulyje. Tai čia taip sako reklaminis bukletas. O mes, mes, žinoma, norim tai pabandyti. Kalnų slankiklį tai nuslinkau į pačią dešinę (suprask – max) ir dar šiek tiek patampiau dėl visa ko. Labai norėjau pažiūrėti kaip tas Garminas Žemaitijoje išburs kalnų. Na bet maža ką. Šiaip tai sudėliojo route’ą neblogai. Buvo smagių atkarpų. Bet kaip ir viskas su tais deterministiniais algoritmais – buvo ir tokio farso, kad teko rajono kiškiams išbėgti mums po ratais ir nukreipti dėmesį nuo tokio garmino apsilochinimo. (True story – kai tik garminas žiauriai papjovė grybą, po ratais tuoj puolė kiškis ir vos liko gyvas. Mes irgi vos likom sveiki, bet labiau gal dėl to, kad jo nemačiau, nes maigiau, bliamba, navigaciją. Salomėja viską gyvai ir emocingai komentavo į šalmo ausines, tai faktas liko užfiksuotas). Žodžiu, kas dėl adventurous routing. Tai kalnų jis, aišku, neišburia. Kai paitaiko ilgos lygaus kelio atkarpos – algoritmas nuveda kokiais nors minoriniais keliukais, vien dėl to, kad reikia “pagaminti” X posūkių per “Y” kilometrų. Toks sutapimas, kad pas mane nuimtas “avoid unpaved roads” avoidancas, nes juk mes adventure motociklas. Tai buvo tokia atkarpa, kai dešimt kilometrų tiesaus kaip linuotė žvyrkelio Garminas pataisė pabandęs mus pagainioti aplink kiekvieną rajono fermą. Tiesiogine prasme. Buvo labai juokinga. Bet šiaip fyčeras turi ateitį, gal būt tuos slaiderius taupiau pastumdžius nebe taip isteriškai grybą pjautų ir būtų galima išlaikyti balansa tarp smagaus ir neabsurdiško. Bandysiu toliau, pradžia daug žadanti.

Tada porą kartų gavom gero lietaus, po to pasiekįm Mažeikius ir Mažeikiuose per geras dvi valandas mums sugebėjo atnešti pavalgyti ir net deserto. Beje, kol valgėm tai nelijo. O kai pradėjom judėti toliau, maždaug 10 km už Naujosios Akmenės mus pasivijo garsusis 2020 vasaros pradžios škvalas ir kuo toliau tuo labiau siautėjo. Joniškyje jau važiavome tiesiog krioklyje – matomumas maksimum 25 metrai, toliau – nesimato nė kelio ženklų, nė kelio žymejimo, nė pačio kelio. Bet buvo labai įdomi patirtis – tokiom ekstremaliom sąlygom dar nebuvau važiavęs. Savaime suprantama, neperšlampamos pirštinės tokiu oru peršlampa maždaug per pusvalandį, batai (kurie irgi pusiau neperšlampami) tampa tiesiog nedidelėmis vandens talpyklėlėmis. Pradžioj visai buvo smagu, neva “štai kokius iššūkius įveikinėjam”, bet po poros valandų tokiam krioklyje pradedi galvoti paprastus tokius, buitinius dalykus. Turėtume nakvoti palapinėje, šansų, kad nustos lyti nėra. Šansų pasistatyti palapinę sausą – nėra. Šansų, kad bent kažkas sauso bus apsirengimui ryte – labai nedaug. Šansų, kad neužvirs atsitiktinis miško medis… Na, suprantate. Tada labai trumpo pasitarimo metu vienbalsiai nusprendžiam šiąnakt mauti į Ukmergę ir ten nakvoti sausai. Pakeliui kavinėdami degalinėje dar persimetam vienu kitu žodžiu su pasivažinėti išvažiavusiu britvininku, jis tai nė neperšlampamo kostiumo neturėjo. Žodžiu, pusantros valandos ir mes jau viską džiaustom ir miegam sausai.

Ketvirta diena. 322 km 5h 19min.

Per visą tą vakarykštį škvalą jau buvom kaip ir pasidavę, nes prognozės buvo, kad lis lis lis tris dienas tris naktis. Bet ryte švietė saulė ir mes nieko blogo apie meteorologų kreivas prognozes nė nesakėm. Tiesiog persimetėm prie rytinės kavos -“važiuojam?” -“važiuojam!”. Ir tiek to kelionės nurašymo – grįžom į track’ą. Aišku, Biržus praskipinom, bet man su tais Biržais kažkaip visad taip – kai tik aš ten netoliese – taip ir supila. Tai vardan gero oro, taip sakant. Šiandien jau uždėjau apribojimą navigacijoje – jokių žvyrkelių, tiesiog taip paprastai, be jokių trikių, senais, gerai pažįstamais keliais. Pakeliui papietavom Zarasuose, irgi paprastai, nebrangiai ir labai greitai. Kažkaip po Mažeikių bet kuris aptarnavimas telpantis į valandą daro įspūdį. O čia kepsnį atneša per dešimt minučių. Dešimt minučių. Toliau su pora sustojimų atsigerti, kavos jau ir Vilnius. Tiesa, nuo Zarasų jau beveik šimtu procentų įsitikinęs, kad reikia keisti vedančiąją žvaigždutę. Ir jau laikas keisti tepalą amortizatoriuose.

Vienas kitas dalykas gal ir liko nepapasakotas: Zarasų bomžiukas, kuris dievagojasi, kad sovietų armijoje ėmė kinus į nelaisvę, nes jie norėjo viską užkariauti. Toks truputį nuspangęs murakamiškas personažas. Iš tų, kurie keliones daro geresnėmis. Galbūt dar šis tas, kas lieka šitoj ekrano pusėj.

Matematika + Python + šiek tiek magijos arba meškiuko vertimas Voronoi diagrama

Voronoi diagramos yra gražios

Voronoi diagramos, kaip ir daugelis kitų matematinių dalykų mūsų smegenims yra gražu. Nė kiek neabejoju, kad bandant rasti priežastis yra prirašyta metrai knygų, bet aš čia ne apie tai, aš apie praktinius dalykus.

Kažkada pabandėm lazeriu išsipjauti vieną kitą voronoi diagrama dekoruotą daikčiuką ir šis stilius prilipo. Norėjosi jų daugiau, dar daugiau ir dar šiek tiek. Bet tai velnias, kiek prie jų dizaininimo reikėdavo rankinio darbo. To (foto aukščiau) kalėdinio elniuko nupaišymui užtrukau gal kokias dvi paras. Nebūčiau programuotojas jei tokiam nuobodžiam darbui nerasčiau automatizuoto sprendimo. Tad šiandien apie tai.

Problematika: dekoruojant kokią nors pasirinktą formą, tarkim, mešką norisi, kad meškoje būsianti Voronoi diagrama kiek įmanoma labiau atspindėtų meškos fyčerus – vidinius bei išorinius (ypač išorinius) kontūrus. Taip diagrama atrodo gerokai gyvesnė nei ant tvarkingai ar pusiau tvarkingai (iš rankos) išdėliotų taškų sugeneruota. Todėl ties kontūrais taškų (seeds) reikia daugiau, tose vietose, kuriose nėra fyčerų – mažiau.

Algoritmas: randami paveiksliuko fyčerų pakraščiai (edges), Poison Disc Sampling, algoritmu generuojami taškai (seeds), tose vietose, kuriose yra pakraščiai, taškai generuojami tankiau. Naudojant šiuos taškus suskaičiuojama Voronoi diagrama, iš jos paimamos sektorių viršūnės, naudojant jas suskaičiuojamas mažesni (vidiniai) sektoriai ir išsaugomi SVG faile. Tada šį SVG rankomis jungiu su norimu kontūru ir taip gaunu kontūrą, kurį galiu išpjauti lazeriu.

Didesnę dalį algoritmo žingsnių pavyko atvaizduoti tarpiniais paveiksliukais – procesas labai smagiai žiūrisi:

pirminis paveiksliukas, kurį versiu diagrama

Pirmas žingsnis yra pakraščių radimas, tam pirminį (source) paveiksliuką praleidžiu pro denoise filtrą ir paverčiu į du – greyscale ir Lab color space:







nimg = denoise_tv_bregman(img, weight=1, max_iter=100, eps=0.001, isotropic=True)
img_gray = rgb2gray(nimg)
img_lab = rgb2lab(nimg)
greyscale
lab color

Tada imant abu šiuos paveiksliukus ir naudojant sobel funkciją randami pakraščiai, vidurkinant, apvalinant ir panaudojus šiek tiek trigonometrijos bei dilation funkciją randama pakraščių svorių matrica, kuri ir yra kriterijus skaičiuojant norimą tankumą paveiksliuko vietose:

weighted edges

Turint svorių matricą Poison Disc Sampling algoritmu generuojami taškai:

tree = KDTree(sample_points)

Naudojant taškus sugeneruoju Voronoi diagramą:

vor = Voronoi(vPoints, furthest_site=False, ...)

Sugeneravus diagramą randu joje vidinius sektorius – parametruose turiu nustatymą kiek pixelių reikia “atitraukti” sektorių į sektoriaus centrą – taip skirtingo stiprumo medžiagoms galiu daryti skirtingo storio tinkliuką.

Kad būtų dar šiek tiek gražiau – kiekvieną vidinio sektoriaus viršūnę”randomizuoju”: sektoriaus centroido kryptimi (arba nuo jos) pastumiu nedideliu atsitiktiniu taškų skaičiumi. Šis efektas beveik nepastebimas žiūrint į kiekvieną viršūnę atskirai, bet labai gerai matosi visame paveiksliuke – jis nebėra toks matematiškai tikslkius, gaunu tokį “human touch” efektą, akiai jis malonesnis.

Tiesa, realiame algoritme turiu nustatymus kiek maksimaliai taškų noriu tam tikro dydžio paveiksliukams, todėl kai kurie taškai suvidurkinami. Čia matome taškus iki vidurkinimo ir diagramą sugeneruotą kai kuriuos iš kų suvidurkinus – sektorių mažiau ir jie tvarkingesni.

Belieka rezultatą išsaugoti į SVG failą:

Ir tada jau rankomis (gerai, gerai, iš tikro peliuku) apdoroti iki norimos formos:

(Čia ne meška, patys atspėkit kas)

Po galutinės formos suteikimo turiu dar porą Inkscape mėgiamų filtrų, kurie suteikia dar daugiau “human touch”, bet visų jų principas tas pats – šiek tiek atsitiktinumo a.k.a magijos.

Štai taip smagu kartais grįžti prie gryno matematinio programavimo, kasdienybė darbe būna kiek pilkesnė: just plain transition to event driven architectures and legacy fighting.

Kitą kartą parašysiu apie motociklus arba apie gyvenimą, nebus vien kodo blogas.