10. maaliskuuta 2020

Virtuaalitodellisuuden toteutus ja tekniset haasteet - Case Oculus Quest

Virtuaalitodellisuus alkaa kohta olemaan jo valtavirtaa, kun hinnat laskevat ja tekniikka kehittyy. Vaikka virtuaalitodellisuuden luominen näin äkkiseltään tuntuisikin helpolta hommalta, on sen taustalla olevassa tekniikassa ja toteutuksessa erinäisiä haasteita. Seuraava artikkeli onkin vähän insinöörimäisempi katsaus siihen, miten Oculus Quest VR-laitteella on pyritty taklaamaan näitä hankaluuksia. Näitä oppeja, termejä ja tekniikan tuntemusta voi sitten soveltaa tuleviin VR-laitteisiin, kun pohtii mahdollisen oston järkevyyttä. Kirjoitan tätä omasta mielenkiinnostani, enkä missään nimessä ole alan asiantuntija. Suomeksi asiasta ei valitettavasti löydy juurikaan juttuja, joten ehkä tämä auttaa joitakin tarpomaan pahimmassa termiviidakossa virtuaalitodellisuuden parissa. Ainakin tiedonnälkäisille nörteille jotain naposteltavaa, muut voivat ehkä kakoa kurkkuaan :)


Oculus Ques - Paperilla tehoton, mutta insinöörien käsissä jotain muuta


Hintaisekseen (449 euroa) Oculus Quest on hämmästyttävä laite, jonka arvostelun voit lukea tästä linkistä. Tekniikaltaan noin pari vuotta vanha laite loihtii hyvää grafiikkaa ilman tehokasta tietokonetta ja häiritsevää johtosotkua. Akku on vain 14 wattituntia ja 3 648 mAh. Vertailun vuoksi siis noin 1,5 kertaa tavallinen AA-sormiparisto ja kestää tällä käyttöä noin 2-3 h. Laitteen oma mobiiliprosessori on Snapdragon 835, joka julkaistiin vuonna 2017. Vertailun vuoksi sama suoritin on Samsungin Galaxy S8 puhelimessa parin vuoden takaa ja jopa pari vuotta vanha iPhone 6S on tätä tehokkaampi. Silmikon resoluutio on 2880 x 1600 pikseliä (1440 × 1600 per silmä, kun vaakaresoluutio puolittuu) ja laite kykenee 4K tarkkuuteen 75 Hz ruudunpäivityksellä.

Todellä kärjistäen voisi ihmetelle, että miten pariston virralla ja noin vanhalla tekniikalla päästään yhtään mihinkään. Kun tehokas PC pyörii 500 watin teholla, niin Oculus Quest käyttää tästä noin 100x vähemmän. Oma kannettavani MacBook Air (mid 2011) vuosien takaa ei pääse edes lähelle tehoissa Oculuksen kanssa. Aika huimaa. Paperilla Oculus Quest on tehoton, mutta insinöörien käsissä tekniikasta on optimoimalla puristettu paljon. Prosessori on tietenkin ylikellotettu sisältäen hyvän tuulettimen ja lämmönsiirtimen. Tehokkaissa älypuhelimissa tämä vaihtoehto ei ole mahdollista, koska juuri kännyköiden pienen koon takia prosessorin lämmöntuotto on usein se "pullonkaula". Isomman rakenteen takia Oculus Questissa lämmönsiirto on saatu hoidettua kunnolla. Sitten on se muu toteutus, josta alla lisää.


FFR - Fixed Foveated Rendering


