ARKit

O Framework da Apple que revolucionou a Realidade Aumentada

O recente anúncio da Apple na WWDC de 2017 teve um grande impacto no ecossistema da Realidade Aumentada. Nunca foi tão fácil de construir aplicações que utilizem AR, pois não há necessidade de se mexer com marcadores de localização, inicializar câmeras, tratar com cálculos malucos a profundidade, sem necessidade de configuração externa e nem utilizar ferramentas de criação proprietárias.

Com o ARKit, a Apple está abrindo uma nova plataforma para a realidade aumentada. Ao mesmo tempo capacitando os desenvolvedores com um kit de ferramentas fácil de usar e fornecendo uma audiência de centenas de milhões de celulares com ARKit prontos quando o iOS 11 for lançado neste outono. Embora haja um ceticismo saudável de que a AR ainda estará por fora alguns anos, mas diante do movimento da Apple tem potencial para ser um ponto de inflexão para esta nova interação.

Obviamente, isso causou um "Boom" e todos querem saber como utilizar, contudo, boa parte dos desenvolvedores não sabe como o ARKit funciona e nem como desenvolver. Portanto, ao longo deste artigo há uma breve explicação sobre como opera o framework para se entender a magia por trás do ARKit, assim como um tutorial de uma aplicação do ARKit.

Demo do ARKit durante a WWDC de 2017

O que é Realidade Aumentada?

A realidade aumentada (AR) descreve as experiências dos usuários que adicionam elementos digitais ao plano a partir da câmera de um dispositivo, de modo que esses elementos parecem habitar a realidade. Realidade aumentada nada mais é que a ilusão que o conteúdo virtual faz parte do mundo real.

Já o ARKit combina o rastreamento do movimento do dispositivo, a captura de cena da câmera e o processamento avançado para simplificar a tarefa de criar uma experiência AR.


Como funciona a "magia" do ARKit?

O requisito básico para qualquer experiência de realidade aumentada é a capacidade de criar e rastrear uma correspondência entre o espaço do mundo real que o usuário habita e um espaço virtual onde pode-se modelar o conteúdo visual.

Para criar tal correspondência, o ARKit usa uma tecnologia chamada visual-inertial odometry (VIO) para rastrear com precisão e em tempo real a posição no mundo ao redor, aproveitando dos dados do sensor da câmera com informações do CoreMotion. Permitindo assim que o dispositivo perceba como ele se move com alta precisão e sem necessidade de calibração. Aliando o visual-inertial odometry com simples detecção de superfícies, é possível criar uma realidade aumentada muito fiel e convincente.

Visual-inertial odometry nada mais é que o famoso World Tracking, tecnologia a qual utiliza as imagens da câmera e core motion para conseguir com precisão onde o celular está localizado e como está orientado

ARKit analisa o que a câmera mostra, detecta planos horizontais (utilizando hit-testing) e também estima a quantidade total de luz disponível e aplica a quantidade correta de iluminação nos objetos virtuais.

Para garantir que os objetos virtuais continuem com a aparência que estão no mundo real, a posição do celular é recalculada entre cada frame que é recarregado e mostrado na tela do dispositivo, isso ocorre cerca de trinta ou mais vezes por segundo. Estes cálculos são feitos duas vezes, em paralelo. A posição é rastreada através do sistema visual (câmera), combinando um ponto no mundo real com um pixel no sensor da câmera de cada quadro. Além disso, a posição também é rastreada pelo sistema inertial (acelerômetro e giroscópio usados em conjunto, os quais são denominados Unidade de Medição Inercial ou IMU). A saída de ambos os sistemas é então combinada através de um Filtro Kalman, método matemático que determina ao longo do tempo com diversas amostras contaminadas com ruído e outras incertezas quais dos dois sistemas fornecem a melhor estimativa de sua posição “real” (referido como Ground Truth). Após tudo isso, a posição atualizada é mostrada através do SDK ARKit. Assim como o odômetro do carro determina a distância do carro percorreu, o sistema VIO rastreia a distância que seu iPhone percorreu no espaço 6D. 6D significa 3D de movimento xyz (translação), além de 3D de roll / pitch / yaw (rotação).

