Preskoči na sadržaj
FORTRONIQ

MODUL 2 · TEORIJSKE OSNOVE I PRIPREME ZA KORIŠTENJE VIRTUALNE STVARNOSTI

Nastavna jedinica 2.5

Softverska rješenja: pokretači, OpenXR i razvojni alati

Između aplikacije i naočala stoji nekoliko slojeva programske podrške: razvojno okruženje, sučelje OpenXR, pokretač s kompozitorom i upravljački programi. Jedinica objašnjava što koji sloj radi, kako teče petlja okvira i kako aplikacija razgovara s opremom i s vanjskim sustavima.

Moći ću:
  • opisati slojeve programske podrške od aplikacije do uređaja
  • objasniti ulogu pokretača i kompozitora u prikazu okvira
  • nabrojiti osnovne pojmove standarda OpenXR: instanca, sesija, referentni prostor, akcija
  • razlikovati ulazne akcije od izravnog čitanja tipki i povezati ih s profilima interakcije
  • odabrati razvojno okruženje i dodatke prema ciljnoj opremi
  • izračunati potrebnu kompresiju i dodatno kašnjenje pri prijenosu slike na samostalne naočale

Slojevi programske podrške

Kad korisnik u laboratoriju VR-1 okrene glavu prema robotu MR-1, poza glave putuje od senzora kroz upravljački program i pokretač do aplikacije, aplikacija iscrta dvije slike, a pokretač ih ispravi i pošalje na zaslone. Svaki sloj tog lanca ima jasnu odgovornost. Tko razumije slojeve, zna gdje tražiti kvar: ako se kontroler ne vidi ni u sustavnom izborniku naočala, problem nije u aplikaciji; ako se vidi u izborniku, a ne u aplikaciji, problem je u vezivanju ulaza ili u odabiru pokretača.

Aplikacija VR-1 (scena, logika, sadržaj) Razvojno okruženje i dodaci Sučelje OpenXR (standard) Pokretač (runtime) i kompozitor Upravljački program i firmver Naočale, kontroleri, bazne stanice slike poze, ulazi
Slika 2.5.1 — Slojevi programske podrške. Slike okvira putuju prema dolje, a poze i stanja ulaza prema gore. Aplikacija razgovara samo sa sučeljem OpenXR, ne izravno s uređajem.

Najviši sloj je aplikacija: scena, modeli i logika hvatanja. Ispod nje je razvojno okruženje, odnosno pogon za prikaz u stvarnom vremenu (engl. real-time engine), koji brine o iscrtavanju, fizici i zvuku. Prema opremi ono razgovara preko sučelja OpenXR, s čije je druge strane pokretač (engl. runtime) proizvođača, a ispod njega upravljački programi (engl. driver) i ugrađeni program (engl. firmware, firmver) naočala i kontrolera.

Zapamtite

Aplikacija napisana prema OpenXR-u ne zna i ne treba znati čije su naočale spojene. Ona traži pozu glave, dvije slike i stanje akcija, a pokretač to prevodi na konkretan uređaj. Zato se isti projekt VR-1 može izgraditi za uređaj A i za uređaj B bez prepisivanja logike.

Pokretač i kompozitor

Pokretač stalno radi u pozadini: iz podataka senzora računa pozu glave i kontrolera, vodi granicu sigurnosti, prikazuje sustavni izbornik i odlučuje koja aplikacija smije crtati na zaslone. Na osobnom računalu može biti instalirano više pokretača, ali samo je jedan aktivni pokretač OpenXR. Ako je aktivan pogrešan, naočale ostanu tamne. Aktivni pokretač odabire se u postavkama samog pokretača; naziv te opcije razlikuje se od inačice do inačice.

