scieee AI-readable full text Open interactive document viewer

Realidad aumentada mediante SLAM en tiempo real con cámara monocular

Maceda García, Almudena

Abstract

Este trabajo consigue simular un Bob Esponja1 con la técnica de realidad aumentada en un entorno desconocido mediante el uso de una cámara monocular y una computadora. A lo largo del mismo, se han realizado diversas investigaciones de las diversas metodologías existentes y aquellas que van a ser utilizadas, como es el caso de SLAM (Visual Simultaneous Localization and Mapping). En este proyecto se ha realizado: una pequeña introducción al software, a la plataforma con la que se ha trabajado, a las librerías más relevantes que utiliza y, por último, a los proyectos que recurren a una metodología similar a la que se utiliza en este trabajo.

Full text

1 Equation Chapter 1 Section 1 Proyecto Fin de Grado Ingeniería Electrónica, Robótica y Mecatrónica Realidad Aumentada mediante SLAM en tiempo real con cámara monocular Autor: Almudena Maceda Garcí a Tutor: Begoña C. Arrue Ullés Dpto. Control y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2019 Proyecto Fin de Grado Ingeniería Electrónica, Robótica y Mecatrónica Realidad Aumentada mediante SLAM en tiempo real con cámara monocular Autor: Almudena Maceda García Tutor: Begoña C. Arrue Ullés Profesor titular Dpto. de Control y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2019 Proyecto Fin de Grado: Realidad Aumentada mediante SLAM en tiempo real con cámara monocular Autor: Almudena Maceda García Tutor: Begoña C. Arrue Ullés El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2019 El Secretario del Tribunal A mi familia A mis abuelos A mis amigos Agradecimientos os agradecimientos que puedo ofrecer en esta pequeña sección de mi trabajo van a ser sobre todo a mis padres y hermanos, que han estado ahí con su apoyo incondicional en todo momento y en especial en aquellos en los que estuve sometida a gran presión. A mi madre, por su paciencia y dedicación absoluta, como es conocida “una heroína entre las sombras” o un ángel de la guarda. A mi padre por haberme dado las dotes necesarias para apreciar la ingeniería y ver todo aquello que puedo desarrollar con una simple idea. A mi hermana, que me ha ofrecido su ayuda para que mi trabajo de fin de carrera, recordándome siempre lo que era capaz de lograr y que debo priorizar mis intereses a los de otros. A mi hermano pequeño por recordarme diariamente con humor que terminaría la carrera antes que yo. A mi abuelo Manolo, por haberme regalado una educación maravillosa y el sonreírle a la vida incluso cuando no haya más chistes, que todo esfuerzo tiene su recompensa y que un libro puede marcar la diferencia entre el resto y tú. A mi abuela Carmen, la matriarca de la casa, por estar siempre atenta de la salud y la formación de cada uno de tus nietos que aunque a veces te vayas sé que estás con nosotros. A mi abuela Matilde, por haber luchado duramente estos últimos meses en los que nos has dejado disfrutar más de ti y esperamos poder hacerlo por mucho más tiempo. A mis profesores de la escuela que me han enseñado a querer y valorar la ingeniería como un bien en el que todos colaboramos para hacer un mundo mejor. A mi tutora Begoña, por haberme dado la oportunidad de desarrollarme como persona y como futura ingeniera en este trabajo, haber confiado en mí en todo momento. A Pablo Ramón, por haberme dado la ingeniosa idea de desarrollar el trabajo en realidad aumenta y haberme ayudado a reestructurar el trabajo aún incluso sin tiempo. A Manu por esas charlas infinitas con un café a medias. A relaciones exteriores de la escuela, pero sobre todo a Enma, por motivar y ayudar a todos los alumnos día tras día para que descubran de lo importante que es realizar una Erasmus, a mí me dio la vida y el hecho de haber estado en la Università di Bologna me ha hecho descubrirme en nuevas ramas de la ingeniería. A mis amigos, que siempre han estado conmigo incluso en estos duros meses en los que nos hemos necesitado. Ellas han hecho que multiplique las sonrisas y reduzca las tristezas. A mis compañeros a los que muchos de ellos puedo llamar amigos que han estado asesorándome durante la ejecución de este trabajo y siempre se esforzaron por resolverme aquellas dudas que me iban L 8ANEXOS..............................................................................................................................54 8.1PÁGINAWEBDETUTORIALPARAROSKINETICUBUNTU......................................................................54 8.2COMPILACIÓNYEJECUCIÓNDEUSB_CAMATRAVÉSDELTERMINAL.......................................................54 8.3DESCARGAYCOMPILACIÓNDEORB_SLAM2ATRAVÉSDELTERMINAL.................................................55 8.4EJECUTARMONO,ATRAVÉSDELTERMINAL.......................................................................................55 8.5EJECUTARMONOAR,ATRAVÉSDELTERMINAL..................................................................................55 REFERENCIAS................................................................................................................................56 Índice de figuras Figura 1. Marcadores AR .......................................................................................................... 8 Figura 2. Relación humano, computadora y entorno [22]. ..................................................... 10 Figura 3. Espectro de la realidad mixta [22] ........................................................................... 10 Figura 4. Diagrama de flujo de vSLAM. ................................................................................ 15 Figura 5. Marco, vectores y características geométricas en la cámara. .................................. 17 Figura 6. Visualización del movimiento de la cámara ............................................................ 18 Figura 7. Modelo de Pinhole Camera Model ......................................................................... 19 Figura 8. Perspectiva general del sistema ORB-SLAM2 [30] ............................................... 20 Figura 9. Perspectiva general del sistema ORB-SLAM2 para cámara Monocular ............... 21 Figura 10. Logo del Sistema Operativo utilizado, Ubuntu. .................................................... 24 Figura 11. Organización Software en ROS. ............................................................................ 25 Figura 12. Logo de la distribución de ROS Kinetic. ............................................................... 26 Figura 13. Modelo de cámara Monocular “Logitech-Carl Zeiss Tessar HD 1080p”. ........... 29 Figura 14. Nube de puntos creado al ejecutar el nodo Mono. ................................................ 30 Figura 15. Ejecución del nodo MonoAR. Muestra de los puntos de rastreo. ........................ 30 Figura 16. Ejecución del nodo MonoAR. Inserción de un modelo en 3D (cubo). ................ 31 Figura 17. Ejecución del nodo MonoAR. Inserción de más de un modelo en 3D (cubos). .. 31 Figura 18. Resultados de la ejecución de ORB_AR con plano inicial. .................................. 35 Figura 19. Resultados de la ejecución de ORB_AR quitando plano inicial. ......................... 35 Figura 20. Fallos de proyección del objeto. ............................................................................ 36 Figura 21. Conjunto de archivos para la ejecución del programa orb_ar_tfg.cpp. ................ 39 Figura 22. Modelo 3D de Bob Esponja, utilizando el visor 3D ............................................. 40 Figura 23. Textura del objeto 3D Bob Esponja ...................................................................... 40 Figura 24. Formación de triángulos [54]. ................................................................................ 42 Figura 25. Rasterización de un triángulo [54]. ........................................................................ 42 Figura 26. Proceso de renderización ....................................................................................... 43 Figura 27. Diagrama de la Matriz MVP. ................................................................................. 47 Figura 28. Ejecución del nodo OrbARTFG. Muestra el rastreo del entorno. ........................ 50 Figura 29. Ejecución del nodo OrbARTFG. Rastreo del entorno junto con Bob Esponja. ... 50 Figura 30. Ejecución del nodo OrbARTFG. Muestra de la proyección del modelo 3D. ...... 51 Notación GUI Graphical User Interface VR Virtual Reality AR Augmented Reality EKF Extended Kalman Filter ROS Robotic Operating System SLAM Simultaneous Location and Mapping vSLAM Visual Simultaneous Location and Mapping TCP Transport Control Protocol OpenGL Open Graphics Library 3D 3 dimensions GLEW Extension Wrangler Library GLM OpenGL Mathematics GLSL OpenGL Shading Language GLFW Graphics Library Framework PNG Portable Network Graphics libpng PNG library MVP Model View Projection Matrix GPU Graphic Processing Unit Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 1 1 INTRODUCCIÓN as tecnologías están cambiando la forma en el que el ser humano interactúa con el mundo real, ampliando horizontes en campos como la industria, la medicina o la educación. Los grandes avances tecnológicos están llevando al ser humano a experimentar en sectores donde antes no se podía llegar como por ejemplo: en la medicina se consideraría impensable la visualización de un embrión en 3D solo con una ecografía o que un cirujano con un brazo robótico fuera capaz de realizar una operación de gran dificultad en escasas horas. En la industria el área es mucho más amplia, en el caso particular del sector automovilístico el modo por el cual el consumidor puede visualizar un producto o experimentar un servicio cambia mediante tecnologías innovadoras como la realidad aumentada. El impacto social y ético está llevando a la introspección de limitar ciertas tecnologías que realicen acciones que anteriormente se le atribuían al ser humano. La doctora Paula Sibilia que ha investigado el impacto de las nuevas tecnologías en el concepto de la intimidad comenta en su libro [1] que “No fueron las tecnologías las que cambiaron el mundo. Las inventamos y nos adaptamos con entusiasmo a ellas porque algo ya había cambiado en nuestra sociedad”. Las nuevas tecnologías, frente a las tradicionales, propician que el maestro ponga en marcha procedimientos más creativos que impulsen al alumno a participar y comience a entender la importancia del trabajo cooperativo. De esta forma se logra que la interacción entre ambos, profesor y alumno, sea más cooperativa y motive al estudiante favoreciendo el aprendizaje. Las tecnologías desempeñan un papel fundamental en nuestra sociedad, tanto que ha llevado al desarrollo de nuevas tecnologías de la información y de la comunicación llamadas TIC2 que han sido de vital importancia para la mejora de todos los campos de la sociedad, especialmente en todo lo relacionado con la educación [2] [3]. Maestros e investigadores están entusiasmados con la inmersión tecnológica como la realidad aumentada en la enseñanza y el aprendizaje, donde se espera que las características de inmersión, interacción y navegación de estas tecnologías mejoren la satisfacción de los estudiantes, ayuden en la comprensión del conocimiento y sean potencialmente útiles en tareas de aprendizaje que requieren experimentación; habilidad espacial; y colaboración entre otros [4]. Las técnicas de estudio que se pueden utilizar para el aprendizaje pueden ser muy variadas, ya que no existen dos mentes que funcionen completamente igual, pero existe un método que se está teniendo una gran afluencia dentro de la enseñanza y dicho método, es el aprendizaje visual que se 2TIC:TecnologíasdelaInformaciónydelaComunicación. L Introducción 2 muestra en el artículo [2]. Algunos estudiantes tienen más desarrollada la memoria visual, esto significa que son capaces de recordar con más facilidad lo que ven que lo que escuchan y necesitan conocer el propósito de un proyecto para generar una visión general del mismo [5]. El uso de tecnologías visuales está siendo cada vez más amplio entre niños y adultos, incluso se puede encontrar libros para colorear donde el dibujo puede ser transformado en tres dimensiones directamente con una aplicación de móvil como es aquel que ha realizado Disney [6] [7]. Dicho papel, consiste en una tecnología llamada Live Texturing of Augmented Reality characters from colored drawings3, donde el usuario puede ver el modelo en 3D parado en la página mientras es pintado en tiempo real como se muestra en [6]. Con métodos de aprendizaje más dinámicos y tecnologías que permiten la visualización de objetos, tal y como se explica en el artículo [2], el efecto de la AR en la educación y en el aprendizaje del alumnado es más amplio por lo que se cuestiona: ¿por qué no desarrollar un método en donde el alumno pueda proyectar el objeto que desee en un medio desconocido? De esta forma, se proporciona al alumno una herramienta con la que comprender una figura geométrica difícil o ver su figura favorita de dibujos animados en tres dimensiones. Algunas de estas innovadoras tecnologías que actualmente se encuentran en el mercado son: la realidad virtual (VR), la realidad aumentada (AR) y la realidad mixta (MR). [8] La realidad virtual es una tecnología que se caracteriza por la sustitución de nuestro entorno por otro generado de forma digital. Esto es una gran ventaja, ya que nos permite con un dispositivo de visualización “transportarnos” a otro mundo, época o lugar [8]. Para que esta experiencia sea completamente envolvente y real, los dispositivos que se usan son gafas virtuales, unos auriculares y un joystick o mando que permiten al usuario interactuar con el mundo virtual [8]. Un ejemplo de este tipo de dispositivo electrónico que permite adentrarse en la VR (Virtual Reality) es el Oculus Rift desarrollado por OculusVR [9]. El Oculus Rift es un casco que permiten introducirse en mundos virtuales como son, por ejemplo, videojuegos o visitas educativas de museos4, ciudades en ruinas5 o la reconstrucción de antiguos imperios6 [9]. Google Arts & Culture contiene una gran variedad de videos explicativos en 360 grados compatibles con Oculus Rift que permiten un paseo dinámico. Como ejemplo, tenemos el museo de Historia Natural de Londres que se muestra en el vídeo de [10]. El progreso de esta tecnología innovadora ha hecho que los usuarios deseen poder experimentar todo esto en el mundo real y de ahí que se decidiera combinar el mundo real con el 3TexturasenvivodepersonajesenRealidadAumentadaapartirdedibujoscoloreados. 4Conenlacea:https://www.oculus.com/experiences/rift/1795182237214575/ 5Con[61]enlacea:https://www.youtube.com/watch?v=zeCu8cN2Xxw 6Conenlacea:https://www.oculus.com/experiences/go/1144207145676653/ Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 3 virtual [11]. La realidad aumentada lo que hace es introducir lo ficticio al mundo real, es decir, superpone capas de información sobre mundo físico en el que nos encontramos sin obstruir el sentido de la realidad virtual (a diferencia de la AR) [12] [13]. Un claro ejemplo de esta tecnología accesible es un juego móvil de AR desarrollado y publicado por Niantic, Inc. para dispositivos iOS y Android que se llama PokémonGO [14]. PokemonGO7 es un juego donde el usuario captura pokemons superpuestos en el mundo físico real. Además, en el vídeo de [15] se muestra como siguen desarrollando PokémonGO con una nueva tecnología llamada AR Occlusion. Esta tecnología redefine la forma en la que la máquina ve y entiende el mundo 3D haciendo que los objetos digitales puedan interactuar con elementos reales. Al usar este aprendizaje y la visión de la computadora ha hecho que se pueda desarrollar técnicas para comprender el espacio 3D y haciendo que la experiencia de AR sea mucho más realista tal y como se explica en [16]. Con aplicaciones como esta se demuestra que en la AR existe una mayor movilidad en la VR y cómo se sigue implementando esta tecnología para llegar a la realidad mixta. Otro de los dispositivos con los que se puede usar la AR tecnología son las gafas Magic Leap One [17]. Estas gafas usan una pantalla de retina virtual colocadas en la cabeza del usuario que superponen imágenes en 3D sobre el mundo real mediante una proyección de un campo de luz digital incidente sobre el ojo tal y como se describe en [17] [18]. Las gafas contienen varias aplicaciones que permite probar diferentes modalidades de la tecnología AR. Una de las aplicaciones más destacable es la creación de tu propio proyecto en el que te da la libertad para crear un mundo ficticio (en AR) en el que puedes tomar diferentes figuras animadas o pintarlo a tu gusto en cualquier entorno. Esta aplicación elimina toda barrera existente entre el mundo digital y real, permitiendo libertad creativa para el usuario [19]. Los investigadores de Magic Leap revelaron el algoritmo de seguimiento “Deep SLAM” en el artículo [20] donde se puede consultar su investigación y resultados. En el vídeo [21] se muestran las diversas aplicaciones que contienen las gafas Magic Leap One y sus diversas funcionalidades. Por último y no menos importante, cuando comenzamos a hablar sobre la VR y la AR es necesario empezar a hablar de la Realidad Mixta (MR) [8]. La MR es el resultado de mezclar el mundo físico con el mundo digital [22]. Al contrario que en la AR, la MR no superpone información sobre el mundo real sino fusiona el mundo físico con el mundo digital haciendo que los objetos físicos y digitales coexistan e interactúen en tiempo real [23] [24]. La empresa Microsoft, recientemente, ha lanzado al mercado unas gafas de MR, llamadas HoloLens 2, donde se presume de ser las primeras gafas de MR. Aunque según varias impresiones en la web se discute su gran parecido a las gafas Magic Leap One no sólo estético, sino también a nivel de software. Aun así las HoloLens 2 consiguen una excelente ergonomía y una mayor amplitud de ángulo de visión en otras ya existentes [25]. Ya es posible intuir el impacto y la importancia que tendrá sobre el mundo 7Con[14]enlacea:https://www.pokemongo.com/es‐es/ Realidad Aumentada 10 Figura 2. Relación humano, computadora y entorno [22]. Como ya se describió con anterioridad, las experiencias que superponen los gráficos en el mundo físico son AR y las que ocluyen la visión del usuario para presentar una experiencia completamente digital es la VR. En la Figura 3. Espectro de la realidad mixta , se muestra la experiencia habilitada entre estos dos extremos. Los dispositivos holográficos permiten colocar contenido digital en el mundo real y los dispositivos inmersivos permiten ocultar el mundo físico y remplazarlo con una experiencia digital [22]. Figura 3. Espectro de la realidad mixta [22] La MR es una tecnología aún en desarrollo que está creando un gran impacto social y económico en ciertos sectores de la sociedad como son el caso de la industria, la educación o la medicina [26]. Todas estas tecnologías permiten al ser humano desarrollar nuevas habilidades y tener un amplio campo de visión hacia investigaciones futuras. Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 11 2.3 AR en entorno desconocido La técnica que usa la AR ya permite la simulación en tiempo real, pero cabe destacar que en muchos casos se utiliza la técnica de inicialización del plano mediante marcadores, imágenes o incluso una posición fija donde será proyectado el objeto. Este trabajo logra mapear el entorno mediante el sistema ORB_SLAM2 y consigue encontrar una superficie plana donde el objeto pueda ser proyectado. El efecto de coincidencia se crea si los gráficos añadidos en AR se mueven en la imagen como si estuvieran colocados en la escena real que observa la cámara. Para que este movimiento sea tan natural como posible, es necesario conocer con precisión la posición de la cámara en todo momento. Una forma sencilla de realizarlo es incorporándola a gráficos 3D como OpenGL, que los renderizará correctamente sobre las imágenes reales. De ahí que consiga que la AR utilizada en el proyecto de ORB_SLAM2 sea tan convincente ya que la cámara se mueve a través de la escena en tiempo real y alta precisión. Cabe destacar que cuantas más características del entorno sean mapeadas más fácil será encontrar una superficie plana y que la inicialización del sistema comience sin problema alguno. [38] El algoritmo presentado por el equipo ORB_SLAM2 resulta ser un éxito cuando se mapea una pequeña zona del espacio donde los movimientos de la cámara son cortos y se toman largos períodos de tiempo de localización. Simultaneous Localization and Mapping 12 3 SIMULTANEOUS LOCALIZATION AND MAPPING ste capítulo introduce la explicación de SLAM (Simultaneous Localization and Mapping), las diversas metodologías y sistemas para su utilización y la principal ventaja que mueve a este trabajo a optar por el uso del sistema SLAM. El capítulo concluirá con una exposición de las principales dificultades que plantea esta rama de la robótica y la manera de poder lidiar con ellas. 3.1 Introducción y el estado del arte En los últimos treinta años, la metodología SLAM ha recibido una mayor relevancia en el campo de la robótica. El SLAM desempeña un papel clave en los campos de los vehículos autónomos tales como: coches sin conductor o vehículos aéreos no tripulados, atrayendo a un gran número de investigadores. El SLAM está formado por dos enfoques principales: el método basado en filtros (SLAM) y el método de optimización de gráficos basados en la visión, visual-SLAM (vSLAM). En el año 1986 fue publicado uno de los primeros trabajos de investigación llevada a cabo por R. C. Smith y P. Cheeseman en “On the Representation and Estimation of Spatial Uncertainty” [39], donde se propone el método general para estimar la relación nominal y el error esperado (covarianza) entre imágenes coordinadas, representando las localizaciones relativas de los objetos. Su enfoque modeló el entorno mediante los filtros de Kalman extendidos (EKF), estimó la posición relativa entre el robot y los puntos de referencia, filtrando el ruido gaussiano en los datos de observación. El EKF fue el método más popular en estudios anteriores. El primer vSLAM en tiempo real también usó EKF para calcular el cambio de pose espacial de los sensores. Otro de los estudios pioneros destacables en este campo fue realizado por el grupo de trabajo de Hugh F. Durrant-Whyte, “Simultaneous Map Building and Localization for an Autonomous Mobile Robot” en la década del 1990. En él se muestra el problema de la robótica móvil respecto a la relación entre la localización y el mapeo simultáneo sin información previa de la posición, donde las soluciones para el SLAM tenían como factor limitante, el abundante contenido de datos [40]. E “Mistakes are the portals of discovery.” - James Joyce - Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 13 Hoy en día se puede encontrar una larga lista de métodos SLAM, los más destacables en relación al trabajo realizado, serán comentados a continuación. El LSD-SLAM (Large-Scale Direct SLAM) es otro tipo de SLAM Monocular que se ha desarrollado para permitir la construcción de mapas del entorno a gran escala [41]. En lugar de usar puntos de referencia para crear una abstracción de las imágenes que va tomando, funciona directamente usando las intensidades de las imágenes para rastrear y mapear. Este método se considera muy útil ya que permite mapear un área grande, no es necesario el uso de un hardware especializado [42]. El RTAB-MAP (Real-Time Appearance-Based Mapping) es un SLAM en el que se puede utilizar tanto cámaras RGB-D, como estéreos o sistemas lidar como método de percepción visual, que se basa en detectar cierres de bucle mediante grafos. El detector de cierre de bucle utiliza un enfoque de bag-of-binary-words para determinar la probabilidad de que una nueva imagen provenga de una ubicación anterior o sea nueva [43]. El propósito de RTAB-MAP es proporcionar una solución que se base en la localización y la composición del grafo, y esta sea independiente del tiempo y la escala [44]. Por otro lado, podemos encontrar FAB-MAP (Fast Appearance-Based Mapping) que es un sistema de navegación basado en la apariencia de lo que se observa. La esencia de FAB-MAP es un modelo probabilístico de apariencia de escenas en línea usando un modelo generativo de observaciones de palabras visuales (visual vocabulary) que encapsula que características visuales son comunes en un tipo particular de entorno [45]. El sistema FAB-MAP se ha convertido en el estándar para la detección de bucles cerrado [46]. 3.2 Visual SLAM El acrónimo SLAM a menudo se define, por muchos autores como técnica o método empleado en robots y vehículos autónomos para construir un mapa a lo largo de un entorno desconocido en el que se mueve, estimando a su vez la trayectoria al desplazarse. Esta acepción plantea un problema computacional a la hora de tener que construir o actualizar un mapa en un entorno desconocido, mientras se va realizando una ruta de su localización. Simultaneous Localization and Mapping 14 Existen métodos para la solución de parte del SLAM, entre los que se incluyen el filtro de partículas, Filtro de Kalman y Graph SLAM12. También hay que considerar el continuo desarrollo e implementación de nuevos métodos para el mapeo y localización simultánea de robots móviles. A lo largo del trabajo se hace un especial hincapié en los sistemas SLAM de visión, y en la información relevante que esta elección implica. Normalmente, el éxito de visión SLAM no es siempre el esperado, ya que se considera bastante difícil tanto tomar la posición inicial de la cámara como construir el mapa. De ahí que, en este trabajo se haya utilizado el Filtro de Kalman Extendido (versión no lineal del Filtro de Kalman). La función de este filtro es la de linealizar sobre una media y covarianza actual estimada. Es considerada una de las soluciones, referentes al problema de localización y modelado simultáneo, más extendidas tanto en la teoría como en la práctica. Los elementos que componen el mapa deben ser descritos utilizando un conjunto de parámetros que encajen de forma sencilla en el vector de estado del sistema. Este trabajo pretende conseguir un mapeo preciso del entorno para que la proyección del objeto 3D no sufra ninguna anomalía al tomar los parámetros necesarios, la localización es el resultado deseado. La proyección de objetos en 3D requiere de un proceso indispensable para extraer características del entorno para alguna clase de objetos, por ello es preciso disponer de un método de asociación de datos robusto y que permita emparejar las observaciones realizadas con los elementos contenidos en el mapa. El vSLAM (Visual Simultaneous Localization and Mapping) consiste en el uso de una cámara móvil para el desarrollo de mapeo y localización simultáneo. Este tipo de algoritmo está compuesto por cinco partes aplicadas en un sistema de tiempo real: la inicialización del sistema SLAM y de la cámara; la localización dentro del entorno en el que se encuentra; el mapeado, que crea el mapa del entorno en que se mueve la cámara; la relocalización, capaz de determinar cuál es su posición actual dentro del mapa y volver a realizar la localización; y por último, la optimización del mapeado. Pasos por los que el vSLAM reconoce el entorno:  Identificar el mayor número de landmarks distintivos y significativos en su entorno. Los landmarks son los puntos de referencia representativos de cada fotograma de la imagen recogida por la cámara. [47]  Asumiendo que el entorno es invariable entre fotogramas, los landmarks en los fotogramas más cercanos van asociados a objetos 3D del entorno de la cámara. [47] 12Algoritmodelocalizaciónymapeosimultáneoqueutilizamatricesdeinformacióndispersasproducidasalgenerar ungráficodefactoresdeinterdependenciasdeobservación. Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 15  Los landmarks son emparejados mediante comparativas de fotogramas para asociarlos posteriormente con objetos que han sido vistos por la cámara anteriormente y los datos son usados para generar información sobre la posición de la cámara (localización) y el mapa del entorno (mapeado). [47] Con esto, los algoritmos SLAM usan los datos para estimar la trayectoria seguida por la cámara, la posición y las características 3D de todos los objetos del entorno que la cámara ha observado. El SLAM también estima la posición relativa de la cámara respecto a otras características del entorno, como puede ser la profundidad o distancia que se encuentra un objeto. [48] Figura 4. Diagrama de flujo de vSLAM. El SLAM Monocular es un algoritmo cuyo hardware es más simple, razón por la es más económico y físicamente más pequeño que otros sistemas. Sin embargo, una de las desventajas del SLAM Monocular es la complejidad, e inmutabilidad de su algoritmo. [48] Otra de las dificultades que presenta este algoritmo es el uso de una única cámara, ya que es difícil determinar el margen de profundidad del desplazamiento de diferentes imágenes que observan el mismo landmark. Para resolver esta dificultad, primero se debe calcular la profundidad a la que se encuentra mediante la comparación de imágenes que han sido tomadas en tiempos diferentes y posiciones globales del sistema del robot. De este modo se irá resolviendo simultáneamente el problema de la profundidad desconocida. Algunas partes de los algoritmos del SLAM monocular pueden ser usadas en sistemas más complejos empleando el desplazamiento de la cámara para resolver el problema de la distancia indefinida entre el objetivo de la cámara y el entorno que va tomando simultáneamente. [48] 3.3 Desventajas de SLAM Simultaneous Localization and Mapping 16 El problema del SLAM reside en la estimación de la posición de una plataforma móvil en un entorno desconocido (determinando el mapa del entorno que se basan en funciones o puntos de referencia) y la localización absoluta de la plataforma en base a la información de cada una [49]. La asociación de datos erróneos provocaría una divergencia irrecuperable de la estimación del filtro. Incluso, el coste computacional crece cuando el número de objetos contenidos en el mapa es mayor, limitando muchas veces su aplicación en tiempo real. Cuando se habla además de vSLAM existen otras desventajas respecto a errores que ocurren en el cálculo de landmarks y objetos en un mapeo 3D del entorno. Esto ocurre por la acumulación de errores matemáticos, la calidad de los fotogramas del vídeo analizado o de la cámara, la dificultad de identificar minuciosamente los landmarks y las imperfecciones de la cámara. Por consiguiente, y para reducir errores es necesario la utilización del SLAM-EKF. Un algoritmo SLAM-EKF realiza un seguimiento de la incertidumbre de la posición del robot y la posición de los landmarks en el mapa, utilizando los datos acumulados mediante cálculos, para obtener así la posición estimada del robot y de los objetos en el mapa 3D. De ahí que los errores entre el entorno real y el mapa realizado por el robot no lleguen a ser tan dispares. [38] En el caso del SLAM Monocular el sistema es mucho más complicado y substancial. Esto ocurre porque la profundidad no puede deducirse directamente de una sola imagen, razón por la que debe ser calculada analizando imágenes de una cadena de fotogramas en un video. También se puede solucionar colocando más de una cámara para obtener más datos del medio o incluso sensores que proporcionen la propiedad para calcular la profundidad. [48] 3.4 Fundamento teórico de MonoSLAM MonoSLAM consiste en un mapa probabilístico, capaz de representar en cualquier momento todas las características de interés del estado de la cámara. El mapa es lo que primero que se inicializa en el sistema y éste finaliza una vez que la operación de mapeo ha concluido. Evoluciona de manera continua y dinámica mientras se actualiza el EFK. Las estimaciones de estado de la cámara y sus características se actualizan durante el movimiento de la cámara con la información obtenida a través de la observación. [38] Mientras se observan nuevas funciones el mapa, éste se amplía con nuevos estados y, si fuera necesario, se descartan algunas de las funciones por la existencia de incongruencias dentro de ellas. El carácter probabilístico del mapa está en la propagación a lo largo del tiempo, no solo de las estimaciones medias de los estados de la cámara, sino también de las características. El mapa es Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 17 matemáticamente representado por un vector de estado 𝑥 (compuesto por las estimaciones de estado de la cámara) y una matriz de covarianza 𝑃 (que es una matriz cuadrada con la misma dimensión que puede dividirse en elementos de submatriz). [38] 𝑥𝑥 𝑦 𝑦 ⋮ 𝑃𝑃 𝑃𝑃⋯ 𝑃𝑃𝑃⋯ 𝑃𝑃𝑃⋯ ⋮⋮⋮…  (1) EL vector de estado de la cámara, 𝑥,comprende un vector de posición 3D métrico 𝑟, un cuaternio de orientación 𝑞 , un vector de velocidad 𝑣 y un vector de velocidad angular 𝑤 con relación a un fotograma del mundo 𝑤 y un fotograma “robot” 𝑅 trasportado por la cámara (13 parámetros): 𝑥𝑟 𝑞  𝑣 𝑤 (2) Los estados de las características 𝑦 son aquellos vectores de posición 3D de las entidades de puntos de las localizaciones. La cámara está modelada como un cuerpo rígido que necesita de parámetros de translación y rotación, los cuales mantienen una velocidad linear y angular constante, para describir su posición. El propósito de esto es que se obtenga una localización continua a largo plazo. [38] Figura 5. Marco, vectores y características geométricas en la cámara. Debido a que la cámara monocular no tiene la suficiente información como para tomar las medidas de profundidad o los datos de odometría, se debe empezar a tomar las medidas desde un objeto de tamaño conocido que permita calcular la escala para el mapeo y movimiento estimado. Conocido el objeto, es conveniente relacionar la escala del mapa con otra información procesada ya que así es más fácil usarla en aplicaciones reales. Para que se pueda hacer un primer seguimiento del Simultaneous Localization and Mapping 18 fotograma, la cámara se mantiene en una ubicación aproximada y conocida. En el vector de estado, la posición inicial de la cámara viene dada por unos pocos grados y centímetros. [38] Para poder predecir cuándo se mueve la cámara ente los diversos intervalos tomados por la imagen capturada, hay que actualizar el vector de estado. El vector de estado es considerado un modelo de velocidad y velocidad angular “constante”, es decir, un modelo estadístico de su movimiento donde se supone que la media de las aceleraciones son indeterminadas como ocurren con un perfil Gaussiano. Figura 6. Visualización del movimiento de la cámara Este modelo es ligeramente efectivo y le da al sistema una importante robustez incluso cuando las medidas visuales son escasas. Suponiendo que se desconocen la aceleración 𝑎 y aceleración angular 𝛼 y la distribución Gaussiana causa un impulso de velocidad y velocidad angular. 𝑛 󰇡𝑉 𝛺󰇢󰇡𝑎∆𝑡 𝛼∆𝑡󰇢 (3) En determinadas circunstancias, 𝑉 y 𝛺 se pueden colocar juntos asumiendo que una fuerza única impulsada puede ser aplicada a una forma sólida del cuerpo que porta la cámara. La matriz covarianza del vector de ruido 𝑛 es diagonal y representa el ruido desvinculado en todos los componentes lineales y rotacionales. Por consiguiente, el estado actualizado sería: 𝑓⎝ ⎜ ⎛ 𝑟 𝑞  𝑣 𝑤⎠ ⎟ ⎞ ⎝ ⎛ 𝑟󰇛𝑣𝑉󰇜∆𝑡 𝑞   𝑞󰇛󰇛𝑤𝛺󰇜∆𝑡󰇜 𝑣𝑉 𝑤𝛺⎠ ⎞ (4) En el EKF, el nuevo estado estimado 𝑓󰇛𝑥,𝑢󰇜 debe ir acompañado por el incremento de estado después del movimiento. Una de las ventajas de usar una cámara Monocular es que se debe predecir cada característica de la imagen de posición antes de decidir cuál de ellas elegir para medirla. La posición Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 19 de un punto característico relativo a la cámara (usando la posición de la cámara y la posición característica estimada) es: ℎ𝑅󰇛𝑦𝑟󰇜 (5) La posición (u, v) es la característica donde se puede encontrar en la imagen, usando el modelo de Pinhole Camera Model: Figura 7. Modelo de Pinhole Camera Model ℎ󰇡𝑢𝑣󰇢𝑢𝑓𝑘     𝑣𝑓𝑘     (6) Donde 𝑓𝑘 , 𝑓𝑘, 𝑢 y 𝑣 son los parámetros estándar de la calibración de la cámara. Las imágenes tomadas no pueden ser primeramente distorsionadas, ya que, posteriormente, deben transformarse en una proyección en perspectiva para poder usarlas en AR. Dado que OpenGL solo admite modelos de cámara en perspectiva, se deforman las coordenadas en perspectiva con una distorsión radial para obtener la posición deseada de la imagen. Una buena aproximación del modelo de distorsión radial es: 𝑢𝑢  (7) 𝑣𝑣  (8) Donde: 𝑟 󰇛𝑢𝑢󰇜󰇛𝑣𝑣󰇜 (9) En la cámara, el modelo de medición no se puede invertir directamente para dar la posición de una nueva imagen tomada cuya profundidad es desconocida. De ahí que se requiera estimar la profundidad de la cámara en función del movimiento de esta junto con varias mediciones desde diferentes puntos de vista. Seguidamente se inicializa una línea 3D en el mapa a lo largo de la cual debe estar su característica, desde una posición estimada de la cámara al infinito. [38] Software y Plataforma 26 El maestro proporciona un registro de nombres y la búsqueda para el resto de la computación gráfica. Es una parte esencial y de conexión dentro del sistema ya que sin él los nodos no serían capaces de encontrar mensajes entre sí, intercambiar o invocar los diferentes servicios. Los nodos se comunican entre sí utilizando mensajes, que tienen una estructura de datos que comprende los tipos de campos. Al igual que en C, los mensajes pueden incluir matrices y estructuras arbitrariamente anidadas. Los mensajes se enrutan a través de un sistema de suscripción semántica. Después un nodo envía mensajes por publicar a un determinado Topic, el Topic es el nombre que se usa para identificar el contenido del mensaje. Un nodo interesado en un tipo de datos se subscribe al Topic correspondiente. 4.3 Instalación ROS kinetic Las principales dificultades con las que se puede encontrar el usuario en esta sección son el aprendizaje, la instalación y el manejo de ROS. Una vez que el usuario haya adquirido las habilidades necesarias en el manejo de dicha librería, le resultará una de las librerías más prácticas, ya que tiene infinitas funcionalidades y aplicaciones. Cabe destacar además, la multitud de recursos que existen tanto en la página web como en foros de ROS. Lo primero que se ha hecho es averiguar qué distribución de ROS era la recomendada para la versión de Ubuntu 16.04 Linux. En este caso, se ha elegido la distribución de ROS Kinetic Xenial. Para la instalación de ROS ha sido únicamente necesario seguir el tutorial de la página web16 para Ubuntu. 16 Ellinkdirectodelapáginawebparaeltutorialsepuedeencontrarenlasección8,8.1.WebpagedeROSKineticpara Ubuntu. Figura 12. Logo de la distribución de ROS Kinetic. Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 27 5 ORB-SLAM2 n esta sección se explica brevemente el funcionamiento de ORB-SLAM2, las partes de esta librería SLAM que consideran relevantes para el trabajo y las modificaciones realizadas para desarrollar el proyecto. 5.1 Introducción Como ya se mencionó anteriormente17, ORB-SLAM2 es una librería SLAM en tiempo real que calcula la trayectoria y reconstruye un mapa disperso en 3D para cámaras Monoculares, Estéreo y RGB-D. También permite la ejecución del proyecto para poder observar las diferentes aplicaciones que tiene. Además, el proyecto ORB_SLAM2 ofrece un nodo para procesar los datos en el caso de que se utilice cámaras Monoculares, Estéreo y RGB-D. Esta librería dispone de un tutorial en GitHub18 que indica detalladamente los pasos que se han de seguir para su compilación. Es una librería fácil de manejar y que no presenta dificultades en su uso, siempre y cuando se hayan instalado todos los paquetes de ROS necesarias para su compilación, junto con las librerías necesarias. La ausencia de lo más mínimo dentro del sistema desencadenará en una serie de errores de compilación a falta de librerías inexistentes. De ahí que se recomiende realizar una comprobación previa que permita una posterior compilación. Los errores más frecuentes radican en la compilación y son el resultado de la inexistencia de una previa comprobación de todo aquello que se dispone. 17Sección2.5 18Git‐Hub.GitesunsistemadecontroldeversionesdecódigoabiertoquefueiniciadoporLinusTrovalds,lamisma personaquecreóLinux.Hub.EselcentroalrededordelcualgirantodaslascosasrelacionadasconGit.Deahíla palabraGitHubysupáginaweb–GitHub.com‐dondetodoslosdesarrolladoresguardassusprojectosyconectancon otraspersonasquepiensancomoellos. E "Research is to see what everybody else has seen, and to think what nobody else has though." - Albert Szent-Gyorgyi - ORB-SLAM2 28 5.2 Requisitos previos de la compilación A continuación, se explicarán todos aquellos programas y librerías necesarias para la compilación y desarrollo del proyecto, especificando en qué consisten pero sin profundizar en la función de cada uno de ellos. Para comenzar es necesario disponer de los requisitos previos que ORB-SLAM2 recomienda, que son los siguientes:  C++11 Compilador. Al instalar Ubuntu 16.04 ya no es necesario que se instale el C++11 porque viene integrado en el mismo sistema operativo.  Pangolin. Es una biblioteca que sirve para administrar la visualización e interacción con la librería OpenGL y abstraer la entrada de video. En su interior se encuentra un programa que administra OpenGI y puede ayudar a modularizar la visualización 3D, sin aumentar su complejidad, y ofrece un avanzado controlador de navegación 3D.También proporciona un mecanismo para manipular variables de programa a través de archivos de configuración y tiene un trazador flexible en tiempo real que sirve para visualizar datos gráficos. Pangolin, posee también su propio tutorial de instalación disponible en la bibliografía adjunta. [51]  OpenCV. Es una librería de software de código abierto de visión y aprendizaje automático. Fue construido para proporcionar una infraestructura común para aplicaciones de visión artificial y para acelerar el uso de sistemas de percepción en máquinas de productos comerciales. Está diseñado para obtener una eficiencia computacional y enfocada fuertemente a aplicaciones en tiempo real. Tiene las interfaces C++, Python y Java, y además soporta Linux, entre otros, que es lo que nos interesa. Escrito en C/C++ optimizado, la librería tiene la ventaja de un procesamiento multi-core. [52]  Eigen3. Es una librería de cálculos en C++ para álgebra lineal.  usb_cam. Es un driver de ROS para cámaras USB V4L. Crea un nodo ROS capaz de conectar la cámara con otros servicios que necesiten usarlo. Este proyecto utiliza, una cámara monocular bastante robusta cuyo modelo es “Logitech-Carl Zeiss Tessar HD 1080p”. Cabe destacar que uso de una cámara estéreo hubiera facilitado la toma de datos a escala real. 19 19Enlasección8deAnexosenelpunto8.2Compilaciónyejecucióndeusb_cam,sedetallacómoseharealizadola compilaciónyejecucióndeestedriver.Hayquetenerencuentaqueaveceslasentradasdeseñaldevideono correspondenconladeseadayhayquecambiardedev/video0adev/video1. Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 29 Figura 13. Modelo de cámara Monocular “Logitech-Carl Zeiss Tessar HD 1080p”. 5.3 Compilación y ejecución de ORB_SLAM2 Una vez instalado todos los requisitos es necesario descargar de la página web de GitHub el archivo ORB_SLAM2 y compilarlo siguiendo los pasos que aparecen en el tutorial de la página web20 para ORB_SLAM2. Al final de la memoria se detalla cómo se ha realizado la compilación21 y ejecución de los nodos Mono22 y MonoAR23 respectivamente. El proyecto también consta de tres anexos “Descarga y compilación de ORB_SLAM2” en el que se detalla cómo se ha realizado la compilación, “Ejecutar Mono” y “Ejecutar MonoAR” en los que se explica cómo ejecutar los nodos Mono y MonoAR respectivamente. Lo que acontece al ejecutar el nodo Mono es que se crea primeramente una nube de puntos del entorno que está siendo grabado en ese momento y, finalmente, un mapa de puntos donde se distinguen correctamente el entorno por donde se está moviendo la cámara. En algunas ocasiones el mapa de puntos es tan preciso que se pueden distinguir perfectamente los objetos que está grabando la cámara. 20https://github.com/raulmur/ORB_SLAM2 21Enlasección8Anexos,enelpunto8.3puedeencontrarseelanexocorrespodientealadescargaycompilacióndel archivoORB_SLAMatravésdelterminal. 22Enlasección8Anexos,enelpunto8.4puedeencontrarseelanexocorrespodientealaejecucióndelnodoMonoa travésdelterminal. 23Enlasección8Anexos,enelpunto8.5puedeencontrarseelanexocorrespodientealaejecucióndelnodoMonoa travésdelterminal. ORB-SLAM2 30 Figura 14. Nube de puntos creado al ejecutar el nodo Mono. El nodo MonoAR, es el encargado de la interfaz para la utilización de la realidad aumentada. Lo que se puede observar en la figura es una interfaz gráfica accesible donde el usuario puede interaccionar y ver qué es lo que está sucediendo mientras se realiza el rastreo del entorno con el SLAM en tiempo real. Figura 15. Ejecución del nodo MonoAR. Muestra de los puntos de rastreo. La imagen que le precede muestra el resultado al ser pulsado el botón Insert Cube de la GUI. Como se puede observar la proyección del modelo en 3D, perteneciente a la librería de Pangolin, tiene resultados favorables ya que consigue detectar el plano principal a la perfección y proyectar el cubo en una superficie sin sufrir modificaciones. Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 31 Figura 16. Ejecución del nodo MonoAR. Inserción de un modelo en 3D (cubo). Con esta figura se pretende demostrar la viabilidad del sistema y la posibilidad de proyectar más de un modelo al mismo tiempo como se muestra a continuación. Figura 17. Ejecución del nodo MonoAR. Inserción de más de un modelo en 3D (cubos). Lo que se pretende es emplear el sistema de mapeo y rastreo del entorno de ORB_SLAM2 para que el resultado sea tan preciso como los que se muestran anteriormente por la ejecución de los nodos Mono y MonoAR, pudiendo así procurar la posibilidad de la representación de un modelo 3D en un entorno desconocido cuando éste presenta alguna que otra dificultad en su representación. ORB-SLAM2 32 5.4 ORB_AR y ORB_AR_DEMO La falta de dominio y experiencia en el campo de la AR invita al usuario a recurrir a proyectos relevantes con la misma metodología, como por ejemplo el trabajo realizado por Puyang Wang llamado ORB_AR [53], el cual consiste en una aplicación de realidad aumentada en tiempo real usando ORB_SLAM2 como sistema ORB-SLAM. El trabajo de Puyang Wang es solamente compatible con una cámara estéreo, de ahí que este proyecto se considere relevante pero no imprescindible. Es importante también destacar que su metodología al contrario que la que se quiere desarrollar, utiliza un marcador (en su caso una página con un dibujo) donde proyecta el objeto 3D en cuestión. Por otro lado, otro de los trabajos destacados en la investigación de la metodología ORBSLAM es el realizado por Baitao Shao. Esta metodología se basa en la proyección de un objeto 3D en un entorno desconocido. Se debe considerar que presenta algunos inconvenientes cuando se desea proyectar un objeto 3D en el entorno, que serán explicados en detalle más adelante. Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 33 5.4.1 Librerías A continuación, se nombran todas aquellas dependencias necesarias para la compilación y uso de ORB_AR.24  OpenCV25  OpenGL. Es una librería de gráficos que define una API multilenguaje y una multiplataforma para escribir aplicaciones que produzcan gráficos 2D y 3D.  GLEW. Es una librería de carga de extensión C/C++ multiplataforma de código abierto. Proporciona mecanismos eficientes de tiempo de ejecución para determinar qué extensiones de OpenGL son compatibles con la plataforma destino.  GLM. Es una librería cabecera de matemáticas de C++ para software de gráficos basada en las especificaciones de GLSL. Esta biblioteca funciona perfectamente con OpenGL pero también asegura interoperabilidad con otras bibliotecas.  GLFW. Es una librería de utilidad liviana para usar OpenGL Proporciona una API simple para crear ventanas, contextos y superficies, recibir entradas y eventos.  Todas las dependencias de ORB-SLAM2.  Libpng. Es una librería de referencia oficial de PNG y es compatible con casi todas las funciones de PNG. 24Algunasdelasdependenciasnoseencuentrandefinidasyaquehansidonombradasydefinidaspreviamenteenel apartado5.2Prerrequisitosantesdelacompilación. 25LadefinicióndelalibreríaOpenCVseencuentraenelapartado5.2Prerrequisitosdelacompilación ORB-SLAM2 34 5.4.2 Funcionamiento ORB_AR Antes de que se comience a explicar el funcionamiento de ORB_AR es imprescindible recalcar que el análisis de este proyecto ha sido realizado mediante la lectura y comprensión del código. La compilación y ejecución del mismo resultaban imposibles debido a la inaccesibilidad a una cámara estéreo. Así que mediante la lectura exhaustiva del código y un vídeo demostrativo de YouTube26 subido por el propio autor, Puyang Wang, se ha podido tener presente las siguientes consideraciones: Teniendo en cuenta que el proyecto ORB_AR se basa principalmente en ORB_SLAM2, se considera relevante la comparación entre estas dos metodologías: 1. Una de las diferencias básicas entre el trabajo de ORB_AR y el que se desea implementar es el uso de cámara estéreo por parte de éste. 2. Otra de las desemejanzas es la utilización por parte de éste de librerías concretas para inicializar más fácilmente la carga de un objeto, dentro del main, tal y como indican los tutoriales de OpenGL (fácilmente accesibles desde su página web27). 3. Sin embargo, una disimilitudes más significativas es la manera de inicialización, ya que en el ORB_SLAM2 se tiene que inicializar previamente la cámara mediante el nodo usb_cam, mientras que en ORB_AR se realiza únicamente una inicialización de cámara mediante la librería OpenGL y una apertura de ventana de visualización por la librería GLFW. Cabe resaltar, una serie de archivos para la carga de objeto (objectloader.cpp), textura (texture.cpp) y sombras (shader.cpp). Estos archivos son de gran utilidad ya que ayudan a cargar el objeto llamándolo desde el main sin dificultad alguna. Los archivos Shaders (TransformVertexShader.vertexshader, TextureFragmentShader.fragmentshader) y SpongeBob (spongebob.obj, spongebob.png) son utilizados en este proyecto porque contienen los detalles del objeto, en este caso un Bob Esponja28. Como se mencionó anteriormente29, existen dos formas de proyecciones de AR basadas en la posición, los marcadores o las imágenes. Puyang Wang implementó su proyecto de AR mediante la utilización de una imagen como primer plano donde es proyectado el objeto. El propósito final de 26YouTubeesunapáginawebdesubidayreproduccióndevideosgratuita.Elenlacealvideoenconcreoesel siguiente:https://www.youtube.com/watch?v=xljy3JuiB3w 27https://www.opengl.org/ 28BobEsponja,personajeprincipaldeunaserieanimada. 29Enlasección3.2seespecificanlosdiferentestiposdeproyeccióndeAR. Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 35 este trabajo es que la cámara sea capaz de mapear el entorno y encontrar la superficie plana deseada para proyectar el objeto. Figura 18. Resultados de la ejecución de ORB_AR con plano inicial. En la figura anterior se muestra el resultado de la ejecución del proyecto ORB_AR y como es necesario de una imagen inicial, en este caso un el folio rojo con dibujos, como marcador para su proyección. Como se observa en la figura 17, la retirada del plano es posible porque este ha encontrado su posición inicial de proyección. Dicho objeto quede en una posición fija sin experimentar transformaciones en el modelo y no se vea alterado por el movimiento de la cámara. Figura 19. Resultados de la ejecución de ORB_AR quitando plano inicial. Finalmente, se observa que la posición del objeto no es completamente fija y a veces puede llegar a perder su ubicación inicial. A pesar de que existen algunos detalles en este programa a mejorar, es muy eficaz y resulta de gran ayuda como proyecto notorio para el desarrollo de este trabajo. AR para Cámara Monocular 42 textura, para que el rasterizador se mezcle en la superficie de los triángulos que conectan el vértice. [54] Figura 24. Formación de triángulos [54]. La GPU conecta los vértices proyectados para formar triángulos. Lo hace tomando los vértices en el orden especificado por la matriz de elementos y agrupándolos en conjuntos de tres. El raterizador toma cada triángulo, lo recorta y desecha las partes que están fuera de la pantalla, y divide las partes visibles restantes en fragmentos del tamaño de un píxel. Como se mencionó anteriormente, las salidas variables del vertex shader también se interpolan a través de la superficie rasterizada de cada triángulo, asignando un gradiente suave de valores a cada fragmento. [54] Figura 25. Rasterización de un triángulo [54]. Los fragmentos generados luego pasan a través de otro programa llamado fragment shader. El fragment shader recibe los valores variables generados por el vertex shader e interpolados por el rasterizador como entradas. Genera valores de color y profundidad que luego se dibujan en el framebuffer. Las operaciones de sombreado de fragmentos comunes incluyen mapeo de texturas e iluminación. Como el fragment shader se ejecuta de forma independiente para cada píxel dibujado, puede realizar los efectos especiales más sofisticados; sin embargo, también es la parte más sensible al rendimiento del flujo de gráficos. [54] El framebuffer es el destino final para la salida del trabajo de renderizado. La mayoría de las implementaciones modernas de OpenGL le permite crear objetos de framebuffer que se dibujan en moldes fuera de pantalla o texturas. Esas texturas se pueden usar como entradas para otros trabajos Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 43 de renderizado. Un framebuffer puede tener un depth buffer y/o un stencil buffer38, ambos filtran opcionalmente los fragmentos antes de dibujarlos en el framebuffer. [54] Por lo tanto el proceso es desde vertex buffer a framebuffer (Figura 26. Proceso de renderización) cuando se realiza una llamada de dibujo en OpenGL. La representación de una escena generalmente implica múltiples trabajos de dibujo, texturas, estados uniformes y el uso de profundidad y memorias intermedias de la plantilla para combinar los resultados. Figura 26. Proceso de renderización Como se ha explicado anteriormente el proceso de carga de modelos en 3D con OpenGL es complejo pero a su vez muy útil si se tienen los archivos necesario para la carga de texturas y de sombras. Por esta razón, se ha decidido trabajar con la librería OpenGL y otras más recientes, como GLFW y GLM relacionadas con la carga de modelos, texturas y creación de gráficos. Para analizar el entorno real en el que se encuentra se ha utilizado la metodología SLAM llevada a cabo por el proyecto de ORB_SLAM2. Esta resulta ser una metodología eficaz y sin acumulación de errores significativos, puntos muy importantes si queremos que el programa trabaje de manera efectiva. En detalle, se empezará explicando el archivo orb_ar_tfg.cpp (archivo main) ya que es el que gobierna la ejecución del programa dirigiendo las llamadas de otras funciones del programa. Primero, se deben nombrar todas las cabeceras y librerías necesarias para la compilación y ejecución de los archivos relativos al main. Cabe destacar que la librería GLFW es aquella que permitirá abrir la ventana window donde empezarán a mostrarse todos los gráficos. A diferencia de Pangolin que crea una apertura de una ventana a través de una función CreateWindowAndBind. La 38Stencilbuffer:esunbúferdedatosadicionalademásdelbúferdecoloryelbúferdeprofundidad,queseencuentraenel hardwaredegráficosmodernos.Elbúferesporpíxelyfuncionaconunaprofundidaddeunbyteporpíxel. AR para Cámara Monocular 44 ventaja principal, radica en la posibilidad de crear una interfaz que permite acceder a las distintas partes necesarias para que el usuario final tenga la posibilidad de acceder a las funciones deseadas. Seguidamente, se ha decidido tomar la función DetectPlane cuya finalidad es detectar la superficie plana conveniente como base elemental donde proyectar el objeto 3D. Dicha variable se le ha asignado el nombre de Plane. Esta función lo que recibe son las imágenes que captura la cámara (Tcw), los diversos puntos del mapeo (vMPs) y un número de iteraciones (iterations) necesarias para que la detección del plano sea el correcto. Plane*DetectPlane(constcv::MatTcw,conststd::vector<MapPoint*>&vMPs,const intiterations) Esta función devuelve siempre una nueva variable Plane que contiene la posición de la cámara y del plano que está tomando la cámara. En segundo lugar, nos encontraríamos dentro del main donde se pueden considerar algunos valores enteros relevantes para la programación. Posteriormente, realizaremos una llamada a función VideoCapture que pertenece a la librería OpenCV e indica la apertura de la cámara USB. VideoCaptureinputVideo(1);/*FunciónOpenCVparaabrirusbporlaentradaque corresponda*/ inputVideo.set(CV_CAP_PROP_FRAME_WIDTH,640);/*Conf.anchuravídeo*/ inputVideo.set(CV_CAP_PROP_FRAME_HEIGHT,480);/*Conf.alturavídeo*/ La función VideoCapture inputVideo(1) grabará las imágenes de vídeo que toma la cámara, pero para ello es necesario configurar la altura y anchura de la cámara, height y width respectivamente. Para empezar a realizar un mapeo del entorno es preciso que se inicialice el sistema SLAM con la siguiente llamada: ORB_SLAM2::SystemSLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,false); Lo que esta llamada permite es llamar al archivo System perteneciente al archivo ORB_SLAM2 y que contiene la configuración necesaria para el mapeo y el seguimiento de puntos con el tipo de cámara elegida, en este caso una cámara monocular. Seguidamente, se tomarán los valores de calibración de la cámara descritos en el archivo TUM1.yaml, donde se guardan los valores de la cámara en diversas variables. //getKandDistCoeffromyaml cv::FileStoragefSettings(argv[2],cv::FileStorage::READ); floatfps=fSettings["Camera.fps"]; Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 45  floatf_x=fSettings["Camera.fx"]; floatf_y=fSettings["Camera.fy"]; floatc_x=fSettings["Camera.cx"]; floatc_y=fSettings["Camera.cy"];  K=cv::Mat::eye(3,3,CV_32F); K.at<float>(0,0)=f_x; K.at<float>(1,1)=f_y; K.at<float>(0,2)=c_x; K.at<float>(1,2)=c_y;  DistCoef=cv::Mat::zeros(4,1,CV_32F); DistCoef.at<float>(0)=fSettings["Camera.k1"]; DistCoef.at<float>(1)=fSettings["Camera.k2"]; DistCoef.at<float>(2)=fSettings["Camera.p1"]; DistCoef.at<float>(3)=fSettings["Camera.p2"]; constfloatk3=fSettings["Camera.k3"]; if(k3!=0) { DistCoef.resize(5); DistCoef.at<float>(4)=k3; } A su vez, se ha de inicializar las librerías que anteriormente han sido nombradas en la cabecera debido a que necesitan ser inicializadas como en el caso de GLFW para crear la ventana window dónde se verán las imágenes que va tomando la cámara usb y la librería GLEW. //InitialiseGLFW if(!glfwInit()){ fprintf(stderr,"FailedtoinitializeGLFW\n"); getchar(); return‐1; } glfwWindowHint(GLFW_SAMPLES,4); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//TomakeMacOShappy;shouldnotbeneeded glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); AR para Cámara Monocular 46 //OpenawindowandcreateitsOpenGLcontext window=glfwCreateWindow(640,480,"ORBAR",NULL,NULL); if(window==NULL){ fprintf(stderr, "FailedtoopenGLFWwindow.IfyouhaveanIntelGPU,theyare" "not3.3compatible.Trythe2.1versionofthetutorials.\n"); getchar(); glfwTerminate(); return‐1; } glfwMakeContextCurrent(window); printf("OpenGLversionsupportedbythisplatform(%s):\n", glGetString(GL_VERSION));  //InitializeGLEW glewExperimental=GL_TRUE;//Neededforcoreprofile if(glewInit()!=GLEW_OK){ fprintf(stderr,"FailedtoinitializeGLEW\n"); getchar(); glfwTerminate(); return‐1; } Adicionalmente, se debe realizar un apartado de lectura y carga de sombras, textura y objeto donde se llamará a las funciones del modelo explicado con anterioridad. El modelo que se va a cargar es un Bob Esponja y lo único que se realiza en el main es usar la información ya cargada para poder ser utilizada. Es preciso recalcar que la variable im se relaciona con la imagen tomada por la cámara y que se considera un plano inicial configurable por si la localización del mapa varía, y se desea colocar un nuevo plano para colocar el modelo 3D. Este método soluciona la restricción que tenía el proyecto de ORB_AR que necesitaba de una imagen inicial para proyectar el objeto. A continuación tenemos un bucle while que se mantiene en ejecución mientras la cámara esté activa, y no existe forma de salir de él si no se realiza en el terminal una llamada39 en el proceso para finalizar la ejecución del programa o en el caso de que sea pulsado en el teclado Esc. El seguimiento de puntos se realiza asiduamente, pero no es visualizable por el usuario y era difícil 39Lallamadaaparadaquedeberealizarseenelterminalesuncrtl+c,loqueseconocecomo:matarelprocesoconla señalSIGINT. Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 47 distinguir el entorno y saber si el SLAM encontraba el número suficiente de puntos para su localización o no, se ha querido facilitar un método de visualización de dichos puntos mientras se mantenga pulsada la flecha derecha del teclado. if(glfwGetKey(window,GLFW_KEY_RIGHT)==GLFW_PRESS){ constintN=vKeys.size(); for(inti=0;i<N;i++){ if(vMPs[i]){   cv::circle(imcopy,vKeys[i].pt,1,cv::Scalar(0,255,0),‐1);   } } } Lo que realiza a continuación es considerar que la Texture1 es aquella imagen im que va tomando de la cámara. Anteriormente, crearemos una copia de im que es imcopy para poder ser utilizada sin modificar la original. Esto es necesario para que sea posible la visualización de la cámara en tiempo real ya que a la hora de ser visualizado en la ventana deben ser definidas todas las texturas para no ser superpuestas. Otro aspecto importante dentro de la carga de un modelo es el MVP, una nueva terminología que es el acrónimo de ModelViewProjection que corresponden a tres matrices de cuatro por cuatro independientes, necesaria para separar las transformadas de manera fácil y precisa. Estas matrices permitirán transformar los vértices 󰇛𝑥,𝑦,𝑧,𝑤󰇜. La matriz Model o modelo pasa todos los vértices definidos en el centro del modelo, es decir, un modelo está definido por un set de vértices. Las coordenadas 󰇛𝑥,𝑦,𝑧󰇜 de estos vértices son definidas respectivamente al centro del modelo y a su vez definidos con respecto al centro del mundo o World Space. La matriz View o vista es aquella que da la vista desde el mundo real al de la cámara. Por último, la matriz Projection o proyección es la proyección de la cámara a la de la pantalla, cambiando las coordenadas de la cámara a coordenadas homogéneas [34]. Definidas en el código como: //getMVPmatrix,defineit Figura 27. Diagrama de la Matriz MVP. AR para Cámara Monocular 48 glm::mat4MVP=glm::mat4(1.0);  //ProjectionMatrix glm::mat4ProjectionMatrix=glm::perspective(glm::radians(61.5f),4.0f/ 3.0f,0.1f,1000.0f);  //ModelMatrix glm::mat4ModelMatrix; glm::mat4TranslateMatrix; glm::mat4ScalingMatrix; El valor de MVP se puede usar como único resultado para hacer un mapa desde el espacio del objeto hacia el espacio de la pantalla. Permitiendo calcular lo necesario para pasar a la siguiente etapa de las posiciones de los vértices entrantes. Por lo que enlazando variables, viewMatrix contiene los valores de la cámara Tcw, ModelMatrix contiene los valores del plano Tpw y ProjectionMatrix, TranslateMatrix tiene matrices constantes y ScalingMatrix comprende una matriz y el factor de escala que será referido posteriormente. //MODELMATRIXMULTIPLICATION TranslateMatrix=glm::translate(glm::mat4(1.0f),glm::vec3(0,0,0)); ScalingMatrix=glm::scale(glm::mat4(1.0f),glm::vec3(scale_factor)); ModelMatrix=ModelMatrix*ScalingMatrix;  //MODEL,PROJECTIONANDVIEWMATRICESMULTIPLICATION MVP=ProjectionMatrix*View*ModelMatrix; El factor de escala, scale_factor, es un valor configurable desde teclado. Se puede ampliar o disminuir la escala del modelo mediante las flechas hacia arriba y hacia abajo para aumentar o decrementar respectivamente. if(glfwGetKey(window,GLFW_KEY_DOWN)==GLFW_PRESS) scale_factor=scale_factor/0.2; if(glfwGetKey(window,GLFW_KEY_UP)==GLFW_PRESS) scale_factor*=0.2; Si se desea colocar el objeto en un nuevo plano es posible hacerlo mediante el uso del teclado. Esto resulta muy útil puesto que está diseñado para la carga única del objeto y de manera que si el medio cambia, la proyección del modelo en este nuevo entorno es factible. Se ha determinado el siguiente código: Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 49 if(glfwGetKey(window,GLFW_KEY_SPACE)==GLFW_PRESS) TrueNewplane=true; if(TrueNewplane) pPlane=DetectPlane(Tcw,vMPs,50); Su significado es que si es pulsado el tabulador o la tecla de espaciado, se determinado verdadera la variable de condición TrueNewplane, nuevo plano, y por lo tanto se debe detectar el plano de nuevo. Haciendo uso en el teclado de la flecha izquierda, tendremos la posibilidad de proyectar el modelo. Finalmente, lo que realiza es una supresión de los archivos cargados en memoria y cierre de los hilos utilizados al cerrar la ventana de imagen o al escribir en el terminal el comando crtl+c. if(glfwGetKey(window,GLFW_KEY_LEFT)==GLFW_PRESS){ //Drawthetriangle! glDrawArrays(GL_TRIANGLES,0,vertices.size());  Para la compilación y ejecución del código es necesario haber instalado previamente los requisitos previos referentes a la librería y paquetes necesarios como el caso de ORB_SLAM2. Para la ejecución del código es necesario realizar: /*Directoriodóndehasidocompiladoelarchivoyejecución*/ $cdORB_SLAM2 $rosrunORB_SLAM2ORB_AR_TFGVocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml 6.4 Resultados Resulta más fácil explicar los resultados obtenidos si se muestran distintas imágenes de su funcionamiento. En muchas de las figuras se podrá observar cuál es el funcionamiento del mismo cuando se pulsan los comandos asignados mediante teclado. A continuación, se muestra cómo al mantener pulsada la flecha izquierda del teclado empieza a mostrar los puntos de rastreo dentro del entorno desconocido, es decir, qué puntos se empiezan a reconocer dentro del mismo. AR para Cámara Monocular 50 Figura 28. Ejecución del nodo OrbARTFG. Muestra el rastreo del entorno. Si se desea proyectar el modelo en 3D sobre el nuevo entorno es necesario mantener pulsado la flecha derecha del teclado. En las figuras que la preceden se muestra la proyección del objeto en 3D, un Bob Esponja, situados en diferentes planos de un entorno desconocido. Se muestra como es proyectado en un teclado y en una página escrita, ya que estos tipos de entornos son más adecuados para encontrar diversos puntos de rastreo y poder así encontrar una superficie plana sobre la que proyectar el objeto. Figura 29. Ejecución del nodo OrbARTFG. Rastreo del entorno junto con Bob Esponja. Y por último, se ha querido mostrar una captura de la compilación del proyecto cuando la muestra de rastreo no es visible pero se tiene la carga del modelo perfectamente proyectado. Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 51 Figura 30. Ejecución del nodo OrbARTFG. Muestra de la proyección del modelo 3D. En resumen al conjunto que se ha mostrado anteriormente, los resultados obtenidos son favorables ya que se ha conseguido cumplir el objetivo principal de este proyecto, Realidad Aumentada con una cámara monocular en un entorno desconocido, donde las desventajas que presentaba era la utilización de la cámara monocular y la carga de un objeto en 3D. Sin embargo, el objeto tiene un pequeño desvío rotacional cuando se mueve un poco la cámara y nunca queda en una posición fija del todo. Existe retraso al inicializar el SLAM y cuando se pulsan las flechas del teclado para mostrar los puntos de rastreo y el objeto en 3D. Resulta más cómodo encontrar los puntos del entorno en el que se está moviendo la cámara ya que tiene la utilidad de ver si el entorno para proyectar es el adecuado. Aun así, se puede recalcar que el resultado es el idóneo para una cámara monocular y que los resultados junto a la formación previa realizada, tanto en bibliografía como en el entendimiento de los proyectos relevantes, ha sido el adecuado para su elaboración. Referencias 58 [26] P. D. T. Hutzschenreuter and C. Burger-Ringer, Impact of Virtual, Mixed and Augmented Reality on Industries, Munich: TUM: Technical University of Munich, 2018. [27] C. Flavián, S. Ibáñez-Sánchez and C. Orús, “The impact of virtual, augmented and mixed reality technologies on the customer experience,” J ournal of Business Research, no. 0148-2963, 2018. [28] R. T. Azuma, “A Survey of Augmented Reality,” Teleoperators and Virtual Environments, vol. IV, no. 6, pp. 355-385, 1997. [29] M. Mahrami, M. N. Islam and R. Karimi, “Simultaneous Localization and Mapping: Issues and Approaches,” International Journal of Computer Science an d Telecommunications, vol. IV, no. 1, 2013. [30] R. M.-A. a. J. D. Tardós, “ORB-SLAM2: An Open-Source SLAM System for Monocular, Stereo, and RGB-D Cameras,” IEEE Transactions on Robotics, vol. 33, no. 5, pp. 1255-1262, 2017. [31] P. Wang and L. Wang, “An Augmented Reality Application based on Plannar Tracking and Visual SLAM,” 2 febrero 2018. [Online]. Available: https://www.dropbox.com/s/222oxk0echirt60/capstone-final-report.pdf?dl=0%5D. [Accessed 20 diciembre 2018]. [32] D.Gálvez-López and J.D.Tardos, “Bags of binary words for fast place recognition in image sequences,” Robotics, IEEE Transactions on, vol. IV, no. 28, pp. 1188-1197, 2012. [33] B. Shao, “ORB_AR_DEMO,” GitHub, 9 agosto 2017. [Online]. Available: https://github.com/castiel520/vslam_research. [Accessed 28 junio 2018]. [34] opengl, “opengl-tutorial,” 7 junio 2017. [Online]. Available: http://www.opengltutorial.org/es/. [Accessed junio 2018]. [35] L. Sanchez, “Realidad Aumentada. Tipos de realidad Aumentada,” [Online]. Available: http://wwwavancesdelcelular.weebly.com/index.html. [Accessed 26 noviembre 2018]. [36] J. Emspak, “Live Science Contributor,” What is Augmented Reality?, 31 mayo 2018. [Online]. Available: https://www.livescience.com/34843-augmented- reality.html. [Accessed 26 noviembre 2018]. [37] B. Mundo, “Qué es la realidad aumentada, cómo se diferencia de la virtual y por qué Apple apuesta fuertemente a ella,” BBC Mundo, p. 1, 17 octubre 2016. [38] I. D. R. N. D. M. a. O. S. A. J. Davison, “MonoSLAM: Real-time single camera SLAM,” IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. VI, no. 1052–1067, p. 29, 2007. [39] P. R.C.Smith, “On the Representation and Stimation of Spatial Uncertainty,” The International Journal of Robotics Research, vol. V, no. 4, pp. 56-68, 1986. Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 59 [40] H.F.Durrant-White and J.J.Leonard, “Simultaneous Map Building and Localization for an Autonomous Mobile Robot,” Workshop on Intelligent Robots and Systems '91, vol. III, pp. 1442-1447, 1991. [41] J. Engel and P. D. D. Cremers, “LSD-SLAM: Large-scale direct Monocular SLAM,” [Online]. Available: http://vision.in.tum.de/research/vslam/lsdslam. [Accessed 20 febrero 2019]. [42] E. J, S. T and C. D, “LSD-SLAM: Large-scale direct Monocular SLAM,” [Online]. Available: https://vision.in.tum.de/_media/spezial/bib/engel14eccv.pdf. [Accessed 19 febrero 2019]. [43] M.Labbé and F.Michaud, “RTAB-Map as an Open-Source Lidar and Visual SLAM Library for Large-Scale and Long-Term Online Operation,” J ournal of Field Robotics, 2018. [44] Z. Kong and Q. Lu, “A Brief Review of Simultaneous Localization and Mapping,” IECON 2017 - 43rd Annual Conference of the IEEE Industrial Electronics Society, pp. 5517-5522, 2017. [45] R. Paul and P. Newman, “FAB-MAP 3D: Topological Mapping with Spatial and Visual Appearance,” Mayo 2010. [Online]. Available: http://www.robots.ox.ac.uk/~mobile/Papers/1751.pdf. [Accessed 1 marzo 2019]. [46] M. Cummins and P. Newman, “ Appearance-only SLAM at large scale,” The International Journal of Robotics Researc, vol. 30, no. 9, pp. 1100-1123, 2011. [47] L. M. D. M. L. J.-M. Royer E, “Monocular vision for mobile robot localization and autonomous navigation,” International Journal of Computer Vision, vol. III, p. 74, 2007. [48] B. A. H. A. L. P. Yap Maurice, “Monocular SLAM,” Imperial College London, [Online]. Available: https://www.doc.ic.ac.uk/~ab9515/monoslam.html. [Accessed 26 noviembre 2018]. [49] A. R. N. N. S. Amitava Chatterjee, Vision Based Autonomous Robot Navigation:Algorithms and Implementations, Springer, 13 octubre 2012. [50] J. Zijlman, “LSD-slam and ORB-slam2, a literature based explanation,” A Medium Corporation [US], 23 agosto 2017. [Online]. Available: https://medium.com/@j.zijlmans/lsd-slam-vs-orb-slam2-a-literature-based- comparison-20732df431d. [Accessed 28 noviembre 2018]. [51] S. L. a. R. Newcombe, “Pangolin,” GitHub, 11 abril 2011. [Online]. Available: https://github.com/stevenlovegrove/Pangolin/blob/master. [Accessed 5 mayo 2018]. [52] O. team, “OpenCV,” OpenCV team , [Online]. Available: https://opencv.org/about.html. [Accessed 26 noviembre 2018]. Referencias 60 [53] P. Wang, R. Mur-Artal and equipo:ORB_SLAM2, “ORB_AR,” GitHub, 24 abril 2016. [Online]. Available: https://github.com/XwK-P/ORB_AR. [Accessed 20 marzo 2018]. [54] “Gimoo,” Gimoo.net, [Online]. Available: http://www.gimoo.net/t/1507/55b04579bd2e5.html. [Accessed 10 abril 2019]. [55] M. B., OpenLocalizationService, S. Cai and A. Pasic, “Docs de Microsoft,” Microsoft, 04 11 2016. [Online]. Available: https://docs.microsoft.com/es-es/cpp/clanguage/main-function-and-program-execution?view=vs-2017. [Accessed 21 01 2019]. [56] J. d. Vries, “Learn OpenGL,” junio 2014. [Online]. Available: https://learnopengl.com/About. [Accessed 8 enero 2019]. [57] F. Andrade and M. Loifriu, Writers, SLAM Estado del arte. [Performance]. MINA y Facultad de Ingeniería Montevideo, Uruguay, 2012. [58] C. Pellini, “La Educación en Egipto Antiguo función de los Sacerdotees y Escribas,” 5 noviembre 2014. [Online]. Available: https://historiaybiografias.com/egipto1/. [Accessed 19 febrero 2019]. [59] G. Misty Cabañas Marrufo, F. J. Moreno Campos and A. Pérez Flores, “La Educación Griega y sus principales representantes,” 17 noviembre 2015. [Online]. Available: http://www.eumed.net/rev/atlante/11/educacion-griega.html. [Accessed 19 febrero 2019]. [60] B. Crecente, “Magic Leap: Founder of Secretive Start-Up Unveils Mixed-Reality Goggles,” Variety, 20 diciembre 2017. [Online]. Available: https://variety.com/2017/gaming/news/magic-leap-impressions-interview- 1202870280/. [Accessed 19 febrero 2019]. [61] I. Lapowsky, “Magic Leap CEO Teases 'Golden Tickets' for Its Augmented- Reality Device,” Wired business, 24 febrero 2014. [Online]. Available: https://www.wired.com/2015/02/magic-leap-reddit/. [Accessed 19 febrero 2019]. [62] M. o. t. Antz, “The VR Museum of Fine Art on Oculus Rift - Quick Look part 1,” Youtube, 22 mayo 2017. [Online]. Available: https://www.youtube.com/watch?v=zeCu8cN2Xxw. [Accessed 19 febrero 2019]. [63] V. Martínez, “Realidad Virtual con el Oculus Rift,” Youtube, 20 noviembre 2017. [Online]. Available: https://www.youtube.com/watch?v=fj1mcKwOX8M. [Accessed 10 febrero 2019]. [64] R. López, “Niantic muestra su nueva tecnología AR para Pokémon GO con Pikachu,” PokéMaster, 29 junio 2018. [Online]. Available: https://pokemaster.es/niantic-muestra-su-nueva-tecnologia-ar-para-pokemon-go-con- pikachu-no-113187/. [Accessed 20 febrero 2019]. Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 61 [65] R.Azuma, Y.Baillot, R.Behringer, S.Feiner, S.Julier and B.MacIntyre, “Recent advances in augmented reality,” IEEE Computer Graphics and Applications, vol. XXI, no. 6, pp. 34-47, 2001. [66] Z. Kong and Q. Lu, “A brief review of simultaneous localization and mapping,” in 43rd Annual Conference of the IEEE Industrial Electronics Society, Beijing, 2017. [67] P. Cipresso, I. A. C. Giglioli, M. A. Raya and G. Riva, “The Past, Present, and Future of Virtual and Augmented Reality Research: A Network and Cluster Analysis o f the Literature,” Frontiers in Psychology, vol. IX, no. 1664-1078, p. 2086, 2018. [68] N. Karlsson, E. d. Bernardo, J. Ostrowski, L. Goncalves, P. Pirjanian and M. Munich, “The vSLAM Algorithm for Robust Localization and Mapping,” Proceedings of the 2005 IEEE International Conference on Robotics and Automation, pp. 24-29, 2005. [69] H. F. Durrant-Whyte and T. Bailey, “Simultaneous Localization and Mapping: Part I,” IEEE Robotics Automation Magazine, vol. XIII, no. 2, pp. 99-110, 2006. [70] “Flat Icon,” FreePickCompany S.L., [Online]. Available: https://www.flaticon.com/home. [Accessed 10 abril 2019 ]. Realidad Aumentada mediante SLAM en tiempo real con cámara monocular 63