WRVA 2015
-
Upload
christopher-cerqueira -
Category
Education
-
view
975 -
download
1
Transcript of WRVA 2015
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. 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
1. openFrameworks
07:59cscerqueira.com.br
Processing
Adobe Flash
Unity
Cinder
openFrameworks
07:59cscerqueira.com.br
[openFrameworks]openframeworks.cc
▪ Vídeo oF1..\..\media_videos\7_openFrameworks1.mp4
▪ Vídeo oF2..\..\media_videos\7_openFrameworks2.mp4
07:59cscerqueira.com.br
[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
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
:59
csce
rqu
eir
a.c
om
.br
[openFrameworks] Onde encontrar?
07:59cscerqueira.com.br
[openFrameworks] Level Easy: Gerador Automático
07:59cscerqueira.com.br
[openFrameworks] Escolhendo expansões
Do c
ore
oF
Da c
om
unid
ade
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: communicationfirmataExample
07:59cscerqueira.com.br
[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
[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 openFrameworksVamos 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 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);
}
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 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
[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 GeneralAdditionalLibrary Directories e inclua o caminho para a biblioteca, no caso:
..\..\..\addons\ofxARtoolkitPlus\libs\ARToolKitPlus\lib\win32
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 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
6. Movimento autônomo de dronecom 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 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
[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 chegamosreturn true;}
}
[Controlando Drone]Já chegamos??
07:59cscerqueira.com.br 07:59cscerqueira.com.br 07:59cscerqueira.com.br
x
y
Ponto
DestinoTolerância
Já
chegamos?
Rotacionar
// testa se está na direção corretaif ( (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 < 0Y > 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: [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
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 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
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: [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