Informe - Escuela de Ingeniería Eléctrica

Anuncio
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.
Descargar