Universidad de Costa Rica Facultad de Ingenierı́a Escuela de Ingenierı́a Eléctrica Sistema cognitivo para controlar elementos de una habitación interactiva mediante gestos Por: Fabián Moya Solano Ciudad Universitaria “Rodrigo Facio”, Costa Rica Noviembre, 2013 Sistema cognitivo para controlar elementos de una habitación interactiva mediante gestos Por: Fabián Moya Solano IE-0499 Proyecto eléctrico Aprobado por el Tribunal: M.Sc Teodoro Willink Castro Profesor guı́a Lic. Mauricio Espinoza Bolaños Profesor lector PhD Lucky Lochi Yu Lo Profesor lector Resumen En este documento se presenta al lector un proyecto eléctrico concerniente a una interfaz de usuario para el control de una serie de actuadores de uso común en una habitación domótica. La particularidad de esa interfaz de usuario innovadora, es que utiliza herramientas de visión por computador para controlar los elementos únicamente mediante movimientos de los brazos. El objetivo principal del mismo es diseñar e implementar un sistema que permita interpretar gestos humanos y logre traducirlos a señales eléctricas para controlar diversos elementos eléctricos o electrónicos en una habitación. Se desarrolló el proceso completo, desde la instalación del equipo y software necesario, hasta el diseño e implementación de los actuadores, pasando por el algoritmo de detección de usuario y la manipulación de la información obtenida de sus articulaciones. En este proyecto también se explica la estructura del lenguaje de brazos diseñado para la aplicación y las pruebas a las que fue sometido. Se hace un análisis de las demás alternativas a la visión por computador y se justifica su selección. Dentro del margen de la visión por computador, se introducen brevemente las alternativas exploradas para la implementación de la interfaz y se justifica por qué se utilizó rastreo de esqueleto como base para el algoritmo. Las herramientas utilizadas fueron un Kinect, una tarjeta Arduino UNO, una computadora portátil y dos actuadores, una bombilla y un motor DC, estos últimos acompañados de la electrónica externa diseñada para su control y correcto funcionamiento. La implementación del proceso fue exitosa, por tanto se informa al lector que este documento puede servir como una referencia plausible para desarrollar aplicaciones similares, o basadas en el mismo principio. v Dedicatoria A mi madre y a mi tı́a Sonia, no sólo por el amor y el apoyo incondicional, sino por la altura de sus expectativas. A mis compañeros, profesores y amigos de carrera, por haber sido habitantes junto a mı́ de esa segunda casa que fue la Escuela de Ingenierı́a Eléctrica durante estos cuatro años. vii Reconocimientos Agradezco profundamente al profesor Teodoro Willink, quién brindó constante guı́a y oportuno consejo durante todo el proceso. A mis profesores lectores por su tiempo y comentarios. A mis demás profesores, por su sabio consejo tanto dentro como fuera de las aulas. A mi familia por su apoyo y motivación, no sólo durante la realización de este proyecto, sino durante toda la carrera. A Paula Apú, por sus constantes visitas al laboratorio, por sus horas de ayuda en la etapa de pruebas, por la corrección de este documento y por regalarme sonrisas cuando el cansancio las hacı́a más necesarias. ix Índice general Índice de figuras xii Nomenclatura 1 Introducción 1.1 Alcance . . 1.2 Justificación 1.3 Objetivos . 1.4 Metodologı́a 1.5 Contenido . xiii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 3 3 4 2 Antecedentes 2.1 Domótica . . . . . . . . . . . . . . . . . . 2.2 Interfaces de comunicación usuario-edificio 2.3 Software de procesamiento disponible . . . 2.4 Herramientas a utilizar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 13 15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Diseño 3.1 Software necesario para el procesamiento e instalación del equipo 3.2 Identificación y procesamiento de gestos utilizando Processing . 3.3 Comunicación por puerto serial . . . . . . . . . . . . . . . . . . 3.4 Actuadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 19 20 30 31 4 Resultados 35 4.1 Algoritmo de detección de usuario y rastreo de esqueleto . . . . 35 4.2 Pruebas del CVHAAL . . . . . . . . . . . . . . . . . . . . . . . 37 4.3 Pruebas de comunicación serial y actuadores . . . . . . . . . . 39 5 Conclusiones y recomendaciones 41 A Instalación del software necesario 43 A.1 Instalación en Linux . . . . . . . . . . . . . . . . . . . . . . . . 43 A.2 Instalación en Windows . . . . . . . . . . . . . . . . . . . . . . 44 xi Índice de figuras 2.1 2.2 2.3 Error de la IVU de Siri . . . . . . . . . . . . . . . . . . . . . . . . Kinect sin su carátula. . . . . . . . . . . . . . . . . . . . . . . . . . Vista superior de un Arduino UNO . . . . . . . . . . . . . . . . . . 3.1 3.2 3.3 3.4 3.5 3.6 3.7 7 17 18 Diagrama de flujo del proceso desarrollado . . . . . . . . . . . . . . Programa de puntos calientes y nube de puntos . . . . . . . . . . . Anatomı́a de las extremidades superiores . . . . . . . . . . . . . . Diagrama de bloques del flujo del programa . . . . . . . . . . . . . Diagrama de bloques de la configuración inicial . . . . . . . . . . . Diagrama de bloques de la función encargada de dibujar el esqueleto. Diagrama de bloques de la función que determina la confianza de las medidas de los puntos . . . . . . . . . . . . . . . . . . . . . . . 3.8 Diagrama de flujo del ciclo central del programa . . . . . . . . . . 3.9 Diagrama de flujo del programa del Arduino . . . . . . . . . . . . 3.10 Esquemático del circuito de la bombilla. . . . . . . . . . . . . . . . 3.11 Esquemático del circuito del motor DC . . . . . . . . . . . . . . . 19 21 24 25 26 27 4.1 4.2 4.3 4.4 36 38 39 40 Prueba del punto para la mano izquierda . . . . . . . . . . . . . Variaciones de la posición Psi con usuarios de ambos géneros . . Posición con ángulos iguales a Psi que dispara la misma acción . Variaciones de la posición Abrazo con usuarios de ambos géneros xii . . . . 28 29 31 32 33 Nomenclatura CV Computer vision CV HAAL Computer Vision Hands and Arms Angle Language IEEE Institute of Electrical and Electronics Engineers IDE Integrated Development Environment iOS iPhone Operative System IV U Interfaz por voz del usuario M IT Massachusetts Institute of Technology SDK Software Development Kit PWM Pulse Wide Modulation RGB Red Green Blue ROS Robotic Operating System U SB Universal Serial Bus xiii 1 Introducción Desde el siglo XIX, el concepto completo de la domótica ha sido un elemento constante en novelas de ciencia ficción. El nivel de interacción humano-hogar ha sido descrito durante años como una realidad utópica, casi inalcanzable. Con la electrificación doméstica generalizada y el acelerado avance tecnológico, esta fantası́a futurista se ha acercado cada vez más a la realidad. Durante los últimos años se ha trabajado en automatización de viviendas, sistemas inteligentes de eficiencia energética para hogares y sistemas de interacción que ofrezcan una interfaz para comunicarse con las personas de forma cada vez más natural. Una vivienda inteligente óptima, será aquella que administre de forma más eficiente la energı́a, realice todos los procesos cotidianos posibles de forma automática, y los procesos que dependan de la voluntad humana los realice con una interfaz sencilla y natural para las personas. Una alternativa factible actualmente para esa interacción, es la utilización de visión por computador. Mediante el Kinect, de Microsoft Corporation, se puede utilizar visión por computador para sensar profundidad y ası́ obtener una imagen virtual con información de tres dimensiones del cuerpo que se tenga en frente. Suponiendo que este cuerpo es una persona, los movimientos corporales de la misma pueden ser captados por el Kinect y luego procesados por un computador para una cantidad muy grande de aplicaciones. En el área de domótica, puede ser utilizado desde en sistemas de seguridad, hasta en sistemas de interacción completa con el usuario. Sabiendo que el Kinect puede captar esta información y una computadora puede procesarla, es posible diseñar un sistema de interacción con los humanos basado en gestos. 1.1 Alcance El proyecto consiste en el diseño y la implementación de un sistema que convierta una habitación con aparatos eléctricos y electrónicos común, en una habitación cognitiva que controle estos aparatos mediante el uso de movimientos del cuerpo. El proyecto abarca tanto la interacción entre el usuario y el sistema, como el desarrollo de los actuadores mismos activados por los movimientos. El alcance del proyecto se limita a la interacción con el usuario y su procesamiento en una computadora portátil, sumado a la comunicación con un Arduino UNO que a su vez controla una serie de actuadores previamente diseñados. 1 2 1 Introducción 1.2 Justificación La sociedad moderna se encuentra en un punto histórico donde el crecimiento tecnológico está en explosión. Las nuevas tecnologı́as en otras áreas se están adaptando cada vez más y más rápido al desarrollo inteligente de las viviendas. Cada vez son más las tecnologı́as que se desarrollan especı́ficamente para las edificaciones grandes, medianas y pequeñas. En este momento es productivo incursionar en el terreno de la domótica, pues está en un punto medio de su desarrollo que resulta muy cómodo. La domótica no es tan reciente como para que sea difı́cil conseguir bases, material y referencias para trabajar, ni lo suficientemente desarrollada como para que no haya muchı́simas aplicaciones en las cuales se pueda mejorar o hasta innovar. La parte de la domótica que compete a la interacción humano-vivienda es una de las que ofrecen más posibilidades, pues las posibles interfaces son tantas como lo permita la imaginación. Sumado a la gran cantidad de opciones que ofrece el mercado destinadas especı́ficamente a la lı́nea doméstica, se pueden encontrar infinitas posibilidades de implementar otras tecnologı́as en el hogar. El mercado ofrece herramientas potenciales para estas interfaces que van desde teclados sencillos hasta mandos activados por voz y movimientos, pasando por sensores de sonido, pantallas táctiles, conectividad con teléfonos inteligentes y un sin número de herramientas más. El área de visión por computador se ha desarrollado intensamente en las últimas décadas y los frutos de toda esa investigación salen a la luz para utilizarse en muchas áreas más. Con este proyecto eléctrico se pretende utilizar esas herramientas en una aplicación establecida y desarrollarla hasta su implementación básica. Esta aplicación servirá de base luego, y dejará las puertas abiertas para un desarrollo más profundo y para una serie de mejoras que la lleven finalmente a un punto de utilidad óptima. La aplicación desarrollada en este proyecto permite aportar confort y facilidad de uso para cualquier persona. Son muchas las personas que se pueden ver beneficiadas por un desarrollo más completo de lo que se propone en este proyecto, entre las cuales se pueden mencionar: • Personas que no tienen una relación tan directa con la tecnologı́a moderna y tienen dificultades para controlar aparatos de uso cotidiano y constante como controles remotos de televisión, aires acondicionados, cortinas eléctricas, alarmas de seguridad, entre otros. • Personas adultas mayores, mujeres embarazadas, personas enfermas o con capacidades fı́sicas disminuidas o discapacidad. Este sector de la población sufre dificultades para labores tan sencillas para los demás, como apagar una luz o no alcanzar a encender un ventilador de techo. 1.3. Objetivos 3 • Niños, pues este tipo de aplicación puede despertar su curiosidad cientı́fica e incentivar en ellos un interés auténtico por la tecnologı́a, cómo funciona y en un futuro hasta cómo desarrollarla. • Personas con impedimentos del habla o dificultades de lenguaje, ya que el sistema no utiliza ningún comando de voz. • Público general, pues presenta una forma novedosa y diferente de interactuar con los diferentes elementos de su hogar. 1.3 Objetivos Objetivo general Diseñar e implementar un sistema que permita interpretar gestos humanos y logre traducirlos a señales eléctricas para controlar diversos elementos eléctricos o electrónicos en una habitación. Objetivos especı́ficos Para el desarrollo de este proyecto se establecieron los siguientes objetivos especı́ficos: • Diseñar e implementar un sistema capaz de percibir gestos humanos usando un Kinect y procesarlos en tiempo real. • Diseñar e implementar un sistema de comunicación por puerto serial entre el computador conectado al Kinect y un Arduino UNO. • Diseñar e implementar actuadores acoplables a la tarjeta Arduino UNO, activados mediante los gestos procesados y traducidos por el computador. 1.4 Metodologı́a El desarrollo del trabajo incluyó los siguientes pasos y procedimientos, listados en secuencia a continuación: 1. Investigación sobre las herramientas de software disponibles en el mercado para el procesamiento e implementación de visión por computador. 2. Elección del software o biblioteca a utilizar para procesar las imágenes tridimensionales captadas por el kinect, utilizando la información recolectada. 4 1 Introducción 3. Creación y programación de un lenguaje de gestos propio de la aplicación. 4. Implementación del software o biblioteca elegida, de forma que sea capaz de captar e identificar movimientos del cuerpo. 5. Implementación efectiva de un protocolo de comunicación entre la computadora portátil y el Arduino UNO mediante puerto serial. 6. Diseño de la electrónica necesaria para la implementación de los actuadores conectados al Arduino UNO. 1.5 Contenido Para el desarrollo del proyecto se presentará la información de la siguiente forma: En el primer capı́tulo se hará una introducción breve al tema de la domótica, sus antecedentes y las interfaces de usuario existentes. Se expondrá una comparación de la interfaz usada con otras interfaces y se justificará de forma integral la elección tomada. Para concluir este capı́tulo, se listaran las herramientas a utilizar tanto de hardware como de software, acompañadas de una breve descripción de cada una. El capı́tulo siguiente expone la parte más extensa del trabajo, correspondiente al diseño del proyecto. En este capı́tulo se comentará sobre el software necesario y su instalación, el proceso de reconocimiento y procesamiento de gestos utilizando Processing, las alternativas exploradas y se explicará a profundidad el lenguaje de gestos creado especı́ficamente para esta aplicación. Seguidamente se presentará al lector una explicación del código tanto de Processing como del Arduino, mediante diagramas de flujo. Una vez expuesto el código utilizado, se presentará la información respectiva a la comunicación serial y finalmente se mostrará el resultado y desarrollo de los actuadores diseñados. El capı́tulo que le sigue presentará los resultados de todas las pruebas efectuadas. El último capı́tulo corresponde a las conclusiones obtenidas luego del desarrollo entero del trabajo, y adicionalmente, se sugerirán una serie de recomendaciones para mejorar el sistema a futuro. 2 Antecedentes 2.1 Domótica La palabra domótica, morfológicamente hablando, se deriva de la palabra domus, del latı́n, que significa casa y de la terminación tica, que denota automática. Actualmente, la palabra automática no solo se refiere a automatización, sino que también incluye varios tipos de procedimientos por medios informáticos. Según ?, la domótica se refiere al área de la ingenierı́a que estudia e implementa sistemas informáticos y electrónicos capaces de automatizar, controlar y monitorear una casa. La concepción del término, implica que se está trabajando en una nueva área de la tecnologı́a especı́ficamente centrada en el diseño, investigación e instalación de edificaciones inteligentes. Cuando nace esta disciplina, se hace posible unificar criterios e ideas que permiten desarrollar normas de calidad y estándares necesarios para un correcto estudio y aplicación de la tecnologı́a para domótica. 00 La domótica es la nueva ciencia y técnica que trata de hacer inteligentes a los edificios. Se supone que una casa inteligente es la que está fresca en verano y caliente en invierno, la que ahorra energı́a, y la que en general obedece las órdenes de sus ocupantes. Hay que apresurarse a advertir que la arquitectura tradicional creó durante siglos muchas casas inteligentes, porque la sabidurı́a en el uso de los materiales, el aislamiento y la orientación cuidadosamente estudiada producı́an precisamente esos efectos, pero en la sociedad actual, esas cosas se consiguen más bien mediante el control de los numerosos artefactos que hay en los hogares.00 ? Como se habló anteriormente, la domótica involucra tanto automatización de procesos como eficiencia energética, en pro de la economı́a y el medio ambiente, y los sistemas de interacción que sirven de interfaces de control para los seres humanos. 2.2 Interfaces de comunicación usuario-edificio La mayorı́a de los edificios y casas inteligentes que se construyen actualmente, cuentan con interfaces orientadas por voz o por pantallas táctiles. Existen muchas alternativas más para diseñar interfaces para que el usuario pueda controlar a voluntad los procesos domóticos de una edificación, pero estos han sido poco explotados y en una gran mayorı́a de casos se han quedado 5 6 2 Antecedentes estancados en el laboratorio o en el papel. En las subsecciones siguientes, se desarrolla una pequeña introducción a las dos tecnologı́as más usadas y a una tercera opción, menos popular pero con un enorme potencial. Interfaces por voz Las interfaces por voz (IVU ), han sido por décadas, marca emblemática de los hogares del futuro en toda la literatura y cinematografı́a de ciencia ficción. Para muchos lectores empedernidos de este género, puede saltar a la memoria la clásica novela Second Foundation, de ?. En ella se describe una máquina capaz de escuchar la voz humana de los estudiantes y escribir exactamente lo que decı́an. Actualmente son muchas las aplicaciones que permiten hacer dictado a la computadora, a pesar de ser complicadas y generalmente cometer muchas equivocaciones. Este mismo principio se puede utilizar para cualquier aplicación que involucre reconocimiento de voz, incluidas las IVU. Una IVU que destaca y ha ganado popularidad desde su creación en el 2007, es la de Siri. Siri es un asistente personal con una IVU, implementado en los teléfonos de Apple con iOS (iPhone Operative System), capaz de activar alarmas, buscar información, redactar y enviar mensajes, abrir y cerrar aplicaciones, escribir notas y entradas en la agenda, etc. Una tecnologı́a como esta implementada en un hogar, podrı́a ser algo maravilloso, pero existen aún muchos problemas. Tomemos por ejemplo el caso en el que se pida desde la IVU apagar la cocina a las seis y cincuenta, y que el algoritmo entienda que debe apagar la cocina a las diez y cincuenta. Es muy probable que la comida que se haya estado preparando se termine quemando. Este es solo un insignificante ejemplo de una de las muchas cosas que pueden salir mal en un ambiente con una cantidad tan grande de actividades cotidianas, que se traducen directamente en una acción fı́sica que puede causar daños estructurales, daños al equipo o inclusive, poner en riesgo la seguridad humana. El problema de su utilización en la actualidad es que además de ser poco asertivo, suele ser muy frustrante para las personas que tienen algún impedimento del habla, como los tartamudos, para las personas que no hablan el idioma en el que se programó el algoritmo o tienen un marcado acento, o hasta imposible de usar, como en el caso de los mudos. El lenguaje es otro obstáculo importante, pues su programación no es universal, sino que se debe adaptar o hasta crear para cada idioma. Según ?, la comunicación verbal no está basada únicamente en palabras u oraciones, sino que es una forma de comunicación sumamente compleja que involucra aspectos difı́ciles de comprender para una máquina, como lo son el tono de voz a la hora de pronunciar las frases, que puede expresar el contexto emocional, o el énfasis verbal que se le dé a ciertas palabras. Es por esta razón que el primer avance en esta tecnologı́a para el área de domótica debe ser algo 2.2. Interfaces de comunicación usuario-edificio 7 Figura 2.1: Error de la IVU de Siri meramente práctico e impersonal, limitar la comunicación usuario/hogar a una serie de instrucciones. En un futuro, cuya distancia temporal es aún incierta, se espera se trabaje con tecnologı́a de reconocimiento de voz capaz de comprender el estado de ánimo del usuario para responder de manera acorde. Acercarse a una interfaz ası́, puede hacer de las IVU las interfaces de comunicación más prometedoras de todas por lo naturales que resultarı́an para las personas. Parte del problema se puede arreglar con algoritmos de entrenamiento, en los cuales el usuario se dedica a leer al sistema una serie de oraciones previamente diseñadas para que la computadora pueda adaptarse a cada usuario, su 8 2 Antecedentes tono de voz y su velocidad de habla. A pesar de esto, esta solución genera un problema nuevo. En una casa de habitación es poco común que solo viva una persona, y aún menos probable que todos en esa casa hablen de la misma manera. Esto, sumado al costo del equipo, las problemáticas anteriores y su poca fiabilidad, hacen que las IVU deban ser pospuestas hasta que su desarrollo permita una implementación más confiable. Pantallas táctiles Una apuesta menos ambiciosa, pero muchı́simo menos propensa a errores, es la utilización de pantallas táctiles como interfaces de usuario. Una pantalla táctil es un dispositivo que permite la interacción con el usuario mediante el contacto directo de los dedos con su superficie, sin necesidad de un mouse o un teclado, y además muestra los resultados en pantalla. Existen varias formas de construir pantallas táctiles, como por ejemplo las capacitivas, que son las que utilizan los teléfonos modernos. El principio de funcionamiento de estas pantallas está basado en sensores capacitivos, una capa de un material dieléctrico transparente y una pelı́cula de un material conductor sobre esta. Al hacer contacto con este material conductor, el cuerpo humano, que también es conductor, altera el campo eléctrico de la pantalla y permite que los sensores perciban esta perturbación dada en un lugar especı́fico de la pantalla. También existen opciones más económicas pero más sencillas, como las pantallas resistivas, que son menos brillantes, más gruesas y sensibles al sol, pero más precisas. Otra opción económica y sencilla es utilizar pantallas táctiles basadas en infrarrojo. Estas pantallas generan un plano infrarrojo que al ser perturbado en un punto, presenta perturbaciones en dos de los ejes. Utilizando las coordenadas de la perturbación, puede ubicar la posición exacta del dedo y ası́ efectuar la acción deseada. Pantallas con esta tecnologı́a reducen el precio considerablemente en aplicaciones sencillas, como en los libros electrónicos de Amazon, Kindle Touch. Las pantallas táctiles, si son de buena calidad y están bien diseñadas e implementadas, pueden ser tan confiables como un mando común de botones y perillas. Las casas modernas están llenas de estos mandos mecánicos, desde los interruptores de las luces hasta las perillas del aire acondicionado, pasando por los teclados de los controles de televisión. El uso de estos mecanismos comunes se ha ido cambiando poco a poco en algunas casas de habitación con capacidades domóticas, pero sobretodo en las edificaciones más grandes. En estos edificios se encuentran pantallas táctiles empotradas, generalmente en paredes, mediante las cuales se puede controlar la ventilación, iluminación, sonido, etc. En conjunto con un sistema operativo sencillo y los actuadores correctos, estas interfaces pueden formar sistemas empotrados de control de vivienda muy eficientes y de un costo no tan elevado. A continuación se enlistan 2.2. Interfaces de comunicación usuario-edificio 9 una serie de ventajas y desventajas de las interfaces por pantalla táctil. Ventajas: • Son relativamente baratas. • Ofrecen una gran facilidad de uso. • Disminuye el número de periféricos necesarios de entrada y salida de una computadora. • Resultan atractivas para el usuario promedio. Desventajas: • La mayorı́a de pantallas táctiles para estas aplicaciones, están diseñadas para sistemas empotrados, limitando la movilidad del usuario. Para controlar la interfaz, habrı́a que levantarse y caminar hasta la pantalla. A pesar de que existen alternativas móviles a este problema, como la planteada por ?, en la que presenta una opción viable de interfaz por pantalla táctil orientada a personas con discapacidad motora, su costo se puede elevar significativamente, los mandos se pueden perder y son menos robustos y más susceptibles a daños fı́sicos. • Como las pantallas táctiles son elementos que utilizan herramientas visuales en una superficie lisa, resulta casi imposible para las personas no videntes o con discapacidades visuales significativas, utilizarlas. • Si la pantalla no es lo suficientemente grande, la fisionomı́a de la mano del usuario puede resultar problemática. • Personas con enfermedades o discapacidades que no les permitan precisión en sus movimientos manuales, como la enfermedad de Parkinson, pueden llevar a una interacción deficiente. • Pueden llegar a descalibrarse. • Al ser un medio fı́sico y de contacto, es un foco de contaminación importante. • En caso de que se dañen, puede resultar inconveniente arreglarlas, dado que para hacer esto, hay que tomar toda la pantalla, a diferencia de las IVU, donde se podrı́a dañar solo un micrófono o un parlante. Si se tiene solo un mando y este se daña, el sistema queda inhabilitado. Las pantallas táctiles ofrecen mucho, pero es una tecnologı́a que ya se ha desarrollado ampliamente y no ofrece muchas oportunidades para innovar, razón por la cuál se decidió no elegirlas como interfaz en el desarrollo de este proyecto. 10 2 Antecedentes Visión por computador La visión por computador o CV, abreviación del inglés computer vision, es una opción menos utilizada y común que las mencionadas anteriormente. La población general tiene un entendimiento más limitado sobre este tipo de tecnologı́a que sobre las IVU o las pantallas táctiles. Recientemente se han empezado a utilizar aplicaciones pequeñas y comunes de visión por computador en otras áreas de fácil acceso al público, como el reconocimiento de rostros en las cámaras o en las fotos en redes sociales como Facebook, pero los usuarios siguen sin estar realmente familiarizados con el concepto. La herramienta de visión por computador consiste, explicada de una forma muy simplificada, en captar una imagen, procesarla y hacer algo con esa información procesada. Esta es un área que está en intenso desarrollo en este momento y sus aplicaciones son incontables. Implementaciones de CV se pueden ver en sistemas que van desde seguridad, hasta entretenimiento. Tal explosión de trabajo en la última década ha resultado en una cantidad considerable de material de referencia, pero encontrado de forma desordenada y con regulaciones y estándares aún en la etapa más tierna de su formación. Según ?, no se debe relacionar tan de cerca el área gráfica con el procesamiento de imágenes. Si bien van de la mano, el área de desarrollo de gráficos está también en desarrollo, pero su desarrollo es estructurado y ordenado, pues su problema también lo es. En desarrollo de gráficos se pretende presentar una imagen que se comporta de forma controlada a voluntad del diseñador. En procesamiento de imágenes, el problema es más complejo, absolutamente estocástico y no siempre se puede resolver de forma estructurada. A pesar de la naturaleza estocástica del proceso, siempre se trata de abarcar siguiendo un procedimiento ordenado que es idéntico siempre en sus primeras tres etapas, y varı́a drásticamente en las últimas dos. ? plantean ese procedimiento de la siguiente forma: 1. Acceso: Obtener la información de la imagen, generalmente por medio de una cámara. 2. Transferencia: Comunicación entre el sensor (cámara) y la computadora. 3. Conversión: Transformación de la información al formato requerido. 4. Modificación: Aplicación de filtros, recortes, transformaciones, etc. 5. Análisis: Uso de CV para entender una escena. La visión por computador, más que solo un medio, es un sistema completo y complejo que además de los medios fı́sicos, involucra un procesamiento 2.2. Interfaces de comunicación usuario-edificio 11 computacional que suele ser pesado hasta para aplicaciones básicas y se puede intensificar hasta lo que la tecnologı́a de procesamiento permita. Si por ejemplo se utiliza visión por computador para detectar los movimientos corporales de una persona, se necesita al menos una cámara y una computadora. Las dimensiones fı́sicas y de capacidad de esta computadora van a depender directamente del nivel de complejidad que se desea manejar. Si se desea utilizar visión por computador para una aplicación de robótica de un vehı́culo terrestre que detecte obstáculos y los evada, el procesamiento no necesita ser muy pesado y puede ser soportado hasta por un ordenador de placa reducida de bajo costo, como un Raspberry Pi. En este caso, al robot solo le interesa saber qué es un objeto grande que puede ser un potencial obstáculo para su tránsito y qué no, no es importante para él analizar si el objeto es una silla, una mesa o un Chevrolet Impala negro del 67. En aplicaciones mucho más complicadas, el procesamiento se puede volver algo muy exigente, como en el caso de las computadoras que deben analizar expresiones faciales en tiempo real para predecir emociones, estados de ánimo o niveles de estrés utilizadas en varios proyectos de detección de mentiras. En la Conferencia internacional sobre acústica, y procesamiento de señales y habla de la IEEE, celebrada en Tokyo, ? presentaron un trabajo en el que lograron implementar un sistema que lograba detectar cuando un individuo interrogado estaba guardando información con un margen de error de solo 16.5 %. Este sistema utilizaba visión por computador con imágenes térmicas, reconocimiento facial y detección de gestos faciales y su necesidad de procesamiento era sumamente elevada. Las aplicaciones de CV son sumamente abundantes y multidisciplinarias. ? mencionan las áreas más importantes y se enlistan a continuación. • Robótica: Es una de las áreas más prolı́ficas de la visión artificial. Sus aplicaciones van desde navegación autónoma de vehı́culos no tripulados marinos, terrestres, aéreos y espaciales, hasta manipulación de objetos con brazos y manos robóticas. 00 Para la navegación en robótica se recurre generalmente a técnicas de visión estereoscópica con el fin de poder reconstruir la escena 3-D. Si a esto se le añade algún módulo de reconocimiento 3-D con el fin de identificar la presencia de determinados objetos, hacia los que debe dirigirse o evitar, tanto mejor. La utilización del movimiento basado en la visión constituye un magnı́fico recurso puesto que el propio sistema está ya de hecho en movimiento. Naturalmente, cualquier otra información que pueda extraerse con ayuda de la visión puede proporcionar una gran ayuda para conseguir el movimiento del robot.00 ? • Biologı́a, geologı́a y meteorologı́a: Sus aplicaciones pueden ser tanto microscópicas, como en el análisis de materia celular por parte de la histo- 12 2 Antecedentes logı́a, como macroscópicas, como la identificación de terrenos viendo su vegetación desde imágenes aéreas. • Medicina: Dada la cantidad inmensa de imágenes médicas como radiografı́as, resonancias magnéticas y tomografı́as, la medicina ofrece un campo muy amplio en el cual trabajar. La IEEE tiene una revista especializada en este tema, la IEEE Trans. Medical Imaging. • Ingenierı́a civil, arquitectura y urbanismo: Utilizando visión por computador se puede llevar a cabo identificación de construcciones, infraestructuras y objetos en escenas de exterior. • Industria: Esta es un área en la que se puede sacar máxima utilidad al aplicarla para reconocimiento y clasificación de materiales u objetos. Con visión por computador se puede llegar a clasificar y ordenar materiales de forma automática, sin necesidad de intervención humana. • Certificaciones de calidad : Haciendo uso de CV, se puede inspeccionar y realizar control de calidad de los productos finales de cada etapa del proceso de producción. Un caso común es el análisis de acabado de superficies y detección de imperfecciones. • Cartografı́a: Mediante el uso de imágenes estereoscópicas satelitales, se pueden obtener elevaciones de terreno. • Seguridad : Aplicaciones de CV son ampliamente utilizadas como sistemas de detección en equipos de seguridad como alarmas. Con todo lo mencionado anteriormente, es natural llegar a la conclusión de que CV puede ser aplicado a casi cualquier problema del que se pueda tomar una imagen o una serie de imágenes. El área de la domótica presenta una cantidad abismalmente grande de posibilidades para implementar visión por computador. En la actualidad, la mayorı́a de sistemas domóticos que utilizan CV, se limitan a la parte de seguridad. Sistemas como el de ? , utilizan reconocimiento de siluetas humanas y sombras para detectar posibles amenazas a la seguridad de una casa. Existen también sistemas más bélicos, que además de activar alarmas, realizan seguimiento de patrones y toman una acción que puede ser drástica, como es el caso de las torretas automáticas. Estos dispositivos no solo deben detectar movimiento, sino que deben reconocer que efectivamente el blanco es una persona y que además, no es un habitante autorizado de la edificación. Estos sistemas deben ser en extremo fiables, en caso contrario podrı́an dispararle a una mascota, vehı́culo o hasta a un habitante humano del edificio. La utilización en el área de interfaces de usuario para domótica es poco común y es por eso que se decidió desarrollar el proyecto en torno a esto. 2.3. Software de procesamiento disponible 2.3 13 Software de procesamiento disponible Existe una cantidad modesta de software de procesamiento para visión por computador en el mercado, tanto de código abierto como de pago. En esta sección se destacan los softwares más destacados y adaptables a la aplicación de este proyecto. ROS La palabra ROS es un acrónimo para Robotic Operative System , que se traduce del inglés como Sistema Operativo Robótico. A pesar de su nombre, ROS no es precisamente un sistema operativo per se, sino más bien es una infraestructura digital desarrollada especı́ficamente para el desarrollo de robots utilizando visión por computador. ROS es un compendio de bibliotecas programadas en C++ y Python para ser usado bajo la plataforma de Linux. ROS fue creado en el 2007 y se sigue trabajando arduamente en su desarrollo, desde el Laboratorio de Inteligencia Artificial de Stanford, en Estados Unidos. Gracias a esto es que ROS es una plataforma de software soportada, sobre la cual se puede encontrar referencias de trabajo con muchı́sima facilidad. La comunidad que utiliza ROS es considerablemente grande para su área, y al estar focalizada en visión por computador, es muy fácil encontrar ayuda o material en lı́nea sobre temas especı́ficos a la hora de trabajar en él. Las distribuciones de ROS se pueden segmentar en una parte aportada por los desarrolladores de Stanford y una que consiste enteramente de paquetes aportados por la comunidad de desarrolladores independientes. Su distribución más reciente al 2013 es Groovy Galapagos e incluye, entre muchas aplicaciones más, paquetes especı́ficamente desarrollados para reconocimiento facial, reconocimiento de gestos, reconocimiento de movimientos y seguimiento de objetos. Groovy Galapagos parece ser indicado para la aplicación planteada en este proyecto, pero es importante considerar que al ser ROS virtualmente un sistema operativo completo y tener una gran cantidad de aplicaciones además de visión por computador, el nivel de procesamiento que debe soportar la plataforma de hardware para ejecutarlo es bastante pesado. Considerando que el objetivo de este proyecto es que se pueda seguir desarrollando a futuro de forma real en una plataforma idealmente económica y pequeña, como un Raspberry Pi o un Beaglebone, ROS resulta una solución sobredimensionada para la aplicación que se necesita. Utilizar el mismo en una plataforma pequeña puede resultar en un procesamiento de imagen pobre, equı́voco, y causar un calentamiento importante en el hardware. 14 2 Antecedentes Processing con SimpleOpenNI Processing es un lenguaje de programación orientado a objetos, basado en Java y cuenta con un ambiente de desarrollo integrado. Originalmente fue concebido en el MIT con la intención de enseñar las bases de la programación a un público más variado, desde diseñadores y artistas hasta ingenieros. El modelo de programación es muy similar a Java, pero su sintaxis es más sencilla y además está basado en un contexto gráfico. Processing ofrece una alternativa multidisciplinaria muy amplia, que va desde aplicaciones simples, como la creación de interfaces gráficas para otras aplicaciones, hasta otras más complejas, como visión por computador. Se ha demostrado que es posible utilizar visión por computador con un procesamiento menos exigente utilizando Processing, todo esto mediante técnicas bien expuestas y documentadas en el libro de ? Making Things See. En este libro se presenta una aplicación en la que un robot humanoide imita los movimientos bidimensionales de un ser humano utilizando un Kinect y un Arduino, lo que es adaptable a la aplicación que se pretende realizar en este proyecto. Processing por sı́ mismo no puede procesar imágenes desde el Kinect, este necesita exportar una biblioteca creada para esa aplicación. Afortunadamente, esta biblioteca ya existe y se llama SimpleOpenNI. SimpleOpenNI es un wrapper para Processing del entorno de desarrollo original, llamado OpenNI. El entorno OpenNI, es un SDK de código abierto para el desarrollo de aplicaciones de y librerı́as de visión por computador que utilicen sensores en tres dimensiones. Existen muchı́simas librerı́as para OpenNI, desarrolladas por la comunidad libre de programadores, para las más variadas aplicaciones especı́ficas, desde escaneo de objetos para impresión en 3D, hasta reconocimiento facial. Para la aplicación de este proyecto se utilizará la biblioteca NITE, de Primesense, creada con la intención de procesar reconocimiento de manos y esqueleto. Es por la ligereza de procesamiento en comparación con las otras opciones, por la cantidad de documentación que existe, por las ventajas que conlleva el hecho de que sea código abierto y por los antecedentes prácticos que tiene, que se elige esta opción para trabajar en este proyecto. OpenCV Open Source Computer Vision es una biblioteca, desarrollada por Intel, de software de código abierto gratuita tanto para fines académicos como comerciales, ofrece interfaces en C, C++, Python y Java y es soportada por Windows, Linux, Mac OS, iOS y Android. OpenCV ofrece más de 500 aplicaciones de visión por computador y fue diseñado con especial atención al rendimiento 2.4. Herramientas a utilizar 15 y aprovechamiento de recursos. A pesar de esto, por ser fabricado por Intel, está diseñado para ser extremadamente eficiente en procesadores multinúcleo y para utilizar el sistema de eficiencia óptima integrada en los procesadores fabricados en Intel. Por razones similares de sobredimensionamiento a las de ROS, se descarta su uso para este proyecto. 2.4 Herramientas a utilizar Para el desarrollo de este proyecto es posible simular todo con software, pero para su implementación fı́sica, se necesita hardware. Las herramientas a utilizar serán: • Computadora portátil HP Pavilion Sleekbook 15-b010us con procesador Intel Core i3-2377M de 1.5 GHz y 3 MB Caché • Arduino UNO • Kinect • Circuito de actuador con relé y bombillo • Circuito de actuador con ventilador Kinect El Kinect de Microsoft Corporation es una herramienta capaz de reconocer gestos, comandos de voz, imágenes, objetos y personas. Todas estas capacidades convierten al Kinect en un mando de control completo con el potencial de ser utilizado en muchas aplicaciones. El Kinect nació de un proyecto de Microsoft llamado Project Natal y fue lanzado al público en Noviembre del 2010, luego de 20 años de investigación, desarrollo y pruebas. Originalmente fue concebido para la consola de videojuegos Xbox 360, pero su potencial tan grande motivó al público aficionado a la programación, a hacer a la unidad de hardware, un dispositivo compatible con ordenadores. Pese a que Microsoft también vio este potencial y respondió lanzando drivers de compatibilidad para computadoras con sistemas operativos Windows, el público estaba ansioso por poder utilizar el dispositivo con software libre. En el mismo mes de su lanzamiento, Adafruit Industries ofreció una recompensa de $ 3000 a la persona que diseñara un driver de código abierto para el Kinect. En el mismo mes de Noviembre se anunció al ganador y desde ese momento se dispuso de un driver USB tanto para los sensores de profundidad como para la cámara del Kinect para ordenadores basados en Linux. 16 2 Antecedentes Desde el punto de vista más fundamental, el Kinect es una cámara de profundidad. A diferencia de las cámaras convencionales, que perciben luz y como se refleja en los objetos, entregando al usuario una imagen bidimensional común, las cámaras de profundidad perciben la localización de un objeto en el espacio, permitiendo el mapeo real en tres dimensiones. Una cámara convencional captura como se ven los objetos, mientras que una cámara de profundidad obtiene la información de en donde están. Para una computadora es mucho más fácil procesar información de la localización de un objeto, que una imagen sencilla de como se ve el objeto. Si por ejemplo se desea usar CV para construir un robot que emule los movimientos de una persona, para la computadora no es trascendental saber como se ve la persona, pero sı́ lo es saber la ubicación de sus extremidades. Esta simplificación para la computadora abre un mundo nuevo de posibilidades de procesamiento de imágenes, aplicaciones que se adaptan al concepto de simplificación mencionado anteriormente. Otra ventaja importante de las cámaras de profundidad sobre las cámaras convencionales, es que las primeras no dependen de la iluminación ambiental para funcionar pues basan su funcionamiento en un sistema infrarrojo. Si se desarma un Kinect, se pueden ver sus componentes como en la figura 2.2. De izquierda a derecha se puede ver un proyector infrarrojo, una cámara RGB y una cámara infrarroja. El funcionamiento del Kinect está basado en el proyector y la cámara infrarroja. El proyector despide una lluvia de puntos sobre la habitación en la que se encuentra, mientras que la cámara percibe en donde se encuentran esos puntos. La longitud de onda del infrarrojo no está dentro del espectro visible, por lo cual no es visible para los ojos humanos, además de ser perfectamente seguro. Con esta información ya es posible saber con bastante precisión la localización exacta de un objeto y sus partes. La cámara RGB sirve para mostrar en pantalla cómo se ven las cosas realmente y no solo como las percibe la computadora. Una desventaja del Kinect y de las cámaras de profundidad en general, es que un segundo objeto que se encuentre detrás de un primer objeto más grande, no será percibido o se encontrará escondido del sensor, aunque el objeto del frente sea translúcido. En la base del Kinect se encuentra también un motor que le permite moverse en un ángulo de 30 grados para poder seguir de manera óptima al objeto o persona que lo esté utilizando. Además de los sensores visibles en la figura 2.2, el Kinect cuenta con cuatro micrófonos incorporados. Estos micrófonos están distribuidos de forma de que no solo resultan útiles para percibir sonido, sino para aproximar la posición de la fuente de este sonido en el espacio. Este principio es biomimético y trata de imitar el principio de funcionamiento de las orejas humanas y de muchos mamı́feros. Si a una persona se le grita, esta, utilizando sus dos oı́dos, puede recuperar información de ambos y realizar un procesamiento de milésimas 2.4. Herramientas a utilizar 17 Figura 2.2: Kinect sin su carátula. de segundo en su cerebro para aproximar la ubicación de la persona que le gritó. Este método no es exacto, pues resulta casi imposible saber exactamente en donde está la persona que gritó, pero se recibe información importante y suficiente para obtener una posición aproximada de la fuente de ruido. ? asegura que la llegada del Kinect es una revolución tecnológica y la compara con la invención de la computadora y del internet. Él acepta que de primera entrada la comparación puede parecer ridı́cula y exagerada, pero también comenta que en un inicio, la computadora sólo era una tecnologı́a de lujo para grandes compañı́as que nadie creı́a necesitar, y que el internet solo era una forma de entrelazar las computadoras del gobierno. El Kinect tiene un potencial enorme que está siendo utilizado cada dı́a en más aplicaciones que van desde el entretenimiento hasta la atención médica, o en el caso de este proyecto, la domótica, capaz de mejorar la calidad de vida de las personas con discapacidad. Arduino UNO El Arduino es un microcontrolador de hardware libre construido en una sola placa, concebido originalmente por un grupo de estudiantes en Italia y luego mejorado y optimizado para reducir su costo por varios investigadores más. El objetivo principal del Arduino fue crear una plataforma electrónica para prototipos fácil de usar y económica, haciéndola accesible para personas de cualquier clase social y nivel académico. Al ser una plataforma de hardware libre, el Arduino puede ser ensamblado por cualquier persona con el conocimiento técnico para construirlo o puede ser comprado preconstruido por algún distribuidor. Según ?, uno de los cofundadores de Arduino, el Arduino fue creado para que pudiera ser usado tanto por artistas, como por ingenieros. El Arduino tiene una serie de pines de entrada y salida, en conjunto con un puerto serial, que sirven para comunicarse con su entorno. El Arduino tiene pines de entrada tanto analógicos como digitales y el número de estos varı́a de 18 2 Antecedentes modelo a modelo. Para la realización de este proyecto se utilizará el Arduino UNO fabricado por Sparkfun Electronics. Esta tarjeta se puede ver en la figura 2.3. En la parte superior de la figura se pueden apreciar 14 pines digitales (013) que soportan PWM (Pulse Wide Modulation), y en la parte inferior, 6 pines de entrada analógicos (A0-A5). El puerto serial se encuentra debajo del botón de reset en la parte superior de la figura. Figura 2.3: Vista superior de un Arduino UNO La labor del Arduino en este proyecto será la de activar y controlar los actuadores instalados en la habitación cognitiva usando como entrada la señal de la computadora que ingresa por el puerto serial. Su salida será el gatillo de una electrónica externa que se debe diseñar para controlar cada actuador. El diseño de esta electrónica puede variar de actuador a actuador o no ser necesaria del todo. Todo esto será abarcado completamente en el capı́tulo de diseño de este trabajo. Actuadores Los actuadores pueden ser muchos equipos de uso común en una habitación, pero para el desarrollo de este proyecto se utilizarán: • Un interruptor para iluminación controlado por tensión. • Sistema de reproducción de música • Ventilador de dos velocidades 3 Diseño En la figura 3.1, se muestra el diagrama de flujo que sintetiza el proceso ya en funcionamiento de este proyecto eléctrico. La idea de hacer un diagrama de flujo del proceso a alcanzar, es tomar cada uno de sus bloques como un objetivo de diseño, y finalmente tener una guı́a de trabajo. Figura 3.1: Diagrama de flujo del proceso desarrollado En este capı́tulo se hará una pequeña guı́a para la instalación del equipo y el software necesario, luego se desarrollará exhaustivamente el algoritmo de identificación y procesamiento utilizado, pasando luego a la comunicación serial con el Arduino para finalmente concluir en la sección referente a los actuadores. 3.1 Software necesario para el procesamiento e instalación del equipo Como paso previo a cualquier desarrollo lógico, es importante garantizar que el equipo está correctamente instalado. Como se decidió trabajar con bibliotecas de software libre y no con el entorno de desarrollo oficial del equipo, la instalación del mismo puede resultar más complicada. En el apéndice Instalación del software necesario, se explica el procedimiento base, paso a paso, para instalar el equipo tanto en Windows como en sistemas operativos basados en Linux. Es importante seguir los pasos de instalación en el orden indicado, pues algunos pasos son dependientes del material instalado en partes anteriores. 19 20 3 Diseño Para ambos casos se decidió utilizar la versión más reciente disponible de OpenNI, OpenNI2 y de NITE, NITE2. La ventaja de utilizar estas versiones, es que tienen menos errores, son más precisas, no necesitan una calibración inicial para reconocimiento de esqueleto y ofrecen más funciones. La desventaja es que al ser tan nuevas y tener varios cambios importantes, resulta difı́cil que muchos usuarios decidan migrar, por tanto la cantidad de documentación de referencia es considerablemente más escasa. A partir del punto en el que está instalado todo el material necesario, el desarrollo y programación del algoritmo es indiferente al sistema operativo, fuera de la instalación, el proyecto se desarrolla igual tanto para Windows como para Linux. 3.2 Identificación y procesamiento de gestos utilizando Processing En este capı́tulo se abarcará el desarrollo del algoritmo, las pruebas realizadas, las alternativas con las que se experimentó, las razones por las cuales se descartaron esas alternativas, la alternativa utilizada para el desarrollo y las razones por las cuales se eligió. Alternativas exploradas Durante la realización de este proyecto se consideraron y probaron varias alternativas para solucionar el problema. Los elementos principales de decisión para estas alternativas fueron la fiabilidad, la precisión, el nivel de procesamiento necesario y la naturalidad de la interfaz para un ser humano. Fiabilidad se refiere a la probabilidad de que ocurra una acción programada al cumplir con los requisitos preestablecidos. La precisión es un término de medición, se refiere a la capacidad del algoritmo de obtener correctamente la información que se le solicita. El nivel de procesamiento se va a ver reflejado en la velocidad de ejecución de las acciones y en la fluidez con que se muestran las imágenes capturadas en pantalla. La naturalidad de la interfaz de usuario para un ser humano hace referencia a la facilidad que tendrı́a una persona promedio para adaptarse a la misma. Nubes de puntos La principal caracterı́stica de las cámaras de profundidad es la capacidad que tienen las mismas de ubicar puntos en el espacio. Con suficientes puntos es posible obtener un mapa de la superficie de un objeto o una persona, de forma muy similar a una 00 cáscara00 . Esta superficie hecha de puntos, en caso de que sea un usuario, se mueve con él, recolocando los puntos en el espacio. Si se 3.2. Identificación y procesamiento de gestos utilizando Processing 21 define uno o varios 00 lugares calientes00 , es posible combinarlos con los puntos y producir acciones. Un lugar caliente es un lugar en el espacio, determinado con anticipación, en el que, al entrar una cantidad definida de puntos, se toma una acción. Si se crean una serie de cajas como lugares calientes, y se toma una nube de puntos del usuario, es posible controlar actuadores al introducir partes del cuerpo, como la cabeza o las manos, en las cajas. Una captura de pantalla del programa que se creó para probar esta técnica se puede ver en la figura 3.2. Note como la nube de puntos está en azul, mientras que en verde se encuentran las cajas de los puntos calientes. Figura 3.2: Programa de puntos calientes y nube de puntos Esta opción fue descartada pues tenı́a un desempeño muy pobre en todos los criterios de decisión. La fiabilidad se veı́a comprometida por los otros tres aspectos. La precisión fue muy baja para una nube de puntos con pocos puntos (una muestra de cada mil), y moderada para una nube con bastantes puntos (una muestra de cada diez). El procesamiento fue mediocre para una nube 22 3 Diseño con pocos puntos con un retraso de aproximadamente dos segundos, y muy lento y pesado para una nube con muchos puntos, resultando en pantallas congeladas en ciertas ocasiones y un retraso casi constante de cerca de cinco segundos. La naturalidad de la interfaz fue precaria, pues las personas no están acostumbradas a tratar de tocar objetos que simplemente no están ahı́. Varias personas probaron la interfaz y evidenciaron una seria dificultad para ubicar las cajas en el espacio, aún viéndolas en la pantalla. Otra desventaja significativa fue la necesidad inminente de una pantalla para ubicar las cajas, dejando por fuera la posibilidad de desarrollar este sistema a futuro en un sistema embebido sin pantalla. Matriz de cuadros Se probó utilizando una matriz de cuadros en pantalla, segmentando en una cuadrı́cula la imagen capturada. El usuario se debı́a parar frente al Kinect y mover los brazos hacia adelante, tratando de ubicar las manos en los cuadros de la matriz. Cada cuadro activaba una acción, y ası́ se podı́a controlar los actuadores. En cuanto a fiabilidad, esta opción ofrecı́a una opción aceptable. Respecto a precisión, la matriz de cuadros presentaba ciertos problemas, pues de hacer los cuadros muy pequeños, resultaba muy difı́cil acertar a la hora de activarlos. Hacer los cuadros más grandes solucionaba este problema, pero reducı́a la cantidad de acciones posibles. El procesamiento era bastante bueno, pues no era muy exigente y se presentaba de forma fluida. La naturalidad para el usuario resultaba muy pobre, pues los usuarios tenı́an problemas para ubicar sus manos en comparación con la cuadrı́cula en pantalla. Además de todo esto, se descartó esta opción por ser completamente estática. En caso de que el usuario se moviera cuatro pasos a la derecha, el Kinect debı́a ser movido también, o la interfaz cambiaba espacialmente de forma drástica. La cuadrı́cula no se adapta al usuario, sino que el usuario se debe adaptar a la cuadrı́cula y esto resulta sumamente inconveniente y tedioso. Gestos de la biblioteca OpenNI El wrapper para Processing, SimpleOpenNI, incluye una pequeña biblioteca de gestos con varios movimientos, como agitar la mano o levantar los brazos, que pueden servir para iniciar una serie de acciones. Esta alternativa parece sumamente sencilla a nivel de programación, pero a nivel de uso presenta varias deficiencias. La fiabilidad es sumamente baja, al realizar pruebas con el gesto 00 wave00 o agitar la mano, el algoritmo interno de la biblioteca lo reconoció en algunas ocasiones y en otras no. También dependı́a mucho de la velocidad a la que se agitara la mano. La precisión, al igual que la fiabilidad, fue bastante deficiente. El procesamiento resultaba aceptable, pues solo perdió un poco de 3.2. Identificación y procesamiento de gestos utilizando Processing 23 fluidez a la hora de reconocer el gesto, por unos segundos y luego volvı́a a la normalidad. En cuanto a naturalidad, esta fue la opción más destacada de todas. Se realizó una prueba con una aplicación que utilizaba el gesto 00 wave00 y fue sumamente fácil de usar para todos los usuarios. A pesar de tener tan destacado desempeño en naturalidad, se decidió que no fue suficiente para compensar las deficiencias en los otros tres aspectos, razón por la cual se descartó esta alternativa. Rastreo de esqueleto La biblioteca OpenNI 2 ofrece una herramienta capaz de realizar rastreo esquelético de un ser humano. Esta herramienta identifica la silueta humana y luego coloca puntos en las articulaciones principales. Basta con un punto en cada codo, hombro, mano, rodilla, pie, cadera, uno en el torso, uno en el cuello y otro en la cabeza para construir un esqueleto funcional de una persona. Si se procesa solo la información de estos puntos, se ahorra una cantidad considerable de recursos en procesamiento y aumenta la fiabilidad drásticamente. La precisión presentó ciertas deficiencias aleatoriamente, pero estas eran rápidamente corregidas por el mismo algoritmo. Respecto a la naturalidad, esta opción no superó a la alternativa de la biblioteca de gestos, pero resultó enormemente más natural que las otras dos opciones, pues los usuarios no estaban lidiando con objetos invisibles, sino con las partes de su propio cuerpo. Otra ventaja considerable de esta alternativa es la versatilidad y dinamismo que tiene, pues el rastreo de esqueleto seguı́a aún cuando el usuario se moviera mucho respecto al Kinect. En caso de que el Kinect se moviera, seguı́a funcionando de igual manera siempre y cuando el usuario estuviese en el rango de visión del mismo. Es por todas estas ventajas que se decide utilizar esta opción sobre las demás. Para aprovechar el rastreo de esqueleto se creo un lenguaje especialmente para esta aplicación, mismo que será presentado de forma completa en la sección siguiente. Lenguaje de gestos CVHAAL CVHAAL son las siglas para el nombre del lenguaje creado para esta aplicación, y significa Computer Vision Hands and Arms Angle Language. Este lenguaje se basó en un ejemplo del libro Making Things See, en el cual ? presenta un pequeño brazo robótico que imita los movimientos de un brazo real, midiendo ángulos y reproduciéndolos. CVHAAL es un lenguaje de gestos basado en visión por computador, y aprovecha las posiciones de los brazos para formar palabras usando tres sı́mbolos. Estos sı́mbolos corresponden a ángulos formados con los brazos y los antebrazos. Es un malentendido común entender que la palabra 00 brazo00 , se refiera a toda la extremidad, pero realmente se refie- 24 3 Diseño re solo a la parte superior. Para el desarrollo de este trabajo se entenderá que el brazo es la parte superior de la extremidad y que la inferior es el antebrazo. Un modelo claro de este concepto anatómico se puede ver en la figura 3.3. Figura 3.3: Anatomı́a de las extremidades superiores El largo de cada palabra en este lenguaje será de cuatro elementos, los cuales se enuncian a continuación. • Ángulo entre el brazo izquierdo y el torso. • Ángulo entre el brazo derecho y el torso. • Ángulo entre el brazo izquierdo y el antebrazo izquierdo. 3.2. Identificación y procesamiento de gestos utilizando Processing 25 • Ángulo entre el brazo derecho y el antebrazo derecho. Los tres posibles sı́mbolos de este lenguaje, son los siguientes ángulos: • 0 (Ángulos entre 0 y 30 grados) • 90 (Ángulos entre 60 y 120 grados) • 180 (Ángulos entre 150 y 210 grados) Nótese como se deja un margen de seguridad de +/- 30 grados para asegurar que la acción sea activada aún cuando la posición no sea exactamente la indicada. Esto es importante ya que es muy difı́cil tanto que el programa mida los ángulos sin errores, como que la persona coloque sus extremidades con los ángulos exactos. Se realizarán varias pruebas en los extremos una vez implementado el lenguaje para verificar la tolerancia ante las variaciones en las posiciones. Programa en Processing Por su simplicidad visual y por lo efectivo que resulta su uso para el entendimiento centralizado, se utilizarán los diagramas de bloques para explicar el proceso programado. El diagrama de bloques del flujo del programa se puede ver en la figura 3.4. Figura 3.4: Diagrama de bloques del flujo del programa El código en sı́ del programa de Processing, puede ser segmentado en cuatro bloques; un bloque de configuración inicial, dos bloques con funciones auxiliares y un bloque principal que corresponde al ciclo central del programa. El bloque de configuración inicial es necesario para ejecutar este bloque central 26 3 Diseño por primera vez, mientras que los bloques auxiliares corresponden a funciones que el bloque central llama cuando las necesita. Configuración inicial Es necesaria una preparación de condiciones iniciales para poder realizar el procesamiento. El diagrama de bloques se puede seguir en la figura 3.5. Figura 3.5: Diagrama de bloques de la configuración inicial Notas de implementación: • El objeto kinect es de la clase SimpleOpenNI y va a ser el encargado de ejecutar todas las funciones de esa biblioteca, que corresponden a la adquisición de información del Kinect. • El objeto port es de la clase Serial, y corresponde al puerto serial por el cual se va a enviar la información al Arduino. • Las dimensiones de la interfaz son 640x480, dado que esas son las dimensiones de la imagen que capta el Kinect. • Se debe invertir la imagen en espejo horizontal, pues la perspectiva derecha-izquierda del programa es la del Kinect, no la del usuario. Si por ejemplo, se pide al Kinect la información vectorial de la mano izquierda y no se usa este reflejo, se obtiene la información de la mano izquierda vista desde el Kinect, que es la mano derecha del usuario. Funciones auxiliares En esta sección se muestran las dos funciones auxiliares que son llamadas por el ciclo principal al ser necesitadas. 3.2. Identificación y procesamiento de gestos utilizando Processing 27 La primera función es la encargada de realizar el dibujo del esqueleto, para esto se hace una serie de conexiones con las articulaciones obtenidas. En la figura 3.6 se puede ver el diagrama de bloques de la función drawSkeleton. Figura 3.6: Diagrama de bloques de la función encargada de dibujar el esqueleto. La segunda función se encarga de revisar la validez de la información obtenida de cada punto. El wrapper de OpenNI ofrece una función para verificar el margen de confianza de la información que recibe, de forma porcentual. Para esta aplicación se definió que un punto es válido si su margen de confianza es superior a 0.5 e inválido si es inferior a 0.5. El diagrama de bloques de esta verificación se puede ver en la figura 3.7. Ciclo central El ciclo central constituye el núcleo del programa. Es este el que se repite a una frecuencia lo suficientemente elevada como para que parezca que se procesa y se muestra en pantalla la información en tiempo real. En este segmento del código se actualiza la imagen, se procesa y se toma una acción, de forma repetida desde que se preparan las condiciones iniciales hasta que se detiene el programa. La forma más sencilla de entender el proceso y la ejecución del código es mediante un diagrama de flujo de draw(). En la figura 3.8 se encuentra en detalle el diagrama de flujo mencionado. Notas de implementación: 28 3 Diseño Figura 3.7: Diagrama de bloques de la función que determina la confianza de las medidas de los puntos • Un vector imagen es un vector en el que se guarda toda la información instantánea que capta el Kinect, es decir, en este se almacenan los valores que componen la imagen que se muestra en pantalla. • Un vector punto es un vector de tres elementos, uno por cada coordenada espacial. La primera corresponde al valor en el eje X, la segunda al valor en el eje Y y la tercera al valor en el eje Z. • Las ocho articulaciones de interés corresponden a las seis articulaciones básicas para nuestra aplicación y dos articulaciones necesarias para un eje de referencia. Las seis articulaciones básicas son los hombros izquierdo y derecho, los codos izquierdo y derecho y las manos izquierda y derecha. Los dos puntos de referencia son las caderas derecha e izquierda. Estos últimos puntos son necesarios para formar un eje con los hombros y ası́ poder medir el ángulo de estos. • A pesar de que se puede trabajar en tres dimensiones utilizando álgebra vectorial, especı́ficamente el producto punto, se decidió trabajar en dos 3.2. Identificación y procesamiento de gestos utilizando Processing 29 Figura 3.8: Diagrama de flujo del ciclo central del programa dimensiones, pues dos coordenadas bastan para generar un lenguaje lo suficientemente robusto para esta aplicación. • Los ejes de referencia son lı́neas que corresponden a la unión de dos articulaciones. El eje de referencia del ángulo de los hombros es una lı́nea que une el hombro con la cadera y el ángulo que se mide es el que 30 3 Diseño forma esta lı́nea con el brazo superior, que es la unión entre el hombro y el codo. El eje de referencia del ángulo del codo, es la lı́nea del brazo superior. Este último ángulo es el formado entre esa lı́nea y el brazo inferior, que es la lı́nea formada al unir el codo con la mano. Note que todas estas lı́neas son dinámicas y se mueven unas respecto a las otras. • Escribir un 255 equivaldrá a escribir un HIGH en la salida. • Escribir un 0 equivaldrá a escribir un LOW en la salida. • Los ángulos se muestran en pantalla tanto para verificar la verosimilitud de los cálculos, como para servir de herramienta de orientación para el usuario. Programa del Arduino El programa del Arduino será el encargado de manejar los actuadores, recibiendo un valor en la entrada por medio del puerto serial, analizando este valor y enviando una señal digital (5 V) a la salida. El código fue programado utilizando el entorno de desarrollo integrado Arduino IDE y su diagrama de flujo se puede seguir en la figura 3.9. 3.3 Comunicación por puerto serial La comunicación eficiente por puerto serial entre la computadora y el Arduino constituye uno de los objetivos de este proyecto, además de ser fundamental para el funcionamiento del mismo. Para la aplicación desarrollada, será necesario que la computadora escriba un dato en el puerto serial al procesar una posición especı́fica, o palabra de CVHAAL y que el Arduino lo pueda recibir para interpretarlo y llevar a cabo una acción. Para poder lograr esto, el programa en Processing debe cargar la librerı́a serial, definir el objeto que corresponde al puerto y escribir sobre ese objeto cada vez que el usuario se coloque en una de las posiciones programadas. Este dato queda escrito sobre el puerto, pero es necesario ahora inicializar el puerto serial en el Arduino e incluir en el ciclo principal la constante verificación de información en ese puerto. El Arduino estará constantemente revisando si le ha entrado algún dato en su puerto serial y, dependiendo de la información que tenga en él, activará o desactivará un actuador. Para verificar que el puerto esté disponible, se incluyó un LED verde que se enciende cuando el puerto está recibiendo información. En conclusión, la comunicación serial no es algo que se puede desarrollar por separado, como un bloque individual, sino que se debe incluir en dos partes en los programas principales. La primera parte, que envı́a la información, se 3.4. Actuadores 31 Figura 3.9: Diagrama de flujo del programa del Arduino programa en Processing, mientras que la segunda, que recibe información, se programa en el Arduino. 3.4 Actuadores Para demostrar el funcionamiento completo de la aplicación, hasta su etapa final, se diseñaron varios actuadores acoplados a la salida del Arduino. Al 32 3 Diseño funcionar correctamente el actuador, se puede afirmar que se han cumplido todos los objetivos del proyecto, pues para su correcto funcionamiento es necesario también que funcionen adecuadamente los bloques anteriores, tanto de captura de imagen y procesamiento de la misma como de comunicación serial. Para que el ejemplo de aplicación fuera lo más representativo posible, se eligió utilizar como un actuador una bombilla que simula la iluminación de una habitación tradicional. El segundo actuador acoplado a la salida fue un ventilador de dos velocidades. El tercer actuador no es un actuador fı́sico, sino una aplicación directa en la computadora. Este último corresponde a un reproductor de música sencillo. Bombilla El esquemático del circuito se puede ver en la figura 3.10. Se utiliza un relé de 5Vdc-125Vac, ya que la salida digital en alto de los pines del Arduino es de 5V. Esta salida está conectada a la base de un transistor que permite el paso de la corriente cuando la salida del Arduino está en alto, y lo impide cuando está en bajo. Como el Arduino no puede suministrar suficiente energı́a para alimentar el bombillo como lo podrı́a hacer con un LED, es necesario que se alimente el mismo de la forma convencional de una habitación, con la corriente de la instalación eléctrica de la vivienda, que son 120 volts en corriente alterna. El equivalente a un interruptor de pared, será el relé, y este estará cerrado cuando en la bobina hayan 5 Vdc y abierto cuando haya menos. Al cerrarse el relé, se enciende la bombilla y al abrirse se apaga. Es importante colocar un diodo de seguridad en paralelo a la bobina del relé para protegerlo. Nótese como se necesita una fuente de 5 Vdc externa también, pues el Arduino no es capaz de entregar la corriente que necesita la bobina del relé para cerrar el contacto en el otro extremo. Figura 3.10: Esquemático del circuito de la bombilla. 3.4. Actuadores 33 Ventilador En la figura 3.11 se puede revisar el esquemático que representa el circuito acoplado al ventilador a la salida del pin 9 del Arduino. Este ventilador es fundamentalmente un motor DC sencillo, el cual tiene dos velocidades posibles. La velocidad estará controlada por la salida del Arduino. Para esta aplicación se definió la salida del Arduino como una salida analógica, capaz de tomar valores entre 0 y 255. El valor que se escoja a la salida, será directamente proporcional a la velocidad del ventilador. Si el valor de la salida es 0, el ventilador está apagado, mientras que si está en 255, el ventilador gira a su máxima velocidad. Figura 3.11: Esquemático del circuito del motor DC Reproductor de música El actuador correspondiente al reproductor de música no es un actuador fı́sico convencional, sino más bien una aplicación de software. Este reproductor de audio tiene básicamente tres opciones, reproducir, pausar y detener. Para demostrar su funcionamiento, en este proyecto se utiliza la canción Sur le Fil, del pianista y compositor francés, Yann Tiersen. Para hacer esto posible, se utiliza la librerı́a para Processing llamada minim. Esta librerı́a fue diseñada 34 3 Diseño con el objetivo de utilizar clips de audio en aplicaciones y programas de Processing. Su funcionamiento es esencialmente igual al de un cassette, ya que al terminar una canción, debe ser rebobinada”, para que vuelva a empezar. El comando detener, realmente es una combinación de pausa y rebobinar. 4 Resultados Para el análisis de los resultados, se puede seguir el mismo diagrama de flujo de la figura 3.1. Es importante mencionar que los resultados de cada etapa, son absolutamente dependientes de los resultados de las etapas anteriores, por ejemplo, los resultados de las pruebas del lenguaje de gestos dependen de la eficiencia de la etapa de detección de esqueleto. De esto se puede deducir que la mayorı́a de los problemas y errores van a ser acumulativos conforme se avance en el diagrama de flujo. Luego de la instalación exitosa del software necesario, se procedió a programar varios algoritmos de procesamiento de imágenes de profundidad para determinar el más eficiente para esta aplicación. Los resultados de todas las opciones alternativas a la utilizada fueron pobres, por las razones expuestas en la subsección Alternativas Exploradas del capı́tulo de diseño de este mismo documento, razón por la cuál no se va a profundizar sobre ellas en este trabajo. Primeramente se presentan los resultados del algoritmo de detección y rastreo de esqueleto utilizado como herramienta principal de la interfaz de usuario. Una vez presentados estos, se mostraran los resultados de las pruebas de confianza y tolerancia realizadas al lenguaje de gestos creado para esta aplicación y finalmente, en una sola sección se exhibirán los resultados de la comunicación serial y los actuadores. 4.1 Algoritmo de detección de usuario y rastreo de esqueleto Para poner a prueba este algoritmo, se probaron, en condiciones de laboratorio, varios escenarios posibles que emulaban potenciales situaciones verdaderas en una habitación. Se inició partiendo del hecho de que el sistema está diseñado para detectar únicamente un usuario, y se diseñaron varios métodos de prueba pensados en sólo un usuario. Prueba del punto El primero de estos métodos fue para probar la precisión de las coordenadas en X,Y y Z de los puntos de las articulaciones. En pantalla se pueden mostrar bien los puntos, pero hay que considerar que la imagen que se puede proyectar en una pantalla sólo tiene dos dimensiones claramente verificables, la dimensión en Z, aunque se perciba naturalmente, es más complicada de verificar. Si bien para esta aplicación sólo se utiliza la información de las coordenadas X 35 36 4 Resultados y Y, se deseaba verificar la fiabilidad de la Z, pensando en dejar la aplicación abierta para un futuro desarrollo en tres dimensiones usando el mismo algoritmo y álgebra vectorial para calcular los ángulos. Para verificar la fiabilidad y dinamismo de esta coordenada y de las demás, se programó un punto rojo a dibujarse en cada articulación. Al acercarse el usuario al Kinect, el punto se hacı́a más grande y al alejarse, se hacı́a más pequeño. Con esta prueba se logró verificar que cada punto estuviera en el lugar anatómicamente correspondiente en dos dimensiones y en el espacio adecuado en cuanto a profundidad. Los resultados fueron satisfactorios, pues los puntos estaban siempre en el lugar adecuado cuando el usuario se mantenı́a estático. Cuando el usuario se movı́a, efectivamente los puntos se movı́an con él, todo esto de forma casi instantánea, por lo cuál se puede decir que la velocidad de procesamiento del algoritmo es bastante adecuada. En la figura 4.1, se pueden apreciar los resultados de la prueba del punto. Figura 4.1: Prueba del punto para la mano izquierda Limitantes fı́siscas del Kinect y pruebas con múltiples usuarios El algoritmo de detección de usuarios es capaz de detectar múltiples usuarios y asignarle una etiqueta de identificación a cada uno. Para esta prueba se le solicitó a varios usuarios que se pasearan por la habitación, frente al Ki- 4.2. Pruebas del CVHAAL 37 nect, entrando y saliendo de su rango de visión. A cada uno de los usuarios se le coloreaba de un color diferente y se colocaba el número de usuario en el centro de su cuerpo (dependiente del orden en el que el Kinect lo detectó). En condiciones normales los resultados fueron satisfactorios, pero en ciertas condiciones se presentaron dificultades causadas por las limitantes fı́sicas del Kinect. El Kinect es primordialmente una cámara de profundidad, dispara una lluvia de puntos infrarrojos y luego obtiene la posición de esos puntos. El problema es que esos puntos chocan con el primer objeto que encuentren en su trayectoria, por tanto, si el objeto de interés está detrás de ese obstáculo, no será percibido parcial o totalmente. En varias de las pruebas el algoritmo de detección dejaba de funcionar correctamente al poner sillas altas o escritorios delante del usuario en cuestión. En el caso de múltiples usuarios, el algoritmo dejaba de funcionar correctamente al colocarse un usuario en frente del otro. A pesar de que esto es un problema, no resulta muy importante para el alcance de este proyecto, pues el mismo está diseñado solamente para un usuario, sin obstáculos de por medio. Otra limitante fı́sica del Kinect con la que se experimentaron problemas, fue con la luz. El Kinect bien puede funcionar en una habitación sin luz (lo cual es necesario, pues en caso de querer encender la luz en una habitación oscura esto debe ser posible), pero tiene problemas cuando hay una fuente de luz frontal y excesiva. Este escenario se presentó al colocarse al usuario entre el Kinect y una ventana grande, con la luz del atardecer. En estas condiciones el Kinect dejó de detectar imágenes de profundidad del todo, mostrando sólo una pantalla en blanco. 4.2 Pruebas del CVHAAL Una vez probado extensivamente el algoritmo de reconocimiento de usuario y rastreo de esqueleto, se realizaron las pruebas del lenguaje de gestos con los brazos. Para estas pruebas se verificó primero que los ángulos fueran medidos de manera correcta. Para esto se colocó en el código un bloque para mostrar en pantalla los ángulos calculados e identificar a qué parte del cuerpo correspondı́an. Una vez verificado esto, se revisaron todas las posiciones de prueba que se programaron en esta aplicación, además de hacer pruebas para Psi y Abrazo, tanto en la medida de sus ángulos como en su tolerancia a las pequeñas diferencias de posiciones similares, pero que no tengan exactamente los mismos ángulos, por ejemplo, Psi con los antebrazos un poco más abiertos o abrazo con el cuerpo inclinado hacia un lado o los brazos más bajos. Para demostrar el reconocimiento de las posiciones, se programó la acción de mostrar en pantalla Luz Encendida con la posición abrazo y Luz Apagada con la posición Psi. 38 4 Resultados Los resultados fueron positivos, probados en varios usuarios de ambos géneros y diferentes contexturas. En la figura 4.2 se observan cuatro variaciones ligeras de la posición Psi, con usuarios de ambos géneros. Note como los ángulos no son exactamente 90 en cada caso, pero de todas formas se activa el comando de apagar la luz. La tolerancia coincide con la programación, y es de +/- 30 grados en cada articulación. Figura 4.2: Variaciones de la posición Psi con usuarios de ambos géneros A pesar de esto, esta acción presentaba un problema. Al ser activada realmente por los ángulos que forman los miembros y no por la posición exactamente, varias posiciones que forman esos ángulos también disparaban la acción, como por ejemplo formar sólo ángulos de 90 grados, pero con una mano apuntando hacia abajo y la otra hacia arriba. En la figura 4.3 se puede ver uno de estos casos. Esto puede resultar problemático a futuro, ya que ciertas posiciones no programadas podrı́an disparar comandos no deseados. Otro problema de esto es que desaprovecha posiciones que podrı́an ser utilizadas para otros comandos, reduciendo la lista de posibles acciones a dispararse. Para solucionar este problema se propuso considerar también el valor de la coordenada Y de las manos comparada con la de los codos. En el ejemplo de la figura 4.3, se corrige el problema agregando la condición de que ambas coordenadas Y de las manos deben ser mayores que las de los codos. Se realizaron pruebas similares con la posición abrazo. Los resultados fue- 4.3. Pruebas de comunicación serial y actuadores 39 Figura 4.3: Posición con ángulos iguales a Psi que dispara la misma acción ron igual de satisfactorios que los anteriores. En la figura 4.4 se muestran cuatro variaciones de la posición en usuarios de diferente género y en todas el resultado fue positivo. 4.3 Pruebas de comunicación serial y actuadores La última etapa del proceso es la de los actuadores, pero sin la comunicación serial implementada correctamente, esta no puede funcionar. Como estas etapas son mutuamente dependientes, se probaron juntas. El objetivo de la comunicación serial es tomar un dato del procesamiento de la computadora y pasarlo al Arduino para que este dispare una acción. Para probar este funcionamiento, se desarrolló el programa más sencillo posible. Al presionar una tecla especı́fica en el teclado de la computadora se escribı́a un uno en el puerto serial y al presionar otra, se escribı́a un cero. El Arduino se programó para que, al recibir un uno, encendiera un LED y, al recibir un cero, lo apagara. El diseño básico funcionó sin complicaciones. LA siguiente prueba fue implementar el mismo actuador LED, pero activado por la posición abrazo y desactivado por la posición psi. El LED se encendió y apagó de manera casi instantánea, a tal punto que se podı́a hacer parpadear al agitar los brazos. 40 4 Resultados Figura 4.4: Variaciones de la posición Abrazo con usuarios de ambos géneros Este resultado significó poder afirmar que el proceso completo presentaba una interfaz no solo funcional, sino que altamente confiable y eficiente. El retraso fue tan corto que resultó casi imperceptible. Finalmente se realizaron pruebas con el actuador de iluminación, con el cuidado de utilizar una fuente de tensión externa para la bobina del relé, pues de utilizarse la tensión de 5V estática del Arduino, a este se le solicitarı́a más corriente de la que puede entregar, el bombillo no encenderı́a y el Arduino se podrı́a dañar permanentemente. El diseño con este actuador funcionó con la misma velocidad que el LED, concluyendo satisfactoriamente la etapa de pruebas completa. 5 Conclusiones y recomendaciones Para la última parte de este informe, se presentan una serie de conclusiones y recomendaciones. Las conclusiones están basadas primordialmente en los objetivos del proyecto y los resultados del mismo. Las recomendaciones se formularon pensando en formas de optimizar el proceso y hacerlo más natural o intuitivo para el usuario. Conclusiones • OpenNI es una librerı́a confiable y suficientemente robusta como para soportar aplicaciones de interfaces de domótica. • Processing es un lenguaje de programación completamente compatible con OpenNI y no presenta dificultades adicionales para implementar aplicaciones de interfaces de domótica. • El Arduino es una plataforma de hardware con capacidad suficiente para controlar actuadores recibiendo la información de activación por puerto serial, sin agregar un retraso perceptible. • No sólo es posible, sino que es altamente confiable y eficiente controlar actuadores en una habitación utilizando visión por computador. • Un lenguaje de gestos con los brazos resulta nuevo para la mayorı́a de usuarios, pero estos se adaptan muy rápidamente a este una vez que entienden cómo funciona. • La aplicación de esta interfaz, por estar limitada a los movimientos de los brazos, resulta una alternativa que aporta un alto grado de accesibilidad a todos los elementos de una habitación para una persona con discapacidad, adulta mayor o con capacidades fı́sicas disminuidas. Recomendaciones • Agregar un comando de disparo para iniciar a reconocer las posiciones. Este comando puede ser uno de voz, o una posición del mismo lenguaje de gestos. Esto servirı́a para evitar que actuadores se activen accidentalmente por movimientos naturales de la persona, como estirar los brazos. 41 42 5 Conclusiones y recomendaciones • Trabajar en el desarrollo de la aplicación en un microcomputador, como un Beaglebone, para ası́ perder la dependencia de la computadora portátil, reducir el consumo energético y el tamaño fı́sico del equipo. • Una vez desarrollado el proceso en un microcomputador, diseñar un solo paquete que contenga al microcomputador programado y al Arduino conectados. Este paquete tendrá en sus puertos de entrada uno de alimentación, dos puertos para conectar ambas tarjetas con la computadora en caso de necesitar reprogramarlas, y un puerto serial para conectar el Kinect. Sus puertos de salida serán para conectar conductores que llevan una tensión de control para un elemento actuador externo. Estas señales de salida pueden ser analógicas o digitales, dependiendo del actuador y la aplicación. • Mejorar el algoritmo de cálculo de ángulos utilizando producto punto en vez de una reducción a dos dimensiones. • Elaborar un documento con todas las posiciones de los brazos posibles para programar acciones, asignarles un código, programar esos códigos y ası́ permitir que el usuario programe más acciones con solo ingresar el código. • En caso de que no se siga la recomendación anterior, pero sı́ las anteriores a esta, desarrollar un sistema empaquetado con las posiciones preprogramadas y asignadas a cada una de las salidas. Con esto el usuario sabrá que, por ejemplo, al hacer la posición psi, se pondrá en alto el pin 8. A Instalación del software necesario A.1 Instalación en Linux Utilizar software libre tiene una ventaja muy grande, facilita el desarrollo a futuro del proyecto en sistemas embebidos. Existen muchas distribuciones de Linux para micro-ordenadores, como lo es Raspbian, un sistema operativo basado en Debian para RaspberryPi. La ventaja de estos micro-ordenadores es que son mucho más económicos que un ordenador convencional, como lo es una portátil. Desarrollar el sistema en un micro-ordenador excede el alcance del proyecto, pero se plantea desde ya como una opción de desarrollo optimizado para el futuro. A continuación se presenta una guı́a paso a paso para la instalación en sistemas basados en Linux, incluidos los comandos a introducir en la terminal: 1. Instalación de paquetes que son prerequisitos para la instalación sudo apt get install build-essential python libusb-1.0-0-dev Además de: sudo apt get install openjdk-7-jdk freeglut3-dev 2. Instalación de OpenNI • Crear el directorio kinect y abrir la terminal ahı́ mkdir /kinect ; cd /kinect • Descargar OpenNI git clone https://github.com/OpenNI/OpenNI.git -b unstable • Abrir la terminal en el siguiente directorio: cd OpenNI/Platform/Linux/CreateRedist • Crear el archivo Redist bash RedistMaker • Ir a la carpeta del archivo creado cd ../Redist/OpenNI-Bin-DevLinux-x86*/ • Correr el archivo de instalación sudo ./install.sh 3. Instalación de Sensor Kinect. Sensor Kinect contiene todos los drivers necesarios para el funcionamiento del Kinect. • Abrir la terminal en la carpeta kinect cd /kinect 43 44 A Instalación del software necesario • Descargar los drivers git clone https://github.com/avin2/SensorKinect • Abrir terminal en el siguiente directorio cd SensorKinect/Platform/Linux/CreateRedist • Crear el archivo redist bash RedistMaker • Ir a la carpeta del archivo creado, en terminal cd ../Redist/SensorBin-Linux-x86* • Correr el archivo de instalación sudo sh install.sh 4. Instalación de NITE • Descargar NITE de la página de OpenNI • Abrir terminal en el directorio kinect cd /kinect • Descomprimir el archivo tar jxvf nite-bin-linux-x86-v2.0.2.tar.bz2 • Abrir terminal en el siguiente directorio cd NITE-Bin-Dev-Linuxx86*/Data • Modificar los permisos chmod a+w * • Abrir el archivo vi ∗ .xml y modificar la llave de licencia < Licensevendor = ”P rimeSense”key = ”insertkeyhere”/ > ingresando 0KOIk2JeIBYClPWVnMoRKn5cdY4= en el lugar indicado. • Regresar un directorio cd .. • Instalar sudo ./install.sh 5. Descargar Processing. No es necesario instalarlo, basta con descomprimir la carpeta y correrlo. 6. Descargar SimpleOpeNI y descomprimirlo en la carpeta de bibliotecas de Processing. A.2 Instalación en Windows La ventaja de la instalación en Windows con OpenNI2, es que la actualización incluyó un soporte de los drivers oficiales del Kinect, los creados por Microsoft, que son mucho más fiables, pues sirven en casi cualquier computadora sin presentar mayores complicaciones. A.2. Instalación en Windows 45 1. Instalar el SDK de Kinect for Windows. Esta instalación incluye todos los drivers necesarios para el Kinect. No es necesario descargar ni instalar las librerı́as de Microsoft, pues esas no se van a utilizar. 2. Instalar OpenNI2. En muchos casos, como en el de la computadora en la que se desarrolló este proyecto, se presentan problemas con las versiones de 64 bits y no se puede ejecutar OpenNI2. Para solucionar este inconveniente, se encontró que la solución es instalar las dos versiones, tanto la de 32 bits como la de 64 bits. 3. Instalar NITE2. Si la computadora es de 64 bits, se debe proceder de igual manera que en el paso anterior, instalando ambas opciones. 4. Descargar Processing, este no necesita instalación, solo se ejecuta cuando se necesita. Al ejecutarse por primera vez crea una carpeta en la que se guardan todas las bibliotecas y programas guardados, para los pasos siguientes es importante conocer en donde está esa carpeta. 5. Descargar el wrapper SimpleOpenNI, descomprimirlo y guardarlo en la carpeta de librerı́as de Processing mencionada en el paso anterior.