Najvažniji dio pokretača je kompozitor (engl. compositor). Aplikacija mu predaje gotove slike za lijevo i desno oko, a on ih prije prikaza obrađuje:

  • korekcija izobličenja leća — leća slike rasteže jastučasto, pa kompozitor sliku unaprijed izobliči bačvasto da bi oko vidjelo ravne crte;
  • korekcija kromatske aberacije — crveni, zeleni i plavi kanal pomiču se različito jer ih leća različito lomi;
  • ponovna projekcija (engl. reprojection) — neposredno prije prikaza slika se zakrene prema najnovijoj pozi glave; ako aplikacija ne stigne na vrijeme, kompozitor prikaže zakrenutu staru sliku umjesto da slika zastane;
  • slaganje slojeva — dodaje sustavne prozore, granicu sigurnosti i sliku kamera pri prolazu slike.

Osnovna, rotacijska ponovna projekcija ispravlja rotaciju glave, ali ne i predmete koji se sami gibaju ni paralaksu; naprednije inačice, ovisno o pokretaču, djelomično ispravljaju i to, uz vidljive artefakte. Kad robot MR-1 vozi po stolu, a aplikacija stalno kasni, kotači mogu dvostruko titrati. Zato je cilj VR-1 stabilnih 90 sl/s bez oslanjanja na ponovnu projekciju, a ona je samo zaštita od povremenog ispada.

Pažnja

Kad aplikacija stalno kasni, mnogi sustavi prelaze na polovičnu frekvenciju iscrtavanja (npr. 45 umjesto 90 sl/s) i nadopunjuju svaki drugi okvir. Zaslon i dalje radi na 90 Hz, pa pri ispitivanju čitajte vrijeme okvira aplikacije, ne frekvenciju zaslona.

Standard OpenXR i petlja okvira

OpenXR je otvoreni standard za programsko sučelje (engl. application programming interface, API) prema uređajima za virtualnu, proširenu i miješanu stvarnost. Objavljuje ga industrijski konzorcij za grafičke standarde (Khronos Group), a podržavaju ga svi veći proizvođači opreme i razvojnih okruženja. Prije njega svaki je proizvođač imao vlastito sučelje; danas razvojno okruženje uključi dodatak za OpenXR i dobije pristup svakom sukladnom pokretaču.

Osnovne pojmove sučelja korisno je znati i kad se programira nacrtima, jer se po njima zovu postavke i poruke o pogreškama:

  • instanca (engl. instance) — veza aplikacije s pokretačem; pri stvaranju se traže proširenja, npr. za praćenje ruku;
  • sustav (engl. system) — konkretan uređaj koji pokretač nudi, npr. naočale na glavi;
  • sesija (engl. session) — razdoblje u kojem aplikacija stvarno crta u naočale; ima stanja (npr. spremna, vidljiva, u fokusu, zaustavlja se);
  • referentni prostor (engl. reference space) — koordinatni sustav u kojem se izražavaju poze: prostor pogleda vezan uz glavu, lokalni prostor s ishodištem na početnom položaju glave te prostor pozornice (engl. stage) s ishodištem na podu u sredini prostora za igru;
  • lanac slikovnih međuspremnika (engl. swapchain) — skup slika u koje aplikacija iscrtava i koje predaje kompozitoru;
  • akcija (engl. action) — apstraktni ulaz poput „uhvati“ ili „teleportiraj“, o kojem više u sljedećem odjeljku.

Za VR-1 odabire se prostor pozornice jer korisnik stoji uz stol i hoda: ishodište scene na podu znači da je stol visok 750 mm za svakoga, a visina očiju dolazi iz stvarne visine korisnika.

čekajxrWaitFrame počnixrBeginFrame iscrtaj2 pogleda predajxrEndFrame kompozitorzaslon sljedeći okvir CPU i GPU rade 011,1 ms22,2 ms predviđeno vrijeme prikaza pri 90 Hz svaki okvir ima 11,1 ms; poza se traži za trenutak prikaza
Slika 2.5.2 — Petlja okvira. Aplikacija čeka signal pokretača, dobiva predviđeno vrijeme prikaza, za taj trenutak traži pozu glave, iscrtava dva pogleda i predaje ih kompozitoru.

