07:59cscerqueira.com.br
07:59cscerqueira.com.br
Utilização de Realidade
Aumentada no loop de
controle de um drone
M.Sc. Eng. Christopher S. Cerqueira
cscerqueira.com.br
07:59cscerqueira.com.br
O que vamos
aprender hoje
fazer???
07:59cscerqueira.com.br
PONTO DE VISTA DA
CÂMERA
07:59cscerqueira.com.br
Interação Colaborativa com
Artefatos Inteligentes
Interação homem-máquina, metáforas, ambientes contínuos e realidade Cruzada
#motivação
[Motivação][Teoria]
Metáforas (Spolsky, 2001)
Sistema
análogo
Modelo do
programa
representa
Modelo do
Programa
Modelo do
Usuário
Em conformidade
Expectativas de como
o software deve
trabalhar
Software sendo
executado
07:59cscerqueira.com.br
[Motivação][Teoria]
Limitações de interfaces WIMP (Windows, Icon, Menu, Pointer)
Operações explicitas – as interfaces reduzem a carga
cognitiva das operações, só que não necessariamente
reduzem a quantidade de operações.
Desconhecimento do mundo real – as interfaces são
projetadas para o ambiente usuário – computador.
Lacunas entre o mundo real – as interfaces não
conseguem relacionar a modificação de objetos do mundo
real. (Rekimoto e Nagao, 1995)
Solução?!
07:59cscerqueira.com.br
[Motivação][Teoria]
Interfaces tangíveis
“Interfaces tangíveis são interfaces através das quais o
usuário interage com uma informação digital via um
ambiente físico.”
(Ishii, 2008)
07:59cscerqueira.com.br
[Motivação][Teoria]
Estilos de Interfaces (Rekimoto e Nagao (1995))
07:59cscerqueira.com.br
[Motivação][Teoria]
Intersecção entre tipos de artefatos usados no
ambiente (Kirner et al., 2012)
07:59cscerqueira.com.br
[Motivação][Teoria]
Realidade Cruzada = Realidade Aumentada +
Artefatos inteligentes
“Realidade aumentada e uma interface baseada na
combinação de informações geradas
computacionalmente (imagens estáticas ou
dinâmicas, sons espaciais e sensações hápticas)
com o ambiente real do usuário, através de
dispositivos tecnológicos e utilizando interação
natural no mundo real.”
(Kirner 2011)
clássico
laserTag
oasis
lego
pokemon07:59cscerqueira.com.br
Realidade Cruzada = Realidade Aumentada +
Artefatos inteligentes
“Realidade Cruzada é um ambiente de realidade misturada
ubíqua formado 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 de realidade
aumentada, onde a troca de informação é bidirecional entre
os mundos reais e virtuais.”
(Kirner 2011)
(Kirner et al,
2012)
(Curso de Inverno – INPE 2015)
07:59cscerqueira.com.br
[MOTIVAÇÃO]
Aplicações – Internet das Coisas
07:59cscerqueira.com.br
[MOTIVAÇÃO]
Aplicações - Educacionais
07:59cscerqueira.com.br
[MOTIVAÇÃO]
Aplicações - Guerra de robos
07:59cscerqueira.com.br
[MOTIVAÇÃO]
Tendência - Wearables
07:59cscerqueira.com.br
[MOTIVAÇÃO]
Tendência
▪ Explosão de produtos interligados
▪ Com software embarcado
▪ Local Awareness
▪ Vide: raspberry PI 2
07:59cscerqueira.com.br
[MOTIVAÇÃO]
Prototipagem / Aprendizado
07:59cscerqueira.com.br
[MOTIVAÇÃO] Desafio da área espacial:
Docking – Acoplamento autônomo de
espaçonaves.
ISS Dock 01
ISS Dock 02
Dock for dummies
07:59cscerqueira.com.br
[ROTEIRO]
▪ Objetivos do evento proposto: Apresentar a utilização do
openFrameworks, Realidade Aumentada como ferramenta de
engenharia, utilização de Arduino e controle de motor DC.
▪ Conteúdo do evento proposto:
1. openFrameworks
2. Arduino e Firmata
3. Controlando o drone (baseado em Arduino) via Interface em
openFrameworks
4. Realidade Aumentada
5. Capturando informações do marcador via openFrameworks.
6. Movimento autônomo de drone com RA no loop de controle.
07:59cscerqueira.com.br
1. openFrameworks
07:59cscerqueira.com.br
Processing
Adobe Flash
Unity
Cinder
openFrameworks
07:59cscerqueira.com.br
[openFrameworks]
openframeworks.cc
▪ Vídeo oF1....media_videos7_openFrameworks1.mp4
▪ Vídeo oF2....media_videos7_openFrameworks2.mp4
07:59cscerqueira.com.br
[openFrameworks]
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.
07:59cscerqueira.com.br
07:59cscerqueira.com.br
[openFrameworks]
C++ Portável!!!!
07:59cscerqueira.com.br
[openFrameworks]
Página Principal – openframeworks.cc
07:59cscerqueira.com.br
[openFrameworks]
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.
07:59cscerqueira.com.br
[openFrameworks]
Addons da comunidade: ofxaddons.com
07:59cscerqueira.com.br
[openFrameworks]
OSX, Linux,
Windows, iOS,
Android, Linux
ARM
07:59cscerqueira.com.br
ERA TROGLODITA (C++)
▪ Graduação (2010):
▪ ARToolKit
▪ PTAMM
▪ Bolsista DTI (2011):
▪ basAR
ERA DO FOGO (C++/oF)
▪ Mestrado (2012):
▪ Doutorado (2014):
07:59cscerqueira.com.br
• 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
07:59cscerqueira.com.br
• Construção de interfaces on-demand baseadas em Realidade
Aumentada Projetiva para Controle de Hardware (Arduino)
Link
[openFrameworks]
SVR2013 - Resultados
07:59cscerqueira.com.br
[openFrameworks]
SVR2014 - Resultados
07:59cscerqueira.com.br
[openFrameworks]
WRVA2014 - Resultados
07:59cscerqueira.com.br
[openFrameworks]
SVR2015 - Resultados
07:59cscerqueira.com.br
Primeiro programa em oF
07:59cscerqueira.com.br
[openFrameworks]
Onde encontrar?
07:59cscerqueira.com.br
[openFrameworks]
Level Easy: Gerador Automático
07:59cscerqueira.com.br
[openFrameworks]
Escolhendo expansões
DocoreoF
Dacomunidade
07:59cscerqueira.com.br
[openFrameworks]
Estrutura do projeto
07:59cscerqueira.com.br
[openFrameworks]
Exemplo básico
07:59cscerqueira.com.br
// ofApp.cpp
void ofApp::setup(){
mensagem = "Hello WRVA2015!!!";
raio = 0;
}
void ofApp::draw(){
ofEnableAlphaBlending(); ofSetColor(ofColor::blue,128);
ofCircle(x_i,y_i,raio);
ofSetColor(ofColor::red);
ofDrawBitmapString(mensagem,mouseX,mouseY);
}
// ofApp.cpp
void ofApp::mouseDragged(int x, int y, int button){
raio = ofDist(x_i,y_i,x,y);
}
void ofApp::mousePressed(int x, int y, int button){
x_i = x;
y_i = y;
}
void ofApp::mouseReleased(int x, int y, int button){
raio = ofDist(x_i,y_i,x,y);
}
// ofApp.h
...
string mensagem;
int x_i,y_i;
float raio;
...
2. Arduino e Firmata
O que é? Onde
vivem?
Existe? Hoje no
Glob..
O que tem no ARDUINO?
07:59cscerqueira.com.br
[ARDUINO]
Outras versões
07:59cscerqueira.com.br
[ARDUINO]
Shields
07:59cscerqueira.com.br
[ARDUINO]
FIRMATA
Literatura indica FIRMATA:
http://firmata.org/wiki/Download
07:59cscerqueira.com.br
[ARDUINO]
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!
07:59cscerqueira.com.br
Obs.: Mudança da nomenclatura
dos pinos após Firmata 2.3
(Arduino 1.0)
Tomar cuidado na hora de
desenvolver!!!!!!!!!!
07:59cscerqueira.com.br
[ARDUINO]
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.
07:59cscerqueira.com.br
http://arduino.cc/en/reference/firmata
[ARDUINO]
“esquemático”
07:59cscerqueira.com.br
▪ #crashcourse fritzing
▪ http://fritzing.org/home/
[ARDUINO]
“simulador”
▪ https://123d.circuits.io
07:59cscerqueira.com.br
[ARDUINO]
Arduino e openFrameworks
07:59cscerqueira.com.br
[ARDUINO]
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()
07:59cscerqueira.com.br
[ARDUINO]
Código no openFrameworks
▪ Exploração do exemplo: communicationfirmataExample
07:59cscerqueira.com.br
[ARDUINO]
Fluxograma básico
07:59cscerqueira.com.br
SETUP
Habilita callback
de Arduino Alive
Arduino
Responde
Evento Alive
Configura
ArduinoLoop de
execução – sem
Arduino
Enviar
comandos pro
Arduino
Recebeu um
evento Digital
Recebeu um
evento
Analógico
Loop de
execução –
Arduino Update
[ARDUINO]
Código
07:59cscerqueira.com.br
//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);
07:59cscerqueira.com.br
3. Controlando o drone
(baseado em Arduino)
via Interface em
openFrameworks
Vamos controlar o DRONE NA MÃO #FACANACAVEIRA
[oF+Ard+DC]
$$
[oF+Ard+DC]
$$
07:59cscerqueira.com.br
[oF+Ard+DC]
$$
07:59cscerqueira.com.br
[oF+Ard+DC]
Controle de Motor DC
07:59cscerqueira.com.br
[oF+Ard+DC]
Ponte H – L293D
07:59cscerqueira.com.br
[oF+Ard+DC]
Drone 2D
07:59cscerqueira.com.br
1 - AEN = HIGH
2 - A1 = HIGH
7 - A2 = LOW
9 - BEN = HIGH
10 - B1 = HIGH
15 - B2 = LOW
1 - AEN = HIGH
2 - A1 = LOW
7 - A2 = HIGH
9 - BEN = HIGH
10 - B1 = LOW
15 - B2 = HIGH
1 - AEN = HIGH
2 - A1 = HIGH
7 - A2 = LOW
9 - BEN = HIGH
10 - B1 = LOW
15 - B2 = HIGH
1 - AEN = HIGH
2 - A1 = LOW
7 - A2 = HIGH
9 - BEN = HIGH
10 - B1 = HIGH
15 - B2 = LOW
Pinos do L293D
[oF+Ard+DC]
Drone 2D
FUNC ARD LM
RODA1 ENABLE D09 1
RODA1 DIR_A D08 2
RODA1 DIR_B D07 7
RODA2 ENABLE D10 9
RODA2 DIR_A D12 10
RODA2 DIR_B D11 15
07:59cscerqueira.com.br
[oF+Ard+DC]
Drone 2D
07:59cscerqueira.com.br
[oF+Ard+DC]
Código
07:59cscerqueira.com.br
void ofApp::keyPressed(int key){
if (bSetupArduino){
ard.sendDigital(13, ARD_HIGH);
switch (key) {
case OF_KEY_RIGHT: this->moveRight(255); break;
case OF_KEY_LEFT: this->moveLeft(255); break;
case OF_KEY_UP: this->moveFront(255); break;
case OF_KEY_DOWN: this->moveBack(255); break;
default: break;
}
}
}
void ofApp::keyReleased(int key){
if (bSetupArduino){
ard.sendDigital(13, ARD_LOW);
this->stop(0);
}
}
void ofApp::setupArduino(const int & version){
...
// WHEEL ONE
ard.sendDigitalPinMode(8, ARD_OUTPUT); // 1A
ard.sendDigitalPinMode(7, ARD_OUTPUT); // 2A
ard.sendDigitalPinMode(9, ARD_PWM); // 1,2 EN
// WHEEL TWO
ard.sendDigitalPinMode(12, ARD_OUTPUT); // 1A
ard.sendDigitalPinMode(11, ARD_OUTPUT); // 2A
ard.sendDigitalPinMode(10, ARD_PWM); // 1,2 EN
// SIGNAL
ard.sendDigitalPinMode(13, ARD_OUTPUT);
}
void ofApp::stop(int value){
ard.sendPwm(9,(int) 0); // stop wheel one
ard.sendPwm(10,(int) 0);// stop wheel two
}
void ofApp::moveBack(int value){
if(value>255 || value<0) return;
ard.sendPwm(9, value); // full wheel one
ard.sendDigital(8, ARD_HIGH);
ard.sendDigital(7, ARD_LOW);
ard.sendPwm(10, value);// full wheel two
ard.sendDigital(11, ARD_HIGH);
ard.sendDigital(12, ARD_LOW);
}
void ofApp::moveRight(int value){
if(value>255 || value<0) return;
ard.sendPwm(9,value); // full wheel one
ard.sendDigital(8, ARD_HIGH);
ard.sendDigital(7, ARD_LOW);
ard.sendPwm(10,value);// full wheel two
ard.sendDigital(11, ARD_LOW);
ard.sendDigital(12, ARD_HIGH);
}
4. Realidade Aumentada
[Realidade Aumentada]
Frameworks
Marcador
▪ARToolKit (C) –
90´s
▪ NYARToolKit (Java, C#, C++,
Android)
▪ AndAR (Android)
▪ FLARToolKit (AS3)
Sem marcador
▪ OpenCV - Multiplataforma
▪ PTAMM (C++)
▪ Vuforia
▪ Project Tango SDK
▪ NGHIA’S AUGMENTED REALITY
07:59cscerqueira.com.br
[Realidade Aumentada]
Ferramentas de Autoria
basAR FLARAS
07:59cscerqueira.com.br
[Realidade Aumentada]
Marcadores
ARToolKit
▪ HITLab
▪ Compara templates.
▪ Template marker
detection
▪ Mais lento
▪ Inviável em SW
embarcado.
ARToolKitPlus
▪ Graz University of
Technology
▪ Compara códigos
▪ ID-Encoded marker
detection
▪ Mol^k vezes mais rápido
▪ Bom para SW
embarcado.
07:59cscerqueira.com.br
[Realidade Aumentada]
ARToolKit
07:59cscerqueira.com.br
[Realidade Aumentada]
ARToolKitPlus
07:59cscerqueira.com.br
[Realidade Aumentada]
Voltando ao mundo real
▪ openFrameworks + ARToolKitPlus.
▪ Add-on ofxARToolKitPlus.
▪ Descompactá-lo e salvar dentro de
<of>/addons
▪ Renomear, retirando o sufixo -master
07:59cscerqueira.com.br
[Realidade Aumentada]
Add-ons
▪ Utilizar o gerador automático e gerar com os seguintes add-
ons:
▪ ofxARToolKitPlus *Necessário compilar antes para o
c++ que vai usar
▪ ofxOpenCv (necessário para o ofxARToolKitPlus)
▪ ofxAssimpModelLoader
http://touch-base-br.blogspot.com.br/2014/09/openframeworks-083-
ofxartoolkitplus.html
07:59cscerqueira.com.br
[Realidade Aumentada]
Ajustando o projeto - caminhos
1. Configuration Properties  Linker GeneralAdditional
Library Directories e inclua o caminho para a biblioteca, no
caso:
......addonsofxARtoolkitPluslibsARToolKitPluslibwin32
07:59cscerqueira.com.br
[Realidade Aumentada]
Ajustando o projeto - lib
1. Configuration Properties  Linker Input 
Additional Dependencies
incluir a lib:
ARToolKitPlus.lib
07:59cscerqueira.com.br
[Realidade Aumentada]
Lets code...
// testApp.cpp
#pragma once
#include "ofMain.h"
#include "ofxOpenCv.h" //Cabeçalho do OpenCV
#include "ofxARToolkitPlus.h" //Cabeçalho do ARToolKitPlus
class testApp : 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
int threshold; // Threshold da relação preto/branco
ofxCvColorImage colorImage; //imagem capturada pela câmera
ofxCvGrayscaleImage grayImage; //imagem em tons de cinza (mais rápida)
ofxCvGrayscaleImage grayThres;//imagem com threshold antes de ir pro artk
};
07:59cscerqueira.com.br
[Realidade Aumentada]
Configurando – testApp::setup()
//--------------------------------------------------------------
void testApp::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
grayThres.allocate(width, height); // reserva imagem ajustada
artk.setup(width, height); // inicia o ARToolKitPlus
threshold = 85; // threshold para a imagem ajustada
artk.setThreshold(threshold); // informa ao ARToolKitPlus que o ajuste
é externo
}
07:59cscerqueira.com.br
[Realidade Aumentada]
Rastreio - testApp::update()
//--------------------------------------------------------------
void testApp::update(){
vidGrabber.grabFrame(); // 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
//Como queremos testar o threshold temos que gerar essa imagem
grayThres = grayImage;
grayThres.threshold(threshold);
//Passa para o ARToolKitPlus a imagem monocromática
artk.update(grayImage.getPixels());
}
}
07:59cscerqueira.com.br
[Realidade Aumentada]
Exibindo - testApp::draw() – p1
//--------------------------------------------------------------
void testApp::draw(){
ofSetColor(ofColor::white); // inicia a cor dos objetos como branca
colorImage.draw(0, 0); // exibe a imagem capturada colorida
grayThres.draw(640, 0); // exibe a imagem adaptada
artk.draw(640, 0); // Esta função exibe a posição e etiqueta o marcador
// ARTK 3D
artk.applyProjectionMatrix();// aplicar a matriz de projeção da camera
int numDetected = artk.getNumDetectedMarkers(); //detectar os marcadores
ofEnableAlphaBlending(); //habilitar a transparência
07:59cscerqueira.com.br
[Realidade Aumentada]
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);
}
}
}
07:59cscerqueira.com.br
[Realidade Aumentada]
Alterando o threshold -
testApp::keyPressed(int key)
//--------------------------------------------------------------
void testApp::keyPressed(int key){
if(key == OF_KEY_UP) {
artk.setThreshold(++threshold); // aumenta o valor do threshold
} else if(key == OF_KEY_DOWN) {
artk.setThreshold(--threshold); // diminui o valor do threshold
} else if(key == 's') {
vidGrabber.videoSettings(); // chama a configuração da câmera
}
}
07:59cscerqueira.com.br
[Realidade Aumentada]
Resultado esperado
07:59cscerqueira.com.br
[Realidade Aumentada]
Adicionando conteúdo
▪ Adicionar o modelo via ofxAssimpModelLoader
▪ Reutilizar o modelo do exemplo anterior.
07:59cscerqueira.com.br
[Realidade Aumentada]
Só adicionar o Assimp
#pragma once
#include "ofMain.h"
#include "ofxOpenCv.h"
#include "ofxARToolkitPlus.h"
#include "ofxAssimpModelLoader.h"
class testApp : public ofBaseApp{
...
ofxCvGrayscaleImage grayThres;
ofxAssimpModelLoader model;
};
07:59cscerqueira.com.br
[Realidade Aumentada]
Setup e Draw...
//--------------------------------------------------------------
void testApp::setup(){
...
if( !model.loadModel("astroBoy_walk.dae", false) ) // Abre o
arquivo
ofSystemAlertDialog("Erro em carregar arquivo");
}
07:59cscerqueira.com.br
[Realidade Aumentada]
//--------------------------------------------------------------
void testApp::draw(){
// ARTK 3D
...
for(int i=0; i<numDetected; i++) { // marcadores encontrados
...
//Local onde colocar o conteúdo 3D do marcador
//pilha de retângulos.
// Modelo 3D
ofSetColor(255); // Configura a cor do objeto
ofPushMatrix(); // Abre o contexto
glEnable(GL_DEPTH_TEST); // habilita profundidade
ofScale(0.1,0.1,0.1); // ajusta escala
ofRotateX(-90); // rotaciona 90 graus
model.drawFaces(); / desenha as faces
glDisable(GL_DEPTH_TEST); // desabilita profundidade
ofPopMatrix(); // fecha o contexto
}
}
07:59cscerqueira.com.br
[Realidade Aumentada]
07:59cscerqueira.com.br
5. Capturando
informações do
marcador via
openFrameworks.
Entendendo o que é capturado pela câmera
[Marcadores]
Informações possíveis
(x,y,z)
Plano XY
x
y
z
07:59cscerqueira.com.br
07:59cscerqueira.com.br
x
y
-angle+angle
[Marcadores]
Como acessar no código!?!?!?
07:59cscerqueira.com.br
ofVec3f vetorTranslacao;
ofVec3f vetorRotacao;
void ofApp::update(){
vidGrabber.update();
if(vidGrabber.isFrameNew()){
colorImage.setFromPixels(vidGrabber.getPixels(),width,height);
grayImage = colorImage;
artk.update(grayImage.getPixels());
// contas
// só quero o marcador 37!!!!
int myIndex = artk.getMarkerIndex(37); // se encontrou retorna o indice
if(myIndex >= 0 ) {
// vetor translação
vetorTranslacao = artk.getDetectedMarkerCenter(myIndex);
// vetor rotação
vetorRotacao = artk.getOrientationQuaternion(myIndex).getEuler();
} else {
vetorTranslacao = ofPoint(0);
vetorRotacao = ofVec3f(0);
}
}
}
http://mtm.ufsc.br/~ebatista/Escritos_Didaticos_arquivos/bienal_2012.pdf
6. Movimento
autônomo de drone
com RA no loop de
controle.
Fechando a malha
[Controlando Drone]
Teoria de Controle
https://en.wikipedia.org/wiki/Control_theory
07:59cscerqueira.com.br
[Controlando Drone]
Nossa malha
07:59cscerqueira.com.br
Posição
Real
Já
chegamos?
Atua na
direção
Posição
Real
Onde
estamos?
[Controlando Drone]
Onde Estamos?
07:59cscerqueira.com.br
x
y
Onde
estamos?
Posição Atual
Frente Virtual
// ATUALIZAR SENSOR
posicaoAtual = artk.getDetectedMarkerCenter(myIndex);
vector<ofPoint> pontos;
artk.getDetectedMarkerOrderedBorderCorners(myIndex,pontos);
if(pontos.size() == 4){
frenteVirtual = (pontos[3] + pontos[0])/2;
} else {
frenteVirtual.zero();
}
0
1
3
2
[Controlando Drone]
Já chegamos??
07:59cscerqueira.com.br 07:59cscerqueira.com.br
x
y
Ponto
Destino
Distância a
percorrer
Posição Atual
Tolerância
Já
chegamos?
Rotacionar
[Controlando Drone]
Já chegamos??
07:59cscerqueira.com.br
Já
chegamos?
07:59cscerqueira.com.br 07:59cscerqueira.com.br
x
y
Distância a
percorrer
Tolerância
if(alinhado){ // ATUA PARA FRENTE!
if( (posicaoDesejada - posicaoAtual).length() > 20 ) { // já chegamos??
moveFront(255); // não, mas tá alinhado então avante
} else {
stop(0); // AEEEEEEEEEE chegamos
return true;
}
}
[Controlando Drone]
Já chegamos??
07:59cscerqueira.com.br 07:59cscerqueira.com.br 07:59cscerqueira.com.br
x
y
Ponto
Destino
Tolerância
Já
chegamos?
Rotacionar
// testa se está na direção correta
if ( (frenteVirtual - posicaoAtual).isAligned((posicaoDesejada - posicaoAtual),20)){
alinhado = true;
} else
{
........ Continua....
Pensando...
07:59cscerqueira.com.br
perp.x = (posicaoDesejada - posicaoAtual).x;
perp.y = -pow((posicaoDesejada - posicaoAtual).x,2)/(posicaoDesejada - posicaoAtual).y;
if( perp.angle((frenteVirtual - posicaoAtual)) > 90){
cout<< endl << "lado 1";
if( (perp.x > 0 && perp.y > 0) || (perp.x < 0 && perp.y < 0)){
moveRight(255);
} else {
moveLeft(255);
}
} else {
cout << endl << "lado 2";
if( (perp.x > 0 && perp.y > 0) || (perp.x < 0 && perp.y < 0)){
moveLeft(255);
} else {
moveRight(255);
}
}
>90°
Mover para a
esquerda
X < 0
Y > 0
O que aprendemos hoje
▪ As coisas são mais fáceis do que imaginam
▪ Existe um framework em C++ chamado openFrameworks
▪ E ele é fera pois se comunica facilmente com Arduino
▪ Usar o Arduino como uma interface com HW é TOP,
▪ tem uma classe pronta, com todos os métodos
▪ O openFrameworks tem pacotes da comunidade que facilitam a
vida! 
▪ Um deles é para RA – ARToolKitPlus
▪ O rastreio de marcadores permite capturar translações e rotações.
▪ Visão computacional é muito útil, para fechar a malha de controle,
rastrear fim de curso, rastrear posições de acoplagem.
07:59cscerqueira.com.br
Link para download dos códigos dos exemplos
▪http://www.4shared.com/folder/Cb1E5bxa/
WRVA2015.html
07:59cscerqueira.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
07:59cscerqueira.com.br
O INPE (Instituto Nacional de
Pesquisas Espaciais)
07:59cscerqueira.com.br
RV EM SIMULADORES OPERACIONAIS DE
SATÉLITE
RV EM SIMULADORES OPERACIONAIS DE SATÉLITE
07:59cscerqueira.com.br
SIMULADOR DE UM SENSOR DE ESTRELAS
COM RA
SIMULADOR DE UM SENSOR DE ESTRELAS COM
MARCADORES
Geração Automática
de Código Embarcável
m-file
s-file
Comunicação com
MATLAB/Simulink
Modelo do
EPS
Modelos /
Simulador
Circuito
Bateria
*FEE (Front End Equipment) – Estimulador/Sensor
FEE
UTILIZAÇÃO DE ARDUINO EM TESTBENCHS PARA
POTENCIALIZAR O USO DE MDE
CONSTRUÇÃO DE AMBIENTES CONTÍNUOS BASEADOS
EM REALIDADE CRUZADA PARA ANÁLISE DE MISSÃO
Outras Iniciativas:
DESENVOLVIMENTO E APLICAÇÃO DE
RECURSOS DE REALIDADE AUMENTADA
EM VISUALIZAÇÃO DE DADOS DE
MISSÕES ESPACIAIS
RECONSTRUÇÃO GRÁFICA TRIDIMENSIONAL DE
EDIFICAÇÕES URBANAS A PARTIR DE IMAGENS AÉREAS
THE ROLE OF COMPUTATIONAL STEERING IN
SPACE ENGINEERING ACTIVITIES ASSISTED BY
MODELLING AND SIMULATION
Academicamente
▪ 7 Pós-Graduações:
▪ Astrofísica
▪ Engenharia e Tecnologia Espaciais
▪ Mecânica Espacial e Controle
▪ Combustão e Propulsão
▪ Ciência e Tecnologia de Materiais e Sensores
▪ Engenharia e Gerenciamento de Sistemas Espaciais
▪ Geofísica Espacial
▪ Computação Aplicada
▪ Meteorologia
▪ Sensoriamento Remoto
▪ Ciência do Sistema Terrestre
http://www.inpe.br/ci/
07:59cscerqueira.com.br
São José dos Campos - SP
▪ Capital econômica do Vale do Paraíba
▪ EMBRAER, GM, Johnson, Phillips,
Petrobras, Monsanto, Avibras, Mectron
(Odebretch).
▪ ~650k players (ops. Habitantes)
▪ ITA, INPE, IEAv, EAE, IP&D, UNIVAP,
UNIFESP
▪ Capital aeroespacial do país.
07:59cscerqueira.com.br
Dúvidas: christophercerqueira@gmail.com
Site: http://cscerqueira.com.br
Facebook: http://fb.com/RVA.BR
Para dúvidas MUITO maiores:
INPE – SJC
Prédio Satélite
Sala 95
07:59cscerqueira.com.br

WRVA 2015

  • 1.
  • 2.
  • 3.
    Utilização de Realidade Aumentadano loop de controle de um drone M.Sc. Eng. Christopher S. Cerqueira cscerqueira.com.br
  • 4.
  • 5.
  • 6.
  • 7.
    Interação Colaborativa com ArtefatosInteligentes Interação homem-máquina, metáforas, ambientes contínuos e realidade Cruzada #motivação
  • 8.
    [Motivação][Teoria] Metáforas (Spolsky, 2001) Sistema análogo Modelodo programa representa Modelo do Programa Modelo do Usuário Em conformidade Expectativas de como o software deve trabalhar Software sendo executado 07:59cscerqueira.com.br
  • 9.
    [Motivação][Teoria] Limitações de interfacesWIMP (Windows, Icon, Menu, Pointer) Operações explicitas – as interfaces reduzem a carga cognitiva das operações, só que não necessariamente reduzem a quantidade de operações. Desconhecimento do mundo real – as interfaces são projetadas para o ambiente usuário – computador. Lacunas entre o mundo real – as interfaces não conseguem relacionar a modificação de objetos do mundo real. (Rekimoto e Nagao, 1995) Solução?! 07:59cscerqueira.com.br
  • 10.
    [Motivação][Teoria] Interfaces tangíveis “Interfaces tangíveissão interfaces através das quais o usuário interage com uma informação digital via um ambiente físico.” (Ishii, 2008) 07:59cscerqueira.com.br
  • 11.
    [Motivação][Teoria] Estilos de Interfaces(Rekimoto e Nagao (1995)) 07:59cscerqueira.com.br
  • 12.
    [Motivação][Teoria] Intersecção entre tiposde artefatos usados no ambiente (Kirner et al., 2012) 07:59cscerqueira.com.br
  • 13.
    [Motivação][Teoria] Realidade Cruzada =Realidade Aumentada + Artefatos inteligentes “Realidade aumentada e uma interface baseada na combinação de informações geradas computacionalmente (imagens estáticas ou dinâmicas, sons espaciais e sensações hápticas) com o ambiente real do usuário, através de dispositivos tecnológicos e utilizando interação natural no mundo real.” (Kirner 2011) clássico laserTag oasis lego pokemon07:59cscerqueira.com.br
  • 14.
    Realidade Cruzada =Realidade Aumentada + Artefatos inteligentes “Realidade Cruzada é um ambiente de realidade misturada ubíqua formado 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 de realidade aumentada, onde a troca de informação é bidirecional entre os mundos reais e virtuais.” (Kirner 2011) (Kirner et al, 2012) (Curso de Inverno – INPE 2015) 07:59cscerqueira.com.br
  • 15.
    [MOTIVAÇÃO] Aplicações – Internetdas Coisas 07:59cscerqueira.com.br
  • 16.
  • 17.
    [MOTIVAÇÃO] Aplicações - Guerrade robos 07:59cscerqueira.com.br
  • 18.
  • 19.
    [MOTIVAÇÃO] Tendência ▪ Explosão deprodutos interligados ▪ Com software embarcado ▪ Local Awareness ▪ Vide: raspberry PI 2 07:59cscerqueira.com.br
  • 20.
  • 21.
    [MOTIVAÇÃO] Desafio daárea espacial: Docking – Acoplamento autônomo de espaçonaves. ISS Dock 01 ISS Dock 02 Dock for dummies 07:59cscerqueira.com.br
  • 22.
    [ROTEIRO] ▪ Objetivos doevento proposto: Apresentar a utilização do openFrameworks, Realidade Aumentada como ferramenta de engenharia, utilização de Arduino e controle de motor DC. ▪ Conteúdo do evento proposto: 1. openFrameworks 2. Arduino e Firmata 3. Controlando o drone (baseado em Arduino) via Interface em openFrameworks 4. Realidade Aumentada 5. Capturando informações do marcador via openFrameworks. 6. Movimento autônomo de drone com RA no loop de controle. 07:59cscerqueira.com.br
  • 23.
  • 24.
  • 25.
    [openFrameworks] openframeworks.cc ▪ Vídeo oF1....media_videos7_openFrameworks1.mp4 ▪Vídeo oF2....media_videos7_openFrameworks2.mp4 07:59cscerqueira.com.br
  • 26.
    [openFrameworks] oF ▪ Criado paraartistase 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. 07:59cscerqueira.com.br
  • 27.
  • 28.
  • 29.
    [openFrameworks] Página Principal –openframeworks.cc 07:59cscerqueira.com.br
  • 30.
    [openFrameworks] Libs no pacotepadrã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. 07:59cscerqueira.com.br
  • 31.
    [openFrameworks] Addons da comunidade:ofxaddons.com 07:59cscerqueira.com.br
  • 32.
    [openFrameworks] OSX, Linux, Windows, iOS, Android,Linux ARM 07:59cscerqueira.com.br
  • 33.
    ERA TROGLODITA (C++) ▪Graduação (2010): ▪ ARToolKit ▪ PTAMM ▪ Bolsista DTI (2011): ▪ basAR ERA DO FOGO (C++/oF) ▪ Mestrado (2012): ▪ Doutorado (2014): 07:59cscerqueira.com.br
  • 34.
    • 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 07:59cscerqueira.com.br • Construção de interfaces on-demand baseadas em Realidade Aumentada Projetiva para Controle de Hardware (Arduino) Link
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
    Primeiro programa emoF 07:59cscerqueira.com.br
  • 40.
  • 41.
    [openFrameworks] Level Easy: GeradorAutomático 07:59cscerqueira.com.br
  • 42.
  • 43.
  • 44.
    [openFrameworks] Exemplo básico 07:59cscerqueira.com.br // ofApp.cpp voidofApp::setup(){ mensagem = "Hello WRVA2015!!!"; raio = 0; } void ofApp::draw(){ ofEnableAlphaBlending(); ofSetColor(ofColor::blue,128); ofCircle(x_i,y_i,raio); ofSetColor(ofColor::red); ofDrawBitmapString(mensagem,mouseX,mouseY); } // ofApp.cpp void ofApp::mouseDragged(int x, int y, int button){ raio = ofDist(x_i,y_i,x,y); } void ofApp::mousePressed(int x, int y, int button){ x_i = x; y_i = y; } void ofApp::mouseReleased(int x, int y, int button){ raio = ofDist(x_i,y_i,x,y); } // ofApp.h ... string mensagem; int x_i,y_i; float raio; ...
  • 45.
    2. Arduino eFirmata O que é? Onde vivem? Existe? Hoje no Glob..
  • 46.
    O que temno ARDUINO? 07:59cscerqueira.com.br
  • 47.
  • 48.
  • 49.
  • 50.
    [ARDUINO] O que aFIRMATA 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! 07:59cscerqueira.com.br
  • 51.
    Obs.: Mudança danomenclatura dos pinos após Firmata 2.3 (Arduino 1.0) Tomar cuidado na hora de desenvolver!!!!!!!!!! 07:59cscerqueira.com.br
  • 52.
    [ARDUINO] Instalando a Firmatano 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. 07:59cscerqueira.com.br http://arduino.cc/en/reference/firmata
  • 53.
  • 54.
  • 55.
  • 56.
    [ARDUINO] Métodos para conectarcom o ARDUINO  connect()  disconnect()  getAnalog()  getAnalogPinReporting()  getDigital()  getDigitalPinMode()  getPwm()  getString()  isArduinoReady()  isInitialized()  sendAnalogPinReporting()  sendByte()  sendDigital()  sendDigitalPinMode()  sendPwm()  sendReset()  sendString()  setUseDelay()  update() 07:59cscerqueira.com.br
  • 57.
    [ARDUINO] Código no openFrameworks ▪Exploração do exemplo: communicationfirmataExample 07:59cscerqueira.com.br
  • 58.
    [ARDUINO] Fluxograma básico 07:59cscerqueira.com.br SETUP Habilita callback deArduino Alive Arduino Responde Evento Alive Configura ArduinoLoop de execução – sem Arduino Enviar comandos pro Arduino Recebeu um evento Digital Recebeu um evento Analógico Loop de execução – Arduino Update
  • 59.
    [ARDUINO] Código 07:59cscerqueira.com.br //ofApp.h #pragma once #include "ofMain.h" classofApp : 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);
  • 60.
  • 61.
    3. Controlando odrone (baseado em Arduino) via Interface em openFrameworks Vamos controlar o DRONE NA MÃO #FACANACAVEIRA
  • 62.
  • 63.
  • 64.
  • 65.
    [oF+Ard+DC] Controle de MotorDC 07:59cscerqueira.com.br
  • 66.
    [oF+Ard+DC] Ponte H –L293D 07:59cscerqueira.com.br
  • 67.
    [oF+Ard+DC] Drone 2D 07:59cscerqueira.com.br 1 -AEN = HIGH 2 - A1 = HIGH 7 - A2 = LOW 9 - BEN = HIGH 10 - B1 = HIGH 15 - B2 = LOW 1 - AEN = HIGH 2 - A1 = LOW 7 - A2 = HIGH 9 - BEN = HIGH 10 - B1 = LOW 15 - B2 = HIGH 1 - AEN = HIGH 2 - A1 = HIGH 7 - A2 = LOW 9 - BEN = HIGH 10 - B1 = LOW 15 - B2 = HIGH 1 - AEN = HIGH 2 - A1 = LOW 7 - A2 = HIGH 9 - BEN = HIGH 10 - B1 = HIGH 15 - B2 = LOW Pinos do L293D
  • 68.
    [oF+Ard+DC] Drone 2D FUNC ARDLM RODA1 ENABLE D09 1 RODA1 DIR_A D08 2 RODA1 DIR_B D07 7 RODA2 ENABLE D10 9 RODA2 DIR_A D12 10 RODA2 DIR_B D11 15 07:59cscerqueira.com.br
  • 69.
  • 70.
    [oF+Ard+DC] Código 07:59cscerqueira.com.br void ofApp::keyPressed(int key){ if(bSetupArduino){ ard.sendDigital(13, ARD_HIGH); switch (key) { case OF_KEY_RIGHT: this->moveRight(255); break; case OF_KEY_LEFT: this->moveLeft(255); break; case OF_KEY_UP: this->moveFront(255); break; case OF_KEY_DOWN: this->moveBack(255); break; default: break; } } } void ofApp::keyReleased(int key){ if (bSetupArduino){ ard.sendDigital(13, ARD_LOW); this->stop(0); } } void ofApp::setupArduino(const int & version){ ... // WHEEL ONE ard.sendDigitalPinMode(8, ARD_OUTPUT); // 1A ard.sendDigitalPinMode(7, ARD_OUTPUT); // 2A ard.sendDigitalPinMode(9, ARD_PWM); // 1,2 EN // WHEEL TWO ard.sendDigitalPinMode(12, ARD_OUTPUT); // 1A ard.sendDigitalPinMode(11, ARD_OUTPUT); // 2A ard.sendDigitalPinMode(10, ARD_PWM); // 1,2 EN // SIGNAL ard.sendDigitalPinMode(13, ARD_OUTPUT); } void ofApp::stop(int value){ ard.sendPwm(9,(int) 0); // stop wheel one ard.sendPwm(10,(int) 0);// stop wheel two } void ofApp::moveBack(int value){ if(value>255 || value<0) return; ard.sendPwm(9, value); // full wheel one ard.sendDigital(8, ARD_HIGH); ard.sendDigital(7, ARD_LOW); ard.sendPwm(10, value);// full wheel two ard.sendDigital(11, ARD_HIGH); ard.sendDigital(12, ARD_LOW); } void ofApp::moveRight(int value){ if(value>255 || value<0) return; ard.sendPwm(9,value); // full wheel one ard.sendDigital(8, ARD_HIGH); ard.sendDigital(7, ARD_LOW); ard.sendPwm(10,value);// full wheel two ard.sendDigital(11, ARD_LOW); ard.sendDigital(12, ARD_HIGH); }
  • 71.
  • 72.
    [Realidade Aumentada] Frameworks Marcador ▪ARToolKit (C)– 90´s ▪ NYARToolKit (Java, C#, C++, Android) ▪ AndAR (Android) ▪ FLARToolKit (AS3) Sem marcador ▪ OpenCV - Multiplataforma ▪ PTAMM (C++) ▪ Vuforia ▪ Project Tango SDK ▪ NGHIA’S AUGMENTED REALITY 07:59cscerqueira.com.br
  • 73.
    [Realidade Aumentada] Ferramentas deAutoria basAR FLARAS 07:59cscerqueira.com.br
  • 74.
    [Realidade Aumentada] Marcadores ARToolKit ▪ HITLab ▪Compara templates. ▪ Template marker detection ▪ Mais lento ▪ Inviável em SW embarcado. ARToolKitPlus ▪ Graz University of Technology ▪ Compara códigos ▪ ID-Encoded marker detection ▪ Mol^k vezes mais rápido ▪ Bom para SW embarcado. 07:59cscerqueira.com.br
  • 75.
  • 76.
  • 77.
    [Realidade Aumentada] Voltando aomundo real ▪ openFrameworks + ARToolKitPlus. ▪ Add-on ofxARToolKitPlus. ▪ Descompactá-lo e salvar dentro de <of>/addons ▪ Renomear, retirando o sufixo -master 07:59cscerqueira.com.br
  • 78.
    [Realidade Aumentada] Add-ons ▪ Utilizaro gerador automático e gerar com os seguintes add- ons: ▪ ofxARToolKitPlus *Necessário compilar antes para o c++ que vai usar ▪ ofxOpenCv (necessário para o ofxARToolKitPlus) ▪ ofxAssimpModelLoader http://touch-base-br.blogspot.com.br/2014/09/openframeworks-083- ofxartoolkitplus.html 07:59cscerqueira.com.br
  • 79.
    [Realidade Aumentada] Ajustando oprojeto - caminhos 1. Configuration Properties  Linker GeneralAdditional Library Directories e inclua o caminho para a biblioteca, no caso: ......addonsofxARtoolkitPluslibsARToolKitPluslibwin32 07:59cscerqueira.com.br
  • 80.
    [Realidade Aumentada] Ajustando oprojeto - lib 1. Configuration Properties  Linker Input  Additional Dependencies incluir a lib: ARToolKitPlus.lib 07:59cscerqueira.com.br
  • 81.
    [Realidade Aumentada] Lets code... //testApp.cpp #pragma once #include "ofMain.h" #include "ofxOpenCv.h" //Cabeçalho do OpenCV #include "ofxARToolkitPlus.h" //Cabeçalho do ARToolKitPlus class testApp : 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 int threshold; // Threshold da relação preto/branco ofxCvColorImage colorImage; //imagem capturada pela câmera ofxCvGrayscaleImage grayImage; //imagem em tons de cinza (mais rápida) ofxCvGrayscaleImage grayThres;//imagem com threshold antes de ir pro artk }; 07:59cscerqueira.com.br
  • 82.
    [Realidade Aumentada] Configurando –testApp::setup() //-------------------------------------------------------------- void testApp::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 grayThres.allocate(width, height); // reserva imagem ajustada artk.setup(width, height); // inicia o ARToolKitPlus threshold = 85; // threshold para a imagem ajustada artk.setThreshold(threshold); // informa ao ARToolKitPlus que o ajuste é externo } 07:59cscerqueira.com.br
  • 83.
    [Realidade Aumentada] Rastreio -testApp::update() //-------------------------------------------------------------- void testApp::update(){ vidGrabber.grabFrame(); // 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 //Como queremos testar o threshold temos que gerar essa imagem grayThres = grayImage; grayThres.threshold(threshold); //Passa para o ARToolKitPlus a imagem monocromática artk.update(grayImage.getPixels()); } } 07:59cscerqueira.com.br
  • 84.
    [Realidade Aumentada] Exibindo -testApp::draw() – p1 //-------------------------------------------------------------- void testApp::draw(){ ofSetColor(ofColor::white); // inicia a cor dos objetos como branca colorImage.draw(0, 0); // exibe a imagem capturada colorida grayThres.draw(640, 0); // exibe a imagem adaptada artk.draw(640, 0); // Esta função exibe a posição e etiqueta o marcador // ARTK 3D artk.applyProjectionMatrix();// aplicar a matriz de projeção da camera int numDetected = artk.getNumDetectedMarkers(); //detectar os marcadores ofEnableAlphaBlending(); //habilitar a transparência 07:59cscerqueira.com.br
  • 85.
    [Realidade Aumentada] 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); } } } 07:59cscerqueira.com.br
  • 86.
    [Realidade Aumentada] Alterando othreshold - testApp::keyPressed(int key) //-------------------------------------------------------------- void testApp::keyPressed(int key){ if(key == OF_KEY_UP) { artk.setThreshold(++threshold); // aumenta o valor do threshold } else if(key == OF_KEY_DOWN) { artk.setThreshold(--threshold); // diminui o valor do threshold } else if(key == 's') { vidGrabber.videoSettings(); // chama a configuração da câmera } } 07:59cscerqueira.com.br
  • 87.
  • 88.
    [Realidade Aumentada] Adicionando conteúdo ▪Adicionar o modelo via ofxAssimpModelLoader ▪ Reutilizar o modelo do exemplo anterior. 07:59cscerqueira.com.br
  • 89.
    [Realidade Aumentada] Só adicionaro Assimp #pragma once #include "ofMain.h" #include "ofxOpenCv.h" #include "ofxARToolkitPlus.h" #include "ofxAssimpModelLoader.h" class testApp : public ofBaseApp{ ... ofxCvGrayscaleImage grayThres; ofxAssimpModelLoader model; }; 07:59cscerqueira.com.br
  • 90.
    [Realidade Aumentada] Setup eDraw... //-------------------------------------------------------------- void testApp::setup(){ ... if( !model.loadModel("astroBoy_walk.dae", false) ) // Abre o arquivo ofSystemAlertDialog("Erro em carregar arquivo"); } 07:59cscerqueira.com.br
  • 91.
    [Realidade Aumentada] //-------------------------------------------------------------- void testApp::draw(){ //ARTK 3D ... for(int i=0; i<numDetected; i++) { // marcadores encontrados ... //Local onde colocar o conteúdo 3D do marcador //pilha de retângulos. // Modelo 3D ofSetColor(255); // Configura a cor do objeto ofPushMatrix(); // Abre o contexto glEnable(GL_DEPTH_TEST); // habilita profundidade ofScale(0.1,0.1,0.1); // ajusta escala ofRotateX(-90); // rotaciona 90 graus model.drawFaces(); / desenha as faces glDisable(GL_DEPTH_TEST); // desabilita profundidade ofPopMatrix(); // fecha o contexto } } 07:59cscerqueira.com.br
  • 92.
  • 93.
    5. Capturando informações do marcadorvia openFrameworks. Entendendo o que é capturado pela câmera
  • 94.
  • 95.
  • 96.
    [Marcadores] Como acessar nocódigo!?!?!? 07:59cscerqueira.com.br ofVec3f vetorTranslacao; ofVec3f vetorRotacao; void ofApp::update(){ vidGrabber.update(); if(vidGrabber.isFrameNew()){ colorImage.setFromPixels(vidGrabber.getPixels(),width,height); grayImage = colorImage; artk.update(grayImage.getPixels()); // contas // só quero o marcador 37!!!! int myIndex = artk.getMarkerIndex(37); // se encontrou retorna o indice if(myIndex >= 0 ) { // vetor translação vetorTranslacao = artk.getDetectedMarkerCenter(myIndex); // vetor rotação vetorRotacao = artk.getOrientationQuaternion(myIndex).getEuler(); } else { vetorTranslacao = ofPoint(0); vetorRotacao = ofVec3f(0); } } } http://mtm.ufsc.br/~ebatista/Escritos_Didaticos_arquivos/bienal_2012.pdf
  • 97.
    6. Movimento autônomo dedrone com RA no loop de controle. Fechando a malha
  • 98.
    [Controlando Drone] Teoria deControle https://en.wikipedia.org/wiki/Control_theory 07:59cscerqueira.com.br
  • 99.
  • 100.
    [Controlando Drone] Onde Estamos? 07:59cscerqueira.com.br x y Onde estamos? PosiçãoAtual Frente Virtual // ATUALIZAR SENSOR posicaoAtual = artk.getDetectedMarkerCenter(myIndex); vector<ofPoint> pontos; artk.getDetectedMarkerOrderedBorderCorners(myIndex,pontos); if(pontos.size() == 4){ frenteVirtual = (pontos[3] + pontos[0])/2; } else { frenteVirtual.zero(); } 0 1 3 2
  • 101.
    [Controlando Drone] Já chegamos?? 07:59cscerqueira.com.br07:59cscerqueira.com.br x y Ponto Destino Distância a percorrer Posição Atual Tolerância Já chegamos? Rotacionar
  • 102.
    [Controlando Drone] Já chegamos?? 07:59cscerqueira.com.br Já chegamos? 07:59cscerqueira.com.br07:59cscerqueira.com.br x y Distância a percorrer Tolerância if(alinhado){ // ATUA PARA FRENTE! if( (posicaoDesejada - posicaoAtual).length() > 20 ) { // já chegamos?? moveFront(255); // não, mas tá alinhado então avante } else { stop(0); // AEEEEEEEEEE chegamos return true; } }
  • 103.
    [Controlando Drone] Já chegamos?? 07:59cscerqueira.com.br07:59cscerqueira.com.br 07:59cscerqueira.com.br x y Ponto Destino Tolerância Já chegamos? Rotacionar // testa se está na direção correta if ( (frenteVirtual - posicaoAtual).isAligned((posicaoDesejada - posicaoAtual),20)){ alinhado = true; } else { ........ Continua....
  • 104.
    Pensando... 07:59cscerqueira.com.br perp.x = (posicaoDesejada- posicaoAtual).x; perp.y = -pow((posicaoDesejada - posicaoAtual).x,2)/(posicaoDesejada - posicaoAtual).y; if( perp.angle((frenteVirtual - posicaoAtual)) > 90){ cout<< endl << "lado 1"; if( (perp.x > 0 && perp.y > 0) || (perp.x < 0 && perp.y < 0)){ moveRight(255); } else { moveLeft(255); } } else { cout << endl << "lado 2"; if( (perp.x > 0 && perp.y > 0) || (perp.x < 0 && perp.y < 0)){ moveLeft(255); } else { moveRight(255); } } >90° Mover para a esquerda X < 0 Y > 0
  • 105.
  • 106.
    ▪ As coisassão mais fáceis do que imaginam ▪ Existe um framework em C++ chamado openFrameworks ▪ E ele é fera pois se comunica facilmente com Arduino ▪ Usar o Arduino como uma interface com HW é TOP, ▪ tem uma classe pronta, com todos os métodos ▪ O openFrameworks tem pacotes da comunidade que facilitam a vida!  ▪ Um deles é para RA – ARToolKitPlus ▪ O rastreio de marcadores permite capturar translações e rotações. ▪ Visão computacional é muito útil, para fechar a malha de controle, rastrear fim de curso, rastrear posições de acoplagem. 07:59cscerqueira.com.br
  • 107.
    Link para downloaddos códigos dos exemplos ▪http://www.4shared.com/folder/Cb1E5bxa/ WRVA2015.html 07:59cscerqueira.com.br
  • 109.
    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 07:59cscerqueira.com.br
  • 110.
    O INPE (InstitutoNacional de Pesquisas Espaciais) 07:59cscerqueira.com.br
  • 111.
    RV EM SIMULADORESOPERACIONAIS DE SATÉLITE RV EM SIMULADORES OPERACIONAIS DE SATÉLITE 07:59cscerqueira.com.br
  • 112.
    SIMULADOR DE UMSENSOR DE ESTRELAS COM RA SIMULADOR DE UM SENSOR DE ESTRELAS COM MARCADORES
  • 113.
    Geração Automática de CódigoEmbarcável m-file s-file Comunicação com MATLAB/Simulink Modelo do EPS Modelos / Simulador Circuito Bateria *FEE (Front End Equipment) – Estimulador/Sensor FEE UTILIZAÇÃO DE ARDUINO EM TESTBENCHS PARA POTENCIALIZAR O USO DE MDE
  • 114.
    CONSTRUÇÃO DE AMBIENTESCONTÍNUOS BASEADOS EM REALIDADE CRUZADA PARA ANÁLISE DE MISSÃO
  • 115.
    Outras Iniciativas: DESENVOLVIMENTO EAPLICAÇÃO DE RECURSOS DE REALIDADE AUMENTADA EM VISUALIZAÇÃO DE DADOS DE MISSÕES ESPACIAIS RECONSTRUÇÃO GRÁFICA TRIDIMENSIONAL DE EDIFICAÇÕES URBANAS A PARTIR DE IMAGENS AÉREAS THE ROLE OF COMPUTATIONAL STEERING IN SPACE ENGINEERING ACTIVITIES ASSISTED BY MODELLING AND SIMULATION
  • 116.
    Academicamente ▪ 7 Pós-Graduações: ▪Astrofísica ▪ Engenharia e Tecnologia Espaciais ▪ Mecânica Espacial e Controle ▪ Combustão e Propulsão ▪ Ciência e Tecnologia de Materiais e Sensores ▪ Engenharia e Gerenciamento de Sistemas Espaciais ▪ Geofísica Espacial ▪ Computação Aplicada ▪ Meteorologia ▪ Sensoriamento Remoto ▪ Ciência do Sistema Terrestre http://www.inpe.br/ci/ 07:59cscerqueira.com.br
  • 117.
    São José dosCampos - SP ▪ Capital econômica do Vale do Paraíba ▪ EMBRAER, GM, Johnson, Phillips, Petrobras, Monsanto, Avibras, Mectron (Odebretch). ▪ ~650k players (ops. Habitantes) ▪ ITA, INPE, IEAv, EAE, IP&D, UNIVAP, UNIFESP ▪ Capital aeroespacial do país. 07:59cscerqueira.com.br
  • 118.
    Dúvidas: christophercerqueira@gmail.com Site: http://cscerqueira.com.br Facebook:http://fb.com/RVA.BR Para dúvidas MUITO maiores: INPE – SJC Prédio Satélite Sala 95 07:59cscerqueira.com.br