O documento apresenta uma introdução ao uso do framework openFrameworks para construção de interfaces de realidade aumentada on-demand baseadas em hardware como o Arduino. Apresenta os conceitos básicos de realidade aumentada e realidade cruzada e discute porque interfaces on-demand são úteis. Também fornece uma visão geral da estrutura e funcionalidades do openFrameworks para desenvolvimento de aplicações que integram hardware, visão computacional e realidade aumentada.
3. Construção de interfaces on-
demand baseadas em
Realidade Aumentada
Projetiva para Controle de
Hardware (Arduino)
Drª. Ana Maria
Ambrosio
MSc. Christopher
Cerqueira
aluno
doutorado
Dr. Claudio Kirner
6. Objetivo da apresentação
• Devido as restrições, vamos montar uma versão simplificada:
• Ausência de projetores para todos os alunos
• Ausência de ARDUINO para todos os alunos
• Mostrar um framework para construção de apps de RA / RC.
• openFrameworks
• Mostrar os recursos de controle de hardware (Arduino)
• Mostrar os recursos de CV (openCV): rastreio de contorno
(infraestrutura e controles) e processamento de imagem
(mão).
• Mostrar tipos comuns para criação de interface.
• openFrameworks
• Aplicações tipo interação em mesa. (Projeção)
08:38fb.com/RVA.BR
6
7. Agenda:
• Conceito e openFramework
• Criando o primeiro programa em openFrameworks
• Conectando com o Arduino
• Estudos de caso / Construção do ambiente (exemplos):
• 1. Detectar infraestrutura (Apenas rastreio do papel)
• 2. Rastreio do atuador (rastreio da mão)
• 3. Interação com estrutura virtual
• 4. Detectar estrutura física on-demand (sem reprojeção)
• Wrap-Up
3 horas
1,5h
1,5h
08:38fb.com/RVA.BR
7
18. Realidades – Realidade Virtual
interface que permite ao
usuário interagir, em tempo real,
com um mundo
tridimensional gerado por
computador, usando seus
sentidos através de
equipamentos especiais.
SOURCE: NASA (2013a)
08:38
18
fb.com/RVA.BR
20. Realidades – Realidade Aumentada
uma interfacebaseada na
sobreposição de informações virtuais
geradas por computador (envolvendo
imagens estáticas e dinâmicas, sons
espaciais e sensações hápticas) com o
ambiente físico do usuário, percebida
através de dispositivos tecnológicos e
usando as interações naturais do
usuário, no mundo físico.
Claudio Kirner
SOURCE: Adapted from ESA (2009) and Capua (2008)
08:38
20
fb.com/RVA.BR
22. Realidades – Realidade Cruzada
é um ambiente de realidade misturada ubíqua, que
vem da fusão de uma rede de sensores e atuadores
(que coletam e enviam dados relacionados ao
mundo real) com mundos virtuais compartilhados,
usando a interface da realidade
aumentada.
Claudio Kirner
Introdução
08:38fb.com/RVA.BR
22
23. Kirner’s Diagram – elementos
Source: (KIRNER et al., 2012)
Lego
Cave
08:38fb.com/RVA.BR
23
26. [ ] Hololens
• Talvez o primeiro hardware de RA, com sobreposição, que
entra com força no mercado.
• Google Glass tentou, mas na maioria dos apps não tinha
sobreposição intrínseca.
• Vídeo 1
08:38fb.com/RVA.BR
26
27. Qual o motivo de RA ainda não ter
pego em atividades de engenharia?
HWs de
interação?
HWs de
visualização?
Frameworks
de rastreio
SWs
Frameworks
geo-localizados
Frameworks
de interação
08:38fb.com/RVA.BR
27
28. Um dos motivos ao nosso ver é:
• Dificuldade de criação e manipulação de uma interface
de RA a medida que é utilizada.
• Poderíamos então pensar em uma estratégia, de criação
de uma interface física e indicar sua camada virtual a medida
que é necessário (on-demand) e a função desejada.
• Esses minicurso essencialmente é para mostrar uma
opção de criação de interface em RA on demand.
• “Solução simplificada: openFrameworks + visão computacional.”
08:38fb.com/RVA.BR
28
32. oF
• Criado para artistase designers
• Desenvolvido por: Zach Liberman, Theo Watson, Artuno
Castro e Chris O’Shea
•Proposta: Arrumar a falta de comunicação entre
diversas bibliotecas em C++, e permitir portabilidade.
• Escrita em C++
• Licença: MIT (educacional e venda)
• Usar quando:
• O projeto renderiza muitos gráficos 3D, e/ou;
• Utilizar muita visão computacional, e/ou;
• Controlar equipamentos, como, por exemplo:
• o ARDUINO.
08:38fb.com/RVA.BR
32
36. Libs no pacote padrão
• OpenGL, GLEW, GLUT, libtess2 e cairo para gráficos.
• rtAudio, PortAudio ou FMOD e Kiss FFT para entrada, saída e
análise de áudio.
• FreeType para fontes.
• FreeImage para salvar e carregar imagens.
• Quicktime e videoInput para playback e aquisição de vídeo.
• Poco, que contém uma variedade de utilidades.
08:38fb.com/RVA.BR
36
39. ERA TROGLODITA (C++)
• Graduação (2010):
• ARToolKit
• PTAMM
• Bolsista DTI (2011):
• basAR
ERA DO FOGO (C++/oF)
• Mestrado (2012):
• Doutorado (2014):
08:38fb.com/RVA.BR
39
40. MDE (Model Driven Engineering)
MBSE (ModelBased SystemEngineering)
• MDE é um conjunto de práticas de
engenharia, baseadas em ferramentas
que utilizam ao mesmo tempo meta-
modelagem e transformações de modelos
para atingirem automaticamente
objetivos em produção, manutenção ou
operação de sistemas intensivos em
software.
40
Motivador - Matlab
08:38fb.com/RVA.BR
41. Três tipos principais de aplicações
MDE
MDE
Geração automática Descoberta do Modelo Interoperabilidade de
sistemas
41
Um modelo pode
ser transformado
em outro modelo.
Um meta-modelo é um conjunto
de conceitos e relações que o
modelo pode realizar.
“Filtro” de possibilidade.
Uma representação gera um
conjunto de elementos.
08:38fb.com/RVA.BR
43. • Introdução à utilização de openFrameworks para o
desenvolvimento de aplicações de RVA
Link
• Construção de aplicações de Realidade Cruzada Projetiva
utilizando openFrameworks e ARDUINO
Link
• Utilização de Realidade Aumentada, com
marcadores(ARToolKitPlus) e outros (utilizando openCV), para
controle e inspeção de hardware, utilizando a interface
ARDUINO.
Link
08:38fb.com/RVA.BR
43
58. O que a FIRMATA faz!?
• Transforma o ARDUINO numa interface de controle, podendo
ser modificado por um host.
• Quais as vantagens?
• O host controla a execução!
• O host tem mais memória.
• O host resolve as lógicas de controle muito
mais rápido.
• Desvantagens?!
• Tem que ficar atrelado ao host!
08:38
58
fb.com/RVA.BR
59. Obs.: Mudança da nomenclatura
dos pinos após Firmata 2.3
(Arduino 1.0)
Tomar cuidado na hora de
desenvolver!!!!!!!!!!
08:38fb.com/RVA.BR
59
60. Instalando a Firmata no
Arduino
• Faça download do
Arduino 1.0.6
http://arduino.cc/en/
Main/Software
• Abra o sketch do
Firmata Standard.
• Transfira para a
board.
08:38fb.com/RVA.BR
60
http://arduino.cc/en/reference/firmata
65. Fluxograma básico
08:38fb.com/RVA.BR
65
SETUP
Habilita callback
de Arduino Alive
Arduino
Responde Evento
Alive
Configura
Arduino
Loop de execução
– sem Arduino
Enviar comandos
pro Arduino
Recebeu um
evento Digital
Recebeu um
evento Analógico
Loop de execução
– Arduino Update
66. Código
08:38fb.com/RVA.BR
66
//ofApp.h
#pragma once
#include "ofMain.h"
class ofApp : public ofBaseApp{
public:
…
ofArduino ard;
bool bSetupArduino;
private:
void setupArduino(const int & version);
void digitalPinChanged(const int & pinNum);
void analogPinChanged(const int & pinNum);
void updateArduino();
};
//ofApp.cpp
void ofApp::setup(){
...
ard.connect("COM3", 57600); //conecta com arduino
ofAddListener(ard.EInitialized, this, &ofApp::setupArduino);
bSetupArduino= false;// flag arduino ok
}
void ofApp::setupArduino(const int & version) {
ofRemoveListener(ard.EInitialized, this, &ofApp::setupArduino);
bSetupArduino = true; // agora pode usar o arduino.
ard.sendDigitalPinMode(2, ARD_INPUT); //pino entrada digital
ard.sendAnalogPinReporting(0, ARD_ANALOG); // pino entrada analógica
ard.sendDigitalPinMode(13, ARD_OUTPUT); // configura pino saída digital
ard.sendDigitalPinMode(11, ARD_PWM); // configura pino saída PWM
ard.sendServoAttach(9); // diz que o pino tem um servo.
ofAddListener(ard.EDigitalPinChanged, this, &ofApp::digitalPinChanged); //callback
para eventos de pino digital.
ofAddListener(ard.EAnalogPinChanged, this, &ofApp::analogPinChanged); //callback
para eventos de pino analógico
}
void ofApp::updateArduino(){
ard.update(); // verifica se algo mudou no Arduino - obrigatório
if (bSetupArduino) {
//envia o que for para o Arduino.
ard.sendPwm(11, (int)(128 + 128 * sin(ofGetElapsedTimef()))); // pwm...
}
}
//ofApp.cpp
void ofApp::digitalPinChanged(const int & pinNum)
{
// trata o pino digital - ard.getDigital(pinNum)
}
void ofApp::analogPinChanged(const int & pinNum)
{
// trata o pino analógico -
ard.getAnalog(pinNum)
}
//outros comandos
ard.sendServo(9, 180, false);
ard.sendDigital(8, ARD_HIGH);
80. Blobs
• Método de busca de características.
• Blobs compartilham propriedades constantes que podem ser
“percebidas” na imagem.
08:38
80
fb.com/RVA.BR
84. Continuando ....
Usando o addon: ofxCv de Kyle McDonald
https://github.com/kylemcdonald/ofxCv
08:38fb.com/RVA.BR
84
85. Tipo: ofxCv::ContourFinder
• Tipo/função que procura blobs numa imagem.
• Retorna os blobs e características:
• Posição
• Contorno
• Centroide, média centro, pontos das bordas, menor retângulo
contornável, menor elipse, etc etc etc...
08:38fb.com/RVA.BR
85
87. // Camera:
ofVideoGrabber cam; // Video Tracking source
int camHeight;
int camWidth;
ofImage unwarped; // RAW image from camera
// Descobridor de papel
ofxCv::ContourFinder contourFinder;
int thresholdCV;
ofPolyline contour;
ofImage warpedPaper;
bool foundInfra;
// ## Função para retornar tipo de forma geométrica
private:
string findForm(const ofPolyline &poly);
template <class T>
string findForm(const T &poly){
return findForm(ofxCv::toOf(poly)); }
};
Câmera
Procurador
de papel
08:38fb.com/RVA.BR
87
88. Identificar Formas Convexas
• Entrada: número de vértices
• 3 vértices = TRIANGULO
• 4 vértices e cos +/- 0 = RETÂNGULO
• 5 vértices e cos +/- 0.3 = PENTÁGONO
• 6 vértices e cos +/- 0.5 = HEXÁGONO
• > 6 Círculo
• http://opencv-code.com/tutorials/detecting-simple-shapes-in-an-image/
• https://github.com/bsdnoobz/opencv-code/blob/master/shape-detect.cpp
08:38fb.com/RVA.BR
88
96. WHERE IS MY HAND? DETECTING THE
ACTUATOR
Detectando a mão, caneta,
ou qualquer outra coisa
(medo) que você queira
usar para fazer interação.
08:38fb.com/RVA.BR
96
97. Rastrear mão (apontador 2D)
• Restrições (para facilitar)
Fundo homogêneo
Longe das quinas
Uma mão só
• Pseudo-código
• Fazer diferença entra o fundo e o frame atual para encontrar a
mão.
• Com a diferença rastreia o blob.
• Do blob calcula as quinas
• Das quinas pega a mais distante do centroide e que não seja
próximo das quinas ( braço).
08:38fb.com/RVA.BR
97
98. Lets code.... Babe!!!!
#include "ofMain.h"
#include "ofxOpenCv.h" //Cabeçalho do OpenCV
#include "ofxCv.h"
class ofApp : public ofBaseApp{
...
int width, height, threshold;
ofVideoGrabber vidGrabber; // Componente do oF que pega a câmera.
ofxCvColorImage colorImage; // imagem capturada pela câmera
ofxCvGrayscaleImage grayBg, grayImage, grayDiff;// bg, cinza, diferença
bool bLearnBackground;
ofxCv::TrackingColorMode trackingColorMode;
ofxCv::ContourFinder contourFinder;
ofColor targetColor;
ofPoint apontador;
ofPoint encontraPontoMaisDistante();
};
08:38fb.com/RVA.BR
98
99. Tipo: ofPoint
• ofPoint é um tipo muito utilizado no openFrameworks que
faz as vezes de um ponto na área da janela.
• Com ele podemos posicionar pontos na área da janela.
• Essencialmente é um vetor X,Y,Z. Herda de ofVec3f
• Possui propriedades sobrecarregadas de operação de vetores.
08:38fb.com/RVA.BR
99
102. Update
void ofApp::update(){
vidGrabber.update(); // Pega frame da câmera
if(vidGrabber.isFrameNew()){ // é um frame novo ???
colorImage.setFromPixels(vidGrabber.getPixels(),width,height);
grayImage = colorImage;
if (bLearnBackground == true){
grayBg = grayImage;// salva o fundo da tela - TO ROUBANDO MESMO!
bLearnBackground = false;}
grayDiff.absDiff(grayBg, grayImage); // fazer fundo x atual
grayDiff.threshold(threshold);
contourFinder.setThreshold(threshold); // procurar blobs no atual
contourFinder.findContours(grayDiff);
apontador = encontraPontoMaisDistante(); // procurar “dedo”
}
}
08:38fb.com/RVA.BR
102
108. PLAYING IN THE AIR!
Interagindo em
elementos
virtuais com a
mão.
08:38fb.com/RVA.BR
108
109. Definindo um conjunto de
ações
• Assunto: Controlar um Arduino
• Ações:
• Acender e Apagar um LED via Arduino, com replicação virtual, via
botão físico e botão virtual.
• Controlar um servo motor a partir de uma barra virtual.
Dica: Esse é um bom algoritmo para fazer o debounce do toque:
http://drmarty.blogspot.com.br/2009/05/best-switch-debounce-routine-ever.html
08:38fb.com/RVA.BR
109
110. Espalhando controles virtuais pela
área capturada pela câmera
• 1º Projeto de Interface (livre em toda a área)
“É você Google
Glass? É voce
Hololens?”
(Clotilde, 1985)
08:38fb.com/RVA.BR
110
111. Tipo: ofRectangle
• Tipo que define um retângulo na tela.
• Retângulos são muito usados para definir áreas de toque.
(Forma mais simples)
• O tipo ofRectangle possui:
• X,Y,(Z) do canto superior esquerdo (Referência)
• Height, Width
• Operadores sobrecarregados
• Varias funções de posicionamento
• Adição, crescimento para englobar outros, etc etc etc.
08:38fb.com/RVA.BR
111
112. Some code... (testartoques?inside())
ofRectangle controleServo;
ofRectangle chaveOff;
ofRectangle chaveOn;
ofPoint LEDIndicativo;
ofColor ledColor;
bool ledStatus;
// Configurar posição dos
elementos da interface
controleServo.set(30,85,40,140);
chaveOff.set(197,160,40,40);
chaveOn.set(237,160,40,40);
LEDIndicativo.set(160,50);
if( this->controleServo.inside(dedo) ) {
// trata para controle doservo}
if( this->chaveOn.inside(dedo)) {
// trata evento do botão On}
if( this->chaveOff.inside(dedo)) {
// trata evento do botão Off}
ofApp.h ofApp.cpp – setup()
ofApp.cpp – update()
08:38fb.com/RVA.BR
112
118. Pseudo Código
• Encontrada a infraestrutura:
• Update:
1. Processar imagem
2. Procurar controles
1. Procurar tipo Slide
2. Procurar tipo Switch
3. Procurar tipo Button
3. Tendo os controles
1. Associar um controle a uma função predefinida de uma paleta de
controles
• Draw:
1. Desenhar paleta de funções num canto da infraestrutura
2. Desenhar controles encontrados (Forma e status)
1. Ajustar ponto de vista!!! (mesmo usando vista superior, em caso de
projeção é necessário corrigir, pois câmera e projetor não estão no
mesmo ponto)
08:38fb.com/RVA.BR
118
124. Tipos de Controles:
Switch – Posição 0 ou 1, memoriza a função
Button – Posição 0 ou 1, instantâneo, funciona
enquanto clicado, depois perde o valor
Slide - Valor variável entre um máx. e um mín.
08:38fb.com/RVA.BR
124
127. Tipo: vector (de classes)
• Vector é uma estrutura para armazenar sequencialmente.
• No C++ vários tipos de estruturas de dados foram definidas usando
containers genéricos. (STL)
vector<Controle> listaDeControles;
• Adição:
Controle a;
listaDeControles.push_back(a);
• Remoção:
listaDeControles.erase( listaDeControles.begin() + x);
• Percorrer:
vector<Controle>::iterator it = listaDeControles.begin();
for(; it != listaDeControles.end(); it++){
it->id; } // se vetor de ponteiros (*it)->
http://www.openframeworks.cc/tutorials/c++%20concepts/001_stl_vectors_basic.html
vector<Controle*> listaDeControles;
08:38fb.com/RVA.BR
127
128. //... Continuing - void ofApp::encontraControles()
listaDeControles.clear();
int n = controlFinder.size();
for(int i = 0; i< n; i++){
if (isButton(i)) {
float radius;
cv::Point center = controlFinder.getMinEnclosingCircle(i, radius);
Controle *b = new Controle(); b->id = i;
b->fillButton(center, radius);
listaDeControles.push_back(b);
} else if (isSlider(i)) {
cv::RotatedRect rect = controlFinder.getMinAreaRect(i);
Controle *s = new Controle(); s->id = i;
s->fillSlider(rect);
listaDeControles.push_back(s);
} else if (isSwitch(i)) {
cv::RotatedRect rect = controlFinder.getMinAreaRect(i);
Controle *s = new Controle(); s->id = 1;
s->fillSwitch(rect);
listaDeControles.push_back(s);
}
}
}
08:38fb.com/RVA.BR
128
142. • Existe um framework em C++ chamado
openFrameworks. Novo player interessante: Unreal
Engine + Blueprints (AWESOME)
• openFrameworks pode ser expandido com
componentes da comunidade, chamados addons.
• Com ele é possível controlar o Arduino (em C++).
• O Arduino pode se transformar numa interface de
dados usando a lib Firmata.
• Arduino é barato e fácil de usar. Um possível
software para desenhar circuitos é o Fritzing
•Realidade Aumentada é só uma
interface de acesso aos elementos virtuais.
08:38fb.com/RVA.BR
142
143. • openCV é uma biblioteca de visão computacional.
• Com openCV podemos rastrear cores, diferenças de
imagens, etc.
• Pense se sua aplicação pode usar equipamentos
simples!
• Quanto mais simples e do cotidiano do usuário
melhor.
• Visão computacional nem sempre é um resultado por si.
Ideal são soluções hibridas.
• Adicionando elementos de interação físicos (sensores e
atuadores) à Realidade Aumentada, que fazem a troca
bidirecional de informação cria-se Realidade Cruzada.
08:38fb.com/RVA.BR
143