Svaki okvir teče istim redom. Poziv „čekaj“ zaustavi aplikaciju dok pokretač ne procijeni da je vrijeme za novi okvir i vrati predviđeno vrijeme prikaza (engl. predicted display time) — trenutak u kojem će se slika stvarno pojaviti pred okom. Aplikacija za taj trenutak traži pozu glave i oba oka, iscrta stereo par i predaje ga. Pokretač ne daje pozu „sada“, nego predviđenu okvirno desetak do dvadesetak milisekundi unaprijed (ovisno o uređaju), pa se velik dio kašnjenja sakrije. U razvojnom okruženju ovu petlju vodi samo okruženje.

// Shematski prikaz petlje okvira (nije kod za prevođenje)
dok sesija radi:
    t = cekajOkvir()                 // xrWaitFrame -> predviđeno vrijeme prikaza
    pocniOkvir()                     // xrBeginFrame
    pogledi = nadjiPoglede(t)        // xrLocateViews: poza i vidno polje za 2 oka
    sinkronizirajAkcije()            // xrSyncActions: stanje tipki, poza kontrolera
    za oko u [lijevo, desno]:
        iscrtaj(scena, pogledi[oko]) // u sliku iz swapchaina
    predajOkvir(t, slojevi)          // xrEndFrame -> kompozitor

Akcije i profili interakcije

Izravno čitanje tipke („ako je pritisnuta tipka A, uhvati“) radi samo s jednim kontrolerom. OpenXR uvodi akcije: aplikacija definira što korisnik želi napraviti (uhvatiti, odabrati, teleportirati se, okrenuti se), a zasebno predlaže na koji se fizički ulaz akcija veže za svaki poznati profil interakcije (engl. interaction profile), tj. za svaku vrstu kontrolera. Pokretač na kraju odlučuje o vezivanju, a korisnik ga u nekim sustavima može sam promijeniti. Akcije se skupljaju u skupove akcija (engl. action set), npr. skup „laboratorij“ i skup „izbornik“, pa se pri otvaranju izbornika jednostavno uključi drugi skup.

Akcija u VR-1VrstaKontroler (prijedlog vezivanja)Praćenje ruku
Uhvati / pustilogička ili analogna (0–1)tipka hvata sa strane drškestisak šake ili štipanje
Odaberi točku interesalogičkaokidačštipanje palcem i kažiprstom
Teleportdvodimenzionalnapalčana palica naprijedposebna gesta ili izbornik
Okret u koracima od 30°dvodimenzionalnapalčana palica lijevo/desnogumb na zapešću
Poza rukepozapoza drške ili vrha kontrolerapoza dlana iz modela šake
Vibracija pri hvatuizlazna (haptika)motor u kontrolerunema

Prednost je očita na primjeru VR-1. Logika hvatanja pita samo „je li akcija Uhvati aktivna i gdje je poza ruke“. Ista logika radi s kontrolerima uređaja A, s kontrolerima uređaja B i s praćenjem ruku, a pri razvoju bez naočala i s mišem, jer se na akciju može vezati i tipka miša. Točka interesa nema zasebnu logiku za svaki ulaz; ulazi samo pozivaju iste događaje ulaska pokazivača, izlaska i odabira.

Zapamtite

Za svaki ciljni kontroler predložite vezivanje, a u uputama ne pišite „pritisnite tipku A“, nego opišite radnju („stisnite dršku“) ili prikažite model kontrolera s označenom tipkom.

Razvojna okruženja, dodaci i SDK-ovi

Razvojno okruženje za VR mora iscrtavati stereo par pri 90 sl/s, raditi s dodatkom za OpenXR i graditi paket za ciljnu platformu. U praksi se najčešće koriste dva tipa okruženja. Prvi tip nudi vizualno programiranje nacrtima uz mogućnost C++ koda, npr. Unreal Engine, koji ima i predložak VR projekta s gotovim teleportom i hvatanjem. Drugi tip temelji se na C# skriptama, npr. Unity, u kojem se interakcija gradi paketom za XR interakciju (npr. XR Interaction Toolkit) i paketom za praćenje ruku.

