WRVA 2015

118
07:59 cscerqueira.com.br

Transcript of WRVA 2015

Page 1: WRVA 2015

07:59cscerqueira.com.br

Page 2: WRVA 2015

07:59cscerqueira.com.br

Page 3: WRVA 2015

Utilização de Realidade Aumentada no loop de controle de um drone

M.Sc. Eng. Christopher S. Cerqueira

cscerqueira.com.br

Page 4: WRVA 2015

07:59cscerqueira.com.br

O que vamos

aprender hoje

fazer???

Page 5: WRVA 2015

07:59cscerqueira.com.br

PONTO DE VISTA DA

CÂMERA

Page 6: WRVA 2015

07:59cscerqueira.com.br

Page 7: WRVA 2015

Interação Colaborativa com Artefatos Inteligentes

Interação homem-máquina, metáforas, ambientes contínuos e realidade Cruzada

#motivação

Page 8: WRVA 2015

[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

Page 9: WRVA 2015

[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

Page 10: WRVA 2015

[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

Page 11: WRVA 2015

[Motivação][Teoria] Estilos de Interfaces (Rekimoto e Nagao (1995))

07:59cscerqueira.com.br

Page 12: WRVA 2015

[Motivação][Teoria] Intersecção entre tipos de artefatos usados no ambiente (Kirner et al., 2012)

07:59cscerqueira.com.br

Page 13: WRVA 2015

[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

Page 14: WRVA 2015

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

Page 15: WRVA 2015

[MOTIVAÇÃO]Aplicações – Internet das Coisas

07:59cscerqueira.com.br

Page 16: WRVA 2015

[MOTIVAÇÃO]Aplicações - Educacionais

07:59cscerqueira.com.br

Page 17: WRVA 2015

[MOTIVAÇÃO]Aplicações - Guerra de robos

07:59cscerqueira.com.br

Page 19: WRVA 2015

[MOTIVAÇÃO] Tendência

▪ Explosão de produtos interligados

▪ Com software embarcado

▪ Local Awareness

▪ Vide: raspberry PI 2

07:59cscerqueira.com.br

Page 20: WRVA 2015

[MOTIVAÇÃO]Prototipagem / Aprendizado

07:59cscerqueira.com.br

Page 21: WRVA 2015

[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

Page 22: WRVA 2015

[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. openFrameworks2. Arduino e Firmata3. Controlando o drone (baseado em Arduino) via Interface em openFrameworks4. Realidade Aumentada5. Capturando informações do marcador via openFrameworks.6. Movimento autônomo de drone com RA no loop de controle.

07:59cscerqueira.com.br

Page 23: WRVA 2015

1. openFrameworks

07:59cscerqueira.com.br

Page 24: WRVA 2015

Processing

Adobe Flash

Unity

Cinder

openFrameworks

07:59cscerqueira.com.br

Page 25: WRVA 2015

[openFrameworks]openframeworks.cc

▪ Vídeo oF1..\..\media_videos\7_openFrameworks1.mp4

▪ Vídeo oF2..\..\media_videos\7_openFrameworks2.mp4

07:59cscerqueira.com.br

Page 26: WRVA 2015

[openFrameworks] 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)

▪ 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

Page 27: WRVA 2015

07:59cscerqueira.com.br

Page 28: WRVA 2015

[openFrameworks] C++ Portável!!!!

07:59cscerqueira.com.br

Page 29: WRVA 2015

[openFrameworks] Página Principal – openframeworks.cc

07:59cscerqueira.com.br

Page 30: WRVA 2015

[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

Page 31: WRVA 2015

[openFrameworks] Addons da comunidade: ofxaddons.com

07:59cscerqueira.com.br

Page 32: WRVA 2015

[openFrameworks]

OSX, Linux, Windows, iOS, Android, Linux ARM

07:59cscerqueira.com.br

Page 33: WRVA 2015

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

Page 34: WRVA 2015

• 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

Page 35: WRVA 2015

[openFrameworks] SVR2013 - Resultados

07:59cscerqueira.com.br

Page 36: WRVA 2015

[openFrameworks] SVR2014 - Resultados

07:59cscerqueira.com.br

Page 37: WRVA 2015

[openFrameworks] WRVA2014 - Resultados

07:59cscerqueira.com.br

Page 38: WRVA 2015

[openFrameworks] SVR2015 - Resultados

07:59cscerqueira.com.br

Page 39: WRVA 2015

Primeiro programa em oF

07

:59

csce

rqu

eir

a.c

om

.br

Page 40: WRVA 2015

[openFrameworks] Onde encontrar?

07:59cscerqueira.com.br

Page 41: WRVA 2015

[openFrameworks] Level Easy: Gerador Automático

07:59cscerqueira.com.br

Page 42: WRVA 2015

[openFrameworks] Escolhendo expansões

Do c

ore

oF

Da c

om

unid

ade

07:59cscerqueira.com.br

Page 43: WRVA 2015

[openFrameworks] Estrutura do projeto

07:59cscerqueira.com.br

Page 44: WRVA 2015

[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;

...

Page 45: WRVA 2015

2. Arduino e Firmata

O que é? Onde vivem?Existe? Hoje no Glob..

Page 46: WRVA 2015

O que tem no ARDUINO?

07:59cscerqueira.com.br

Page 47: WRVA 2015

[ARDUINO]Outras versões

07:59cscerqueira.com.br

Page 48: WRVA 2015

[ARDUINO] Shields

07:59cscerqueira.com.br

Page 49: WRVA 2015

[ARDUINO] FIRMATA

Literatura indica FIRMATA:

http://firmata.org/wiki/Download

07:59cscerqueira.com.br

Page 50: WRVA 2015

[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

Page 51: WRVA 2015

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

Page 52: WRVA 2015

[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

Page 53: WRVA 2015

[ARDUINO]“esquemático”

07:59cscerqueira.com.br

▪ #crashcourse fritzing

▪ http://fritzing.org/home/

Page 54: WRVA 2015

[ARDUINO]“simulador”

▪ https://123d.circuits.io

07:59cscerqueira.com.br

Page 55: WRVA 2015

[ARDUINO] Arduino e openFrameworks

07:59cscerqueira.com.br

Page 56: WRVA 2015

[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

Page 57: WRVA 2015

[ARDUINO] Código no openFrameworks

▪ Exploração do exemplo: communicationfirmataExample

07:59cscerqueira.com.br

Page 58: WRVA 2015

[ARDUINO] Fluxograma básico

07:59cscerqueira.com.br

SETUPHabilita 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

Page 59: WRVA 2015

[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);

Page 60: WRVA 2015

07:59cscerqueira.com.br

Page 61: WRVA 2015

3. Controlando o drone(baseado em Arduino) via Interface em openFrameworksVamos controlar o DRONE NA MÃO #FACANACAVEIRA

Page 62: WRVA 2015

[oF+Ard+DC] $$

Page 63: WRVA 2015

[oF+Ard+DC] $$

07:59cscerqueira.com.br

Page 64: WRVA 2015

[oF+Ard+DC] $$

07:59cscerqueira.com.br

Page 65: WRVA 2015

[oF+Ard+DC]Controle de Motor DC

07:59cscerqueira.com.br

Page 66: WRVA 2015

[oF+Ard+DC] Ponte H – L293D

07:59cscerqueira.com.br

Page 67: WRVA 2015

[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

Page 68: WRVA 2015

[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

Page 69: WRVA 2015

[oF+Ard+DC]Drone 2D

07:59cscerqueira.com.br

Page 70: WRVA 2015

[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 ONEard.sendDigitalPinMode(8, ARD_OUTPUT); // 1Aard.sendDigitalPinMode(7, ARD_OUTPUT); // 2A ard.sendDigitalPinMode(9, ARD_PWM); // 1,2 EN

// WHEEL TWOard.sendDigitalPinMode(12, ARD_OUTPUT); // 1Aard.sendDigitalPinMode(11, ARD_OUTPUT); // 2A ard.sendDigitalPinMode(10, ARD_PWM); // 1,2 EN

// SIGNALard.sendDigitalPinMode(13, ARD_OUTPUT);

}

void ofApp::stop(int value){

ard.sendPwm(9,(int) 0); // stop wheel oneard.sendPwm(10,(int) 0);// stop wheel two}

void ofApp::moveBack(int value){ if(value>255 || value<0) return;

ard.sendPwm(9, value); // full wheel oneard.sendDigital(8, ARD_HIGH);ard.sendDigital(7, ARD_LOW);

ard.sendPwm(10, value);// full wheel twoard.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 oneard.sendDigital(8, ARD_HIGH);ard.sendDigital(7, ARD_LOW);

ard.sendPwm(10,value);// full wheel twoard.sendDigital(11, ARD_LOW);ard.sendDigital(12, ARD_HIGH);

}

Page 71: WRVA 2015

4. Realidade Aumentada

Page 72: WRVA 2015

[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

Page 73: WRVA 2015

[Realidade Aumentada] Ferramentas de Autoria

basAR FLARAS

07:59cscerqueira.com.br

Page 74: WRVA 2015

[Realidade Aumentada] Marcadores

ARToolKit

▪ HITLab

▪ Compara templates.

▪ Template markerdetection

▪ Mais lento

▪ Inviável em SW embarcado.

ARToolKitPlus

▪ Graz University ofTechnology

▪ Compara códigos

▪ ID-Encoded markerdetection

▪ Mol^k vezes mais rápido

▪ Bom para SW embarcado.

07:59cscerqueira.com.br

Page 75: WRVA 2015

[Realidade Aumentada] ARToolKit

07:59cscerqueira.com.br

Page 76: WRVA 2015

[Realidade Aumentada] ARToolKitPlus

07:59cscerqueira.com.br

Page 77: WRVA 2015

[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

Page 78: WRVA 2015

[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

Page 79: WRVA 2015

[Realidade Aumentada] Ajustando o projeto - caminhos

1. Configuration Properties Linker GeneralAdditionalLibrary Directories e inclua o caminho para a biblioteca, no caso:

..\..\..\addons\ofxARtoolkitPlus\libs\ARToolKitPlus\lib\win32

07:59cscerqueira.com.br

Page 80: WRVA 2015

[Realidade Aumentada] Ajustando o projeto - lib

1. Configuration Properties Linker Input Additional Dependencies

incluir a lib:

ARToolKitPlus.lib

07:59cscerqueira.com.br

Page 81: WRVA 2015

[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

Page 82: WRVA 2015

[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

Page 83: WRVA 2015

[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

Page 84: WRVA 2015

[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

Page 85: WRVA 2015

[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

Page 86: WRVA 2015

[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

Page 87: WRVA 2015

[Realidade Aumentada] Resultado esperado

07:59cscerqueira.com.br

Page 88: WRVA 2015

[Realidade Aumentada] Adicionando conteúdo

▪ Adicionar o modelo via ofxAssimpModelLoader

▪ Reutilizar o modelo do exemplo anterior.

07:59cscerqueira.com.br

Page 89: WRVA 2015

[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

Page 90: WRVA 2015

[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

Page 91: WRVA 2015

[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

Page 92: WRVA 2015

[Realidade Aumentada]

07:59cscerqueira.com.br

Page 93: WRVA 2015

5. Capturando informações do marcador via openFrameworks.Entendendo o que é capturado pela câmera

Page 94: WRVA 2015

[Marcadores]Informações possíveis

(x,y,z)

Plano XY

x

y

z

07:59cscerqueira.com.br

Page 95: WRVA 2015

07:59cscerqueira.com.br

x

y

-angle+angle

Page 96: WRVA 2015

[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 indiceif(myIndex >= 0 ) {// vetor translaçãovetorTranslacao = artk.getDetectedMarkerCenter(myIndex); // vetor rotaçãovetorRotacao = artk.getOrientationQuaternion(myIndex).getEuler();

} else {vetorTranslacao = ofPoint(0);vetorRotacao = ofVec3f(0);

}}

}

http://mtm.ufsc.br/~ebatista/Escritos_Didaticos_arquivos/bienal_2012.pdf

Page 97: WRVA 2015

6. Movimento autônomo de dronecom RA no loop de controle.Fechando a malha

Page 98: WRVA 2015

[Controlando Drone]Teoria de Controle

https://en.wikipedia.org/wiki/Control_theory

07:59cscerqueira.com.br

Page 99: WRVA 2015

[Controlando Drone]Nossa malha

07:59cscerqueira.com.br

Posição

Real

chegamos?

Atua na

direção

Posição

Real

Onde

estamos?

Page 100: WRVA 2015

[Controlando Drone]Onde Estamos?

07:59cscerqueira.com.br

x

y

Onde

estamos?

Posição Atual

Frente Virtual

// ATUALIZAR SENSORposicaoAtual = artk.getDetectedMarkerCenter(myIndex);

vector<ofPoint> pontos;artk.getDetectedMarkerOrderedBorderCorners(myIndex,pontos);if(pontos.size() == 4){frenteVirtual = (pontos[3] + pontos[0])/2;

} else {frenteVirtual.zero();

}

0

13

2

Page 101: WRVA 2015

[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

chegamos?

Rotacionar

Page 102: WRVA 2015

[Controlando Drone]Já chegamos??

07:59cscerqueira.com.br

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 chegamosreturn true;}

}

Page 103: WRVA 2015

[Controlando Drone]Já chegamos??

07:59cscerqueira.com.br 07:59cscerqueira.com.br 07:59cscerqueira.com.br

x

y

Ponto

DestinoTolerância

chegamos?

Rotacionar

// testa se está na direção corretaif ( (frenteVirtual - posicaoAtual).isAligned((posicaoDesejada - posicaoAtual),20)){

alinhado = true;} else{........ Continua....

Page 104: WRVA 2015

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 < 0Y > 0

Page 105: WRVA 2015

O que aprendemos hoje

Page 106: WRVA 2015

▪ 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

Page 107: WRVA 2015

Link para download dos códigos dos exemplos

▪http://www.4shared.com/folder/Cb1E5bxa/WRVA2015.html

07:59cscerqueira.com.br

Page 108: WRVA 2015
Page 109: WRVA 2015

Dúvidas: [email protected]: http://cscerqueira.com.br

Facebook: http://fb.com/RVA.BR

Para maiores dúvidas:INPE – SJC

Prédio SatéliteSala 95

07:59cscerqueira.com.br

Page 110: WRVA 2015

O INPE (Instituto Nacional de Pesquisas Espaciais)

07:59cscerqueira.com.br

Page 111: WRVA 2015

RV EM SIMULADORES OPERACIONAIS DE

SATÉLITE

RV EM SIMULADORES OPERACIONAIS DE SATÉLITE

07:59cscerqueira.com.br

Page 112: WRVA 2015

SIMULADOR DE UM SENSOR DE ESTRELAS

COM RA

SIMULADOR DE UM SENSOR DE ESTRELAS COM

MARCADORES

Page 113: WRVA 2015

Geração Automática de Código Embarcável

m-file

s-file

Comunicação comMATLAB/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

Page 114: WRVA 2015

CONSTRUÇÃO DE AMBIENTES CONTÍNUOS BASEADOS

EM REALIDADE CRUZADA PARA ANÁLISE DE MISSÃO

Page 115: WRVA 2015

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

Page 116: WRVA 2015

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

Page 117: WRVA 2015

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

Page 118: WRVA 2015

Dúvidas: [email protected]: http://cscerqueira.com.br

Facebook: http://fb.com/RVA.BR

Para dúvidas MUITO maiores:INPE – SJC

Prédio SatéliteSala 95

07:59cscerqueira.com.br