WRVA 2015

702 visualizações

Publicada em

Apresentação WRVA

Publicada em: Educação
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
702
No SlideShare
0
A partir de incorporações
0
Número de incorporações
8
Ações
Compartilhamentos
0
Downloads
1
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

WRVA 2015

  1. 1. 07:59cscerqueira.com.br
  2. 2. 07:59cscerqueira.com.br
  3. 3. Utilização de Realidade Aumentada no loop de controle de um drone M.Sc. Eng. Christopher S. Cerqueira cscerqueira.com.br
  4. 4. 07:59cscerqueira.com.br O que vamos aprender hoje fazer???
  5. 5. 07:59cscerqueira.com.br PONTO DE VISTA DA CÂMERA
  6. 6. 07:59cscerqueira.com.br
  7. 7. Interação Colaborativa com Artefatos Inteligentes Interação homem-máquina, metáforas, ambientes contínuos e realidade Cruzada #motivação
  8. 8. [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
  9. 9. [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
  10. 10. [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
  11. 11. [Motivação][Teoria] Estilos de Interfaces (Rekimoto e Nagao (1995)) 07:59cscerqueira.com.br
  12. 12. [Motivação][Teoria] Intersecção entre tipos de artefatos usados no ambiente (Kirner et al., 2012) 07:59cscerqueira.com.br
  13. 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. 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. 15. [MOTIVAÇÃO] Aplicações – Internet das Coisas 07:59cscerqueira.com.br
  16. 16. [MOTIVAÇÃO] Aplicações - Educacionais 07:59cscerqueira.com.br
  17. 17. [MOTIVAÇÃO] Aplicações - Guerra de robos 07:59cscerqueira.com.br
  18. 18. [MOTIVAÇÃO] Tendência - Wearables 07:59cscerqueira.com.br
  19. 19. [MOTIVAÇÃO] Tendência ▪ Explosão de produtos interligados ▪ Com software embarcado ▪ Local Awareness ▪ Vide: raspberry PI 2 07:59cscerqueira.com.br
  20. 20. [MOTIVAÇÃO] Prototipagem / Aprendizado 07:59cscerqueira.com.br
  21. 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. 22. [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
  23. 23. 1. openFrameworks 07:59cscerqueira.com.br
  24. 24. Processing Adobe Flash Unity Cinder openFrameworks 07:59cscerqueira.com.br
  25. 25. [openFrameworks] openframeworks.cc ▪ Vídeo oF1....media_videos7_openFrameworks1.mp4 ▪ Vídeo oF2....media_videos7_openFrameworks2.mp4 07:59cscerqueira.com.br
  26. 26. [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
  27. 27. 07:59cscerqueira.com.br
  28. 28. [openFrameworks] C++ Portável!!!! 07:59cscerqueira.com.br
  29. 29. [openFrameworks] Página Principal – openframeworks.cc 07:59cscerqueira.com.br
  30. 30. [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
  31. 31. [openFrameworks] Addons da comunidade: ofxaddons.com 07:59cscerqueira.com.br
  32. 32. [openFrameworks] OSX, Linux, Windows, iOS, Android, Linux ARM 07:59cscerqueira.com.br
  33. 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. 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. 35. [openFrameworks] SVR2013 - Resultados 07:59cscerqueira.com.br
  36. 36. [openFrameworks] SVR2014 - Resultados 07:59cscerqueira.com.br
  37. 37. [openFrameworks] WRVA2014 - Resultados 07:59cscerqueira.com.br
  38. 38. [openFrameworks] SVR2015 - Resultados 07:59cscerqueira.com.br
  39. 39. Primeiro programa em oF 07:59cscerqueira.com.br
  40. 40. [openFrameworks] Onde encontrar? 07:59cscerqueira.com.br
  41. 41. [openFrameworks] Level Easy: Gerador Automático 07:59cscerqueira.com.br
  42. 42. [openFrameworks] Escolhendo expansões DocoreoF Dacomunidade 07:59cscerqueira.com.br
  43. 43. [openFrameworks] Estrutura do projeto 07:59cscerqueira.com.br
  44. 44. [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; ...
  45. 45. 2. Arduino e Firmata O que é? Onde vivem? Existe? Hoje no Glob..
  46. 46. O que tem no ARDUINO? 07:59cscerqueira.com.br
  47. 47. [ARDUINO] Outras versões 07:59cscerqueira.com.br
  48. 48. [ARDUINO] Shields 07:59cscerqueira.com.br
  49. 49. [ARDUINO] FIRMATA Literatura indica FIRMATA: http://firmata.org/wiki/Download 07:59cscerqueira.com.br
  50. 50. [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
  51. 51. 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
  52. 52. [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
  53. 53. [ARDUINO] “esquemático” 07:59cscerqueira.com.br ▪ #crashcourse fritzing ▪ http://fritzing.org/home/
  54. 54. [ARDUINO] “simulador” ▪ https://123d.circuits.io 07:59cscerqueira.com.br
  55. 55. [ARDUINO] Arduino e openFrameworks 07:59cscerqueira.com.br
  56. 56. [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
  57. 57. [ARDUINO] Código no openFrameworks ▪ Exploração do exemplo: communicationfirmataExample 07:59cscerqueira.com.br
  58. 58. [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
  59. 59. [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);
  60. 60. 07:59cscerqueira.com.br
  61. 61. 3. Controlando o drone (baseado em Arduino) via Interface em openFrameworks Vamos controlar o DRONE NA MÃO #FACANACAVEIRA
  62. 62. [oF+Ard+DC] $$
  63. 63. [oF+Ard+DC] $$ 07:59cscerqueira.com.br
  64. 64. [oF+Ard+DC] $$ 07:59cscerqueira.com.br
  65. 65. [oF+Ard+DC] Controle de Motor DC 07:59cscerqueira.com.br
  66. 66. [oF+Ard+DC] Ponte H – L293D 07:59cscerqueira.com.br
  67. 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. 68. [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
  69. 69. [oF+Ard+DC] Drone 2D 07:59cscerqueira.com.br
  70. 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. 71. 4. Realidade Aumentada
  72. 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. 73. [Realidade Aumentada] Ferramentas de Autoria basAR FLARAS 07:59cscerqueira.com.br
  74. 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. 75. [Realidade Aumentada] ARToolKit 07:59cscerqueira.com.br
  76. 76. [Realidade Aumentada] ARToolKitPlus 07:59cscerqueira.com.br
  77. 77. [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
  78. 78. [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
  79. 79. [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
  80. 80. [Realidade Aumentada] Ajustando o projeto - lib 1. Configuration Properties  Linker Input  Additional Dependencies incluir a lib: ARToolKitPlus.lib 07:59cscerqueira.com.br
  81. 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. 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. 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. 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. 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. 86. [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
  87. 87. [Realidade Aumentada] Resultado esperado 07:59cscerqueira.com.br
  88. 88. [Realidade Aumentada] Adicionando conteúdo ▪ Adicionar o modelo via ofxAssimpModelLoader ▪ Reutilizar o modelo do exemplo anterior. 07:59cscerqueira.com.br
  89. 89. [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
  90. 90. [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
  91. 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. 92. [Realidade Aumentada] 07:59cscerqueira.com.br
  93. 93. 5. Capturando informações do marcador via openFrameworks. Entendendo o que é capturado pela câmera
  94. 94. [Marcadores] Informações possíveis (x,y,z) Plano XY x y z 07:59cscerqueira.com.br
  95. 95. 07:59cscerqueira.com.br x y -angle+angle
  96. 96. [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
  97. 97. 6. Movimento autônomo de drone com RA no loop de controle. Fechando a malha
  98. 98. [Controlando Drone] Teoria de Controle https://en.wikipedia.org/wiki/Control_theory 07:59cscerqueira.com.br
  99. 99. [Controlando Drone] Nossa malha 07:59cscerqueira.com.br Posição Real Já chegamos? Atua na direção Posição Real Onde estamos?
  100. 100. [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
  101. 101. [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
  102. 102. [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; } }
  103. 103. [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....
  104. 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. 105. O que aprendemos hoje
  106. 106. ▪ 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
  107. 107. Link para download dos códigos dos exemplos ▪http://www.4shared.com/folder/Cb1E5bxa/ WRVA2015.html 07:59cscerqueira.com.br
  108. 108. 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
  109. 109. O INPE (Instituto Nacional de Pesquisas Espaciais) 07:59cscerqueira.com.br
  110. 110. RV EM SIMULADORES OPERACIONAIS DE SATÉLITE RV EM SIMULADORES OPERACIONAIS DE SATÉLITE 07:59cscerqueira.com.br
  111. 111. SIMULADOR DE UM SENSOR DE ESTRELAS COM RA SIMULADOR DE UM SENSOR DE ESTRELAS COM MARCADORES
  112. 112. 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
  113. 113. CONSTRUÇÃO DE AMBIENTES CONTÍNUOS BASEADOS EM REALIDADE CRUZADA PARA ANÁLISE DE MISSÃO
  114. 114. 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
  115. 115. 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
  116. 116. 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
  117. 117. 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

×