Universidad Nacional del Nordeste Facultad de Ciencias Exactas, Naturales y AgrimensuraProyecto Final de Carrera Ingeniería en Electrónica 2013 Tema del proyecto: “Clasificador inteligente de objetos con visión artificial utilizando un brazo articulado” Alumnos: Fernández, Diego Ibarra, Alexis Gabriel Profesor: Lombardero, Oscar Guillermo Contactos:
[email protected] (Ibarra Alexis)
[email protected] (Fernández Diego)
[email protected] (UNNe, FaCENA) Agradecimientos Dedicamos esta página, para salvar una deuda afectiva con todas las personas que estuvieron cerca y lejos, pero siempre presentes y siempre dispuestos a ofrecer su apoyo sin importar las circunstancias. A nuestras familias, en especial a Sequi, Axel, Ailen, Olga, Gabriel, Erica, Tony, Ceci, Merce y Javi. A Carolina. A Jimena. A Luciano Zini, Juanjo Cochia, Aquino Carlos, Julian Veglia, y todos nuestros amigos, profesores, compañeros y conocidos. Agradecemos a estas personas que estuvieron siempre, que nos brindaron apoyo y fuerzas en el transcurso de nuestra carrera, y que contribuyeron con opiniones, objeciones, ideas, cuestiones, preguntas, y todo tipo de aportes indispensables para haber logrado nuestro objetivo. Se agradece profundamente el tiempo que nos dedicaron a nosotros y al proyecto. procesarlas y controlar el movimiento del brazo robótico. utilizando el mismo hardware desarrollado y a través de la captura de los movimientos de la mano del usuario. en donde se utilizó la visión artificial para la detección de las posiciones y las características de los objetos (color y tamaño). para que luego puedan ser manipulados por un brazo robot. Los mismos son capaces de adquirir imágenes. el control del brazo robot. Adicionalmente se desarrolló una aplicación que permite.Resumen En este proyecto final se implementó un sistema clasificador de objetos. Para el logro del proyecto se desarrollaron programas y algoritmos utilizando el lenguaje de programación Python. las librerías OpenCV y Qt. y las plataformas de hardware Arduino y Pinguino (herramientas de código abierto). . El tiempo de desarrollo completo del proyecto fue de aproximadamente un año. ......................................2......................................................................2.....1...................... 9 2............................2. 14 2.......3......................... 23 3...............................4.. Brazo Robot......................................................................2.....................................4.....................4 PC ................................2...................... Área o zona de trabajo .............................1............... 7 2..... Hardware de control ....................................................................................2....3..... 32 3............................................................................. ¿Qué es tiempo real? .............................1 Python .................. 42 4.........................................................................Índice General Índice General: 1.............................. 6 2.......................... 40 4................................5....................... 9 2..................................................................................5............... Procesamiento digital en una secuencia de imágenes (video) ............2.......... Procesos principales. 42 4...........2......1................................................................ 7 2............2......................................................... Interfaz gráfica .............. 16 2............2 Herramientas ....................................1............................................... 37 4...................................................................................... 25 3.....4.... 21 3..................... Software del microcontrolador .......... 34 3........................................... Introducción: ................ Introducción ...................................3..................................... 44 4.............. 10 2.................................................................................1....... Algoritmos Específicos ....................................................... Hardware: Diseño de la plataforma de visión artificial ......................................... 28 3...................... Tasa de datos ............................... 22 3. 37 4......2.................... OpenCV .. Software: Diseño y desarrollo del software especializado ....2.............................1............................2................................................3..................................... 43 4...............................................................................1.....................................................3.......................... 36 4...... 36 4.....2...................................... Editor de texto Gedit......................... Introducción: ...................................2...1........................................................ Acondicionamiento y transformaciones básicas ......................................... Diseño y construcción de soporte.......................................................................2...................2............................... Componentes: .................................................................................................................. 34 4.......................2....2......................2.................................... Arduino IDE .............. 22 3........................................ Procesamiento digital de imágenes .............................................. Sensores ópticos ........................................................2.............2.............. 41 4.............................. 6 2..2.................2..1...... 5 2........................... 9 2............................ 39 4........3......... 33 3.............2......4............................... 24 3....................................1..................1................ Materiales y métodos de construcción......................... 47 1 .......... 21 3. 17 3....2........ Captura... Reconocimiento de ciertos objetos en imágenes .......2...................................................................................3................ Fundamentos teóricos: Visión por computadora ...................1.........................1........................................................................................ Qt4 y Qt4 Designer (librería e IDE para interfaz gráfica) ............................. Cinemática .........................2.......3............................ Algoritmos básicos .2....................... Aplicación 2: Interfaz inalámbrica usuario-robot ........................................................................2....................1........1....................................2. Webcam ........................... 12 2....................1.............................................................................. Introducción: .. Aplicación 1: Reconocimiento de objetos .....2..........................................1.2..................... ................... 64 6...................................................................1........1............. Anexo A: Programa del microcontrolador ....................4..................................................................................................................................................................1. Anexos .............Índice General 4.....1................................. Brazo Robot.......................................................................................... 58 5......... Conclusiones ................................................. 53 5.................................................................................... Implementación: Ensayos y resultados ............................................................. 65 7............................2............ Bibliografía ................................................ Procesos principales. 67 8..... 67 2 .............................................. Interfaz gráfica .................................................. Aplicación 2 .......4............................................................................................................................................................ 66 8........... 50 5............ 53 5.................................................................................................................................. 48 4..... 60 6............... Aplicación 1 ......................................3...................2....................... Trabajos futuros ..... .................................................... ......... 6: Ventana principal de la aplicación 1........................................... 1: Arquitectura del proyecto.. ................ 12 Figura 2...... 14 Figura 2...................... 7: Resolución del histograma................ 3: Entorno de desarrollo Arduino... 8: Estudio de Cinemática.............. ..................................................................................... 10: Representación del brazo robot en 3 dimensiones ...................................... 28 Figura 3......................... 12: Pasos sucesivos para aislar un objeto de interés de una imagen capturada..... 47 3 .............. ................ 40 Figura 4......................................................................................... 13: Webcam utilizada................. 22 Figura 3.. 24 Figura 3................ .................................................................. ........................................... 41 Figura 4.. 13 Figura 2............................. .............................. .......................................... 4: Ejemplo de smoothing.......................... 8: Pestaña “Configuración”.. 45 Figura 4................................. 2: Arquitectura de una plataforma de visión artificial................................ 4: Tubos de PVC utilizados......................................................................................... 12: Valores extremos de θ............................. Figura 2.................................. 4: Editor de textos Gedit.............................................. 13: Línea de montaje industrial......................................................... 7: Estructura del software del microcontrolador ....... 20 Figura 3............... implementada con equipo especializado............................................ ...................... 14 Figura 2........................................ .............................. 8 Figura 2......Índice de figuras y Tablas Índice de Figuras: Figura 1....... 10 Figura 2..................... 30 Figura 3.................... 27 Figura 3........................ 5: Procesos de la aplicación 1........ 2: Etapa de AOI.................... 16 Figura 2........................... 3: Detección de fallas en un circuito impreso............................... .. ......................... 18 Figura 2..................................................................................................................................................... 9: Representación gráfica del brazo robot........................................................... 29 Figura 3.............. ............................................ 2: Qt Designer utilizado para el diseño del GUI.................................. 3: Brazo robot desarrollado ............. ...................................................................... . ....... 21 Figura 3...................................... 46 Figura 4.......................................................................... 14: Soporte realizado.................... 15: Cirugía a distancia................................................ .................. 37 Figura 4........................ 1: Esquema de las relaciones entre la visión por computadora y otras áreas afines......... 19 Figura 2................................. ....................... 10: Estudio de convexidad................... 8: Inscripción de una geometría... 26 Figura 3....... 8 Figura 2......................................................................................................................... 14: Filtro predictivo de Kalman... 31 Figura 3.............. .................................................. ................................. 34 Figura 4....................... 5: Ejemplo de erode......................................... 6: Ejemplo de ThresHold............................................ 11 Figura 2.... 5: Servos Hitec HS-311 y HS-55 utilizados........................................ ¡Error! Marcador no definido.................. 7: Pestaña “Iniciar”......... 13 Figura 2.. ...... ..... 43 Figura 4............................................... 23 Figura 3........................................... 1: Arquitectura del proyecto............................................ ................. 11: Esquematización del funcionamiento de MeanShift.......... 9: Aproximación polinómica........................... .................................................................... 42 Figura 4.. 33 Figura 3.......... 17 Figura 2........ 22 Figura 3... 1: Pasos seguidos en la elaboración del software........................................................................................ 6 Figura 2........... ............................ ..................................................................................................... ... 6: Señales de control de un servomotor ... 29 Figura 3...................................................................... ....... ......................................... 11: Representación del brazo robot en 2 dimensiones.............................................................. ................ ..... ................................... 51 Figura 4....Índice de figuras y Tablas Figura 4................ 57 Tabla 5................ 8: Relación área de la mano cerrada a altura............... 3: Mediciones de posicionamiento del ángulo de la base.............. 4: Mediciones de posicionamiento del ángulo de la base..................................................................................................... 7: Mediciones de área de la mano cerrada................................................................. 59 Tabla 5............... 1: Mediciones de posicionamiento en X........ 5: Mediciones de área de la mano abierta.................................. .. 48 Figura 4.................... 2: Mediciones de posicionamiento en Z... 4: Medición de posiciones de objetos.................................... 61 Figura 5....................... 62 Figura 5.......... . ......... 50 Figura 4......................................................... 62 Figura 5... ..................... 9: Diferencia entre áreas...................................................................................... 39 Tabla 5........................... 59 Figura 5. 55 Tabla 5... 52 Figura 5.................................... ........................... ............. 57 Tabla 5.............................................................. 1: Crecimiento de los lenguajes de programación.......... 11: Pestaña “Inicio”.......... ............ ............................................................................................................ 3: Mediciones de posicionamiento corregido en Z.................................... 54 Tabla 5..... .......................................................... 1: Comparación entre las plataformas Arduino UNO y Pingüino 4550...... 63 Índice de Tablas: Tabla 3........... 61 4 ........... 61 Tabla 5.......................... 2: Mediciones de posicionamiento en Z.......................... 58 Figura 5..... 55 Figura 5............................. ......................... 56 Figura 5...................................................... 5: Mediciones de posicionamiento del ángulo de la base..................... 7: Relación área de la mano abierta a altura................................................................... ..... ............................................. 9: Procesos de la aplicación 2..................... .............................. 10: Ventana principal de la aplicación 2........................ ............................................................ 25 Tabla 4....... 12: Pestaña “Configuración”....... 1: Mediciones de posicionamiento en X................................................................ 62 Figura 5................................................................ 6: Mediciones de área de la mano abierta......................................................... 6: Mediciones de área de la mano cerrada................................ en donde un brazo robot pueda manipular autónomamente los objetos a su alrededor (aplicación 1). Actualmente cumplen tareas de manipulación. logística. Gracias al avance en los sistemas computacionales y las tecnologías empleadas. Introducción 1. en donde los autómatas puedan realizar tareas con algoritmos de decisión y que no requieran ser reprogramados continuamente. Estos sistemas se componen de cámaras de video especializadas encargadas de adquirir imágenes y de funciones y algoritmos cuyo objetivo es la obtención de información para el control de un proceso. electrónica. la automatización es el paso más allá de la mecanización. manufactura. fármacos. como aplicación adicional. La unión de la visión computacional con la robótica permitirá el desarrollo de plataformas de manufactura flexibles.. rápida y con menores riesgos para los operarios. La realización del proyecto nace de la idea de juntar ambas tecnologías. Uno de los avances más importantes fue la incorporación de robots o autómatas a las líneas de producción industriales. en donde los procesos industriales son asistidos por máquinas o sistemas mecánicos que reemplazan las funciones que antes eran realizadas por el ser humano. cuando empresas de EEUU empezaron a interesarse por la robótica. sobre temas puntuales como programación. Para el logro de dichas tareas estos robots deben ser previamente programados con rutinas que deberán realizar repetitivamente. 5 . entre otros. el control del brazo robot por medio de la captura de movimientos de la mano del usuario (aplicación 2). madera. mecánica. robótica. fue el de incorporar a los procesos industriales y administrativos las nuevas tecnologías computacionales inteligentes como los sistemas de visión por computadora (mediados de los noventa). Introducción En el enfoque industrial. autodidactas. Se decidió realizar. ensamble y transporte de objetos. etc. linux. manufactura. y mucho más reciente. se procedió a la realización del proyecto previa búsqueda de información y elección de las herramientas a utilizar.1. Valiéndose únicamente de conocimientos previos. Su uso ha ido en aumento desde fines de la década de 1970. Actualmente se utilizan para tareas de control de calidad en los sectores de las industrias de packaging. Con esta idea en mente se optó por la realización de un sistema clasificador de objetos. Otro avance importante. generando una producción más eficiente. cada vez más procesos pueden ser automatizados. segmentación. Fundamentos teóricos: Visión por computadora 2. Seguimiento de un objeto en una secuencia de imágenes. Introducción: Figura 2.1. registro). Registro de diferentes imágenes de una misma escena u objeto. también conocida como visión por computador (del inglés computer vision) o visión técnica. segmentación. caras humanas).2. La visión artificial. es decir. localización y reconocimiento de ciertos objetos en imágenes (por ejemplo. El propósito de la visión artificial es programar un computador para que "entienda" una escena o las características de una imagen. es un subcampo de la inteligencia artificial. 6 . hacer concordar un mismo objeto en diversas imágenes. Los objetivos típicos de la visión artificial incluyen: ● ● ● ● La detección. Fundamentos teóricos: Vision por computadora 2. La evaluación de los resultados (por ejemplo. 1: Esquema de las relaciones entre la visión por computadora y otras áreas afines. procesar e interpretar los resultados. por una lente convergente que proyecta la imagen sobre una superficie sensible a la luz denominada sensor de imagen o sensor óptico. Captura La captura de imagen representa el front-end del sistema en el cual intervienen las cámaras y adquisidores de imágenes.2. En campo de aplicación es entonces muy diverso. se implementaron principalmente las siguientes tareas: ● ● ● ● Reconocimiento de ciertos objetos en imágenes. Evaluación de resultados (respuestas del autómata). Matemáticamente una imagen se representa por r=f(x. 2. tratamiento matemático de matrices y análisis estadístico.2. desde el punto de vista de los cálculos. ● La tarea de implementar un sistema de procesamiento digital de imágenes involucra capturar. Fundamentos teóricos: Vision por computadora ● ● ● Mapeo de una escena para generar un modelo tridimensional de la escena. Esto quiere decir. A continuación se presentan los conceptos básicos relacionados con el procesamiento de imágenes [2]: ● ● Pixel: elemento básico de una imagen. verde y azul (RGB).2. que una imagen a color está representada matemáticamente por 3 arreglos bidimensionales de píxeles (matrices). Color: el color se forma mediante la combinación de los tres colores básicos: rojo. cuyas coordenadas son (x. formadas. 2. La visión artificial cognitiva está muy relacionada con la psicología cognitiva y la computación biológica. Estos objetivos se consiguen por medio de reconocimiento de patrones. teoría de grafos y otros campos. Seguimiento de objetos en una secuencia de imágenes Serie estadísticas de decisión.y). uno para cada color básico. al igual que el ojo humano. Búsqueda de imágenes digitales por su contenido. aprendizaje estadístico. Imagen: arreglo bidimensional de píxeles con diferente intensidad luminosa (escala de gris). geometría de proyección. En el prototipo desarrollado. procesamiento de imágenes. 7 . Involucra. este modelo podría ser usado por un robot para navegar por la escena.y) en donde r es la intensidad luminosa del pixel. filtrar o acondicionar.1. Procesamiento digital de imágenes El procesamiento digital de imágenes se define como el campo que se encarga de manipular imágenes digitales con el objetivo de mejorarlas o identificar cierta información relevante. Estimación de las posturas tridimensionales de humanos. como ser luz UV. con el propósito de detectar fallas en la placa final. donde un capacitor electrolítico fue puesto al revés.2. infrarroja o rayos X. como muestra en la figura 2. en la etapa de AOI (automatic optic inspection. Por ejemplo. 8 . Figura 2. Tomando sucesivas fotos el equipo detecta. se utiliza un equipo especializado. 3: Detección de fallas en un circuito impreso. inspección óptica automática) en una línea de ensamblaje y soldado de placas electrónicas. entre otras cosas. Fundamentos teóricos: Vision por computadora Existen diversos sensores ópticos con varias configuraciones de conexión. que se vale de cámaras de 5Mpx y de iluminación propia de rayos X e infrarrojo. Figura 2.3. malas etiquetas en los componentes. En algunos se provee de iluminación externa específica para la aplicación. 2: Etapa de AOI. 1. Dicho valor está determinado por la persistencia de una imagen en la retina del ojo humano. Entonces esto lleva a definir un margen mínimo de fps (frames por segundo) necesario para que un sistema de captura de imágenes sea interpretado como de tiempo real. Sensores CMOS son generalmente más susceptibles al ruido pero consumen 100 veces menos potencia. En la práctica el margen mínimo está en el orden de los 15 fps. escucha. Además puede capturar partes de la imagen no teniendo que transmitirla completamente. Los sensores son realizados en dos tecnologías. sin importar si en realidad son secuencias discretas de datos.2. que es de 16 ms. se emplean sensores en configuración de línea. puede plantearse la siguiente situación: se debe guardar video de una cámara digital.1. Estos sensores suelen estar configurados en forma matricial de modo que proporcionan una imagen bidimensional. con una resolución de 1. Si los fotogramas pasan demasiado lento se percibirá una “secuencia por pasos”. También. durante un minuto seguido a una frecuencia de fotograma de 30 fps. El ejemplo más clásico es el del video en una cinta con fotogramas. ¿Qué es tiempo real? Se puede decir que tiempo real es una interpretación de una persona que visualiza.4 Gbits 9 . incluso más que un juego en red. 2.3. se utilizan para aplicaciones de medida. como el cine.2.3 Mpx (1280 x 960) y con una profundidad de color de 16bits.2. lo que permite la captura de los puntos que conforman la imagen. Un cálculo rápido da el tamaño del buffer requerido y la tasa de datos que deberá manejar el sistema: Buffer = 1280 * 960 * 30 * 60 * 16 = 35. Sensores ópticos Los sensores digitales de imagen están formados por una serie de foto sensores que modifican su señal eléctrica según la intensidad luminosa que reciben. sumada a la persistencia de la corteza visual que oscila entre 100 y 400 ms.2. gracias a su grado de integración electrónica. es decir una secuencia de imágenes.1. 2. La tecnología CMOS es la más económica y ofrece un menor tamaño. a nivel industrial. que dada sus altas resoluciones. Como ejemplo. La tecnología CCD es la que proporciona mejor calidad de imagen y con menor ruido. principalmente en CCD y en CMOS.2. siente o interpreta una secuencia multimedia como si fuera “fluida” o continua.1. Fundamentos teóricos: Vision por computadora 2. Tasa de datos La reproducción de video y video en vivo son los archivos multimedia que más ancho de banda requieren para su correcto funcionamiento. Si bien existen varias herramientas.4 se detallan los principales algoritmos de procesamiento de video utilizados. los cuales generalmente son de 32bits y 12Mpx. ya que muchos de estos algoritmos son recursivos. Esto condiciona a los desarrolladores. 2. Fundamentos teóricos: Vision por computadora Bit Rate = Buffer / 60 = 590 Mbits / seg Ambos son números difíciles de manejar a menos que se cuente con un servidor dedicado o un clúster.2.2. es decir. Por otro parte puede decirse que el análisis y estudio de las imágenes relacionadas como secuencia de video es el punto crítico de todo sistema de visión artificial. En la sección 2. mucho del contenido matemático y fundamental implementado en el procesamiento de imágenes es válido para el procesamiento de video. a generar y programar sus propios algoritmos de procesamiento de video. el procesamiento de video es diferente para cada sistema. A continuación se describen las principales funciones de acondicionamiento y transformación aplicadas a imágenes: Figura 2. sin ser funciones específicas para tal fin.2. Por lo tanto. como en el caso de este proyecto. Vale la pena aclarar que no se usaron parámetros reales de profundidad de imagen y resolución de píxeles. no pueden aplicarse a imágenes discontinuadas o aisladas. muchísimas veces. La principal diferencia existe en los estudios de tipo estadístico predictivo y el análisis de objetos particulares en una secuencia de video. 10 . 4: Ejemplo de smoothing. métodos y funciones que OpenCV provee para tal finalidad [1]. Acondicionamiento y transformaciones básicas Básicamente el procesamiento de video es el procesamiento de imágenes aplicado a una secuencia de imágenes sucesivas y relacionadas. Como puede verse. empezando por la imagen superior izquierda. En la figura 2. Figura 2. difumina o elimina los cambios o flancos abruptos de color en una imagen. la erosión “achica proporcionalmente” los cuerpos u objetos cerrados y lo opuesto hace la dilatación. En openCV la función se llama cv. y son prácticamente un filtro pasa banda de color de ventana cuadrada.4 puede verse la aplicación del smoothing a una imagen. Erode y Dilate Los algoritmos de erosión (erode) y dilatación (dilate) rara vez aparecen independientes.2. también proporcionalmente al área del objeto.5 se muestran cuatro etapas de erosión consecutiva. El mismo deja pasar sólo las 11 . y son transformaciones de tipo morfológicas.Smooth() [1] [3]. por eso se los agrupa como un solo método. Threshold Los algoritmos de umbral (ThresHold) se aplican también a imágenes en escala de grises. Se aplican a imágenes grises (escala de blancos entre 0-255). obteniendo como resultado la imagen ubicada a la izquierda de la figura. 5: Ejemplo de erode. ya que matemáticamente hablando hacen una convolución en toda la imagen desplazando un kernel (o ventana superficial). En la figura 2. Fundamentos teóricos: Vision por computadora Smoothing El smoothing o difuminado hace exactamente lo que dice su nombre. donde en cada eje se representa una característica de la imagen. 6: Ejemplo de ThresHold. es un gráfico de tipo estadístico de dos ejes. Fundamentos teóricos: Vision por computadora intensidades de color que estén dentro del rango especificado. Lo más utilizado es el gráfico de dos ejes.2. 12 . Histograma El cálculo de un histograma es básicamente una mensura de los componentes que integran una imagen. Para usos aislados.2. etc. 2. Figura 2. DFT y IDFT La DFT aplicada a una imagen no es más que una DFT bidimensional y se aplica siempre a imágenes en escala de grises. Aquí el concepto de “frecuencia y periodo” se ven ligeramente modificados ya que eso depende de la tasa de imágenes por segundo que tengamos y del tamaño de la misma. Algoritmos básicos Dentro de esta sección de algoritmos básicos se detallan las funciones que involucran una o varias de las transformaciones básicas nombradas en la sección anterior. color . este último generalmente del mismo tamaño que la imagen. rara vez se ve superada por la convolución espacial (transformada del kernel). cantidad-valor.cantidad.6 esquematiza bastante bien lo que representa un histograma en una imagen y en donde puede verse que la resolución del histograma depende del tamaño de la grilla.valor. La utilización de la DFT es muy específica y generalmente parte de algoritmos más complejos. o bidimensional. La figura 2. por ejemplo color . como parte de la tarea total que realizan.3. Se usa habitualmente para binarizar imágenes. muy lento.Para que dicho algoritmo se ejecute adecuadamente. figura 2. figura 2. Los métodos existentes para detectar contornos son muy diversos.8. 8: Aproximación polinómica. Contours La detección de contornos realiza un seguimiento recursivo de flancos de color en una imagen. pero básicamente hay 3: ● ● ● Inscribir una geometría conocida (cuadrado o círculo). La detección de contornos es algo sencillo y fundamental en el procesamiento digital de imágenes y videos. Figura 2.9. la imagen debe tener ciertas características como ser: estar binarizada. Aproximación polinómica (interpolación). velocidad moderada. poseer contornos detectables y que los contornos sean de valor 1 y el fondo 0. 7: Resolución del histograma.2. muy rápido. Fundamentos teóricos: Vision por computadora Figura 2. Todas estas características se logran con las funciones previamente descriptas en el apartado anterior. Búsqueda cruda (analiza cada pixel). 13 . Algoritmos Específicos Se distingue entre un algoritmo básico y específico basándose en las siguientes consideraciones: 14 . se utilizan la mayoría de dichos estudios. análisis geométrico. en donde las letras determinan los defectos de convexidad detectados. A partir de la obtención de contornos se pueden realizar diversos tipos de análisis. incluyendo momentos. 8: Estudio de convexidad. Fundamentos teóricos: Vision por computadora Figura 2. lo mostrado en la figura 2. por ejemplo. la concordancia y la convexidad. obteniendo como resultado. En la detección de manos.2. 9: Inscripción de una geometría. Figura 2. concordancia.10.4. etc.2. destacando el uso de los momentos. estudio de convexidad. 2. busca recursivamente el centro de masa de la “distribución de interés”. Con todo esto. entre otras cosas. Un algoritmo específico permite utilizar la información fundamental para interpretar detalles de la misma. 4) Re-centra la ventana si el punto 3 genera un punto central distinto. El algoritmo intenta. Ambos valores están basados en una distribución de probabilidad aportada generalmente por un histograma previo calculado en la imagen. comparar dos contornos para evaluar un índice de similitud entre 0 y 1. o se cumplan con el número máximo de iteraciones seteadas. básicamente.10. se ejecuta varias veces para una sola imagen. 2) Detecta una posición inicial de búsqueda y un tamaño fijo para la ventana. Es la manera más simple de comparar contornos que ofrece OpenCV y se basa en obtener el “centro de masa” de un contorno en cuestión. Entonces. Ambos algoritmos se ejemplifican en la figura 2. 15 . haciéndolo por pasos: 1) Meanshift elige una ventana (un sector de la imagen) y define su tipo y geometría. Un algoritmo específico siempre depende de uno básico para poder efectuarse. por ende. Moments Usa como argumentos los contornos de una imagen. el punto central del contorno.2. El número de defectos puede indicar. si es convexo. Los resultados de un algoritmo específico son más abstractos que los de los algoritmos básicos. 3) Calcula el centro de masa de la ventana (basado en probabilidad). requieren de un post-procesado para adecuarlos al entorno. genera una “cáscara” geométrica asociada al contorno. es decir. etc. 5) Retorna al punto 3 hasta que la diferencia de posición de dos centros de masa obtenidos sea menor que un delta definido. y detecta y describe en variables de salida la convexidad del contorno. el número de dedos extendidos que tiene el usuario en ese momento. determinar una ventana fija que involucre una porción de la imagen que tenga una “probabilidad” de interés definida por un histograma previo. más precisamente. Fundamentos teóricos: Vision por computadora a b c d Un algoritmo básico permite separar información fundamental de la imagen. MeanShift and Camshift Meanshift es un algoritmo de tipo recursivo pues intenta determinar posiciones en varias pruebas sucesivas. ConvexHull and ConvexDefects El algoritmo se basa en contornos como argumentos. Esto muchas veces es más que suficiente para obtener otros parámetros como ser: el área. Una de ellas se basa en saber “a priori” algún dato del objeto a identificar. por ejemplo. 2. se puede decir que CamShift es un algoritmo similar a MeanShift. aislar y procesar objetos de interés que representen información importante para el usuario.11 se da un ejemplo gráfico del funcionamiento de MeanShift. la forma. La tarea de identificar objetos en una imagen o secuencia de video se divide prácticamente en dos ramas independientes *1+. Fundamentos teóricos: Vision por computadora Figura 2. ®. Las flechas indican el desplazamiento recursivo de la ventana. Obviando algunas diferencias menores. el concepto de “cara de una persona” a la cara de cualquier persona. Por dar un ejemplo. Reconocimiento de ciertos objetos en imágenes En esta sección se explican las secuencias de algoritmos utilizadas para extraer. identificar. Implementó cerebro artificial autónomo de búsqueda que 16 .2. En la figura 2.2. a nivel comercial. Este último método es el de mayor interés actualmente. Además vale aclarar que no están basados en color sino en probabilidad. La otra rama se basa en identificar un objeto sin saber a priori datos exactos del mismo. para asociar. tamaño. CamShift y MeanShift son algoritmos de seguimiento básicos que proveen un método rápido para implementar seguimiento en tiempo real. etc. puede ser el color. disminuir o mantenerse en el mismo tamaño. Esto ofrece una mayor robustez y abstracción de capas de procesamiento. algoritmos predictivos y estudios estadísticos profundos.5. esta rama se fundamenta en Redes Neuronales. el tamaño de la misma va cambiando a medida que se ejecuta. hace unos meses Google inc. lugar. El tamaño de la ventana de búsqueda puede crecer. 9: Esquematización del funcionamiento de MeanShift. pero en vez de utilizar una ventana fija. en comparación a al método de conocer datos previos. 17 . Al cabo de unos días el cerebro artificial identificó perfectamente lo que era un gato. 10: Pasos sucesivos para aislar un objeto de interés de una imagen capturada. hay que definir algún método o algoritmo para lograr identificarlo en sucesivas muestras de imágenes. Es por ello que para efectuar algunas tareas se requiera el diseño de algoritmos complejos valiéndose de algoritmos básicos. Aquí es fundamental el análisis estadístico. Procesamiento digital en una secuencia de imágenes (video) El seguimiento de un objeto una vez aislado no es una tarea sencilla.4. identificar “¿qué es un gato?”. El método de auto aprendizaje es extremadamente complejo y experimental. Vale aclarar que todas estas etapas son aplicadas a cada imagen que captura la cámara. solo el texto entre comillas y la posibilidad de buscar imágenes en internet.2. Figura 2. Como se dijo anteriormente.12 se grafican los pasos que se siguen para lograr aislar un objeto de interés.3. en donde la metodología usada es detectar un objeto conociendo su color y tamaño. En la figura 2. muchas veces no encuadran con las necesidades del sistema en particular. A continuación se detallan algunos. A dicho sistema no le dio ningún otro dato. los algoritmos y funciones prediseñadas.11. Fundamentos teóricos: Vision por computadora tenía una sola tarea. en donde el objeto de interés ya se encuentra aislado. Suponiendo que se parte de los resultados de la figura 2. 2. Los algoritmos utilizados se describen en la sección 4. situación que puede verse en la figura 2. el algoritmo vuelve a ejecutar esta tarea de evaluación de criterios. será este y solo este objeto. Estimación de posición futura de un objeto Siguiendo con el ejemplo de la figura 2. Entonces. todos estadísticos.2. además de inferir la posición futura. relacionar esta posición con el “retardo” que tendrá el robot hasta llegar al objeto en cuestión. Figura 2. el rastreado a lo largo de la imagen. Esto último genera interés cuando un brazo robot o cualquier autómata debe actuar sobre el objeto en movimiento. Existen varios métodos. suponiendo que ya se tiene identificado el objeto a seguir. se debe plantear algún algoritmo que permita saber su posición futura en la imagen en función del movimiento que este objeto realiza. por lo tanto es necesario. se procede a analizar tamaños de los objetos presentes en la imagen basándose en criterios seteados previamente por el usuario.12 sub-imagen 5 a 7. como lo ilustra la Figura 2. como se muestra en la figura 2. Una vez que el objeto encuadre dentro del criterio especificado. Fundamentos teóricos: Vision por computadora Identificación de objetos Una vez aislados los objetos de interés.12 en su sub-imagen 4. a una línea de montaje industrial. por ejemplo. 11: Línea de montaje industrial. 18 . una situación que puede plantearse es que el objeto puede ir desplazándose en la imagen de manera similar.13. Una vez que el objeto esté fuera del área de trabajo.12. 2. Fundamentos teóricos: Vision por computadora Se utiliza el método de interpolación lineal con el cual se asumen 2 características fundamentales de la línea de montaje: 1 2 La velocidad es constante, es decir, matemáticamente es un movimiento rectilíneo uniforme (MRU). El objeto no cambia de forma a medida que se mueve dentro de la imagen. Con los dos axiomas nombrados es sencillo determinar la posición futura aplicando un método de interpolación lineal entre sucesivas imágenes. Para lograr que el brazo llegue en el momento preciso al objeto deseado debe vincularse la velocidad de movimiento del objeto con el retardo que tenga el autómata en actuar y llegar a destino. La realidad dice que este retardo depende de la distancia recorrida, o más precisamente, del algoritmo de movimiento empleado por el robot. Otros continuación: ● ● ● algoritmos para inferir la posición futura son, por ejemplo, los que se listan a Filtro predictivo de Kalman Interpolación polinómica Flujo óptico Figura 2. 12: Filtro predictivo de Kalman. Estabilización de datos (filtrado de ruido) Otra cuestión importante es el filtrado de datos erróneos o ruido. Es un algoritmo aplicado, por ejemplo, a la detección de la mano del usuario. En esta aplicación el principal ruido lo proporciona el pulso o inestabilidad del usuario. Errores en la interpretación del movimiento provocados por un pulso inestable se pueden traducir en catástrofes, dependiendo del entorno en el que se utilice el sistema. 19 2. Fundamentos teóricos: Vision por computadora Por dar un ejemplo, si se está realizando una cirugía a distancia como la esquematizada en la figura 2.15, si no se filtrara el ruido de la inestabilidad del médico, se podría asegurar que la operación no sería exitosa. Figura 2. 13: Cirugía a distancia, implementada con equipo especializado. Una solución para el filtrado del ruido se realiza básicamente con un promedio general o filtro promediador digital. Consiste simplemente en incluir los valores obtenidos de posición en un registro de desplazamiento de n valores del cual se debe hallar su promedio continuamente. Esto permite que las variaciones en el movimiento del autómata sean más suaves y más lentas. Obviamente este filtro puede mejorarse mucho, incluso es posible agregar análisis de ruido blanco, con lo cual se eliminarían movimientos muy pronunciados que no son reales. 20 3. Hardware: Diseño de plataforma Vision artificial 3. Hardware: Diseño de la plataforma de visión artificial 3.1. Introducción: Una plataforma de visión artificial consiste en la implementación de un sistema de captura y procesamiento de imagen a un sistema dinámico. El sistema de captura es el encargado de recoger las características del ambiente u objeto de estudio y proporcionar los datos para su procesamiento, por medio de una imagen digital. El procesamiento consiste en la aplicación de algoritmos y transformaciones de las imágenes de forma de obtener la información necesaria para manipular el sistema dinámico y realizar la tarea asignada. La Figura 3.1 esquematiza, didácticamente, como quedó constituida la estructura del hardware del proyecto, también se idealizan las conexiones entre componentes de la arquitectura. Figura 3. 1: Arquitectura del proyecto. 21 Componentes: A continuación se describen en detalle los componentes que integran la plataforma de visión artificial desarrollada. 3.2.2. 2: Arquitectura de una plataforma de visión artificial. 3.2. El autómata construido se muestra en la figura 3. Figura 3.3. Hardware: Diseño de plataforma Vision artificial Los componentes básicos de una plataforma de visión artificial se presentan en la figura 3. Brazo Robot El brazo robot es el sistema dinámico de la plataforma encargado de interactuar con el medio exterior. Figura 3. 3: Brazo robot desarrollado 22 .2.1. Es por ello que se optó por la utilización de los denominados servomotores. Un servomotor es un actuador mecánico basado en un motor de corriente continua y un conjunto de engranajes que permiten multiplicar el torque del sistema final. Su elección se debió a que se caracteriza por ser un material dúctil. Esta característica nos permitió la fácil fabricación de las piezas del brazo robot. 23 . Para la fabricación de las piezas se reciclaron tubos de PVC para la conducción de agua. Por otro lado se requería la motricidad de las articulaciones del brazo robot de manera controlada y estable.1. Hardware: Diseño de plataforma Vision artificial 3. Además mantiene la forma dada y propiedades una vez enfriado a temperatura ambiente. se dibujaron. el cual posee un sistema de control para poder controlar su posición. por lo que se vuelve flexible y moldeable sin necesidad de someterlo a altas temperaturas.1. lo cual facilita su modificación. Esto permite que mediante una determinada señal eléctrica se obtenga una respuesta mecánica controlada. cortaron y moldearon las distintas piezas. por lo que se necesitaba la incorporación de un sistema de control mediante encoders para poder controlar su posición y corregir las eventuales pérdidas de pasos. Figura 3. Los mismos se cortaron longitudinalmente. estable y altamente resistente. 4: Tubos de PVC utilizados. El mismo comienza a reblandecer alrededor de los 80°C y se descompone sobre los 140°C.3. Una vez obtenidas las planchas. se calentaron en agua hirviendo y se aplanaron de tal forma de obtener planchas de PVC.2. Materiales y métodos de construcción Para la estructura del brazo robot se utilizó como material principal el PVC (policloruro de vinilo). Las mismas fueron diseñadas previamente considerando los tamaños de los servos a utilizar y las dimensiones del brazo deseado. Este requerimiento no lo podía cumplir un motor paso a paso debido a que el mismo es un sistema a lazo abierto. Hardware: Diseño de plataforma Vision artificial Se utilizaron los siguientes servomotores comerciales: ● ● ● ● ● ● Base: Hitec HS-311 Hombro: 2x Hitec HS-311 Codo: Hitec HS-311 Muñeca: Hitec HS-311 Muñeca Rotacional: Hitec HS-55 Pinzas: Hitec HS-55 En el anexo se incluye la información técnica de servomotores y los datos de cada uno. tanto su diseño como su distribución. A continuación se muestra una tabla comparativa entre ambas placas: 24 . Por otro lado la plataforma Pingüino 4550 está formada por un microcontrolador PIC 18F4550 de la empresa Microchip. Para la alimentación del conjunto de servos se utilizó una fuente de PC de 250W. 5: Servos Hitec HS-311 y HS-55 utilizados.7A a 5V. El consumo máximo medido del brazo robot fue de 2.2. La elección de dichas plataformas está fundamentada por las facilidades que ofrecen a la hora de desarrollar hardware para proyectos multidisciplinares. y ofrecen un entorno de desarrollo y librerías libres. Figura 3. La plataforma Arduino UNO en particular está formada por un microcontrolador Atmega328 de la empresa Atmel y puertos de entrada/salida. 3. Las mismas son plataformas de hardware libres.2. Hardware de control El hardware de control es el encargado de ser la interfaz física entre la PC (encargada del procesamiento de imagen) y el brazo robot. Su función principal es la de recibir comandos y datos por parte de la PC. y generar las señales necesarias para accionar los servos a través de sus puertos I/O. Para el logro de dichas tareas se optó por la utilización de las plataformas de hardware Arduino UNO y Pingüino 4550.1.3. Esto quiere decir que pueden utilizarse libremente para el desarrollo de cualquier tipo de proyecto sin haber adquirido ninguna licencia. 27 U$S (DigiKey) 3. la función principal que debe cumplir el microcontrolador es la de recibir instrucciones y datos por parte de la PC y generar las señales necesarias para el control de los servos. 25 . Esto significa que si se deja de enviar la señal de control en el tiempo en el que el servomotor lo necesita. Característica Voltaje operativo Pines de I/O Pines de entrada analógica Corriente por cada pin I/O Memoria Flash SRAM EEPROM Frecuencia USB Nativo Precio Arduino UNO (Atmega328) 5V 14 (6 PWM) 6 40 mA 32 KB (0.6). éste (a pesar de estar energizado) dejará de mantenerse en la posición preestablecida y adoptará cualquier orientación regida por el esfuerzo al que esté sometido.1.2. 1: Comparación entre las plataformas Arduino UNO y Pingüino 4550.2.5 KB reservados) 2 KB 1 KB 16 MHz No 26. De esta forma.3. Los servomotores se controlan mediante impulsos de ancho variable que deben refrescarse periódicamente (figura 3.1. Hardware: Diseño de plataforma Vision artificial Tabla 3.39 U$S (DigiKey) Pingüino (PIC 18F4550) 5V 20 (2 PWM) 8 25 mA 32 KB (8 KB reservados) 2 KB 256 Bytes 20 MHz Si 23. Software del microcontrolador Como se dijo en la sección anterior. el sistema de control seguirá operando y el servo conservará su posición y se resistirá a las fuerzas externas que intenten cambiarlo de posición. Para fijar la posición de un servomotor es necesario enviarle continuamente la señal con la posición deseada. 3. 26 . 6: Señales de control de un servomotor Los procesos realizados por el software diseñado se muestra en la figura 3. Hardware: Diseño de plataforma Vision artificial Figura 3.7 y a continuación se detallan cada uno de ellos. 2 3 27 . inmediatamente recibe los valores de los ángulos que deben adoptar cada uno de los servos. Determinación de acción a realizar: Una vez que se produce la recepción de un dato. el mismo es analizado para determinar si se trata de una instrucción y luego. Hardware: Diseño de plataforma Vision artificial Figura 3. 7: Estructura del software del microcontrolador 1 Bucle de espera y recepción de instrucción: La comunicación puede realizarse en cualquier momento. por lo que fue necesario realizar una rutina en donde se espere la recepción de un dato en el puerto UART Rx. ○ ‘ir’: es la instrucción que envía la PC cuando es necesario que el brazo se ubique en una determinada posición (utilizada en la aplicación 2). Las instrucciones posibles son: ○ ‘co’: esta instrucción es enviada por la PC cuando necesita saber si el microcontrolador se encuentra conectado. si es el caso. por lo que es necesario hacer la conversión de cadena (string) a entero (int) utilizando la función atoi().3. Los datos recibidos son cadenas de texto. ya sean instrucciones o valores de ángulos. Recepción de los ángulos de cada servomotor: si el microcontrolador recibe el comando ‘bu’ o ‘ir’. ○ ‘bu’: es la instrucción de búsqueda de un objeto (utilizada en la aplicación 1). determinar la tarea a realizar. 650. 2350). 0. Cinemática La cinemática [13] forma parte del extenso estudio de la robótica cuyo objetivo final es el de obtener un modelo matemático preciso del robot. y como su nombre lo indica. ● Cinemática Directa: Conjunto de ecuaciones que relacionan el valor de cada una de las coordenadas articulares con la posición del extremo (efector) del robot en coordenadas espaciales y su orientación. La velocidad de transmisión debe ser lo más alta posible para que no se produzca un retardo considerable entre el envío de datos y el movimiento del robot.35 ms) utilizando la función map(x. o una cadena de 3 unos si la misma debe abrirse. ● Figura 3.3. 3.2. 180. Conversión de ángulos a duración de pulsos: Se realiza el mapeo de los ángulos recibidos (entre 0 y 180°) a los valores de duración de pulsos (de 0. Hardware: Diseño de plataforma Vision artificial 4 Recepción del estado de la pinza: esta tarea solo se realiza si el comando recibido fue ‘ir’. 5 6 La comunicación con la plataforma de hardware se realiza por USB a través de un puerto COM virtual. A su vez comprende dos análisis: cinemática directa y cinemática inversa. 115200 Baudios. 28 . Es por ello que el control de los cambios de estado de cada uno se realiza por interrupciones del timer. Por este motivo se utilizó la máxima velocidad posible. para que su movimiento sea controlado. 8: Estudio de Cinemática.65 ms a 2. El microcontrolador recibe una cadena de 3 ceros si la pinza del brazo robot debe cerrarse. De esto se encarga la función servo. el estudio cinemático de un robot permite obtener un modelo matemático que representa el comportamiento cinemático del robot.3.1. Dichos trenes de pulsos deben permanecer activos simultáneamente y durante la ejecución de las demás instrucciones. Control de la posición de cada servo: se generan los trenes de pulsos en cada puerto de salida para el control de los servos.writeMicroseconds(). Cinemática Inversa: Algoritmo o conjunto de ecuaciones que representan los valores de las “N” coordenadas articulares en función de los valores de posición y orientación requeridos en el extremo del robot. Particularmente. En el anexo se incluye el código fuente del software desarrollado. 9: Representación gráfica del brazo robot. Particularmente. el análisis de cinemática inversa. obtener las ecuaciones de cinemática inversa. estará definida la complejidad de las mismas. Figura 3. 10: Representación del brazo robot en 3 dimensiones 29 . En la figura 2. Figura 3. por despeje. debido a que la aplicación no requería gran precisión. y según la precisión que se quiera lograr. ya que era necesario contar con una expresión matemática que permita obtener las posiciones que deben adoptar cada servo para que el extremo del brazo alcance una coordenada deseada.3.8 se puede ver la representación gráfica del brazo robot en donde los círculos son puntos de flexión y los triángulos representan puntos de rotación. Hardware: Diseño de plataforma Vision artificial Fue de interés. Existen distintos métodos y herramientas matemáticas para lograr dicho estudio. particularmente. para luego. se optó por utilizar el método geométrico [4]. El método elegido requirió primero la obtención de las ecuaciones de cinemática directa. Hardware: Diseño de plataforma Vision artificial Conocido el punto P(x. z) donde se encuentra el extremo del brazo.10. Figura 3. La fórmula lineal a utilizar es: 30 . como se muestra en la figura 2. son: Para la obtención de las ecuaciones de cinemática inversa deben despejarse los valores de . dado un punto P(x. y.3. debe adoptar el valor de 90°. para poder independizarnos de la variable se propuso que adopte posiciones entre 0° y 90° según la distancia x deseada. por lo que su obtención reduce el problema a dos coordenadas (x’ e y’). se realizó el mapeo a coordenadas cilíndricas ( P(x’. Esto quiere decir que. y para alcanzar el punto más lejano posible. El ángulo corresponde al ángulo que debe adoptar la base del brazo robot. y’) ). y en función de x’ e y’. dados los valores de x’ e y’. se trata de un sistema de dos ecuaciones y tres incógnitas. z). debe adoptar el valor de 0°. Por lo tanto. Las ecuaciones de cinemática directa obtenidas.11 puede notarse que para que el extremo del brazo alcance un punto cercano. 11: Representación del brazo robot en 2 dimensiones. y. se tendrán infinitos valores de ángulos que cumplen dicho sistema. . Como puede verse. En la figura 3. De esta forma.3. y. son: 31 . De la ecuación Se utilizaron las siguientes identidades trigonométricas para despejar . z). Figura 3. Hardware: Diseño de plataforma Vision artificial Siendo Xmáx y Xmín el alcance máximo y mínimo del brazo robot. el problema se redujo a la obtención de los valores de de y’ se despejó . para obtener los valores de ángulos de cada articulación del brazo robot. dado el punto P(x. las ecuaciones de cinemática inversa que deben realizarse. y . expresados en centímetros. 12: Valores extremos de θ. Resumiendo. para luego ser reemplazado en la ecuación de x’. a precios accesibles. para que sea compatible con el software a desarrollar *11+. En el mercado local se ofrecen webcams de muy buena calidad con soporte UVC. este precio eleva considerablemente el costo del proyecto. Por este motivo se optó por una webcam de calidad regular y con soporte UVC. de fabricación china y con un precio rondando los 10U$S. marca Seisa. y que resultan ideales para la aplicación.2. La primera es la de poder contar con una calidad de imagen tal que permita el desarrollo del proyecto. 32 . era necesario que se trate de un dispositivo del tipo UVC. Por otro lado.2. alrededor de 100 U$S. “USB video device class”. que para el prototipo fue adecuada. Hardware: Diseño de plataforma Vision artificial Siendo: 3. Webcam Para la selección del sensor óptico se tuvo en cuenta que el mismo debía cubrir dos necesidades. De todas formas.3. Hardware: Diseño de plataforma Vision artificial Figura 3. 33 . que permite trabajar en tiempo real con los siguientes parámetros: ○ ○ ○ ○ Resolución: 640X480 Fps: 15 a 30 fps Color: 8 bits Ajustes: automático o manual. El sistema de software desarrollado implementa imágenes de resolución 640x480. 13: Webcam utilizada.2.1. color de 8 bits. Diseño y construcción de soporte La aplicación requiere que el dispositivo adquisidor de imágenes se ubique por encima del brazo robot y enfocando el área de trabajo.4. 3. Esto condiciona la PC a utilizar.3. Fue realizado en madera y cuenta con 4 niveles de altura.2. Para lograr esto y darle mayor movilidad al sistema (portabilidad) se diseñó y fabricó un soporte para la webcam. la tasa de datos mínima que el sistema debe manejar es de 30 Mbits/s.2. condición que se describe más adelante en la sección 3. Dichas alturas están en función de las distancias necesarias para implementar la visión artificial del sistema. Posee un sensor óptico CMOS. Por lo tanto. ya que depende del procesamiento que se realice entre capturas. y fps a demanda. es decir no existe un mínimo ni un máximo. Área o zona de trabajo En una plataforma de visión artificial la iluminación del ambiente cumple un papel muy importante. permitiendo y facilitando la extracción de los rasgos de interés para la aplicación.3. se debe proporcionar al sistema de condiciones de iluminación uniformes e independientes del entorno. Con esto se conseguiría una imagen sin sombras y con alto contraste. 34 . Dado que la plataforma desarrollada es portable. gracias a que los objetos son iluminados en todas direcciones con luz difusa. Comunicarse con el hardware de control del brazo robot. Dado que la imagen se forma a partir de la luz que reflejan los objetos. Controlar el buen funcionamiento de todos los elementos hardware. 3. 3. Brindar la interfaz gráfica al usuario. 14: Soporte realizado. es necesario que el ambiente en donde se ubique cuente con una iluminación omnidireccional y difusa. para favorecer la detección de objetos se requiere de un fondo contrastante. Cumpliendo con estas dos condiciones se logró un correcto funcionamiento del sistema. preferentemente de color blanco o negro.4 PC El sistema de visión artificial debe contar con un sistema computacional que se encargue de las siguientes tareas: ● ● ● ● ● Realizar la lectura de las imágenes.2. Por otra parte. Hardware: Diseño de plataforma Vision artificial Figura 3. Procesar los datos proporcionados por la cámara para realizar el análisis de imagen (realización de los algoritmos y transformaciones de las imágenes).2.3. 35 . sistema operativo Windows 7 o Linux. Hardware: Diseño de plataforma Vision artificial Una condición limitante es la tasa de datos que debe manipular la computadora anfitriona.2. en donde la tasa de transferencia máxima posible es de 480 Mbits/s (60 MB/s).0. por lo que no es posible su utilización. debe ser capaz de manejar un flujo continuo de datos de 30 Mbit/s como mínimo. pues. 1. como se dijo en la sección 3. placa de video integrada con 256 Mb dedicados.5 GB de memoria RAM.2. El puerto USB en su versión 1. Por lo tanto. cabe destacar que el núcleo o intérprete python administra de la mejor manera los recursos de memoria y CPU necesarios. Además. dos puertos USB 2. los requisitos mínimos que debe cumplir la PC a utilizar son: procesador de 2GHz.0. El sistema de software y hardware de la plataforma se diseñó para que pueda ser utilizado en cualquier computadora estándar de escritorio o notebook. Esto se puede lograr utilizando puertos USB 2.3.1 admite una tasa de 12 Mbits/s. se requieren soluciones rápidas y concretas dejando de lado las premisas de portabilidad. En esta sección se presentan las herramientas utilizadas. LabView. para una solución del tipo ingenieril en donde generalmente el sistema de cómputo no es el punto central del estudio. que un sistema desarrollado íntegramente para una solución particular es altamente sensible a fallos y probablemente inflexible al momento de querer ampliar sus características. permiten esas características y aúnmás. librerías y módulos libres y de código abierto. la descripción del software desarrollado. pero se caracterizan por requerir mucho más conocimiento en programación.4. flexibilidad y estructura o gramática del software. Software: Diseño y desarrollo del software especializado 4. a costa de tener un mayor tiempo de desarrollo. Por dar ejemplos. pero esto implica un costo.1. pero son plataformas privadas donde se requieren licencias pagas para uso. 36 . Entonces. ¿Existen soluciones de software libre? Dentro de las plataformas GNU o BSD hay infinidad de opciones y de comunidades. National Instruments. o algún dispositivo inteligente. El desarrollador sabe. Software: Diseño y desarrollo del software especializado 4. así como también. etc. Para lograr flexibilidad.1. la Suite de Matlab.. además. Entonces. una PC. principalmente por sus problemas de actualización. distribución y edición de contenidos. dependiendo el caso). portabilidad y la posibilidad de realizar futuras mejoras al software especializado se decidió desarrollarlo íntegramente utilizando herramientas de programación. El software fue desarrollado siguiendo los pasos mostrados en la figura 4. Esto ha generado a lo largo del tiempo muchísimos sistemas personalizados o puntuales a una tarea que han quedado en completo desuso. Introducción: En todo proyecto que involucre un sistema de cómputo automático. publicación. se puede asegurar que la etapa más laboriosa y que requiere mayor tiempo de dedicación es el desarrollo del software (o firmware. ¿No existe forma de generar sistemas que sean flexibles y actualizables? Obviamente sí. Python tiene. con la particularidad de que cuenta con una sintaxis muy limpia y que favorece un código legible. no obstante. Sin embargo son más flexibles y más portables que otros lenguajes. fuertemente tipado.2.2 Herramientas 4. y analizando las distintas alternativas de lenguajes de programación. se optó por la utilización del lenguaje Python. Se trata de un lenguaje interpretado o de script.4. 4.1 Python Para el logro de un software especializado que cuente con las características deseadas y descriptas anteriormente. La desventaja que presentan los lenguajes interpretados es que su ejecución es más lenta. Software: Diseño y desarrollo del software especializado Figura 4. por lo que se podría decir que es semi 37 . con tipado dinámico. Python [5] es un lenguaje de programación creado por Guido van Rossum a principios de los años 90. Un lenguaje interpretado o de script es aquel que se ejecuta utilizando un programa intermedio llamado intérprete en lugar de compilar el código a lenguaje máquina que pueda comprender y ejecutar directamente una computadora (lenguajes compilados). multiplataforma y orientado a objetos. 1: Pasos seguidos en la elaboración del software. muchas de las características de los lenguajes compilados. Solaris. que son los que se ejecutarán en sucesivas ocasiones. Software: Diseño y desarrollo del software especializado interpretado. En Python. En otros lenguajes el tipo de la variable cambiaría para adaptarse al comportamiento esperado. DOS. no se permite tratar a una variable como si fuera de un tipo distinto al que tiene. si tenemos una variable que contiene un texto (variable de tipo cadena o string) no podremos tratarla como un número (sumar la cadena “9” y el número 8).pyc o . y el tipo de esta variable puede cambiar si se le asigna un valor de otro tipo.4. Mac OS. etc. estando atrás de objective-c (Apple) y C++. La característica de tipado dinámico se refiere a que no es necesario declarar el tipo de dato que va a contener una determinada variable. como en Java y muchos otros lenguajes. Por otra parte. OS/2. generando archivos . El intérprete de Python está disponible en multitud de plataformas (UNIX. En la tabla 4.pyo (bytecode optimizado).) permitiendo que el software desarrollado corra en todos estos sistemas sin grandes cambios. Por ejemplo. Windows. 38 . es necesario convertir de forma explícita dicha variable al nuevo tipo previamente. aunque esto es más propenso a errores.1 se puede ver que Python es el lenguaje de programación de nueva generación muy popular y el de tercer mayor crecimiento en el último año. el código fuente se traduce a un pseudo código máquina intermedio llamado bytecode la primera vez que se ejecuta. sino que su tipo se determinará en tiempo de ejecución según el tipo del valor al que se asigne. Linux. Google Earth. el gestor de memoria. adicionalmente. 1: Crecimiento de los lenguajes de programación.2. Skype. Qt4 y Qt4 Designer (librería e IDE para interfaz gráfica) Qt es una biblioteca multiplataforma ampliamente usada para desarrollar aplicaciones con interfaz gráfica de usuario.2. por ejemplo. Software: Diseño y desarrollo del software especializado Tabla 4. en los programas Adobe Photoshop. Siemens. y es utilizada. Por su sintaxis simple. etc. Qt utiliza el lenguaje de programación C++ de forma nativa. clara y sencilla. 4. Un binding es una adaptación de una biblioteca para ser usada en un lenguaje de programación distinto de aquél en el 39 . Mathematica. como herramientas para la línea de comandos y consolas para servidores. el tipado dinámico. pero. puede ser utilizado en varios otros lenguajes de programación a través de “bindings”. la gran cantidad de librerías disponibles y la potencia del lenguaje. Es distribuida bajo licencia GNU y otras licencias comerciales.4. así como también para el desarrollo de programas sin interfaz gráfica. entre otros. se utilizó Python como lenguaje principal del software desarrollado. Por otro lado. una característica altamente distintiva. se utilizó Qt Designer para el diseño de la interfaz gráfica (ventanas) y las librerías de qt para la gestión de ejecución del sistema en sí. Software: Diseño y desarrollo del software especializado que ha sido escrita. 2: Qt Designer utilizado para el diseño del GUI. para mejorar rendimiento de gráficos.4. Desde que apareció su primera versión alfa en el mes de enero de 1999. 4. se ha utilizado en infinidad de aplicaciones. OpenCV es una biblioteca libre de visión artificial originalmente desarrollada por Intel. un binding de la biblioteca gráfica Qt para el lenguaje de programación Python. ya que básicamente esta API (interfaz de programación de aplicaciones) es la que proporciona todas las funcionalidades de procesamiento de video e inteligencia artificial en tiempo real. si Python fuera la cabeza del proyecto. Desde sistemas de seguridad con detección de movimiento. Particularmente se utilizó PyQt [17]. Figura 4. OpenCV es el corazón del mismo.3. 40 . OpenCV Haciendo analogías. por hardware. Esto se debe a que su publicación se da bajo licencia BSD que permite que sea usada libremente para propósitos comerciales y de investigación con las condiciones en ella expresadas.2. hasta aplicativos de control de procesos donde se requiere reconocimiento de objetos. QT provee además de compatibilidades GPU. visión estéreo y robótica. basada en una placa con un microcontrolador y un entorno de desarrollo. Windows y Mac OS X. incluyendo inspección de productos. El objetivo principal de OpenCV es proveer al desarrollador de una infraestructura en visión computacional simple de utilizar y reduciendo el tiempo de desarrollo de aplicaciones complejas. imágenes médicas. seguridad. cuenta con un editor de textos y es capaz de compilar el código. 41 . diseñada para facilitar el uso de la electrónica en proyectos multidisciplinares. Ruby. 4. es una plataforma de hardware libre. para luego grabarlo en el microcontrolador con un simple clic. Software: Diseño y desarrollo del software especializado La librería está escrita en C y C++ y corre en los entornos Linux. Arduino IDE Arduino. Su utilización también es posible en Python. interfaces de usuario.4. como se mencionó anteriormente. calibración de cámara. Matlab y otros lenguajes de programación. La librería contiene cerca de 500 funciones [3] que abarcan la mayoría de los campos de aplicación de la visión artificial. El entorno de desarrollo integrado Arduino es una aplicación multiplataforma escrita en Java y derivada del IDE del lenguaje de programación Processing. 3: Entorno de desarrollo Arduino.4.2. El mismo. Figura 4. Esta aplicación se utiliza para la programación en lenguaje C y C++ de la plataforma de hardware Arduino [7]. principalmente por la falta de portabilidad a la hora de editar código.4. Para la aplicación de la sección 4. Software: Diseño y desarrollo del software especializado 4. Aplicación 1: Reconocimiento de objetos La aplicación desarrollada consiste en la utilización de los algoritmos de procesamiento de imagen para el reconocimiento del color. Gedit es un editor de textos enriquecido compatible con UTF-8 (formato de codificación de caracteres) para GNU/Linux. Diseñado como un editor de textos de propósito general. El brazo robot interactúa con su entorno sin necesidad del usuario. Para esta aplicación fue el color y márgenes de tamaño máximo y mínimo. para que luego el brazo pueda tomarlos y depositarlos en un lugar específico definido como “basurero”. 42 .3. gedit enfatiza la simplicidad y facilidad de uso. El método de auto aprendizaje (explicado en la sección 2. Mac OS X y Microsoft Windows. quien únicamente se encarga del seteo inicial del sistema. es que está distribuido bajo las condiciones de la licencia GPL. 4: Editor de textos Gedit. Editor de texto Gedit Ante la complicación que acarrera utilizar un entorno de desarrollo integrado. es decir que es software libre.2. y uno de los motivos de su elección. Además. tamaño y las posiciones de los objetos dentro de un espacio de trabajo. por lo que se decidió que las tareas de detección se basen en conocer parámetros previos del objeto de interés.4 fue la geometría del objeto (su forma) y tamaño en pixeles. como por ejemplo Eclipse. Incluye herramientas para la edición de código fuente y textos estructurados. Figura 4.5) es algo extremadamente complejo aplicar.2. se realizó la programación de todo el sistema en un editor simple de texto.5. 4. como lenguajes de marcado. 3. ● Se selecciona el objeto según el criterio preestablecido por el usuario. Saturación.1.Moments(). formando la imagen “back projection”. 4. Saturation. Value – Matiz. Valor) y se separa el canal Hue (matiz). ● Utilizando la función cv. Software: Diseño y desarrollo del software especializado El algoritmo básico utilizado para el software es el esquematizado en la figura 4. el canal Hue y el histograma definido por el usuario.5. ● Se calcula el área de cada contorno y se descartan aquellos que no cumplan con el tamaño mínimo y máximo. 2) Selección de objeto: ● Se obtienen los contornos y las posiciones de todos los objetos utilizando las funciones cv. se obtienen los pixeles de la imagen que cumplen con el rango de color establecido por el histograma.4. 5: Procesos de la aplicación 1. Figura 4. Procesos principales Se explicarán más detalladamente los procesos más importantes: 1) Búsqueda de objetos: ● Se convierte la imagen original capturada a formato HSV (Hue.CalcArrBackProject.FindContours() y cv. 43 . para que su efector final. como se explicó anteriormente. más precisamente. Se espera un cierto tiempo de respuesta de confirmación para.3. Software: Diseño y desarrollo del software especializado 3) Obtención de las posiciones: ● Se utiliza el algoritmo cv. se calcula la posición futura del objeto. Interfaz gráfica El principal objetivo de la interfaz gráfica es brindar al usuario un medio de comunicación con el sistema de visión artificial. alcance la posición deseada. 5) Cinemática inversa: ● Utilizando la posición del objeto y las fórmulas de cinemática inversa del brazo robot (detalladas anteriormente) se obtienen las posiciones en que deben estar cada servo del brazo. conociendo de antemano su relación (por parámetros de configuración). Conociendo los tiempos de respuesta del sistema y considerando que el autómata presenta un retardo general de 3 segundos a cualquier parte de la imagen. ● La posición calculada se encuentra expresada en píxeles.4. Las principales funciones que debía brindar la interfaz a desarrollar eran: ○ Inicio y detención de la aplicación ○ Control de las funciones ○ Configuración del sistema ○ Calibración ○ Información del estado del sistema ○ Ayuda e instrucciones de utilización 44 .2. 6) Comunicación con el hardware: ● Las posiciones de cada servo (expresadas en ángulos) son enviadas al hardware de control por USB y utilizando un puerto COM virtual de la PC. luego. volver nuevamente a la captura de imagen. Esta función. implementa un algoritmo de búsqueda iterativo en donde la ventana de búsqueda se va ubicando recursivamente en el centro de masa del “back projection” del objeto. se realiza un escalado de los valores de X e Y en píxeles a centímetros. considerando que el movimiento del objeto es rectilíneo y con velocidad constante.CamShift para obtener el centro del objeto. la posición del objeto sea obtenida por interpolación. Si bien la mejor solución hubiera sido utilizar un filtro de Kalman. ● Se realiza dicha función una determinada cantidad de veces (configurable por el usuario) para que. luego. por lo tanto. 4) Cálculo de posición futura: Del proceso anterior se tiene una serie de posiciones que adopta el objeto detectado. se realiza una interpolación lineal para estimar dicha posición. 4. en el momento de la búsqueda. como se mencionó anteriormente. también fue importante lograr que la comunicación entre usuario y el equipo pueda realizarse de forma fácil e intuitiva. Siguiendo estos objetivos se diseñó la interfaz gráfica en el entorno Qt Designer. etc. 3 4 Figura 4. Cada pestaña se muestra en detalle más adelante. detención e información de estado del sistema. y así brindar comodidad y eficiencia al usuario. en otra (figura 4. y las opciones de inicio. Selección de pestañas: Se organizaron todas las opciones de configuración y calibración en una pestaña aparte a las opciones de inicio.). detención e información de estado del sistema. La ventana principal de la aplicación 1 puede verse en la figura 4. Como se mencionó anteriormente.8). 45 .6 y consta de los siguientes elementos: 1 2 Cuadro de imagen: allí se muestran tanto las imágenes capturadas por la webcam así como las figuras de detección y los recuadros del área de trabajo. Barra de menú: Se incluyeron los menús de opciones y ayuda. sliders. Software: Diseño y desarrollo del software especializado Por otro lado. a Opciones: Cuenta con las opciones de cambio de aplicación. Con esto se logró que la ventana principal no se sobrecargue de elementos y que resulte sencilla y organizada para el usuario.7). carga y guardado de los datos de configuración y salida del sistema. botones. 6: Ventana principal de la aplicación 1. se organizaron todas las opciones de configuración y calibración en una pestaña (figura 4. Contenido de la pestaña: Allí se incluyen todos los elementos propios de cada pestaña (informaciones. b Ayuda: Allí se incluyen los instructivos de uso del sistema y los datos de contacto.4. Además habilita los controles de “Ajustes finos” para que se pueda mejorar la detección de objetos. criterio de búsqueda (por tamaño o aleatoriamente) y los tamaños mínimo y máximo de objetos a detectar. y lo muestra en pantalla. Estado del sistema: allí se informa al usuario de todos los eventos que realiza el sistema. También avisa o alerta cuando ocurre un error o es necesario que el usuario realice alguna tarea. Los elementos que forman parte de la pestaña “Iniciar” (figura 4. Esto es para que el usuario se asegure que el sistema funcione correctamente. Software: Diseño y desarrollo del software especializado Figura 4.7) son: 1 Información de configuración: en esta sección se muestran los valores de configuración actuales del sistema. Botón Probar: ejecuta los algoritmos de búsqueda y detección de objetos.4.8) cuenta con los siguientes elementos: 1 2 Botón Configurar: habilita los demás controles. Para ello la pestaña “Configuración” (figura 4. 7: Pestaña “Iniciar”. 3 46 . 2 3 Cada vez que la aplicación se ejecute en condiciones de entorno o ambiente diferente se debe realizar la calibración y configuración del sistema. Dichos valores pueden ser extraídos (leídos) de un archivo de configuración como también pueden ser seteados por el usuario en la sección de configuración. Botón Iniciar o Detener: cumple la función de poner en marcha el sistema o detenerlo una vez que el mismo está en funcionamiento. Valores de configuración: Allí se ingresan los valores que necesita el sistema para funcionar. Esto tiene la función de evitar que se produzcan cambios en la configuración durante la ejecución del sistema. Ellos son el valor de la línea blanca (se muestra en pantalla). Ajustes finos: Como se mencionó previamente. incluso limita su uso a cámaras de buena calidad. 5 Figura 4. Pero en contrapartida. Las condiciones de iluminación del ambiente pueden causar errores o ruidos en los algoritmos de visión computacional. usando dos webcams simultáneamente. Aplicación 2: Interfaz inalámbrica usuario-robot En esta aplicación el sistema capta a través de la cámara movimientos o posiciones de la mano del usuario. Para que el sistema se adapte al medio. los sliders configuran los valores de Threshold.9. cumplen la función de mejorar la detección de objetos.4. quien de esta manera controla el brazo robot en todo su espacio de acción.4. Software: Diseño y desarrollo del software especializado 4 Histograma: Al presionar el botón “Dibujar Histograma”. Evaluando esto último y en vista de que nuestra aplicación no sacaría un amplio provecho de la visión estéreo se decidió por la utilización de una sola webcam para alcanzar el objetivo. Erode y Dilate que deben utilizarse para que el objeto de interés sea detectado correctamente. sin estar necesariamente el usuario cerca del brazo o expuesto a un medio hostil. Esta tecnología es utilizada para distinguir profundidad de los objetos análogamente como lo efectúa la visión humana. el usuario puede seleccionar en la imagen el color del objeto a detectar. El objetivo principal del software es detectar la posición de la mano en las 3 dimensiones. 47 . su utilización requiere de una calibración casi constante y muy precisa. 4. En el inicio se planteó realizar el programa utilizando visión estereoscópica digital. 8: Pestaña “Configuración”. El algoritmo básico utilizado para el software se muestra en la figura 4. Dicho color (o gama de colores) seleccionado se muestra en la escala cromática inferior. 48 . Procesos principales Se explicarán más detalladamente los procesos más importantes: 1) Extracción de fondo: ● Se convierte la imagen capturada por la webcam de RGB a HSV.4. ● Se realiza una operación lógica NOT para intercambiar zonas oscuras por zonas blancas. ● Se efectúa la diferencia. en valor absoluto. ● Se separa de la imagen solo los valores de saturación S.4. 4.1. 9: Procesos de la aplicación 2. del fondo de la imagen (tomada previamente a iniciar el programa) con la imagen S de la mano. Software: Diseño y desarrollo del software especializado Figura 4. Y) a la cual debe dirigirse el extremo del brazo robot. se detecta el contorno con la función cv. luego. 6) Traducción y envío de datos al robot: ● Del proceso anterior se cuenta con la posición de la mano del usuario relativa a su posición en la imagen. palma de la mano. 5) Comunicación con el hardware: ● Las posiciones de cada servo (expresadas en ángulos) son enviadas al hardware de control por USB y utilizando un puerto COM virtual de la PC. es decir se encuentra expresada en píxeles. como un área independiente. Con esto se logra obtener el centro de masa de la mano. se calcula la posición en Z en centímetros. volver nuevamente a la captura de imagen. conociendo de antemano su relación (por parámetros de configuración). 49 .Y en píxeles a centímetros. se realiza un escalado de los valores de X. se obtienen las posiciones en que deben estar cada servo del brazo.FindContours().Moments().4. posición de la mano y antebrazo. 3) Reconocimiento de mano abierta o cerrada: ● Con la relación entre el área del contorno y el área de la cáscara se determina si la mano está “ABIERTA” o “CERRADA”. 2) Detección de la mano del usuario: ● Una vez aislada la mano del fondo. seguido por la detección de la cáscara o envoltura con cv. Por lo tanto. y operaciones morfológicas simples: Erode y dilate. Con esto se obtiene la mano del usuario aislada del fondo. se realiza la función ThresHold. comando que se enviará luego al brazo robot. 4) Obtención de las coordenadas de posición en X e Y: ● Utilizando el contorno de la mano se extraen los momentos con la función cv.ConvexityDefects. ● Con el análisis de los defectos se detecta el antebrazo y se lo elimina de la imagen.ConvexHull2(). Software: Diseño y desarrollo del software especializado ● Con los valores de configuración definidos por el usuario. 4) Cinemática inversa: ● Utilizando la posición obtenida en el proceso anterior y las fórmulas de cinemática inversa del brazo robot. 5) Cálculo de posición en Z: ● Sabiendo por ensayos previos la relación entre distancia de la mano al lente de la cámara y el área de la mano en la pantalla: Z=f(area_de_mano). para que su efector final alcance la posición deseada. es decir se obtiene la posición (X. Se espera un cierto tiempo de respuesta de confirmación para. ● De la cáscara y el contorno se realiza la detección de los defectos de concavidad con cv. Con los defectos de concavidad se puede analizar la imagen y detectar dedos. 4. Consta de los siguientes elementos: 1 2 3 4 Cuadro de imagen: allí se muestran las imágenes capturadas por la webcam y las figuras de detección de la mano del usuario (contorno y defectos). Botón Iniciar o Detener: pone en marcha el sistema o lo detiene si se encuentra en funcionamiento.10) se organiza y posee la misma estructura que la aplicación número 1. Contenido de la pestaña: Allí se incluyen los elementos propios de cada pestaña. que se detallan más adelante. detención e información de estado del sistema. Software: Diseño y desarrollo del software especializado 4. Estado del sistema: en donde el sistema se comunica con el usuario. 50 . Interfaz gráfica La ventana principal de la aplicación 2 (figura 4. Figura 4.2. Los elementos que forman parte de la pestaña “Iniciar” (figura 4. Barra de menú: Se incluyen los menús de opciones y ayuda de la misma forma que en la aplicación de detección de objetos. Selección de pestañas: Las opciones calibración se encuentran en una pestaña aparte a las opciones de inicio.4.11) son los mismos que para la aplicación 1: 1 2 3 Información de configuración: en donde se muestran los valores de calibración actuales del sistema. 10: Ventana principal de la aplicación 2. Para ello la calibración inicial del sistema es fundamental para que la detección de la mano del usuario sea posible. Allí se calibra. por lo que cualquier ruido en la imagen o cambio en la iluminación puede ocasionar un funcionamiento incorrecto o incluso que el sistema no funcione. la relación píxeles a centímetros ingresando el valor de la longitud de una línea que se muestra en pantalla.4. además. mostrando la detección de la mano en la pantalla. 11: Pestaña “Inicio”. Hay que recordar que el programa principal detecta continuamente el contorno de la mano del usuario y calcula su área. Este control se utiliza para asegurarse de que el sistema funciona correctamente con la calibración realizada. Esta aplicación. Software: Diseño y desarrollo del software especializado Figura 4. En la figura 4. Botón Ver Detección: Al presionar se realizan los mismos algoritmos que el programa principal. con la diferencia que no se envían datos al brazo robot. 3 51 . particularmente.12 se muestra la pestaña de “Calibración” en la que se incluye: 1 2 Botón Calibrar: habilita los demás controles e inicia los algoritmos de calibración (que se muestran en pantalla). Controles de calibración: posee sliders que configuran los valores de Threshold. es muy sensible a las condiciones de iluminación del ambiente y del fondo del espacio de trabajo. Erode y Dilate que deben utilizarse para que la mano del usuario sea detectada correctamente. Software: Diseño y desarrollo del software especializado Figura 4. 12: Pestaña “Configuración”. 52 .4. Prueba de posicionamiento en X y Z La prueba de posicionamiento se realizó siguiendo los siguientes pasos: 1 2 3 4 5 6 Manteniendo Z en un valor constante (1 cm). Una vez realizado el cálculo de cinemática inversa. Sus resultados permitieron la corrección de errores y la determinación de las restricciones y consideraciones especiales que se debían tener en cuenta a la hora de la implementación de la plataforma. y enviados los datos al brazo robot. Implementación: Ensayos y resultados 5.1. De igual forma. Se realizó la medida de cada distancia X obtenida (como se muestra en la figura 5. se fue variando Z entre 0 cm y 12 cm. se realizó la prueba para el eje Z. Ellas son: ○ ○ Prueba de posicionamiento en X e Y.1).2).5. Prueba de posicionamiento de la base. se realizó la medida de cada altura Z obtenida (figura 5. Se calculó el error relativo de cada medida. Brazo Robot Para lograr el buen funcionamiento del brazo robot se realizaron pruebas de su sistema de control. se deben tomar los objetos dependiendo de su color y tamaño. 5. Implementación: Ensayos y resultados En la presente sección se describen las pruebas realizadas para comprobar el buen funcionamiento del proyecto y los resultados obtenidos. Uno de los componentes más importantes de dicho sistema es el cálculo de cinemática inversa. Manteniendo X en un valor constante (13 cm). 53 . Se realizaron ensayos al sistema de visión artificial y al sistema de control del brazo robot. donde a partir de las coordenadas obtenidas del software de visión artificial. se realizaron los cálculos de cinemática inversa para valores de X entre 5 cm y 27 cm (máxima extensión del brazo robot). Es por ello que se realizaron dos pruebas de posicionamiento con el objetivo de corregir desviaciones y determinar el rango de trabajo del brazo robot. Una vez obtenidos los valores de ángulos de cada articulación. se enviaron sucesivamente dichos datos al hardware de control del brazo robot. 56 26.79 38.011 54 .1 24.19 90 86.2 17 18.087 0.12 45.87 23.012 0 0.5 24.25 37.4 15.071 0.7 22.2 30.5 18.7 10.83 58.8 98.5 48.01 0.3 100.25 67.9 19.33 32.033 0.007 0.75 60 56.5 7.62 32.021 0.1 13.4 39.34 47.9 21.8 26.2 6.02 0.4 14.8 25.7 X (cm) 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 E relativo 0.25 7.84 17.8 12.2 48.92 53.3 8.13 37.017 0.25 81. 1: Mediciones de posicionamiento en X.008 0.25 52.009 0.5 9.008 0.7 103.5 5.8 20.1 18.59 42. Implementación: Ensayos y resultados Los datos obtenidos fueron: Tabla 5.43 77.38 45.05 44.028 0.6 23.37 73.75 15 11.07 68.75 45 41.22 92.58 48.84 48.3 6.48 8.8 85.42 31.013 0.8 21.55 63.5 78.3 16.06 0.28 48.018 0.99 37.03 0.031 0. (°) (°) (°) Xmed (cm) 108 105.38 24.5.5 33.75 75 71.75 30 26.005 0.055 0.46 20.005 0.79 42.58 43.27 28.89 47.5 63.61 34.25 82.25 22.14 88.1 95. 5 -25.7 87.67 8.5 90.56 93.3 8.75 -33.86 -11.9 1.233 55 .6 -18.5.1 4.4 94.89 15.27 0.1 30.7 0. Implementación: Ensayos y resultados Figura 5.227 0.44 85.5 2.31 78.9 1 0.4 91.5 -0.5 6.5 9. Z (cm) 0 1 2 3 4 5 6 7 8 9 10 11 12 Tabla 5.12 38. 2: Mediciones de posicionamiento en Z.4 0.98 54.25 46. 1: Mediciones de posicionamiento en X.83 89.54 0. (°) (°) (°) Zmed (cm) 73.95 83.266 0.2 E relativo 1.69 1.47 92.3 3.85 94.7 60 60 60 60 60 60 60 60 60 60 60 60 60 -1.87 -4.37 22.483 0.625 0.2 5.25 93.6 7.312 0.9 0 0. 5.3. Los errores de posición para la coordenada Z.087 (8.3 cm (en promedio) por debajo de los valores reales de Z. Esto se debe principalmente al peso del extremo del brazo robot. Analizando los valores de Z medidos se notó que se encuentran aproximadamente de 2.7 %).3 cm. Resultados: Los errores de posición para la coordenada X tuvieron un máximo de 0. el nivel de error obtenido es aceptable. de 2. Implementación: Ensayos y resultados Figura 5. Considerando la aplicación y las dimensiones de los objetos a clasificar mediante el brazo. Puede notarse que el error cometido resultó considerablemente menor. Los resultados de dicha corrección se pueden ver en la tabla 5. 56 . resultaron muy superiores en comparación a la coordenada X. 2: Mediciones de posicionamiento en Z. a las fórmulas de cinemática inversa. Como solución se propuso agregar un valor de offset. 05 0.65 -20.008 0 0 0.1 0.01 91.7 5.03 94.18 91.63 -28.9 9.7 20.6 7.07 93.3 3.63 -0.05 0. Una vez obtenidos los valores de ángulos de cada articulación.18 91.09 94. Implementación: Ensayos y resultados Tabla 5.7 10.43 94.7 20.56 6.18 91.69 60 60 60 60 60 60 60 60 60 60 60 60 0.01 0.7 20.2 88.009 Prueba de posicionamiento de la base La prueba de posicionamiento de la base se realizó siguiendo los siguientes pasos: 1 2 Manteniendo X y Z en un valor constante (13 y 1 cm respectivamente).025 0.5 6.04 -36.7 13.66 78.7 20.15 -6.025 0.3).87 -13.18 91.8 4.011 0.18 91.4 0.18 91.32 -46.18 91.18 20.2 3. 3: Mediciones de posicionamiento corregido en Z.51 91. (°) (°) (°) Zmed (cm) 84.083 0.7 20.7 20.7 20. se realizó el cálculo de cinemática inversa.7 20.09 20.77 28. Los datos obtenidos fueron: Tabla 5.06 0.53 84.05 0.057 0. se enviaron sucesivamente dichos datos al hardware de control del brazo robot.7 60 60 60 60 60 60 60 60 60 60 2 21 42 63 82 99 119 140 160 179 3 4 (°) 0 20 40 60 80 100 120 140 160 180 E relativo 0.005 57 . Se realizó la medida de cada ángulo obtenido (como se muestra en la figura 5.4 2.58 35.05 0.7 20. variando el ángulo (ángulo de la base) entre 0 y 180°.1 0.18 91.9 Z (cm) 0 1 2 3 4 5 6 7 8 9 10 11 E relativo 0.5.8 8. Se calculó el error relativo de cada medida. 4: Mediciones de posicionamiento del ángulo de la base. (°) (°) (°) medido (°) 91.95 88.18 93.5 1.18 91.03 0. Y) para un mismo objeto ubicado en distintas posiciones del plano al mismo tiempo que se tomaban las lecturas de las posiciones detectadas por el algoritmo (figura 5. Se siguieron los siguientes pasos: 1 2 Se realizó un algoritmo similar al utilizado en la aplicación 1 para detectar objetos y determinar su posición en un plano. Aplicación 1 Para lograr que la aplicación 1 funcione correctamente fue necesario comprobar que la determinación de las posiciones de los objetos detectados por parte del algoritmo sean lo más precisa posible. Para ello se realizó una prueba de comparación de las posiciones detectadas respecto a las reales.4). Se calculó el error relativo de cada medida 3 58 .05 (5%). 3: Mediciones de posicionamiento del ángulo de la base.5. El nivel de error obtenido fue aceptable por lo que no fue necesaria ninguna calibración del sistema. 5.2. Implementación: Ensayos y resultados Figura 5. Se realizaron medidas de posición (X. Resultados: Los errores de posición para el ángulo de la base del robot fueron como máximo del 0. 166 0.16 0.4 9.75 3.85 17.5 6 Resultados: E relativo (Y) 0.2 -0.044 0. Y (cm) X detec. El mismo ocasionaba que las posiciones detectadas sean erróneas y por ende la función encargada de realizar la interpolación de las muestras entregaba un valor fuera de los límites del área de trabajo.5. 5: Mediciones de posicionamiento del ángulo de la base.5 12.5. El problema se corrigió incorporando al software una rutina que descarte los valores erróneos de posiciones (aquellos que se encuentren fuera del rango de trabajo) y que inicialice la detección nuevamente.6 -6 -8.3 10. Implementación: Ensayos y resultados Figura 5.55 -9.5 8. El resto de las posiciones detectadas contuvieron menos del 8% de error.15 X (cm) 8 -0.25 0.033 0.5 7 13.025 0.01 0.038 0.088 0.05 0.5 6 17 8.011 0. 59 .5 3.1 6.018 0.5 14.3 9. La aplicación alertaba de que el objeto detectado se encontraba fuera de área. solo en dos mediciones se obtuvieron errores del 15%.051 0 0.55 -5. (cm) E relativo (X) 6.025 0. Cabe aclarar que en el transcurso del ensayo se debió corregir un error que se producía en la ejecución del algoritmo.4 5. Esto se producía debido al ruido que contenía la imagen capturada.65 13.019 0.05 -7.4 9 9.7 -5.8 0.014 Como se expone en la tabla 5.05 6.075 0.55 10. 4: Medición de posiciones de objetos.034 0.25 8.45 -5 0 -7. (cm) Y detec. Los datos obtenidos fueron: Tabla 5. por lo que el funcionamiento del algoritmo resultó muy aceptable.3 5.25 13. cuando este se encontraba realmente dentro del rectángulo de trabajo.75 15. y la webcam. por lo que los colores detectados por la webcam diferían a lo largo del tiempo. omnidireccional y constante a lo largo del tiempo.Z). 60 . en la fiabilidad del sistema y en su tiempo de respuesta. Se intentó también utilizar la luz solar como fuente de iluminación del sistema. La misma debía ser difusa. enfocada por la webcam.5. Si bien la misma era difusa. por poseer capacidades limitadas. obtener su contorno y calcular el área del mismo. La aplicación se basa en mapear un espacio de coordenadas ortogonal (X. capturaba imágenes con mucho brillo. se realizó la lectura de los valores de área medidos para distintas alturas. como se expone en la tabla 5. Las coordenadas X e Y pueden conocerse fácilmente ya que representan la posición de la mano en la pantalla (centro de masa de la mano).3.6. Aplicación 2 En esta aplicación el usuario interactúa con el sistema de manera constante. mejorando las prestaciones de la plataforma. La complejidad surge al momento de la medición de la altura Z.4). De esta forma se pretendió obtener una función que describiera el movimiento del brazo en el eje Z. 5. De la misma forma se leyeron los valores de área de la mano cerrada a distintas alturas. . por lo tanto es una medición directa. utilizando su propia mano para manipular el robot. Esto ocasionaba que la reflexión de la luz en los objetos sea excesiva. Se realizaron gráficos de forma de mostrar el tipo de relación que existe entre el área calculada y la altura. La prueba de medición de área de la mano se realizó siguiendo los siguientes pasos: 4 5 6 7 Se realizó un algoritmo similar al utilizado en la aplicación 2 para detectar la mano del usuario. Para ello se realizaron distintas mediciones del área de la mano del usuario. a distintas alturas (figura 5. Se anotaron dichos valores en la tabla 5. la misma no resulta constante a lo largo del día. Manteniendo la mano abierta en una posición constante de X e Y. coordenadas necesarias para la cinemática inversa del brazo robot.7. Eligiendo la técnica adecuada de iluminación se pudo lograr un aumento en la exactitud.Z) a un espacio en coordenadas cilíndricas (X. En los primeros intentos de la prueba se contaba con una iluminación directa por parte de una lámpara halógena. Implementación: Ensayos y resultados Por otra parte se puede decir que gracias al ensayo realizado se pudo comprobar que las condiciones de iluminación del ambiente influyen permanentemente en el funcionamiento de los procesos de visión artificial.Y. 5: Mediciones de área de la mano abierta. 7: Mediciones de área de la mano cerrada. Z medido (cm) Área Calculada ( í 8 10 12 14 16 18 20 28058 30626 33105 37865 42584 48116 54354 ) 61 . 6: Mediciones de área de la mano abierta. Z medido (cm) Área Calculada ( í 0 2 4 6 8 10 12 14 16 18 20 50345 54072 59744 57350 69625 76049 80328 84314 93915 10013 113292 ) Figura 5.5. Los datos obtenidos para el caso de la mano cerrada fueron: Tabla 5. Implementación: Ensayos y resultados Los datos obtenidos para el caso de la mano abierta fueron: Tabla 5. 6: Mediciones de área de la mano cerrada. Gráficos obtenidos: Figura 5.5. Figura 5. 7: Relación área de la mano abierta a altura. Implementación: Ensayos y resultados Figura 5. 8: Relación área de la mano cerrada a altura. 62 . Implementación: Ensayos y resultados Figura 5. 63 . Dicha diferencia se muestra en la figura 5. puede decirse que las relaciones entre ambas magnitudes son prácticamente lineales. 9: Diferencia entre áreas.7. y como puede verse. Debido a que la altura no debe variar en gran medida si la mano se abre o se cierra.5. es necesario conocer la diferencia que existe entre ambas áreas para realizar la corrección correspondiente. La prueba realizada permitió asegurar que el método de determinación de altura en función de su área en la pantalla genera buenos resultados. es un valor prácticamente constante para las distintas alturas (47315 í en promedio). Resultados: Analizando las figuras 5.8. Este valor se incluye en el algoritmo de la aplicación 2 para corrección de la altura (cuando se cierra la mano).6 y 5. dentro del rango de alturas a utilizar. Además se realizó el estudio de cinemática inversa permitiendo que el autómata manipule y clasifique los objetos conociendo solamente sus posiciones. El método geométrico utilizado fue una buena opción ya que.6. Por otra parte. en entornos Windows y Linux. Conclusiones Con los estudios y las tareas realizadas se logró desarrollar un sistema clasificador de objetos. El mismo permite que cualquier componente sea reemplazado por otro. en donde se utiliza la visión artificial para la detección de las posiciones y las características de los objetos (color y tamaño). cumpliendo con el objetivo principal del proyecto. una webcam (para la captura de imágenes) y un sistema computacional (para el procesamiento de datos). el software también se encarga de brindar una interfaz gráfica al usuario y de comunicarse con el hardware de control del brazo robot. Se logró que la interfaz gráfica resulte sencilla e intuitiva. como del entorno en el cual se implementa. Se debe proporcionar al sistema de condiciones de iluminación uniformes generando el menor contenido de ruido en la imagen capturada. permitió resolver el problema de las múltiples soluciones determinando la posición del efector final al momento de manipular los objetos. Conclusiones 6. La misma quedó conformada por el brazo robot construido (sistema dinámico) y su hardware de control. siempre y cuando cumpla la misma función y respete el protocolo de comunicación utilizado. Se ha logrado el diseño e implementación de una plataforma de visión artificial. 64 . siendo un método sencillo. La adecuada selección de las herramientas de software empleadas permitió que la aplicación final sea portable y pueda ser ejecutada en cualquier computadora estándar. encargado de realizar los algoritmos y funciones necesarias. puede decirse que depende de la iluminación del ambiente en donde se encuentre. El sistema de visión computarizada realizado es portable y flexible. permitiendo al usuario realizar la configuración del sistema de forma fácil. Es decir que es independiente tanto del autómata. En cuanto a su funcionamiento. del sensor óptico y del sistema de cómputos utilizados. Se diseñó y construyó un brazo robot de 5 grados de libertad (DOF) con materiales de bajo costo. Gracias a la facilidad de uso de los lenguajes de programación y librerías utilizadas se puede dar mayor funcionalidad al sistema e implementar nuevas aplicaciones mediante simples modificaciones. Se elaboraron y aplicaron algoritmos de visión por computadora capaces de extraer la información visual necesaria para detectar objetos y reconocer la mano del usuario. Para la implementación de la visión artificial en la plataforma se desarrolló un sistema de software especializado. Conclusiones 6. presión.) con el fin de ampliar la funcionalidad del sistema. que permita conocer las posiciones de sus articulaciones. Trabajos futuros Del desarrollo de este proyecto y de las conclusiones obtenidas surgen propuestas de trabajos futuros que pueden realizarse de forma de mejorar el funcionamiento y desempeño del sistema. y de incorporar nuevas funcionalidades. Implementar un control a distancia del sistema vía Internet (servidor SSL). Incorporar a la plataforma un autómata de mayor tamaño y capacidad (brazo industrial). Integración del sistema desarrollado al entorno ROS [8]. A continuación se nombran algunas de ellas: ● ● ● ● ● ● ● ● ● ● ● Inclusión de filtros predictivos Kalman para la determinación de posiciones de objetos en movimiento. Utilizar cámaras digitales de mayor calidad para mejorar el desempeño de los algoritmos de visión artificial.1. etc.6. Implementar realimentación activa del brazo robot. Agregar sensores al efector final del brazo robot (temperatura. con el objetivo de mejorar su control. Aumentar grados de libertad del autómata (incluir ruedas y hacerlo móvil). Agregar funciones al sistema (más aplicaciones). Implementación de visión estéreo que permitan el análisis de profundidad. Independizarse del uso de una PC o notebook desarrollando un sistema embebido capaz de realizar el procesamiento de datos. 65 . humedad. net/tutorial-python/. Aníbal Ollero Baturone. Robótica: manipuladores y robots móviles. 2012. http://www.3 documentation. 2012.agenciadenoticias.societyofrobots. Luis Enrique Palafox Maestre. 2012. Tutorial de OpenCV. PyQt Class Reference.edu/. Carlos Medrano. Jorge Rodríguez Araújo. http://docs.opencv.google.org/. Computer Vision Lab. 2012.edu. http://blog. Rick McClelland. http://mundogeek.0 Documentation. OpenCV Tutorials. O’Reilly Media.cc/index.neuroforge. 2007. http://pyqt. 2012.ros. 2001.php/Main_Page/. Robot Arm Tutorial.ideasonboard.martinperis. http://www.org/wiki/.org/2/.csail. Universidad Autónoma de Baja California. 2010. http://www. 2005.7.cc/en/Reference/HomePage/.co.python. Blog de Visión Artificial y Robótica. Linux UVC Driver Support.com/robot_arm_tutorial. 2010. Python v2.7.html/. Learning OpenCV. 2012. Bibliografía [1] [2] Gary Bradski. https://code.html.co/ndetalle/article/usan-la-magia-de-los-numerospara-encontrar-objetos-ocultos.org/uvc/. 2008. Pingüino Reference.sourceforge. Bibliografía 7. http://arduino. http://www.com/p/ctypes-opencv/.4. OpenCV v2. Fundamentos de procesamiento de imágenes.shtml/. http://wiki. http://www.com/.pinguino. 2009. Martin Peris. 2008. 2012. Arduino Language Reference.net/Docs/PyQt4/classes. Ctypes Package Examples. [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] 66 .mit. Laboratorio del MIT. Marcombo. 2005. John Daniel Bell. Robot Operative System (ROS) Documentation.unal. 2011. especializado en Computer Vision. Artículo periodístico sobre estudios en Universidad Nacional de Colombia. Python para todos. Adrian Kaehler. 2012. http://docs. 2012. José Jaime Esqueda Elizondo. Raúl Igual. Raúl González Duque.uk/. Introducción a los sistemas de visión artificial. http://www. Servo base. #define cerrado 1550 #define abierto 800 int i=1.1.h> #include <stdlib. int zbasei. Servo giromano. // incoming serial byte char z_servo1[4]. char z_servo2[4]. int zbase. base. Servo servo3. int i3=1600. int hand. String cadena2. 67 . int i1=800.attach(8).h> Servo servo1. giromano. char z_servo3[4].attach(9).setTimeout(700).attach(13). servo3. int z3. Anexos 8.attach(11).attach(12). char mano[4]. char cadena1[10]. // digital sensor int j=0. Anexos 8. char base_servo[4]. int zbaseb. servo1. Servo servo2. Serial. int z1. void setup() { //nuetros servos van desde 700 a 2450 useg Serial.8. servo2. Anexo A: Programa del microcontrolador #include <Servo. int z2. Servo pinza. int i2=2350.begin(115200). } else {zbase--.} if (i3!=z3) { if (i3<z3) { i3++. Anexos pinza.} if (i2!=z2) { if (i2<z2) { i2++.writeMicroseconds(2350). z3=1600.writeMicroseconds(i1).writeMicroseconds(1600).} else {i1--.writeMicroseconds(650). base. z2=2350.8.writeMicroseconds(800).writeMicroseconds(cerrado). servo2. servo3. giromano.} 68 . delayMicroseconds(500).} servo2.writeMicroseconds(i3).} else {i2--. Serial.flush().writeMicroseconds(zbase).} servo3. servo1. zbasei=1500. delayMicroseconds(500). z2=2350. delayMicroseconds(500). delayMicroseconds(500). while (i1!=z1||i2!=z2||i3!=z3){ if (i1!=z1) { if (i1<z1) { i1++.}} while (zbase!=zbasei){ if (zbase!=zbasei) { if (zbase<zbasei) { zbase++.writeMicroseconds(1500). while (i1!=z1||i2!=z2||i3!=z3){ if (i1!=z1) { if (i1<z1) { i1++. pinza.}} } void levantar() { z1=800.} servo1. } void irinicio() { z1=800.attach(10).} base.} else {i1--. z3=1600.writeMicroseconds(i2).} else {i3--. } if (i2!=z2) { if (i2<z2) { i2++.} else {i3--.} base.} servo1. delayMicroseconds(500). delayMicroseconds(500). while (zbase!=zbaseb){ if (zbase!=zbaseb) { if (zbase<zbaseb) { zbase++.} else {i2--.} if (i3!=z3) { if (i3<z3) { i3++.writeMicroseconds(i2).} else {i2--. delayMicroseconds(500).writeMicroseconds(i1).} servo3.writeMicroseconds(zbase). delayMicroseconds(500).} servo3. delayMicroseconds(500).8.} }} void irbasurero() { z1=1600. delayMicroseconds(500).}} while (i1!=z1||i2!=z2||i3!=z3){ if (i1!=z1) { if (i1<z1) { i1++. while (i1!=z1||i2!=z2||i3!=z3){ if (i1!=z1) { 69 .writeMicroseconds(i3). delayMicroseconds(500).writeMicroseconds(zbase).} else {i3--. z3=1600.} else {i1--.} servo2.} if (i3!=z3) { if (i3<z3) { i3++.writeMicroseconds(i1).} servo2.} if (i2!=z2) { if (i2<z2) { i2++. z2=1600.}} } void ir() { base. Anexos servo1.writeMicroseconds(i3).writeMicroseconds(i2).} else {zbase--. zbaseb=2450. } servo1. 70 . z3=map(z3. delayMicroseconds(500). Serial. Serial. delay(1). 650.writeMicroseconds(i2). } } if(strcmp(cadena1.flush(). 0. Serial. 180.readBytes(z_servo1.j<=9. Anexos if (i1<z1) { i1++.3). 2350). Serial. if(strcmp(cadena1. delayMicroseconds(500). ir()."bu")==0){ Serial. Serial.} else {i1--. 0.} if (i2!=z2) { if (i2<z2) { i2++.println("conectados"). z2=map(z2. 2350).} servo3. Serial. 650. 180. z3=atoi(z_servo3). 2350). if (z1!=650&&z2!=650&&z3!=650&&zbase!=650) { pinza. 180.} else {i3--.3).j++){ // bucle para borrar cadena cadena1[j]='\0'.available() > 0){ delay(1). z1=atoi(z_servo1).3). Serial.flush().println("buscando").} if (i3!=z3) { if (i3<z3) { i3++.println("busco"). 650.readBytes(cadena1. 0.3). for (j=0. Serial. zbase=map(zbase.2).writeMicroseconds(i1). z2=atoi(z_servo2)."co")==0){ Serial. delayMicroseconds(500).flush().}} } void loop() { if (Serial. z1=map(z1. delay(500). 650.writeMicroseconds(i3).} else {i2--.8.} servo2. 0. 180.readBytes(z_servo2. Serial.readBytes(z_servo3.readBytes(base_servo. zbase=atoi(base_servo). 2350).writeMicroseconds(abierto). } ir(). zbase=map(zbase.3).writeMicroseconds(cerrado).readBytes(base_servo.writeMicroseconds(abierto).j++){ // bucle para borrar cadena cadena1[j]='\0'. 650.readBytes(z_servo3. hand=atoi(mano).3). 650. levantar().flush(). 2350). zbase=atoi(base_servo). z3=map(z3. } } if(strcmp(cadena1. z2=map(z2.writeMicroseconds(cerrado). Serial. z1=atoi(z_servo1). pinza. delay(500). Serial. delay(100). 180. 2350). irbasurero(). Serial. 180. Serial. delay(500).flush(). pinza. 650.8. z3=atoi(z_servo3).readBytes(z_servo1.readBytes(z_servo2.writeMicroseconds(abierto). 0. 180. 2350)."ir")==0){ Serial. 0. Serial.3).3). z1=map(z1.3). 0. } for (j=0. z2=atoi(z_servo2). if (z1!=650&&z2!=650&&z3!=650&&zbase!=650) { if (hand==1){ pinza.readBytes(mano. 0. } } 71 . 180. } else{pinza. Anexos pinza. } } Serial. Serial.writeMicroseconds(cerrado). 650.j<=9. 2350).println("voy"). irinicio().