FFR, eli Fixed Foveated Rendering on tekniikka, jossa kuva renderöidään silmikon reunoilta huonommin, kuin keskeltä. Vähän sama asia, kuin ihmisillä tarkan näön alue ja ääreisnäkö. Usein tätä tarkkuuden muutosta ei edes huomaa, ellei sen käyttöön kiinnitä huomiota esimerkiksi materiaalilla, jossa on suuret kontrastierot. 180º VR-videoissa Oculus Questissa on 3 eri FFR-tasoa ja sen voi myös ottaa kokonaan pois päältä. Suuri FFR voi tuottaa merkittävänkin parannuksen GPU:n (grafiikkasuoritin) toimintaan, kun reunojen pikseleihin tarvitaan vähemmän laskentatehoa. FFR voi perustua myös silmien liikkeiden seurantaan, jolloin tarkan näkemisen alue muuttuu aina silmien liikkeiden mukaan, mutta Oculus Questissa se on fiksattu paikoilleen. Tästä siis termi fiksattu tarkannäön alueen renderöinti.

Fixed Foveated Rendering, eli fiksattu tarkannäön alueen renderöinti käytössä ja maksimiasetuksilla isoimmassa kuvassa. Alemmissa kuvissa kaksi muuta pienempää asetusta. Kuvan lähde: Oculus kehittäjäblogi.


Yllä olevassa kuvassa Fixed Foveated Rendering käytännössä maksimiasetuksilla linssien läpi nähtynä. Renderöinti tehdään tiilirakenteella. Keskellä valkoisella alkuperäinen kuva, jossa jokainen pikseli lasketaan grafiikkasuorittimen toimesta itsenäisesti. Punaisista tiilistä renderöidään vain puolet, vihreistä 25 % ja sinisistä 12,5 %. Aivan ääreisnäön kulmissa olevista liloista tiilistä vain 6,25 % pikseleistä lasketaan ja renderöidään. Puuttuvat pikselit interpoloidaan sitten viereisistä lasketuista pikseleistä.

Oculuksen ohjelmointirajapinta mahdollistaa FFR-asetusten muuttumisen vaikka jokaisen ruudun välillä, mutta yleensä käytetään asetusta, jossa FFR on pois päältä kontrastierot paljastavissa valikoissa sekä käyttöliittymissä ja itse pelissä se voidaan säätää jopa maksimiin, jotta grafiikkasuoritin pääsisi helpommalla. Parhaimmillaan FFR voi auttaa jopa 25 % paljon grafiikkasuoritinta rasittavissa ohjelmissa, kun taas toisissa tapauksissa siitä ei ole niin kovasti hyötyä. Keskimäärin hyöty on noin 15 % luokkaa. Esimerkiksi nykivä 5K 180º VR-video ei koskaan pyöri sujuvasti, vaikka käyttäisi maksimaalista FFR asetusta. Nykiminen on vain hivenen vähäisempää.


Miten 3D kuva syntyykään 2D ruudulle


Näin äkkiseltään olettaisi, että jos ääreisnäön alueilta ei lasketa tarkkaa kuvaa ja suurin osa informaatiosta häviää ja keskiarvoistetaan, niin tuotetun kuvan laadun pitäisi olla jo todella huono. Tässä tulee kuitenkin esille virtuaalitodellisuuden toteutuksen tekniikka ja sen "ikävien" ominaisuuksien hyödyntäminen. Ensiksi pitääkin ymmärtää, miten 2-ulotteisesta kuvasta saadaan ympärillä näkyvä 3-ulotteinen kuva. Kysymys on oikeastaan täysin analoginen sille, miten maapallon pinnasta on tehty karttoja kaksiulotteiselle paperille? Tähän kysymykseen vastaus on siis erilaiset karttaprojektiot. 180 asteen 3D videoissa käytetyin on kuitenkin Equi-Angular Cubemap (EAC).

Perinteinen cube map -projektio, jota peliohjelmoinnissa käytetään. Tässä pallosta muovataan kuutio (kuvittele laittavasi pallo kuution sisälle), jonka sivut taitellaan auki. Ongelmana tässä kulmien vääristyminen. Kuvan lähde: Google AR and VR.


Myös virtuaalitodellisuuden puolella mitään täsmälleen yhtä oikeaa vastausta kaikkeen ei ole, koska jokaisessa projektiossa on omat hankaluutensa. Jo projektio itsessään on mielestäni todella hankala hahmottaa. Miten VR-lasien sisällä olevan suoran näytön kuva voikaan luoda kuvitelman siitä, että se  kaareutuisi 180 asteen puoliympyräksi? Siksi ajattelinkin hahmotella tästä yksinkertaistetun kuvaparin alle. Vasemmassa kuvassa tilanne siitä, miten 3D kuva saadaan kaksiulotteiseksi. Yleensä siis kalansilmälinssillä kuvattu video (tässä siis ympyrä) saadaan projektiolla kaksiulotteiseksi. EAC-projektio on tähän paras, koska se vääristää reunoja vähemmän, kuin perinteiset projektiot kohdentaen pikselit paremmin. Oikealla kuvassa puolestaan malli VR-laseista. Vaakasuora viiva edustaa VR-lasien oikeaa fyysistä näyttöä ja puoliympyrän kaari tästä syntyvää kuviteltua 3D kuvaa. FOV edustaa silmää, josta näkökenttä lähtee. Tämän ja näytön välissä on sitten VR-laitteeseen suunniteltu linssi. Kun katsot kuvaa tämän läpi, niin kuva kaartuukin puoliympyräksi. Kun kaksi tällaista kuvaa on vähän eri kulmasta otettu ja katselet niitä molemmilla silmillä, niin aivosi tuottavat ja tulkitsevat sen kolmiulotteiseksi.

Molemmista kuvista näkee nopeasti, että fyysisen näytön keskellä tarvitaan vähemmän pikseleitä saman kuvan tuottamiseen kuin reunoilla. Vaikka sininen pitsa slicen muotoinen sektori on kuvitellussa 3D kuvassa käytännössä samansuuruinen sekä keskellä, että vasemmassa reunassa, onkin se oikeassa VR-lasien tasaisessa näytössä paljon isompi. Toisin sanoen fyysisellä näytöllä sektori vaatii siis suuremman määrän pikseleitä reunalla ollessaan. Tätä kuvataan kahden valkoisen laatikon leveydellä.

Vasemmassa kuvassa esimerkki siitä, miten 3D kuvasta tehdään projektio 2D kuvaksi. Oikealla kuvassa VR-lasien kuvan muodostus, kun sitä katsotaan kohdasta FOV (Field of View) ja tasainen kuva taittuukin linssin avulla puolikaareksi. Kuvan lähde Oculus kehittäjäblogi.


Äskeisen teorian pohjalta voidaankin nyt pistää yhteen FFR, eli fiksatun tarkannäön alueen renderöinti ja sen etu. Ensinnäkin linssin rakenne sumentaa ja vääristää yleensä aina näkymää reunoilta aberraation takia. Tätä teoriaa en lähde edes avaamaan, koska on niin monimutkaista. Toisaalta käyttäjä usein katsoo VR-lasien keskikohtaa, eikä reunoja. Kolmanneksi 3D kuvan tuottamiseen tarvitaan VR-lasien näytössä reunoilla huomattavasti enemmän pikseleitä, kuin keskellä. Onko siis mitään järkeä käyttää grafiikkasuorittimesta eniten tehoja kuvan tuottamiseen ääreisnäön reunoille, jota linssin rakenne vielä luonnollisesti vääristää ja johon katsotaan vain harvoin? Tämä toiminta olisi aika tehotonta, haitallista ja typerää, joten FFR on insinööreiltä aika järkevä kikka.



Dynamic Clock Throttling


Puhelimissa ja tableteissa prosessorin hidastaminen on helppo tapa lämmöntuoton hallintaan. VR-laitteella samanlainen toiminta näkyisi kuitenkin heti ruudunpäivityksessä ja käyttäjä alkaisi nopeasti voimaan huonosti. Toisaalta VR-laite ja sen prosessori ei voi myöskään koko ajan toimia maksimiteholla, koska akku loppuisi lyhyeen ja komponentit kuumenisivat liiaksi. Tätä varten on keksitty muuttuva yli/alikellotus, joka säätää grafiikkasuorittimen (GPU) ja prosessorin (CPU) tehoja tarpeen mukaan (neljä eri tasoa). Ongelmaksi tuleekin, millä päättelet onko suoritin äärirajoilla vai lähes toimettomana?

GPU:n kohdalla käyttöasteen toteaminen on helppoa, koska grafiikkasuoritin toimii aika suoraviivaisesti, kun taas moniytimisen prosessorin kohdalla osa ytimistä voi melkein nukkua ja osa toimia äärirajoilla. Insinöörimäinen lähestymistapa tähän onkin tarkkailla ruudunpäivitystä. Oculuksen ohjelmointirajapinnassa onkin toiminto joka laskee kuinka paljon kuvataajuus laskee. Kun ruudunpäivitys on lähellä haluttua, prosessorin tehoa on mahdollista laskea. Jos frame droppeja on puolestaan paljon, eikä grafiikkaprosessori ole pullonkaulana, niin tämä indikoi, että prosessorin tehoa pitää nostaa vaikka osa ytimistä lähes nukkuisikin. Otetaan tästä valaiseva esimerkkigraafi.

Dynamic Clock Throttling pots päältä. Vaaka-akselilla aika ja viivat kuvaavat prosessorin käyttöastetta ja missattuja ruutuja. Kuvan lähde: Oculus kehittäjäblogi.

Ylemmässä kuvassa ylin punainen viiva edustaa grafiikkaprosessorin käyttöastetta. Tämän alla olevat sininen ja ja ruskea viiva puolestaan pääsuorittimen ytimien käyttöastetta. Aivan alin liila viiva kuvaa missattuja ruutuja kuvataajuudessa. Vihreä vaakaviiva on grafiikkaprosessorin taso, joka tässä tapauksessa on koko ajan samalla tasolla, koska Dynamic Clock Throttling on pois päältä. Noin kohdassa 45 sekuntia ruudunpäivitys alkaa tippua ja lila viiva nousee. Grafiikkaprosessorin käyttöaste (punainen viiva) on noin 85 % ja nousee kohdassa 50 sekuntia yli 95 %:iin. GPU:sta tulee pullonkaula ja ruutuja missataan pahimmillaan 20 sekunnissa, kun ruudunpäivitys on keskimäärin 40 ja pitäisi olla 60 fps.
Dynamic Clock Throttling laitettuna päälle. Suomeksi siis muuttuva yli/alikellotus.

Kun sama tehdään kytkemällä päälle muuttuva yli/alikellotus, niin homma muuttuu huomattavasti. Vaikka ohjelma alun perin toimi GPU tasolla 2, niin systeemi ajaa sen tasolla 3, jotta käyttöaste olisi noin 75 %. Noin 50 sekunnin kohdalla GPU taso (vihreä viiva) nostetaan maksimiin, eikä ruutuja missata juurikaan yhtään (alin lila viiva ei nouse). GPU:n piikki laskee 15 sekunnin päästä ja se alikellotetaan jopa tasolle 2. Dynamic Clock Throttling käytännössä siis esti kaikki pudonneet ruudut ja piti ruudunpäivityksen haluttuna 60 fps ilman muutoksia itse ohjelmaan.

Kun otetaan huomioon Oculus Questin hyvä lämmönsiirto, FFR ja Dynamic Clock Throttling, niin ei liene enää ihme, että noinkin heikkotehoinen laite kykenee aika ihmeisiin suorituskyvyssä.


Bonus - Tekoälyllä lisää tehoja


Facebookin tekoälyryhmä on keksinyt menetelmän, jolla Oculus Questistä saadaan 67 % enemmän GPU tehoa grafiikan tuottamiseen. Kikka tuntuu vähän CSI-sarjan tempulta tai repäisyltä jostain sci-fi-sarjasta, mutta käytännössä siis kuva renderöidään noin 70 % resoluutiolla alkuperäisestä ja tästä huonommasta kuvasta skaalataan tekoälyn avulla tarkempi. Keskimäärin GPU:n tehoja säästyy 40 % ja latenssi on vain muutaman millisekunnin. Käytännössä säästyneitä tehoja voidaan käyttää parempaan ruudunpäivitykseen ja laajemman grafiikan tuottamiseen. Vaihtoehtoisesti esimerkiksi videontoisto-ohjelmssa ja vastaavissa säästyneillä tehoilla voidaan sitten pitkittää ja parantaa akun kestoa.

Joku voi tietysti väittää, että humpuukia. Jos kuvaa huonontaa, niin siitä ei voi millään saada alkuperäistä parempaa. Näin toki on, mutta se ei välttämättä myöskään tarkoita alkuperäistä huonompaa. Näin oli ehkä ennen, mutta katsokaapa huvikseen YouTubesta vaikka kanavaa Two Minute Papers. Siinä näytetään hyvin, mihin kaikkeen tekoäly jo taipuu ja miten ihminen jää toiseksi. Samankaltaista tekniikka itse asiassa käytetään jo. NVIDIA käytti kuvaa ylöspäin skaalaavaa AI-algoritmia Shild TV:ssä vuonna 2019 sekä RTX näytönohjaimissa ja tätä ennen Google sovelsi samaa Super Res Zoom -tekniikkaa Pixel 3 kameroissa vuonna 2018.

Käytännössä menetelmä eroaa muista kuvaa nyt skaalaavista menetelmistä siinä, että siinä käytetään tekoälyä, jolle on opetettu, miltä tietynlaiset objektit tulisi näyttää. Tästä käytetään termiä Real Time SR (Super Resolution) ja tekniikkana ESPCN (Efficient Sub-Pixel Convolutional Neural Network). Toteutuksesta voi lukea enemmän tästä linkistä. Tietenkään tämä vielä tutkimuksen alla oleva tekniikka ei välttämättä koskaan saavu nykyiselle Oculus Questille, mutta potentiaalia siinä ainakin on.


Muita ajatuksia ja mietteitä


Nettifoorumeilla puhutaan paljon, että VR-lasien näkökentän (FOV, eli field of view) pitäisi ehdottomasti olla yli 110 astetta. Olen aina ihmetellyt tätä. Mihin se oikein perustuu? Tietenkin olisi kiva, jos ääreisnäön puute ei latista immersiota. Toisaalta VR-kokemuksessa taitaa fysiikka tulla vastaan tällaisten vaatimusten kohdalla. Suljepa vaikka toinen silmäsi ja sano näetkö nenääsi? Itse ainakin näen ja se blokkaa aika hyvin näkökenttääni. Vaikka molempien silmien näkökenttä ääreisnäkö huomioiden olisi noin 180 astetta, niin väitän, että molemmilla silmillä en näe samaan aikaan edes 90 astetta. Tämän jälkeen joudun jo kääntämään päätä. Jos molemmilla silmillä stereonäkö on alle 90 astetta, niin silloin et saa yhden silmän kuvalla mitenkään loihdittua kolmiulotteista VR-maailmaa. Voihan sen näkökentän rakentaa laajaksi, mutta kolmiulotteisuus toimii kuitenkin vain keskellä noin 90 asteen osalla.

Tältä näyttää 180 VR video tavallisella tietokoneen näytöllä. Video on niin sanotusti sbs (side-by-side), eli eri silmille tarkoitetut kuvat ovat vierekkäin. Huomaa projisointi 180 asteen pallon muotoon, jolloin kaikki vääristyy normaalilla ruudulla, mutta kolmiulotteisuus VR-laseilla on todella hyvä.


Sitten on keskustelu tuosta resoluutiosta. Mikä on järkevää ja mikä ei? Mitä isompi nimittäin FOV on, niin sitä huonompi on pikselitiheys. Mikä olisi resoluutiossa ihan maksimi? Oletetaan, että Oculus Quest voi toistaa maksimissaan 180 asteen VR videota resoluutiolla 4 600 x 2 300 pikseliä (todellisuudessa tämä jo nykii). Muistakaamme myös että videot ovat muotoa sbs (side-by-side), eli kaksi kuvaa on vierekkäin. Näin ollen saamme vaakasuuntaiseksi pikselitiheydeksi per silmä (4 600/2) px /180 astetta = 12,78 pikseliä/aste (PPD eli pixels per degree). Parhaimman 180° 4K -videon tarkkuus on siis noin 13 PPD. 

