[WRVA2014] Utilização de Realidade Aumentada, com marcadores(ARToolKitPlus) e outros (utilizando openCV), para controle e inspeção de hardware, utilizando a interface ARDUINO
Objetivo:Mostrar as possibilidades de uso de realidade aumentada para controle de hardware utilizando o openFrameworks, explicando as etapas de construção da aplicação. Mostrar caminhos simplificados de desenvolvimento com foco no exemplo.
Similaire à [WRVA2014] Utilização de Realidade Aumentada, com marcadores(ARToolKitPlus) e outros (utilizando openCV), para controle e inspeção de hardware, utilizando a interface ARDUINO
Latinoware 2019 - DEsenvolvimento mobile em Nivel jediAlessandro Binhara
Similaire à [WRVA2014] Utilização de Realidade Aumentada, com marcadores(ARToolKitPlus) e outros (utilizando openCV), para controle e inspeção de hardware, utilizando a interface ARDUINO (20)
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
[WRVA2014] Utilização de Realidade Aumentada, com marcadores(ARToolKitPlus) e outros (utilizando openCV), para controle e inspeção de hardware, utilizando a interface ARDUINO
2. Using AR/CR, with markers and others, to control and inspect hardware with ARDUINO based interface.
Utilização de Realidade Aumentada, com marcadores(ARToolKitPlus) e outros (utilizando openCV), para controle e inspeção de hardware, utilizando a interface ARDUINO.
2
Claudio Kirner1 and Christopher S. Cerqueira12
1Federal University of Itajubá – Universidade Federal de Itajubá (UNIFEI)
2National Institute for Space Research – Instituto Nacional de Pesquisas Espaciais (INPE)
1ckirner@gmail.com ,2christophercerqueira@gmail.com
1http://realidadevirtual.com.br/, 2http://cscerqueira.com.br
09:16
3. Agenda:
•Conceitos e openFrameworks ~60m
•Estado da prática no INPE
•Criando o primeiro programa em openFrameworks ~20m
•Conectando com o Arduino ~40m
•Realidade Aumentada + ex.: Realidade Cruzada ~ 60min
•Usando marcadores -ofxARToolKitPlus
•Usando openCV - ofxOpenCv
•Controlar e monitorar equipamentos usando RA ~60min
•Arduino + openCV + marcadores
09:16
fb.com/RVA.BR
3
Três etapas:
1.10h30 – 12h00
2.14h00 – 15h30
3.16h00 – 17h30
4. Exemplo prático que vai ser montado
•Vamos controlar o Arduino:
•Acender e apagar led, via botão físico e botão virtual (usando marcador tipo ofxARToolKitPlus)
•Movimentar um servo usando rastreio de mão (usando ofxOpenCv)
09:16
fb.com/RVA.BR
4
6. CONCEITOS GERAIS
Algumas definições, como cheguei no openFrameworks, e estado da prática de estudos de interação e visão computacional na Engenharia e Tecnologia Espacial.
09:16
fb.com/RVA.BR
6
7. “The product is no longer the basis of value. The experience is.”
Venkat Ramaswamy
The Future of Competition
7
12/11/2014
fb.com/RVA.BR
8. Valor de uma boa experiência
8
12/11/2014
fb.com/RVA.BR
9. IHC – Interação Homem-Computador
•Estudo da interação entre pessoas e computadores.
•Onde são formadas as experiências.
9
12/11/2014
fb.com/RVA.BR
10. Mas quem desenvolve experiência?
•UX Developer – User Experience
•A pessoa que caminha entra o design e a tecnologia.
http://blog.alexandremagno.net/2013/02/o-que-seria-um-ux-developer/
10
12/11/2014
fb.com/RVA.BR
11. Interação
11
Texto, som, cores, visual, mecânico ou fisico.
Interface
Mensagens
Usuário
Sistema
12/11/2014
fb.com/RVA.BR
20. 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)
9:16
20
22. Realidades – Realidade Aumentada
uma interface baseada 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)
12/11/2014
22
fb.com/RVA.BR
24. 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
12/11/2014
24
fb.com/RVA.BR
25. Milgram Continuum - interfaces
SOURCE: Milgram et al. (1995)
Aumento de elementos reais
Aumento de elementos virtuais
12/11/2014
25
fb.com/RVA.BR
26. Kirner’s Diagram – elementos
Source: (KIRNER et al., 2012)
12/11/2014
26
fb.com/RVA.BR
M$
GRU
Lego
Cave
2L
30. ERA TROGLODITA
•Graduação (2010):
•ARToolKit
•PTAMM
•Bolsista DTI (2011):
•basAR
Conectar com ARDUINO em C++
Literatura indica FIRMATA:
http://firmata.org/wiki/Download
12/11/2014
30
fb.com/RVA.BR
https://github.com/bodusb
http://cscerqueira.com.br/basar
33. oF
•Criado para artistas e 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)
33
12/11/2014
fb.com/RVA.BR
34. utilizar oF quando:
•O projeto renderiza muitos gráficos 3D, e/ou;
•Utilizar muita visão computacional, e/ou;
•Controlar equipamentos, como, por exemplo, o ARDUINO.
34
12/11/2014
fb.com/RVA.BR
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.
36
12/11/2014
fb.com/RVA.BR
40. ERA TROGLODITA (C++)
•Graduação (2010):
•ARToolKit
•PTAMM
•Bolsista DTI (2011):
•basAR
ERA DO FOGO (C++/oF)
•Mestrado (2012):
•Doutorado (2014):
12/11/2014
40
fb.com/RVA.BR
41. •Introdução à utilização de openFrameworks para o desenvolvimento de aplicações de RVA
http://pt.slideshare.net/christophercerqueira/svr2013-o-frev
•Construção de aplicações de Realidade Cruzada Projetiva utilizando openFrameworks e ARDUINO
http://pt.slideshare.net/christophercerqueira/ppt-svr2014
12/11/2014
41
fb.com/RVA.BR
43. Ambiente de desenvolvimento deste tutorial
oF 0.8.4
Visual Studio Express 2012
C++ 11
Windows 8.1
09:17
fb.com/RVA.BR
43
44. Descompactando
•addons – recursos fora do core do oF
•apps – local onde ocorre o devel
•docs –
•examples - +100
•export – dlls
•libs – bibliotecas do oF
•others – pde para exemplo com Arduino
•projectGenerator – gerador automático de projetos
•scripts – compilar tudo, e base para criação de projetos
09:17
fb.com/RVA.BR
44
46. O EXEMPLO VAZIO!
o exemplo vazio serve para explorar a estrutura de arquivos do oF, a utilização do gerador automático e a organização do código.
46
57. 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.
•Desvantagens?!
•Tem que ficar atrelado ao host!
12/11/2014
57
fb.com/RVA.BR
58. Obs.: Mudança da nomenclatura dos pinos após Firmata 2.3 (Arduino 1.0)
09:17
fb.com/RVA.BR
58
59. 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.
09:17
fb.com/RVA.BR
59
http://arduino.cc/en/reference/firmata
62. Métodos para conectar com o ARDUINO
connect()
disconnect()
getAnalog()
getAnalogPinReporting()
getDigital()
getDigitalPinMode()
getPwm()
getString()
isArduinoReady()
isInitialized()
sendAnalogPinReporting()
sendByte()
sendDigital()
sendDigitalPinMode()
sendPwm()
sendReset()
sendString()
setUseDelay()
update()
12/11/2014
62
fb.com/RVA.BR
63. Código no openFrameworks
•Exploração do exemplo: communicationfirmataExample
09:17
fb.com/RVA.BR
63
64. Fluxograma básico
09:17
fb.com/RVA.BR
64
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
65. Código
09:17
fb.com/RVA.BR
65
//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);
69. Definição atual
Uma definição mais atualizada é: realidade aumentada é uma interface baseada 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. (KIRNER 2011)
69
78. Voltando ao mundo real
•openFrameworks + ARToolKitPlus.
•Add-on ofxARToolKitPlus. (https://github.com/fishkingsin/ofxARtoolkitPlus)
•Descompactá-lo e salvar dentro de
<of>/addons
•Renomear, retirando o sufixo –master
78
79. ARToolKitPlus original:
•https://launchpad.net/artoolkitplus
•released on 2014-10-05 ( )
•ARToolKitPlus is a software library that can be used to calculate camera position and orientation relative to physical markers in real time. This enables the easy development of a wide range of Augmented Reality applications.
•advantages over the classical ARToolKit:
•easier C++ based API
•support for 4096 binary based markers - no need to design new markers yourself
•supports RGB565, Gray images
•"Robust Planar Pose" algorithm that reduces jitter while tracking
•uses modern text-file based camera calibration
•Vignetting Compensation
•automatic Thresholding
•Hull based tracking in multi marker mode
09:19
fb.com/RVA.BR
79
80. •Utilizar o gerador automático e gerar com os seguintes add-nos:
•ofxARToolKitPlus
•ofxOpenCv (necessário para o ofxARToolKitPlus)
•DICA: Não vai funcionar – o of0.8.4 usa o C++ 11, diferente do compilado na ofxARToolKitPlus
•Como resolver: http://touch-base- br.blogspot.com.br/2014/09/openframeworks-083- ofxartoolkitplus.html
80
81. Ajustando o projeto - caminhos
1.Configuration Properties Linker GeneralAdditional Library Directories e inclua o caminho para a biblioteca, no caso:
......addonsofxARtoolkitPluslibsARToolKitPluslibwin32
1.Configuration Properties Linker Input Additional Dependencies incluir a lib:
ARToolKitPlus.lib
81
82. Fluxograma
09:19
fb.com/RVA.BR
82
SETUP
Configura câmera e ARTKP
UPDATE
Update câmera e ARTKP
DRAW
Desenha 2D
Desenha 3D
83. Lets code...
// ofApp.cpp
#pragma once
#include "ofMain.h"
#include "ofxOpenCv.h" //Cabeçalho do OpenCV
#include "ofxARToolkitPlus.h" //Cabeçalho do ARToolKitPlus
class ofApp : public ofBaseApp{
...
int width, height; // Tamanho da janela da câmera
ofVideoGrabber vidGrabber; // Componente do oF que pega a câmera.
ofxARToolkitPlus artk; // Instância do ARToolKitPlus
ofxCvColorImage colorImage; //imagem capturada pela câmera
ofxCvGrayscaleImage grayImage; //imagem em tons de cinza (mais rápida)
};
83
84. Configurando – testApp::setup()
//--------------------------------------------------------------
void ofApp::setup(){
ofSetWindowShape(1280,480); // Ajusta o tamanho da aplicação
width = 640; height = 480; // largura e altura da imagem da câmera
vidGrabber.initGrabber(width, height); // reserva buffer da câmera
colorImage.allocate(width, height); // reserva imagem colorida
grayImage.allocate(width, height); // reserva imagem mono
artk.setup(width, height); // inicia o ARToolKitPlus
}
84
85. Rastreio - testApp::update()
//--------------------------------------------------------------
void ofApp::update(){
vidGrabber.update(); // Pega frame da câmera
bool bNewFrame = vidGrabber.isFrameNew();// é um frame novo ???
if(bNewFrame) { // se um frame novo
//pega os pixels do buffer da câmera e armazena
colorImage.setFromPixels(vidGrabber.getPixels(), width, height);
grayImage = colorImage; //converte a imagem para mono
artk.update(grayImage.getPixels());
}
}
85
86. Exibindo - testApp::draw() – p1
void ofApp::draw(){
ofSetColor(ofColor::white); // inicia a cor dos objetos como branca
colorImage.draw(0, 0); // exibe a imagem capturada colorida
artk.draw(640, 0); // Esta função exibe a posição e etiqueta marcador
// ARTK 2D stuff - // See if marker ID '0' was detected
int myIndex = artk.getMarkerIndex(0);
if(myIndex >= 0) {
ofSetColor(ofColor::red);
ofDrawBitmapString(ofToString(artk.getTranslation(myIndex)),
artk.getDetectedMarkerCenter(myIndex));
}
// ARTK 3D
artk.applyProjectionMatrix(); // matriz de projeção da camera
int numDetected = artk.getNumDetectedMarkers(); //detectar marcadores
ofEnableAlphaBlending(); //habilitar a transparência
86
87. Exibindo - testApp::draw() – p2
for(int i=0; i<numDetected; i++) { // marcadores encontrados
artk.applyModelMatrix(i); //matriz de perspectiva do marcador
//Local onde colocar o conteúdo 3D do marcador
// neste exemplo é uma pilha de retângulos.
ofNoFill();
ofEnableSmoothing();
ofSetColor(255, 255, 0, 50);
for(int i=0; i<10; i++) {
ofRect(-25, -25, 50, 50);
ofTranslate(0, 0, i*1);
}
}
}
87
88. Alterando o threshold - testApp::keyPressed(int key)
//--------------------------------------------------------------
void ofApp::keyPressed(int key){
switch(key){
// aumenta o valor do threshold
case OF_KEY_UP: artk.setThreshold(++threshold); break;
// diminui o valor do threshold
case OF_KEY_DOWN: artk.setThreshold(--threshold); break;
// chama a configuração da câmera
case 's': case 'S': vidGrabber.videoSettings(); break; default: break;
};}
88
89. Lembrar de copiar a ARToolKitPlus.dll para a pasta destino
Lembrar de copiar as definições de câmera do ARToolKitPlus
09:19
fb.com/RVA.BR
89
92. Teoria: Rastreio de cores
1.Breve teoria de cores e rastreio de blobs em openCV,
2.Construção dos artefatos de manipulação,
3.Algoritmo de rastreio,
4.Algumas sugestões de usos
12/11/2014
92
fb.com/RVA.BR
94. Blobs
•Método de busca de características.
•Blobs compartilham propriedades constantes que podem ser “percebidas” na imagem.
12/11/2014
94
fb.com/RVA.BR
100. Voltando ao mundo real
•openFrameworks + openCV.
•Addon ofxOpenCV – Incluso no openFrameworks
•Addon ofxCv (https://github.com/kylemcdonald/ofxCv)
•Descompactá-lo e salvar dentro de
<of>/addons
•Renomear, retirando o sufixo –master
•DICA: nenhuma dica,
vai funcionar!!!
100
103. 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).
09:19
fb.com/RVA.BR
103
104. 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 bLearnBakground;
ofxCv::TrackingColorMode trackingColorMode;
ofxCv::ContourFinder contourFinder;
ofColor targetColor;
ofPoint apontador;
ofPoint encontraPontoMaisDistante();
};
09:19
fb.com/RVA.BR
104
106. 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 (bLearnBakground == true){
grayBg = grayImage;// salva o fundo da tela - TO ROUBANDO MESMO!
bLearnBakground = 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”
}
}
09:19
fb.com/RVA.BR
106
107. Ponto mais distante – p1
ofPoint ofApp::encontraPontoMaisDistante(){
int n = contourFinder.size(); //qtidade de blobs capturados
ofPoint maisDistante ; //nosso ponto mais distante
for(int i = 0; i < n; i++) {
ofVec2f centroid = toOf(contourFinder.getCentroid(i)); //Centroide;
ofPolyline convexHull = toOf(contourFinder.getConvexHull(i)); //quinas;
vector<ofPoint> vertices = convexHull.getVertices(); // vetorDeQuinas
vector<ofPoint>::iterator itVec; // para percorrer as quinas.
maisDistante = (*vertices.begin());
float tamMaisDistante = centroid.distanceSquared(maisDistante);
float distanciaAtual = 0;
09:19
fb.com/RVA.BR
107
113. O que nós sabemos (em tese) até agora:
•Como se localizar no openFrameworks
•projectGenerator, ofApp.h, ofApp.cpp, métodos: setup,update,draw
•Como transformar o Arduino numa interface de hardware, para sensores e atuadores.
•Como, via openFrameworks: enviar comandos digitais, receber dados digitais e analógicos, enviar PWM, controlar um servo.
•Utilizar marcadores do tipo ARToolKitPlus, e: descobrir a sua posição 3D e a sua posição 2D (na tela), verificar se ele foi encontrado.
•Utilizar openCV para rastreio de cores, e a posteriori rastreio de mão/dedos –
•usando uma webcam normal!!!
•Suck it up Kinect!
09:19
fb.com/RVA.BR
113
117. •Existe um framework easy (noob level) em C++ chamado openFrameworks.
•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.
09:19
fb.com/RVA.BR
117
118. •ARToolKitPlus é um tipo de marcador para RA, que é mais rápido que o ARToolKit.
•openCV é uma biblioteca de visão computacional.
•Com openCV podemos rastrear cores, diferenças de padrão, etc.
•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.
09:19
fb.com/RVA.BR
118
120. 120
Claudio Kirner1 and Christopher S. Cerqueira12
1Federal University of Itajubá – Universidade Federal de Itajubá (UNIFEI)
2National Institute for Space Research – Instituto Nacional de Pesquisas Espaciais (INPE)
1ckirner@gmail.com ,2christophercerqueira@gmail.com
1http://realidadevirtual.com.br/, 2http://cscerqueira.com.br
Dúvidas: christophercerqueira@gmail.com
Site: http://cscerqueira.com.br
Facebook: http://fb.com/RVA.BR
Para maiores dúvidas:
INPE – SJC
Prédio Satélite
Sala 95