Mjesto u lancuPrimjer alataUloga u VR-1
CAD sustavparametarski modelar, npr. SolidWorksizvor geometrije robota MR-1 (STEP 38 MB)
Program za mrežunpr. Blenderdecimacija, ishodišta, materijali, prazni objekti za točke interesa
Razvojno okruženjenpr. Unreal Engine (nacrti) ili Unity (C#)scena, logika, interakcija, izgradnja paketa
Dodatak za OpenXRdio okruženja ili zaseban paketveza s pokretačem, akcije, referentni prostori
SDK proizvođačadodatni paket platformeposebne funkcije: prolaz slike, prostorna sidra, trgovina aplikacija
Simulator robotazaseban program na računaluizborno: kinematika robota, kutovi natrag u scenu

SDK (engl. software development kit) proizvođača više nije nužan za osnovne funkcije — prikaz, praćenje glave i kontrolera te akcije pokriva OpenXR. Vlastiti paketi proizvođača služe za funkcije izvan jezgre standarda: prolaz slike, prepoznavanje ploha u prostoriji, objavu u trgovini aplikacija. Dobra praksa: držite ih u zasebnom dijelu projekta da osnovna aplikacija ostane prenosiva.

Isti projekt gradi se za više ciljeva. Za uređaj A izgradnja je program za osobno računalo, a za uređaj B paket za operacijski sustav samostalnih naočala (najčešće izveden iz mobilnog operacijskog sustava, npr. Androida), s drugačijim postavkama grafike i strožim budžetom: najviše 300 000 trokuta i 150 poziva za crtanje umjesto 750 000 i 1000. Redoslijed rada koji se pokazao dobrim: prvo inačica koja radi mišem ili sa simulatorom uređaja, pa tek kad logika točaka interesa i hvatanja radi, dodavanje XR sklopa kamere i kontrolera.

Komunikacija aplikacije i opreme

Kod uređaja A (PC-VR) aplikacija radi na računalu, a slika ide kabelom prema naočalama; bazne stanice samo emitiraju svjetlosni signal koji mjere senzori na naočalama i kontrolerima. Kašnjenje prijenosa je malo jer se slika ne sažima ili se sažima vrlo blago.

Uređaj B može raditi na dva načina. U samostalnom načinu aplikacija je instalirana i radi na procesoru u naočalama, pa nema prijenosa slike, ali je računska snaga znatno manja. U načinu spajanja na računalo aplikacija radi na računalu, a slika se kodira kao video, šalje kabelom ili bežično i u naočalama dekodira. Poze i stanja kontrolera putuju u suprotnom smjeru. Kodiranje, prijenos i dekodiranje dodaju kašnjenje od nekoliko do nekoliko desetaka milisekundi i gubitke kvalitete na finim rubovima i tekstu.

Treća vrsta komunikacije vodi prema vanjskim sustavima. U proširenoj inačici VR-1 odabir točke interesa „motor“ šalje poruku simulatoru robota koji radi na istom računalu, a simulator vraća kutove kotača po kojima se pomiče model u sceni. Veza ide mrežnim protokolom za razmjenu poruka (npr. WebSocket, ZMQ ili ROS 2), često preko malog posredničkog programa. Poruke su kratke, pa propusnost nije problem; važno je da vanjska veza nikad ne blokira petlju okvira, nego se odgovor čeka asinkrono.

Pažnja

Bežični prijenos osjetljiv je na zauzeće mreže: kad desetak naočala radi na istom usmjerivaču, kašnjenje i artefakti rastu. U nastavi koristite kabel ili zaseban usmjerivač u istoj prostoriji.

Prijenos slike na samostalne naočale

Koliko se slika mora sažeti kad uređaj B radi spojen na računalo? Nekomprimirani tok jednak je umnošku broja piksela obaju očiju, frekvencije i 24 bita po pikselu. Omjer kompresije je nekomprimirani tok podijeljen s brzinom prijenosa kodera, a dodatno kašnjenje u okvirima dobije se kao kašnjenje kodiranja, prijenosa i dekodiranja pomnoženo s frekvencijom.

R = 2 · w · h · s² · f · 24 bit    k = R / Rkod    n = tp · f

Prijenos slike na samostalne naočaleRačunski prikaz

Za uređaj B spojen na računalo računa nekomprimirani tok slike, potrebni omjer kompresije, broj bitova po pikselu i dodatno kašnjenje izraženo u okvirima.

Nekomprimirani tok—
Omjer kompresije—
Bitova po pikselu—
Dodatno kašnjenje—

Za zadane vrijednosti uređaja B (2 × 2064 × 2208 px, 90 Hz, skala 1,0) nekomprimirani tok iznosi oko 19,7 Gbit/s. Pri brzini prijenosa od 200 Mbit/s koder mora sažeti sliku približno 98 puta, što ostavlja oko 0,24 bita po pikselu. Kašnjenje od 30 ms odgovara 2,7 okvira od po 11,1 ms. Zato se taj način osjeća tromije nego uređaj A, a fini natpisi na točkama interesa slabije su čitljivi. Skala iscrtavanja 1,2 povećava nekomprimirani tok s kvadratom skale, na oko 28,3 Gbit/s, pa pri istoj brzini prijenosa na piksel otpada još manje bitova (oko 0,17). Veća skala bez veće brzine prijenosa zato malo donosi; hoće li se slika kodirati u skaliranoj ili izvornoj razlučivosti, ovisi o pokretaču.

Ključni pojmovi

PojamZnačenje
pokretač (engl. runtime)program proizvođača koji računa poze, upravlja sesijama i predaje slike zaslonima
kompozitor (engl. compositor)dio pokretača koji ispravlja izobličenje leća, slaže slojeve i prikazuje sliku
ponovna projekcija (engl. reprojection)zakretanje gotove slike prema najnovijoj pozi glave neposredno prije prikaza
OpenXRotvoreni standard programskog sučelja između aplikacije i XR opreme
sesija (engl. session)razdoblje u kojem aplikacija iscrtava u naočale, sa stanjima od spremne do zaustavljene
referentni prostor (engl. reference space)koordinatni sustav poza: pogled, lokalni ili pozornica s ishodištem na podu
akcija (engl. action)apstraktni ulaz aplikacije koji se veže na fizičke tipke ili geste
profil interakcije (engl. interaction profile)opis određene vrste kontrolera s nazivima njegovih ulaza i izlaza

Provjeri se

Kratka provjera prije prelaska na sljedeću jedinicu. Odgovor se potvrđuje klikom, a obrazloženje se prikazuje odmah.

Pitanje 1 od 4

Aplikacija se pokreće na zaslonu računala, a naočale ostaju tamne. Koji je najvjerojatniji uzrok?

Na računalu može biti više pokretača, a aplikacija se spaja na onaj koji je postavljen kao aktivni pokretač OpenXR.

Pitanje 2 od 4

Što kompozitor NE radi?

Fizika sudara dio je razvojnog okruženja i aplikacije; kompozitor obrađuje gotove slike prije prikaza.

Pitanje 3 od 4

Zašto je za VR-1 odabran referentni prostor pozornice (stage)?

Prostor pozornice ima ishodište na podu u sredini prostora za igru, pa visina očiju proizlazi iz stvarne visine korisnika.

Pitanje 4 od 4

Koja je glavna prednost akcija i profila interakcije?

Aplikacija definira namjeru (uhvati, teleportiraj), a vezivanje na fizički ulaz određuje se za svaki profil posebno.

Odgovoreno 0 od 4.

Vježbe uz jedinicu

Gradivo ove jedinice priprema za sljedeće vježbe: