Birthday Sale! Up to 40% off unlimited courses & creative assets Birthday Sale! Save up to 40%!
Advertisement
  1. Code
  2. Android SDK
Code

Android SDK rozšířená realita: Umístění & vzdálenost

Difficulty:AdvancedLength:LongLanguages:

Czech (Čeština) translation by Tereza Foretová (you can also view the original English article)

Vítejte na část 2 z našeho seriálu o budování rozšířené reality aplikace na platformě Android. V části 1 se naučili, jak používat fotoaparát, kreslení text nad pohled kamery a získat různé hodnoty ze senzorů zařízení. Nyní přidáme v GPS dat, promícháme s nějakou matematiku a určit polohu pevné objektu v prostoru nad pohledu kamery.


K dispozici také v této sérii:

  1. Android SDK rozšířená realita: Kamera & nastavení senzoru
  2. Android SDK rozšířená realita: Umístění & vzdálenost


Krok 0: Začínáme a předpoklady

Tento kurz se pohybuje na velmi rychle tempo. Očekáváme, že čtenáři seznámit se s vytvářením a systémem Android projekty. Také očekáváme, že čtenáři mají Android zařízení, které je dostatečně silný pro běh AR apps, například Nexus S. Většina testování této aplikace bude třeba udělat na zařízení, protože aplikace spoléhá na fotoaparátu, snímače a umístění data, která není k dispozici v Android emulátor.

Poskytli jsme ukázkovou aplikaci ve spojení s tímto tutorial ke stažení. Tento projekt se bude zvyšovat v průběhu kurz řady AR. Tak jít Stáhnout Android projekt a postupujte!


Část 4: Použití GPS v zařízení


Pro umístění na AR aplikaci, která vytváříme je důležité, že víme, kde se zařízení nachází. A pro přesnost, potřebujeme nejlepší zprostředkovatel umístění, která je k dispozici v zařízení. Pojďme začít.


Krok 1: Oprávně


Aplikace, které používají jakékoli údaje o poloze ze zařízení vyžadují určité oprávnění k umístění. Existují dvě možnosti pro to. Jednou z možností je použít místo konání kurzu, který poskytuje místo na základě buněčná věže nebo znám přístupové body Wi-Fi. Tato úroveň podrobností funguje velmi dobře pro určování, co jste ve městě a okolí, možná. Však pravděpodobně nebude schopen určit, které ulici nebo blok jste na správně. Další možností je využít jemné umístění, které používá GPS v zařízení získat oprava přesné pozice. To trvá o něco déle, ale využívá satelity GPS a buněčná věže zvýšit přesnost umístění výsledků. Pomůže vám určit, jaké straně ulice jste na obvykle jemné lokalizační údaje. To je úroveň přesnosti a preciznosti, která se obecně používá pro AR apps.

Tedy tady je oprávnění, které je třeba přidat do souboru manifestu:


Krok 2: Poslech k umístění

Teď, když máme oprávnění k přístupu ke službám GPS zařízení, začněme, poslouchá, co má říct, ano? Pojďme přidat tyto informace přímo do OverlayView třídy (pro jednoduchost více, než design).

OverlayView třída musí implementovat nyní LocationListener.

Dále zavést povinné přepsání metody LocationListener rozhraní:

Další, zaregistrujte se k odběru změny umístění, v rámci metodu konstruktoru OverlayView(context):

Všimněte si, že požadujeme nejlepší poskytovatel lokalizačních údajů na nejlepší přesnost, kterou můžeme dostat. V tomto okamžiku můžete přidat umístění GPS onDraw() metody pro ladění účely, pokud chcete. To je ve zdrojovém kódu k dispozici, ale necháme to na čtenáři jako cvičení.


Část 5: Výpočet směr a vzdálenost mezi dvěma body


Tato část kurzu se změní na některé matematiky – nebo bychom, kdyby nebylo nějaké pěkné pomocníky. V tomto dvourozměrné implementaci AR nezajímá nás zejména tuto vzdálenost, to může být užitečné použít nějaké světlo, škálování, nebo dokonce stoupl měřítko (například tři velikosti), pro zobrazení bodů zájmu v různých vzdálenostech. Další využití by mohlo být pouze ukázat místa – anebo mimo – rozmezí zařízení.

Co jsme velký zájem, Nicméně, je směrem k objektu vzhledem k zařízení. V navigaci tomu se říká ložiska. Cesta mezi dvěma body na kulovitý objekt, například na planetě Zemi, je nejkratší po, co se říká-vzdušné vzdálenosti. Pokud používáte AR techniky k nalezení umístění nebo zobrazení, kde by mohl být nějaký pevný předmět vzhledem k vaší poloze, to by bylo rozumné vzdálenosti mechanismus použít. Jak se dostanete blíže, ložisko se může změnit, ale by stále po nejkratší trasu do daného místa.

Alternativní řešení by mohlo být přímku, v 3D prostoru, mezi dvěma body na kouli. Tato metoda předpokládá, že cesta přes koule, jak protichůdný k po celém jeho povrchu je proveditelné nebo zajímavé. Tímto způsobem Pokud jste se pokusili najít, řekněme, Sydney, Austrálie ze San Francisca, Kalifornie, budete potřebovat místo téměř rovně dolů k zemi. Při zábavné, tento mechanismus není příliš užitečná, pokud jste umístění hvězdy.

Bychom se mohli dostat do nějaký matematický o tom jak to funguje. Vskutku použijeme vzorec haversine ručně k určení medvěd z jednoho místa do druhého. Umístění objektu, pohodlně předaný metodě onLocationChanged(), nám však obsahuje mnoho užitečné navigační metody, aby nám pomohl. Dvě z těchto metod jsou distanceTo() a bearingTo().

Ale co jsme dostaneme vzdálenost a ložisko? V konečném důsledku by chtěl míst se určí z databáze či krmiv. Poté již můžete filtrovat příslušné objekty zobrazeny v zobrazení podle vzdálenosti, pokud tak zvolíte.

Pro tuto chvíli však nastavíme na jednom místě vyhledat: Mount Washington, nejvyšší vrchol v severovýchodní USA a domovem některých na světě nejhorší počasí (také se mohli snadno vidět od našeho domu, který je testování o něco jednodušší).
Nastavení statické souřadnice pro Mount Washington jako je tento:

Tip #1 pro vývoj a testování aplikace založené na umístění AR: Používejte co nejpřesnější údaje o poloze můžete dostat své ruce na. Není-li vaše údaje přesné, to nebude projevovat tak přesné, na obrazovce. Při jednání s místy, i pár bodů z může znamenat obrovský rozdíl. Například rozdíl mezi 44 severem a 44,1 Severní je více než 11 kilometrů!

Dále můžeme určit ložisko do tohoto umístění pomocí následujícího kódu:

V tomto okamžiku můžete chtít přidat tyto informace do výstupu ladění zobrazení, abyste viděli, jak ložisko aktualizace, jak se pohybovat se zařízením. Jen sedět u svého stolu? Ložisko k cíli se moc nezmění.


Část 6: Stanovení azimutů sluchátko


Teď, abyste mohli určit azimut k cíli, možná se divíte, jak telefon ví, kterým směrem se ukázal. Naštěstí všechna data snímače, co potřebujeme je již na místě. Vše, co zbývá udělat, je tato data použít k určení, které tak telefon směřuje.

Jak to uděláme? No telefon má kompas. Můžeme to jen použít? Ne přímo. Kompas hlásí magnetické pole kolem x, y a z v mikro Tesla. Pokud je vaše odpověď na tento příkaz něco v duchu, "Huh?", pak jste si také uvědomil to není přímo použitelné – potřebujeme převést data do formátu, který nám říká, jakým způsobem telefon směřuje. A tím, že poukáže, jsme vlastně znamená který způsob záběru fotoaparátu.

Jak se ukázalo, to vyžaduje, že vezmete v úvahu orientaci zařízení, které využívá kombinaci akcelerometr a kompas. Konečným výsledkem je vektor s úhly otáčení kolem každého z 3 OS. To přesně orientuje zařízení s ohledem na planetě – přesně to, co chceme. Naštěstí opět jsou Pomocníci pro matematiky matice, kterou potřebujeme.

První metoda pomocníka můžeme použít se nachází v SensorManager třída: getOrientation(). Tato metoda přebírá Rotační matice a vrátí Vektor s azimut, pitch a roll hodnoty. Hodnotu azimutu je rotace kolem osy a osa z je, který odkazuje přímo do středu planety. Hodnota natočení je rotace kolem osy y, kde y je tečná k planetární sféry a body směrem magnetického severu. Hodnota stoupání je rotace kolem osy x, což je vektorový součin osy z a y – odkazuje na co by se dalo nazvat magnetické západ.

Ale kde seženeme matice otočení? Jak se to stane, Android SDK opět má pomocníka pro tento v SensorManager třídy nazvané getRotationMatrix(). Volejte ji předejte akcelerometr vektorové a kompasu vektor, například takto:

Nyní můžeme spočítat orientace:

OK takže dnes víme, jak je zařízení orientovaná vzhledem k planetě. Rychle, kde je kamera ukázal? Dobře, pojďme přemapovat otočení matice, tak, aby obsluhu podél kladný směr osy y, dříve než jsme počítat orientaci vektoru:

Teď může být dobrý čas můžete přidat některé další ladění textový výstup na obrazovku nebo na záznamník (zjistili jsme, že máme často vstávat od naší stoly testovat, takže obrazovka je i nadále vhodné místo pro výstup takové věci).


Část 7: Označení cílové umístění v překryvném zobrazení

Teď máme všechny informace, potřebné k umístění cíl na obrazovce: směr čelí fotoaparát a umístění objektu vzhledem k naší poloze. V současné době máme dva vektory: fotoaparát orientaci a azimut k cíli. Co musíme udělat je mapa obrazovky (nebo, ve skutečnosti) rozsah otáčení hodnot a vykreslení cílový bod pohledu, když je to místo je v rámci zorného pole kamery obrazu jak je zobrazen na obrazovce.

Pár věcí, být si vědom: již nyní, naše orientace vektoru používá radiány pro jednotky a ložisko stupňů. Musíme si být jisti, že pracujeme s stejné jednotky a příslušného typu. Výpočet ložiska vrátil stupňů a můžeme použít otočení ve stupních na plátně objektu, takže vypočítáme hodnoty na stupně, když jsou v radiánech. Balík java.lang.Math poskytuje metody pro dělat převody mezi stupních a radiánech.

Vyvolejte z dříve že orientaci vektoru začíná s Azimut nebo otáčení kolem osy z, který bude ukazovat přímo dolů. S y směřující do magnetického severu, Azimut ve srovnání s naší ložiska a to určuje, jak daleko vlevo nebo správný cíl je na obrazovce – Pokud je na obrazovce vůbec (když je to mimo zorné pole kamery).

Podobně hřiště se používá k určení, jak hluboko nebo dolů cíl by měl být stanoven na obrazovce. To může nebo nemusí být něco, co vyžaduje vaše aplikace. Konečně roll by změnit virtuální horizont, který může zobrazit na obrazovce – to znamená, to by bylo celkové obrazovkou rotace. Opět nemusí to být zajímavé pro vaši aplikaci. To záleží na to, co hledáte.

Připíšeme všechny tři naši ukázkovou aplikaci, jen pro legraci. Přesně do jaké míry obrazovky zahrnuje zorné pole reálného světa je zcela na vás. Camera.Parameters třída však může poskytnout zorné pole kamery zařízení, jak jsou nakonfigurována výrobcem, pomocí metody getVerticalViewAngle() a getHorizontalViewAngle(). Pohodlný, co?

Nyní můžeme aplikovat příslušné rotace a překlady umístit linii obzoru a cílový bod správně, relativně k obrazovce a zorné pole kamery:

V podstatě výše uvedený kód otáčí roll hodnotou, překládá nahoru a dolů podle hodnoty stoupání a poté nakreslí čáru obzoru. Pak Azimut se používá pro levý nebo pravý překlad zorné pole a umístění bodu (v tomto případě, kde je hora) je nakreslena (jako kruh) kde očekávané.

Konečný výsledek bude vypadat přibližně takto:



(Omluvte obsah. Pořizování snímků obrazovky a venku je obtížné.)

Můžete si všimnout, že Horizont na kopie obrazovky se otáčí proti směru hodinových ručiček. To proto, že telefon, v době, kdy jsme si na obrázku, byl otočený po směru hodinových ručiček. Tedy na obzoru na obrazovce lícuje se ten pravý.

Jste nyní rozšířené zobrazení reálného světa tím, že umístí informace o jaký fotoaparát je vidět přímo na obrazovce! To nebylo tak těžké, ne? Jste ušli dlouhou cestu, ale existuje mnohem více na AR, jakmile se dostanete dál.


Další problémy: Wigglies, Jigglies, výkon a mobilní osvědčené postupy

Pokud spustíte aplikaci vzorku, možná jste si všimli, že linie a cíl jsou skákací všude. To proto, že senzory jsou velmi citlivé. Co musíme udělat je vyhladit data. To se nejlépe provádí s low-pass filtr; To znamená filtr blokuje vysokofrekvenční dat ale umožňuje pro nízkofrekvenční data. To bude vyhladit data a snížit trhnutím na obrazovce. Probereme to v budoucnu AR kurzu.

V závislosti na vaší poloze a umístění cíle možná zjistíte, že ložisko zdá divné. Blíže jste k geomagnetické sever, dále od zeměpisnému severu kompas vám ukáže. Ve skutečnosti, kde jsme se právě nacházíte, True North je celých 16 stupňů. To je docela nápadný, při vyhledávání velké objektu – například Mount Washington. Probereme to v budoucnu AR kurzu.

Také pravděpodobně jste si všimli že pokud spustíte aplikace na chvíli, má tendenci zapadnout do celého zařízení. To proto, že jsme nyní dělá matematický magie, který trvá příliš dlouho pro metodu onDraw(). Jak víte, operace, které čas by měl provádět vždy z podproces uživatelského rozhraní. Objekt OverlayView, jsme vytvořili samostatný, je, aby vlastní použití senzorů a služby GPS zařízení. To znamená, že bude muset dělat závity v samostatný, bezpečným způsobem.

Znovu Toto jsou problémy, které pravděpodobně budou řešeny v budoucích kurzů této série.


Závěr

Tím končí druhá část našeho kurzu AR. Rozšířená realita je vzrušující žánr aplikací na platformě Android. Android SDK poskytuje vše – včetně mnoha matematických pomocníky – nezbytné pro vývoj aplikací AR elegantní, zajímavé, ale ne všechna zařízení splňují hardwarové požadavky, které tyto aplikace vyžadují. Naštěstí nejnovější generaci zařízení Android ještě nejmocnější, a mnozí splňují nebo překračují hardwarové specifikace pro vývoj aplikací pro skutečné AR.



O autorech

Mobilní vývojáře Lauren Darcey a Shane Conder mají spoluautorem několika knih na vývoj pro Android: podrobné programovací knihu s názvem vývoj aplikací pro Android Wireless a Sams pro Android vývoj aplikací v 24 hodin. Při psaní, tráví svůj čas vývoje mobilního softwaru v jejich společnosti a poskytování poradenské služby. Může být dosaženo v e-mailem na androidwirelessdev+mt@gmail.com, prostřednictvím svého blogu na androidbook.blogspot.com a na Twitteru @androidwireless.

Potřebujete pomoc psaní aplikace pro Android? Podívejte se na naše nejnovější knihy a zdroje!







Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.