A grande vantagem que o VIO traz é que as leituras através do IMU são feitas cerca de mil vezes por segundo e são baseadas no acelerômetro. Dead Reckoning é usado para medir o movimento do dispositivo entre leituras IMU. Dead Reckoning é praticamente um palpite, o qual é feito com uma incrível precisão, funciona como se você desse um um passo e adivinhasse quantos centímetros esse passo era, você usaria o cálculo do tempo para estimar a distância. Os erros no sistema inercial se acumulam ao longo do tempo, de modo que o tempo maior entre os quadros IMU ou quanto mais longo o sistema Inercial não for obtido um “reset” do Visual System, mais o rastreamento se afastará da Ground Truth.

As medidas visuais/ópticas são feitas na taxa de frames da câmera, portanto, geralmente 30 fps, e são baseadas na distância (mudanças da cena entre os frames). Os sistemas ópticos geralmente acumulam erros ao longo da distância (e tempo em menor grau), de modo que quanto mais você se deslocar, maior será o erro. A boa notícia é que os pontos fortes de cada sistema (visual e inertial) cancelam as fraquezas do outro.

Portanto, o sistema Visual e Inercial são baseados em medidas totalmente diferentes e sem nenhuma interdependência. Isso significa que a câmera pode ser coberta ou pode ver uma cena com poucas características ópticas (como uma parede branca) e o Sistema Inercial pode “carregar a carga” para alguns quadros. Alternativamente, o dispositivo pode ficar imóvel e o Visual System pode dar uma pose mais estável do que o sistema Inertial. O filtro Kalman escolhe constantemente a melhor pose de qualidade e o resultado é um rastreamento estável.

Apenas os processadores A9 e A10 executam ARKit, portanto, só a partir do iPhone 6s. Pode-se aproveitar as otimizações do ARKit em Metal, SceneKit e ferramentas de terceiros, como Unity e Unreal Engine.

Agora sim as duas câmeras do iPhone 7 entram em ação

As câmeras duplas são boas para melhores capacidades de zoom, mas também para uma melhor detecção de profundidade. Se você tem dois pontos de vista diferentes e sabe a distância entre esses dois pontos de vista, é possível triangular a distância de um determinado ponto de objeto. Isso significa que para cada pixel a câmera capta, o dispositivo pode calcular mapas de profundidade do que a câmera vê.

Como a câmera dupla lida com os objetos

O cérebro funciona de forma semelhante, permitindo perceber o mundo em 3D. O efeito é chamado stereopsis. O benefício dessa tecnologia é que o software poderia entender quais objetos estão em primeiro plano e quais documentos estão em segundo plano. As posições relativas de objetos entre si. Como uma funcionalidade que muitos já estão familiarizados, é a tecnologia de poder dar um efeito "bokeh" na foto, ou seja, fazer com que o background tenha um aspecto de borrão. Independentemente da estética visual, esta tecnologia fornece à ARKit informações sobre objetos do mundo real com informações digitais.


Boas práticas para se trabalhar com ARKit

Antes de começar a desenvolver uma aplicação de AR, é necessário ter em mente as boas práticas para não encontrar muitas dificuldades e nem erros inesperavéis. Para uma boa experiência AR, depende-se muito dos deltalhes do ambiente físico que nem sempre são consistentes ou fáceis de medir sem erro em tempo real, portanto é necessáro estar ciente das seguintes dicas.

  1. AR com condições de iluminação previsíveis. A qualidade de análise de imagens é reduzida quando a câmera não enxerga detalhes (ex: parede em branco ou ambiente muito escuro)
  2. Use informações de qualidade do rastreamento. O rastreamento correlaciona a análise de imagem com o movimento do dispositivo, com isso o ARKit desenvolve uma melhor compreensão da cena se o dispositivo estiver em movimento. Já um movimento excessivo (muito longe ou muito rápido) resulta em uma imagem borrada ou muito distante para gerar os cálculos, reduzindo a qualidade de rastreamento. A classe ARCamera fornece informações do estado de rastreamento, que você pode usar para desenvolver UI que informa ao usuário como resolver situações de rastreamento de baixa qualidade.
  3. Deixe tempo para a detecção de planos para produzir resultados claros e desabilite quando já tiver os resultados que precisa. Os resultados de detecção de planos variam ao longo do tempo pois o ARKit refina sua estimativa de posição e extensão. Quando uma grande superfície plana está na cena, ARKit pode continuar a mudar a posição, extensão e transformação da âncora do plano depois de ter usado para colocar o conteúdo digital.