Oculus Questin näyttövisiirin resoluutio on puolestaan 2880 x 1600 pikseliä (1440 × 1600 per silmä, kun vaakaresoluutio puolittuu). Jos laitteen FOV on noin 95 astetta, niin PPD olisi logiikan mukaan 1 440 pikseliä / 95 astetta = 15,16 px/aste. Oculus Questin pikselitiheys on siis noin 15 PPD. Äsken laskemamme videon kohdalla oltaisiin jo siis aika lähellä maksimia, jos toistetaan 4 600 x 2 300 resoluutiolla.

Käänteisesti kun lasketaan matematiikan avulla, niin 180° videon maksimivaakaresoluutio olisi siis: 15,16 px/aste x 180 astetta = 2 728 px. Sbs videoissa tämän kun kertoo vielä kahdella, niin saadaan noin 5 457 pikselin levyinen video. Yli 6K videon toistamisessa Oculus Questin kohdalla ei siis ole enää järkeä, koska VR-näytön pikselitiheys on tästä huonompi. Tässä tietenkin oletuksena, että kaikki pikselit ovat yksi yhteen, ne jakautuvat tasaisesti koko alalle ja kuva ei vääristy mistään kohdasta. Teoriassa siis tuossa 5,5K videossa menee se rajahyöty. Näin kerrotaan myös Oculuksen omassa blogissa. Toisaalta Oculus ei edes pysty yli 5K videoita toistamaan, joten "ongelma" on lähinnä teoreettinen.

Vertailun vuoksi muuten ihmisen silmän PPD on eri tietolähteiden mukaan noin 60. Tästä jos tehtäisiin 180° video, niin se olisi noin 21 600 pikseliä leveä. Suurin mahdollinen resoluutio nykytekniikalla taitaa olla 16K, joka ei siis edes yllä tuohon resoluutioon, jolla todellisuutta ei enää erottaisi virtuaalisesta.



Tietoa eri virtualilasien (6DoF) resoluutiosta, grafiikasta ja pikselitihydestä
laiteresoluutio per silmäkokonaisresoluutio
pikseliä
FOV
astetta
PPD
pikselitiheys
ruudunpäivityshintamuuuta
Oculus Go 32Gt1280 x 14402560 x 1440100°1575 Hz270standalone
Oculus Quest 64Gt1440 x 16002880 x 160095°1575 Hz445standalone
Oculus Rift1080 x 12002160 x 120095°13,580 Hz--
Oculus Rift S1280 x 14402560 x 1440110°1490 Hz479-
PSVR960 x 10801920 x 1080110°10120 Hz229-
HTC Vive Pro1440 x 16002880 x 1600110°1390 Hz899-
Lynx
Mixed Reality
1600 x 16003200 x 160090° 1890 Hz1300Snapdragon XR2-siru


Olisin tässä voinut vielä paneutua AMOLED ja RGB näyttöjen eroihin yms, mutta annetaan olla. Yllä tosiaan vielä pieni taulukko eri virtuaalilasien resoluutioista, hinnoista yms. Toivottavasti joku tykkäsi tästä artikkelista. Omasta mielestäni siihen liittyvää tietoa oli ainakin mielenkiintoista opiskella. Jos jollakulla on tähän VR-maailmaan ja tekniikkaan liittyvää tietoa ja täydennystä, niin olisin kiitollinen sen jakamisesta.

Jos virtuaalitodellisuus muuten kiinnostaa ja harkitset jonkinlaisten lasien hankkimista, niin kannattaa ehkä ensin käydä kokeilemassa vaikkapa HTC Vive Pro laseja Pikseli Arcadessa. Hinta on noin 38 e/tunti. Kokemuksesta voi sitten päätellä, kannattaako rahojaan investoida johonkin VR-settiin ja mitä laitteelta haluaakaan.

Ei kommentteja:

Lähetä kommentti