Como construir uma aplicação com ARKit?

Depois de ler sobre essa tecnologia, a ansiedade para desenvolver e colocar as "mãos na massa" só aumenta. Com isso, aqui está um breve tutorial de um simples app usando o ARKit. Mas antes, aqui vão alguns conceitos importantes de saber antes de mexer com o framework.

  • Tracking: principal funcionalidade do ARKit, podendo rastrear seu dispositivo em tempo real, consegue a posição física do dispositivo no ambiente ao seu redor
  • Visual inertial odometry: utiliza as imagens da câmera e core motion para conseguir com precisão onde o celular está localizado e como está orientado
  • Scene understanding: habilidade de determinar atributos ao seu redor, como detectar superfícies e planos, estimando a iluminação do ambiente externo para mudar o do objeto digital
  • Renderização: fácil integração entre as imagens da câmera, compreensão da cena e detecção de superfícies. Podendo ser: SceneKit, SpriteKit e Metal (para uso externo como Unity e Unreal)

Pronto, agora prosseguiremos em como criar uma aplicação em ARKit. Primeiramente é importante ressaltar que só é possível desenvolver a partir do Xcode 9 e o iOS 11. Assim que abrir o Xcode já está disponível um template para Realidade Aumentada.

Crie um projeto com o template Augmented Reality App

É possível escolher a tecnologia a ser usada: SceneKit, SpriteKit e Metal, não vou aprofundar muito sobre o assunto de cada uma mas aqui foi utilizado o SceneKit. Assim que é criado o projeto, já tem muitas coisas definidas por default, assim como um template de espaçonave em 3D.

A ARSCNView que já é criada na ViewController é uma subclasse que implementa toda a parte de renderização e o desenvolvedor não precisa se preocupar com isso. Toda vez que for necessário manusear o ARKit, basta iniciar um ARSession que é o objeto que controla todo o processo para criar um app de realidade aumentada, mas primeiro é necessário determinar qual nível de rastreamento necessário através do ARSessionConfiguration. Apenas chamar o ARSession.run (_ configuration). Além disso não é preciso se preocupar com nada pois o ARKit já gerencia a captura de AVFoundation (câmera) e CoreMotion.

Sem fazer nenhuma alteração no projeto template, é possível já ver uma espaçonave no ambiente real.

Execução do Template

Agora vamos lá! O aplicativo será de inserir objetos 3D no mundo real, coisas bem simples, primeiramente deve-se configurar o ARKit no método ViewDidLoad.

Para adicionar os objetos com o SceneKit, é necessário tratá-los como um nó, a seguir há o código para efetuar isso.

E o que dá toda a magia do ARKit, é a câmera, portanto toda vez que o botão for acionado, na posição frontal da câmera, um objeto é colocado na tela.

O resultado final é esse:

Agora que você já sabe como desenvolver, deixe a criatividade fluir! Tem uma infinidade de aplicações: deixar o storytelling mais imersivo e atrativo, novos tipos de jogos, decoração da casa (ver como ficam os móveis de uma loja dentro da sua própria casa).


Quer estudar e saber mais sobre ARKit?

Aqui tem uma compilação de alguns links que são interessantes e que ajudam muito nesse aprendizado.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.