Full text
1 Equation Chapter 1 Section 1 Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías Industriales Operación de remachado mediante robot manipulador industrial basado en ROS Autor: Víctor Hugo Gómez Tejada Tutor: Guillermo Heredia Benot Dep. Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2015
Trabajo Fin de Grado Grado en Ingeniería de las Tecnología Industriales Operación de remachado mediante robot manipulador industrial basado en ROS Autor: Víctor Hugo Gómez Tejada Tutor: Guillermo Heredia Benot Profesor titular Dep. de Ingeniería de Sistemas y Automática Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2015
Proyecto Fin de Grado: Operación de remachado mediante robot manipulador industrial basado en ROS Autor: Víctor Hugo Gómez Tejada Tutor: Guillermo Heredia Benot El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2015 El Secretario del Tribunal
i Resumen El diseño e implementación de procesos cada vez más automatizados en la industria ha empujado el desarrollo tecnológico del campo de la robótica en los últimos años. Esto ha propiciado la iniciativa de promover e invertir en el campo de investigación de la robótica industrial. EuRoC, una organización de carácter europeo, ha promulgado la iniciativa en la investigación en este campo mediante el lanzamiento de un desafío estructurado en distintos niveles, aquí es donde se encuentra el proyecto en cuestión. La organización nos plantea un reto de carácter industrial, donde nos situa en un entorno de simulación donde debemos realizar una tarea de remachado a una pieza de trabajo mediante un robot manipulador industrial. En este desafío se nos valorará la capacidad para programar nuestro robot mediante el framework robótico ROS para realizar la tarea de remachado, evaluando su rapidez y eficiencia. En las siguientes páginas se presentará el proyecto, así como su solución propuesta con su calificación final por parte del colectivo EuRoC.
ii Índice Resumen i Índice ii Índice de Tablas iv Índice de Figuras v 1 Introducción 1 1.1. EuRoC 1 1.1.1. Resumen 2 1.1.2. Objetivos 3 1.1.3. Challenge 1 3 2 Estado del arte de la Robótica 5 2.1. La Robótica 5 2.2. Historia de la Robótica 5 2.3.Clasificación de Robots 6 2.4 Robot manipulador o industrial 7 2.4.1 Estructura mecánica 8 2.4.2 Aplicaciones 8 2.4.2.1 Remachados mediante Robots 9 2.4.3 Nuevas estructuras 9 2.5. La simulación Robótica 10 3 Modelado, control y simulación de robots 11 3.1. Representación de posición y orientación 11 3.2. Modelo cinemático del robot manipulador 14 3.2.1 Cinemática directa 14 3.2.1.1. Representación Denavit-Hartenberg 15 3.2.2 Cinemática inversa 17 3.3 Velocidades: Jacobiano de un robot manipulador 17 3.4. Modelo dinámico de un robot manipulador 17 3.5 Control de articulaciones de un robot manipulador 18 4 ROS y herramientas de desarrollo 19 4.1. ROS 19 4.2. Diseño modular y distribuido 20 4.3. Historia 20 4.4. Comunidad activa y colaborativa 21 4.5. Conceptos básicos 21 4.6. Herramientas ROS 23 4.6.1. Gazebo 23 4.6.2. RVIZ 23 4.6.3. TF 24 4.6.4. URDF 25
iii 4.6.5. UR_KIN_PY 26 4.6.6. Mercurial 26 5 Entorno de Simulación 28 5.1. Entorno de simulación 28 5.1.1. Sistema robótico 29 5.1.2. Humano simulado 30 5.1.3. Pieza de trabajo 30 5.2.Objetivo de la tarea 31 5.3. Interacción con el sistema 32 5.4 Evaluación 33 6 Algoritmo de planificación y control de proceso de remachado 34 6.1. Máquina de estado 36 6.2. Mover el robot 38 6.3 Detectar agujero de remachado 34 6.4 Ejemplo de ejecución 40 7 Resultados y conclusiones 41 Anexa A: Arranque del Sistema 42 Anexo B: State Machine Code 43 Bibliografía 47
Introducción 4 4 Métodos de control de sistemas robóticos de cooperación multi-función en un entorno industrial relevante. En la primera fase de este challenge tiene lugar mi proyecto. Consta de 4 tareas interactivas robot-operario robot-robot, que se realizarán en dos escenarios de simulación distintos, la tarea 1 y 2 en el primer escenario, y la 3 y la 4 en el segundo. La tarea 1 no se utiliza el robot, se trata de una tarea de carácter de percepción de las cámaras del entorno. Hay que identificar un gesto señalador del operario, así como reconocer el punto de la pieza que señala, y estimar la posición de la pieza. Todo esto utilizando las cámaras kinect. La tarea 2 consiste en la programación de nuestro robot para que realice una secuencia de remachado. Las tareas 3 y 4 consisten en control de coordinación de dos brazos manipuladores robóticos, en la tarea 3 se trata de introducir un objeto que porta un brazo en otro objeto que porta el otro, y la tarea 4 se trata de mover un objeto de forma coordinada entre ambos manipuladores esquivando un obstáculo del escenario. Figura 3: EuRoC participantes.
5 5 Operación de remachado mediante robot manipulador industrial basado en ROS 2 ESTADO DEL ARTE DE LA ROBÓTICA ntes de comenzar con el planteamiento de la tarea encomendada y su posterior desarrollo de la solución, daremos un breve repaso sobre la robótica en general, sus inicios, su historia… hasta centrarnos en lo relevante en nuestro proyecto, el robot industrial y la simulación robótica. 2.1 La Robótica El estudio de la robótica requiere de un amplio conocimiento de la misma, y aunque es un área relativamente nueva, los avances realizados en sus pocos años de historia han sido muy importantes. El término robótica procede de la palabra robot. El término robot fue introducido por el checo Karel Capek en 1921, y viene de la combinación de las palabras checas “robota”, que significa “trabajo obligatorio” y “robotnik”, que significa ciervo. La robótica es, por tanto, la ciencia o rama de la ciencia que se ocupa del estudio, desarrollo y aplicaciones de los robots. Otra definición de robótica es el diseño, fabricación y utilización de máquinas automáticas programables con el fin de realizar tareas repetitivas como el ensamble de automóviles, aparatos, etc. y otras actividades. Básicamente, la robótica se ocupa de todo lo concerniente a los robots, lo cual incluye el control de motores, mecanismos automáticos neumáticos, sensores, sistemas de cómputos, etc. La robótica [2] es una disciplina con sus propios problemas, sus fundamentos y sus leyes, Tiene dos vertientes: teórica y práctica. En el aspecto teórico de aúnan las aportaciones de la automática, informática e inteligencia artificial. Por el lado práctico o tecnológico hay aspectos de construcción (mecánica, electrónica), y de gestión (control, programación). La robótica presenta por lo tanto un marcado carácter interdisciplinario. En la robótica se aúnan para un mismo fin varias disciplinas afines, pero diferentes, como la Mecánica, la Electrónica, la Automática, la Informática, etc. Los tres principios o leyes de la robótica según Asimov son: Un robot no puede dañar ni permitir que sea dañado ningún ser humano. El robot debe obedecer a todas las órdenes de los humanos, excepto las que contraigan la primera ley. El robot debe autoprotegerse, salvo que para hacerlo entre en conflicto con la primera o segunda ley. Los robots son dispositivos compuestos de sensores que reciben datos de entrada y que pueden estar conectados a la computadora. Esta, al recibir la información de entrada, ordena al robot que efectúe una determinada acción. Puede ser que los propios robots dispongan de microprocesadores que reciben el input de los sensores y que estos microprocesadores ordenen al robot la ejecución de las acciones para las cuales está concebido. En este último caso, el propio robot es a su vez una computadora. 2.2 Historia de la Robótica Por siglos, el ser humano ha construido máquinas que imitan partes del cuerpo humano. Los antiguos egipcios unieron brazos mecánicos a las estatuas de sus dioses; los griegos construyeron estatuas que operaban con sistemas hidráulicos, los cuales eran utilizados para fascinar a los adoradores de los templos. El inicio de la robótica actual puede fijarse en la industria textil del siglo XVIII, cuando Joseph Jacquard inventa en 1801 una máquina textil programable mediante tarjetas perforadas. Luego, la Revolución Industrial impulsó el desarrollo de estos agentes mecánicos. Además de esto, durante los siglos XVII y XVIII en Europa fueron construidos muñecos mecánicos muy ingeniosos que tenían algunas características de robots. En 1805, Henri Maillardert construyó una muñeca mecánica que era capaz de hacer dibujos. La palabra robot, como bien se desarrolló antes comenzó a utilizarse en 1921 en la obra del dramaturgo checo Karel Capek “Los Robots Universales de Rossum”, donde un hombre fabricó un robot que luego éste mataría a A
Estado del Arte de la Robótica 6 6 su creador. Son varios factores que intervienen para que se desarrollaran los primeros robots en la década de los 50’s. La investigación en inteligencia artificial desarrolló maneras de emular el procesamiento de información humana con computadoras electrónicas e inventó una variedad de mecanismos para probar sus teorías. Las primeras patentes aparecieron en 1946 con los muy primitivos robots para traslado de maquinaria de Devol. En 1954, con la aparición de las primeras computadoras, Devol diseña el primer robot programable En los 60’s se instaló en la Ford Motors Company el robot Unimate, basado en la transferencia de artículos. Ya en los 70’s, la Standford University desarrolló un pequeño brazo robótico de accionamiento eléctrico, bautizado como “Standford Arm”. Actualmente, el concepto de robótica ha evolucionado hasta los sistemas móviles autónomos, que son aquellos que son capaces de desenvolverse por sí mismos en entornos desconocidos y parcialmente cambiantes sin necesidad de supervisión. En los setenta, la NASA inició un programa de cooperación con el Jet Propulsión Laboratory para desarrollar plataformas capaces de explorar terrenos hostiles. En la actualidad, la robótica se debate entre modelos sumamente ambiciosos, como es el caso del COG “robot de cuatro sentidos”, desarrollado en el Instituto Tecnológico de Massachusetts (MIT), con proceso de aprendizaje cognitivo propio, vehículos con control remoto como SOUJOURNER O LUNA ROVER, o los robots mascotas de Sony. En general la historia de la robótica la podemos clasificar en cinco generaciones: las dos primeras, ya alcanzadas en los ochenta, incluían la gestión de tareas repetitivas con autonomía muy limitada. La tercera generación incluiría visión artificial, en lo cual se ha avanzado mucho en los ochenta y noventas. La cuarta incluye movilidad avanzada en exteriores e interiores y la quinta entraría en el dominio de la inteligencia artificial en lo cual se está trabajando actualmente. 2.3 Clasificación de Robots De manera general, y basándose en su morfología, los robots se suelen dividiren los siguientes tipos: Robot industrial o manipulador Son artilugios mecánicos y electrónicos destinados a realizar de forma automática determinados procesos de fabricación o manipulación. Se utilizan principalmente en la fabricación industrial. Los robots industriales son, con diferencia, el tipo de robot más utilizado, siendo Estados Unidos y Japón los líderes tanto en su fabricación como en su consumo. Figura 4: Robot industrial o manipulador.
7 7 Operación de remachado mediante robot manipulador industrial basado en ROS Robots móviles Los robots móviles están provistos de algún tipo de mecanismo que les permite desplazarse de lugar autónomamente, como pueden ser patas, ruedas u orugas y reciben la información del entorno con sus propios sistemas sensores. Son empleados en plantas industriales para el transporte de mercancías y para la exploración de lugares de difícil acceso o muy distantes, como es el caso dela exploración espacial y de las investigaciones o rescates submarinos. Androides o humanoides Intentan reproducir total o parcialmente la forma y el comportamiento del ser humano. Actualmente, los androides están bastante evolucionados, sobre todo en Japón, pero aún no tienen una utilidad práctica por sus propias limitaciones y por su precio de fabricación. Básicamente están destinados a la investigación y a tareas de marketing de las propias empresas desarrolladoras. Figura 5: Robot humanoide. Zoomórficos Los robots zoomórficos reproducen con mayor o menor grado de realismo, los sistemas de locomoción de diversos seres vivos. A continuación, detallaremos y nos centraremos en el robot usado en el proyecto, el robot manipulador o industrial. 2.4 Robot manipulador o industrial Los robots manipuladores o robots industriales (conocidos así porque inicialmente fueron usados masivamente en la industria) fueron los encargados de inaugurar la era de los robots en los años 60, con la herencia adquirida de los primeros teleoperadores. Por ello, es el área de la robótica donde la investigación está más avanzada. Es difícil encontrar investigaciones que trabajen en los aspectos básicos de los robots manipuladores tradicionales y, las pocas que hay, están centradas en la inclusión de modernos sensores o actuadores. Un ejemplo de esto es la adición de cámaras para reconocimiento avanzado de imágenes que mejoren la efectividad de dichos robots.
Estado del Arte de la Robótica 8 8 El área más interesante, y donde sí que se investiga de manera importante es en la búsqueda de novedosas aplicaciones para los robots manipuladores, como es el caso de los robots quirúrgicos, los cuales están teniendo un gran auge en estos momentos. En este caso, la investigación no está centrada en el robot sino en adaptar éste a las necesidades propias de la aplicación. 2.4.1 Estructura mecánica Se conoce también al robot industrial como brazo robótico y esto se debe a que guarda cierta similitud con la anatomía del brazo humano. También por ello, para hacer referencia a los distintos elementos que componen el robot, se utilizan términos como cuerpo, brazo, codo o muñeca. Formalmente, se denomina base al punto de apoyo del robot, generalmente sujeto de forma fija al suelo. Los elementos o eslabones van unidos por medio de diferentes articulaciones, que permiten un movimiento relativo entre dos eslabones consecutivos. En la parte final, se sitúa el efector final, que son los encargados de interaccionar directamente con el entorno del robot. Figura 6: Estructura mecánica del manipulador. El movimiento de cada articulación puede ser de desplazamiento, de giro o de una combinación de ambos. De este modo son posibles los 5 tipos diferentes de articulaciones, con sus diferentes grados de libertad, que pueden ser articulación de rotación(1), prismática(1), cilíndrica(2), planar(2) y esférica(3). Los grados de libertad son el número de movimientos independientes que puede realizar cada articulación con respecto a la anterior. El número de grados de libertad de un robot viene dado por la suma de los grados de libertad de cada una de sus articulaciones. El empleo de diferentes combinaciones de articulaciones en un robot, da lugar a diferentes configuraciones con características a tener en cuenta tanto en el diseño y construcción del robot como en su aplicación. 2.4.2 Aplicaciones Los robots manipuladores tienen su principal foco de trabajo en la industria, automatizando los procesos de producción o almacenaje. Generalmente no trabajan de forma independiente sino en conjunto con otras máquinas y herramientas formando células de trabajo. Se enumeran a continuación algunos ejemplos:
9 9 Operación de remachado mediante robot manipulador industrial basado en ROS Operaciones de procesamiento, como soldadura, pintura, etc. Este tipo de robots son muy comunes en la industria de la automoción. Operaciones de ensamblaje, donde el trabajo repetitivo facilita el uso de este tipo de robots. Operaciones de empaque (en tarimas o pallets), agilizando el proceso y manejando grandes pesos. Otro tipo de operaciones como pueden ser remachados, estampados, corte por choro de agua, sistemas de medición, etc. Concretamente, el robot manipulador del proyecto tiene una aplicación industrial de proceso de remachado a una pieza de trabajo provista de agujeros. 2.4.2.1 Remachados mediante Robot Con el fin de conseguir eficiencia y flexibilidad en la industria, se han desarrollado robots destinados a realizar tareas como remachado o atornillado, liberando así una gran carga de trabajo para el operario, por no hablar de la mayor efectividad conseguida con el robot. Los robots de remachado son aquellos utilizados para sellar materiales o artículos metálicos. Generalmente se utlizan en informática y electrónica, así como en la fabricación y ensamblado de electrodomésticos. Estos robots realizan una misma tarea con gran efectividad, como por ejemplo también podría ser el atornillado. Estos remaches se pueden realizar también mediante soldadura, en función de lo que se programe en cada caso y según las necesidades del cliente. En el mercado actual podemos encontrar numerosas empresas dedicadas a la comercialización de robots y sus fabricantes como pueden ser Stäubli, Yaskawa o Adept Technology destinadas a distintos sectores como la carpintería metálica, o los electrodomésticos, informática o electrónica, citados anteriormente. Figura 7: Robot de remachado Stäubli TX90. 2.4.3 Nuevas estructuras de robots manipuladores El robot manipulador tradicional que se ha presentado anteriormente es el más usado, pero desde hace tiempo se investiga mucho en novedosas estructuras para este tipo de robots: Robots manipuladores redundantes: Básicamente se componen de un gran número de eslabones, los cuales además tienen la cualidad de ser iguales y repetitivos. Se denominan también robots de tipo serpiente. Estos robots tienen la capacidad de introducirse por espacios poco estructurados debido a su flexibilidad.
Estado del Arte de la Robótica 10 10 Robots manipuladores antropomorfos (generalmente imitando la forma de la mano humana): Su aplicación se aleja de la industria tradicional y se acerca más a la creación de prótesis para la investigación médica. 2.5 La simulación Robótica La simulación juega un papel crucial previo en los proyectos robóticos gracias a que nos permite realizar las operaciones de validación y verificación de aplicaciones robóticas antes de la construcción física del robot, lo que conlleva un importante ahorro tanto de tiempo como de dinero. Su empleo no sólo se basa en un carácter, por llamarlo de alguna manera, preventivo del producto. La simulación virtual también tiene una importante aplicación a la hora de entrenar el manejo y comprender las características del dispositivo antes de emplear el robot real. Simuladores basados en comportamientos robóticos nos permiten crear mundos simplificados con objetos rígidos y programar robots que interactúen con ellos. En ocasiones, un entorno con condiciones extremas u operaciones en un área remota no nos permiten verificar todos los procedimientos y problemas físicomecánicos ni por ello testear de una forma sólo experimental. Por lo tanto, pueden presentarse ocasiones en las que haya que tomar decisiones con el único análisis de los resultados de una simulación. Una de las aplicaciones más populares es el modelado 3D y su representación que requieren de buenos motores de leyes físicas y buenos gráficos para una emulación aceptable del robot y el mundo que lo rodea. Esto implica que cada robot tendrá unas propiedades gráficas y unas físicas. Las técnicas de simulación e implementación robótica necesariamente pasan por una descripción analítica del sistema físico-mecánico. Sin embargo, a veces puede no contarse con todos los parámetros reales para simular un entorno cien por cien realista. Se emplean entonces técnicas de manejo de datos con la probabilidad y estadística. Es necesario también el modelado numérico con su respectivo software y toolboxes. Son empleados simuladores multidominio e híbridos con métodos que soporten una simulación rápida en tiempo real. En la actualidad, la simulación robótica nos proporciona una grandísima variedad de elementos: diferentes familias de robots (UGV para tierra, UAV para aire, AUV para agua, brazos robóticos, manos robóticas, humanoides, avatares…), actuadores (Cadenas cinemáticas genéricas, actuadores de fuerza controlada…), subactuadores, sensores (Odometría, IMU, GPS, cámaras, lásers, emisores y receptores…), mecanismos, manipuladores, herramientas robóticas…). Llegando incluso a existir simuladores empleados en tareas en el espacio como satélites o aeronaves. Científicos e ingenieros han venido desarrollando conjuntamente una gran variedad de técnicas de modelado y simulación creando diferentes softwares, de los cuales destacaré a continuación los más importantes. Morse es un simulador de un robot de código abierto con soporte completo a ROS . Usa OpenGL como su motor 3D y tienen un render realista, que hace que la simulación sea más sencilla de entender. El sistema funciona con comandos en línea, pero también puede usarse Python para controlar los robots en el simulador. Un componente sorprendente de Morse es su habilidad para modelar la interacción humano/robot. Otro simulador similar es Gazebo, también para ROS. Como es el usado en este trabajo, lo desarrollaré más adelante. El siguiente ejemplo es Webots, el cual utiliza ODE (Open Dynamics Engine) para la detección de colisiones, proporcionando también una simulación precisa de velocidad, inercia y fricción. Una de las características que han hecho famoso ARS es que funciona exclusivamente con Python y su facilidad para generar la documentación. Otro simulador muy famoso es V-Rep no sólo porque los controladores pueden ser escritos en casi todos los lenguajes de programación existentes, sino por la versatilidad que le proporciona su distribuida arquitectura de control: cada objeto puede ser controlado independientemente por un script interno, un plugin, un nodo de ROS, un cliente remoto API o el cliente. Es empleado para desarrollo rápido de algoritmo y simulaciones de cadenas de montaje.
11 11 Operación de remachado mediante robot manipulador industrial basado en ROS 3 MODELADO, CONTROL Y SIMULACIÓN DE ROBOTS n el campo de la robótica, para el modelado, simulación y control de robots es necesario disponer de unas herramientas que nos permitan conocer su posición, orientación, velocidad, configuración entre otros en el entorno de trabajo. Para ello es necesario conocer previamente como representar la posición y la orientación en el espacio, establecer un modelo tanto cinemático como dinámico que nos permita relacionar valores articulares-posición, velocidades cartesiana-velocidades articulares, par aplicado-articulación, etc. Pueden encontrar esta información de forma más extensa en los libros de robótica generales: - Ollero Baturone, (2007). Robótica: Manipuladores y robots móviles. - Lewis, Frank L., Abdallah, C. T. Dawson, D. M. (1993). Control of robot manipulators. 3.1 Representación de posición y orientación Sabemos que la posición de un punto en el espacio euclídeo tridimensional viene determinada por tres cantidades, que llamamos sus coordenadas, y decimos que están expresadas en algún sistema de referencia, formado por tres ejes, usualmente rectilíneos. En lo sucesivo usaremos exclusivamente sistemas de referencia rectilíneos, ortogonales (es decir, con sus tres ejes perpendiculares dos a dos), normalizados (es decir, las longitudes de los vectores básicos de cada eje son iguales) y dextrógiros (el tercer eje es producto vectorial de los otros dos). Usaremos, pues, simplemente el término "sistema" para referirnos a sistemas ortonormales. Figura 8: Tipos de sistemas de referencia. Las coordenadas de un punto, denotadas por (x; y; z), son las proyecciones de dicho punto perpendicularmente a cada eje, o, equivalentemente, las componentes del vector que lo une al origen de coordenadas. En lugar de usar estas, nos será más conveniente el uso de las llamadas coordenadas homogéneas, en la forma: donde siendo w una cantidad arbitraria, que se suele tomar como 1. Si, como resultado de algún cálculo, w fuese E
Modelado, control y simulación de robots 12 12 distinto de 1, las coordenadas usuales se reconstruyen simplemente dividiendo las tres primeras coordenadas homogéneas entre esta cuarta. La traslación de un punto x, y, z por un vector v es un punto x’, y’, z’ tal que: Pero también como el producto de una matriz por un vector homogéneo, en la forma: Esto tiene la ventaja de que, si: entonces Donde se puede calcular la inversa, que resulta ser: lo cual es consistente con el hecho de que x esta trasladado por un vector –v respecto a x'. Respecto a la rotación alrededor de un eje, en el caso bidimensional, se está rotando con respecto a un eje z perpendicular al plano de la figura. Figura 9: Rotación de sistema de referencia respecto al eje Z Llamando i, j a los vectores básicos del sistema original, e i' y j' a los del sistema girado, se tiene que
13 13 Operación de remachado mediante robot manipulador industrial basado en ROS Es decir, que Igualando componente a componente, escribimos la matriz como Si generalizamos a tres dimensiones, como la coordenada z no varia y la cuarta coordenada homogénea sigue siendo 1, tenemos Para hallar la transformación inversa basta ver que desde el punto de vista de R', R esta rotado un ángulo -θ , luego podemos afirmar que Esta operación es más simple que invertir la matriz, aunque por supuesto, equivalente. En general, si hubiéramos rotado alrededor de otro de los ejes básicos, se puede ver que Cabe destacar el cambio de signo en la rotación alrededor del eje y, debido a que, si el eje alrededor del cual rotamos nos apunta, los otros dos forman un ángulo de 90o en el caso de x y z, pero de -90o en el caso de y. Se pueden aplicar a un punto tantas transformaciones sucesivas (rotaciones y traslaciones) como se quiera. La operación resultante vendría dada por una matriz que sería producto de las matrices de cada operación, aplicadas en el orden correcto, dado que el producto de matrices no es conmutativo. Se pone más a la derecha la primera transformación que se aplique, siendo expresado como Significa que se aplica al punto X la rotación 1, seguida de la rotación 2, seguida de la traslación 1, luego la rotación 3 y por último la traslación 2. Veamos ahora cual sería la matriz de rotación respecto a un eje cualquiera. Sea un eje que pasa por el origen definido por un vector unitario alrededor del cual giraremos un ángulo θ.
ROS y herramientas de desarrollo 20 20 Las áreas que incluirán las aplicaciones de los paquetes de ROS son: Percepción Identificación de Objetos Segmentación y reconocimiento Reconocimiento facial Reconocimiento de gestos Seguimiento de objetos Egomoción Comprensión de movimiento Estructura de movimientos (SFM) Visión estéreo: percepción de profundidad mediante el uso de dos cámaras Movimientos Robots móviles Control Planificación Agarre de objetos 4.2 Diseño modular y distributivo Ros fue diseñado para ser lo más distributivo y modular posible, de modo que los usuarios pueden utilizar ROS tanto como deseen. Su modularidad le permite seleccionar y elegir qué partes son útiles y qué partes prefiere implementar uno mismo. La naturaliza distributiva de ROS también fomenta una gran comunidad de paquetes contribuidas por usuarios que añaden un gran valor a la parte superior del núcleo del sistema ROS. En el último recuento se contaron más de 3000 paquetes en el ecosistema ROS, y eso que solo son los paquetes que la gente ha hecho público. Estos paquetes varían en la fidelidad, cubriendo desde pruebas de conceptos de implementación de nuevos algoritmos hasta drivers de alta capacidad y calidad industrial. La comunidad de usuarios de ROS construye sobre la parte superior de una infraestructura común para proporcionar un punto de integración que ofrece acceso a controladores de hardware, robots genéricos, herramientas de desarrollo, bibliotecas externas útiles, y mucho más. 4.3 Historia ROS es un largo proyecto con muchos antepasados y colaboradores. La necesidad de un marco de colaboración abierto fue requerido por muchas personas en la comunidad de investigación robótica, y muchos proyectos se han creado para alcanzar este objetivo. Varios esfuerzos en la Universidad de Stanford a mitad de los años 2000 envolviendo integrativamente tanto STanford Al Robot (STAIR) como el programa Personal Robots (PR) crearon prototipos internos de sistemas de software flexibles y dinámicos destinado al uso robótico. En 2007, Willow Garage, una incubadora cercana de visionarios robóticos, aportó importantes recursos para ampliar estos conceptos mucho más allá y crear implementaciones bien probadas. Este esfuerzo se vió impulsado por un sinfín de investigadores que contribuyeron con su tiempo y experiencia para las ideas principales de ROS y sus paquetes de software fundamentales. En todo momento, el software fue desarrollado en abierto usando una licencia de código abierto (BSD open-source), y poco a poco se ha convertido en una plataforma ampliamente utilizada en la comunidad de investigación robótica.
21 21 Operación de remachado mediante robot manipulador industrial basado en ROS Desde sus inicios, ROS se desarrolló en múltiples instituciones y para múltiples robots, incluyendo muchas de las instituciones que recibieron los robots PR2 de Willow Garage. A pesar de que habría sido mucho más fácil para todos los contribuyentes poner su código en los mismos servidores, en los últimos años, el modelo “federado” se ha convertido en una de las grandes fortalezas del ecosistema ROS. Cualquier grupo puede comenzar su propio repositorio de código ROS en sus propios servidores, y mantener la propiedad y control por completo, sin necesidad de permiso de nadie. Si deciden poner su repositorio a disposición del público, pueden recibir el reconocimiento y crédito que se merecen sus logros, y beneficiar se de la información técnica específica y mejoras como todos los proyectos de software de código abierto. 4.4 Comunidad activa y colaborativa En los últimos años, ROS ha crecido para contar con una gran comunidad de usuarios en todo el mundo. Históricamente, la mayoría de los usuarios se encontraban en los laboratorios de investigación, para cada vez más estamos viendo una adopción en el sector comercial, en particular en la industria y servicios robóticos. La comunidad ROS es muy activa. Según las últimas mediciones, la comunidad ROS cuenta con más de 1500 en la lista de ROS distributiva, más de 3300 usuarios en la wiki de documentación colaborativa y unos 5700 usuarios en foro de la página web. La wiki cuenta con más de 22000 páginas y más de 30 ediciones diarias. En el foro tienen lugar unas 13000 preguntas hechas hasta la fecha, con una tasa de respuesta del 70%. ROS no solo ofrece por sí mismo un gran valor a la mayoría de los proyectos, sino que también representa una oportunidad para establecer contactos y colaborar con los expertos en robótica mundiales que forman parte de la comunidad de ROS. Una de las filosofías básicas de ROS es compartir el desarrollo de componentes comunes. 4.5 Conceptos básicos Los conceptos fundamentales de la aplicación de ROS son nodos, mensajes, topics y servicios. Los nodos son procesos ejecutables. ROS es diseñado para ser modular en una escala de grano fino: Un sistema típicamente se compone de muchos nodos. En este contexto, el término “nodo” es intercambiable por “módulo”. El uso del término “nodo” surge de visualizaciones de ROS basados en sistemas tiempo de ejecución: cuando muchos nodos se están ejecutando, se realizan las comunicaciones “peer-to-peer”, es decir, el enlace entre los distintos nodos son estas comunicaciones. Los nodos se comunican entre sí mediante paso de mensajes. Un mensaje es una estructura de datos que pueden ser distintos tipos (enteros, punto flotantes, booleanos, etc) apoyados por tipos primitivos y constantes. Los mensajes pueden estar compuestos de otros mensajes, y matrices de otros mensajes, anidados de forma profunda. En nodo envía un mensaje mediante su publicación en un “topic”. Un topic puede interpretarse como un buzón de mensajes dónde llega siempre un mismo tipo o estructura de dato, de esa forma, si un nodo está interesado en un determinado tipo de dato, se suscribirá en el topic correspondiente. Puede haber varios publicados y suscriptores para un solo topic, como un nodo puede publicar y estar suscritos a varios topics a la vez.
ROS y herramientas de desarrollo 22 22 Figura 12: Sistema básico ROS. Aunque el modelo de publicación-suscripción basado en topics es flexible, no es apropiado para transacciones síncronas, que pueden permitir el diseño de algunos nodos. Para esto, ROS nos facilita los “servicios”, que se define con un nombre de cadena de caracteres y dos mensajes proporcionados: Uno de solicitud y otro de respuesta. Esto es análogo a los servicios web, que son definidos por los URI y tienen tipos de documentos de solicitud y respuesta bien definidos. A diferencia de los topics, solo un nodo puede requerir un servicio, mientras que será respondido por otro. Finalmente también hay que destacar la capacidad de flexibilidad a la hora de la programación, ya que permite usar varios lenguajes de programación como C++, Python, Lisp u Octave, permitiendo además, que un sistema esté compuesto por nodos escritos en distinto lenguajes, aumentado su flexibilidad y modularidad. Figura 13: Sistema Robótico de visión en ROS.
23 23 Operación de remachado mediante robot manipulador industrial basado en ROS 4.6 Herramientas ROS 4.6.1 Gazebo La simulación robótica es una herramienta esencial en el tool-box robótico. Un simulador bien diseñado permite probar rápidamente algoritmos, robots diseñados y realizar pruebas de regresión utilizando escenarios realistas. Gazebo [4] ofrece la posibilidad de simular con precisión y eficiencia poblaciones de robots en entornos interiores y exteriores complejos. Genera tanto la realimentación de los sensores como las interacciones físicas entre objetos tratándolos como cuerpos rígidos, a través de gráficos de alta calidad e interfaces programables. Además de tener una comunidad activa. Figura 14: Gazebo. 4.6.2 RVIZ RVIZ (ROS Visualization) [5] es un visualizador 3D que permite la visualización de datos de sensor e información de estado del sistema de ROS. Usando RVIZ, se puede ver la configuración actual de Baxter en un modelo virtual del robot, además de las representaciones en vivo de los valores de sensor publicados en los topics de ROS, incluyendo datos de cámara, mediciones de sensores de distancia infrarrojos, datos de sonar, etc. Algunos de los datos más importantes que podemos visualizar se encuentran: RobotModel: Muestra una representación visual de un robot en la posición dada (definida por la transformación TF del momento). TF: Descrita a continuación, nos permite visualizar los distintos ejes de referencia que conforma nuestro entorno. Point Cloud; Muestra los datos de una nube de puntos, configuradas por diferentes opciones disponibles.
ROS y herramientas de desarrollo 24 24 Camera: Crea una nueva ventana con la perspectiva de una cámara, y superpone la imagen en la parte superior de la misma. Laser Scan: Muestra los datos de una exploración por láser, con diferentes opciones para los modos de representación, acumulación, etc. Otras herramientas como Axes, Effort, Grid, Map, Markers, Path, Pose, Pose Array…etc. Figura 15: RVIZ. 4.6.3 TF El sistema TF de ROS [6] permite coordinar múltiples sistemas de referencias y mantener la relación entre ellos en una estructura de árbol. TF se distribuye de manera que la información acerca de la coordinación de todos los sistemas de referencia del sistema está disponibles para todos los nodos de la red de ROS. Además del acceso a esta información, nos permite recuperar transformaciones entre ellos, transformar puntos, vectores y otras entidades entre dos ejes de referencia. Algunas aplicaciones son: tf_monitor: Imprime información sobre el actual árbol de coordenadas por consola. tf_echo: Imprime información sobre la transformación relativa entre dos ejes de referencia. static_transform_publisher: Publica un nuevo eje de referencia a través de una transformación estática de un eje ya existente. view_frames: Genera un PDF con nuestro árbol de tf.
25 25 Operación de remachado mediante robot manipulador industrial basado en ROS Figura 16: TF frames en RVIZ. De aquí en adelante, a los ejes de referencia representados por TF los llamaremos “TF frames”. Esta herramienta de ROS nos permitirá obtener posiciones relativas entre TF frames, que nos sirve por ejemplo, para calcular errores de posición entre ellos y que usaremos para estimar la posición del agujero deseado para remachar. También podremos realizar transformaciones entre estos marcos de referencia para las operaciones de cinemática inversa o directa del modelo cinemático, sin tener que usar matrices de transformación, como por ejemplo en el caso de aplicar la cinemática inversa, no usaremos el robot hasta el último eslabón como viene definido en el archivo URDF tcp, sino que tenemos que retroceder tres eslabones hacia atrás en el modelo cinemático hasta el eslabón ee_link (end effector link). 4.6.4 URDF URDF (Unified Robot Description Format) [7] se trata de una herramienta de ROS que consiste en un documento formato XML que nos permite representar el modelo de un robot. Los archivos URDF se estructuran básicamente en forma de árbol, con dos componentes principales para construir el robot: Links (eslabones) y Joints (articulaciones): Links: Constituyen las componentes físicas del robot, es decir, cada uno de los eslabones por lo que está formada nuestra cadena cinemática, también compone la parte visual donde debemos introducir nuestros archivos .DAE para su visualización posterior. En el apartado visual -> geometry -> mesh podemos introducir nuestro modelo .dae diseñado previamente. También podemos introducir de forma genérica objetos geométricos simples como cilindros, esferas, cubos, etc… definiendo todos sus parámetros (arista, radio…). Joints: Mediante la definición de los “joints” establecemos la relación entre los distintos links o eslabones que componen nuestro robot, tanto las posiciones relativas entre ellos, como la articulación que habrá entre ellos.
ROS y herramientas de desarrollo 26 26 Figura 17: Esquema URDF. La organización EuRoC nos facilita el archivo URDF de nuestro robot UR5, que utilizaremos para realizar las operaciones de cinemática inversa y directa usando la librería ur_kin_py , que detallamos a continuación, ya que para realizar operaciones de cinemática necesitamos conocer el modelo cinemático del robot, y este archivo URDF le servirá a nuestra librería todo lo necesario sobre eslabones y articulaciones de nuestro manipulador. Para una información más completa 4.6.5 UR_KIN_PY UR_KIN_PY [8] se trata de un paquete existente en el repositorio de códigos de ROS donde encontramos las funciones de cinemática directa e inversa de las configuraciones UR5 y UR10, que necesitaremos para la generación de trayectorias para mover nuestro robot. 4.6.6 Mercurial Ciertamente Mercurial no pertenece al sistema ROS, es un software propio y totalmente fuera, es un sistema de control de versiones multiplataforma, un software libre para la línea de comandos, implementado principalmente en Python pero que incluye una implementación binaria en C. Escrito originariamente para funcionar en GNC/Linux. Con una interfaz web integrada, sus metas de desarrollo son el rendimiento y escalabilidad, un desarrollo distribuido sin necesidad de servidor, gestión robusta de archivos tanto de texto como binarios y capacidades avanzadas de ramificación e integración manteniendo la sencillez conceptual. Las diferentes facilidades que nos ofrece Mercurial son: Monitorizar los archivos añadidos Repositorio compartido Guardar cambios localmente de forma temporal trabajando en diferentes clones Copiar y mover archivos Revisar historial Arreglar errores en versiones anteriores Mezcla o fusión de dos clones diferentes originales de un mismo código
27 27 Operación de remachado mediante robot manipulador industrial basado en ROS Figura 18: Mercurial.
Entorno de Simulación EuRoC 28 28 5 ENTORNO DE SIMULACIÓN EUROC omo ya se desarrolló anteriormente, mi proyecto se encontraba en la prima fase del Challenge 1 de EuRoC, dónde se planteaban 4 tareas en dos escenarios distintos, las tareas 1 y 2 en uno, y la 3 y 4 en otro. A continuación mostraremos una descripción del entorno en el que reside el trabajo, escenario uno, para la tarea 2. 5.1 Entorno de simulación El entorno para las tareas 1 y 2 consiste en área de trabajo donde encontramos principalmente una mesa de trabajo, con un robot industrial y un objeto, un operario moviéndose de forma totalmente aleatoria (en nuestra tarea 2) por nuestro escenario, y dos cámaras 3D. Sobre la mesa de trabajo encontramos un robot industrial de 6 grados de libertad (configuración UR5) equipado en su efector final con una herramienta de remachado. También tiene lugar un objeto, que llamaremos de aquí en adelante “pieza de trabajo” en el área de trabajo de nuestro robot. Esta pieza de trabajo tiene varios agujeros para realizar operaciones de remachado sobre ellos. Como ya hemos mencionado, también tenemos dos cámaras 3D. La primera enfoca el escenario de forma global pudiendo ver la escena con su totalidad, y la segunda enfoca directamente la mesa de trabajo. Cabe mencionar que en nuestra tarea 2 no usaremos estas cámaras, ya que éstas están destinadas para su uso en la tarea 1, centrada en la percepción. Figura 19: Entorno de simulación. C
29 29 Operación de remachado mediante robot manipulador industrial basado en ROS 5.1.1 Sistema robótico Como ya iniciamos antes, para nuestra tarea tenemos un robot manipulador de 6 grados de libertad, cuya configuración es la conocida y global UR5. La organización EuRoC nos da el acceso a su descripción cinemática y dinámica a través de su archivo URDF (Unified Robot Description Format). Figura 20: Robot UR5 con sus marcos de referencia. En su efector final, el robot está equipado con una herramienta de remachado, descrita con la siguiente figura: Figura 21: Vistas detalladas del efector final del robot. Esta parte cilíndrica de 5mm de diámetro de la herramienta tiene que ser insertada en los agujeros de la pieza de trabajo, como detallaremos en la descripción de la tarea, los TF más relevantes se muestran en la imagen anterior. Debemos destacar que nuestra guía de la posición del robot será el último tf frame llamado tcp.
Algoritmo de planificación y control de proceso de remachado 36 36 GOING TO HOLE GUESS -> MOVING INTO HOLE: De 36 utom transición automatic mediante variable booleana MOVING INTO HOLE: Donde nuestro robot se introducirá en el agujero hasta 6 mm con la herramienta de remachado cilíndrica. Figura 30: Remachado de la pieza. MOVING INTO HOLE -> RIVETING: Transición 36 utomatic por variable booleana. RIVETING: Una vez introducida la herramienta en el agujero, llamaremos al servicio ROS trigger_rivet, que simula el proceso de remachado, y podremos contabilizar un remachado con éxito. RIVETING -> OUT FROM HOLE: Transición que se active tras la llamada al servicio trigger_rivet. OUT FROM HOLE: Movimiento del robot de salida del agujero hasta la posición de encare inicial. OUT FROM HOLE -> GOING TO RIVET HOME: Si todo se ha realizado correctamente, nuestro topic target_frame tendrá un valor de rivet_home tras comprobar esto, se activará la transición, comenzando el proceso de nuevo. Esta máquina de estado está implementada en código de programación que se adjunta en el Anexo B :“State Machine Code”. Este ejecutable está implementado en el nodo cliente de la tarea, donde debe ir la solución a nuestro problema. 6.2 Mover el robot Como expuse anteriormente, partimos de la base de opciones de acciones en ROS que nos proporciona la organización del concurso: simulation_ur5/joint_trajectory_controller/follow_joint_trajectory: Nos permite mover el robot en el espacio articular. simulation_interface_ur5/cartesian_position:ipa325_msgs.msg.RobotMovementAction : Nos permite mover el robot en el espacio cartesiano. Tras una serie de pruebas utilizando ambas opciones, finalmente me decanté por mover nuestro robot en el espacio articular, ya que la posibilidad del espacio cartesiano nos ofrecía a veces problemas de cinemática inversa, produciendo movimientos bruscos del robot, golpeando la pieza de trabajo, cosa que debemos evitar.
37 37 Operación de remachado mediante robot manipulador industrial basado en ROS Tratándose de una acción de ROS, debemos saber que se trata de una comunicación bidireccional, es decir, debemos hacer una petición de realizar la acción, esta petición se realizar mediante una llamada de código. Una vez formulada la petición, si ésta se ha realizado de forma correcta, se ejecutará la acción, y nos enviará un mensaje de vuelta con el resultado: éxito, error o indefinido. Puede entenderse tal que así: Figura 31: Comunicación entre acciones ROS. Para realizar nuestra petición a la acción, debemos completar una estructura de mensaje ROS, del tipo control_msgs.msg.FollowJointTrajectoryGoal, donde debemos completar los siguientes campos de la estructura control_msgs.msg.FollowJointTrajectoryGoal.trajectory: control_msgs.msg.FollowJointTrajectoryGoal.trajectory.joint_names: Se trata de un vector de caracteres compuesto por las distintas articulaciones de nuestro robot, en nuestro caso , tras definir nuestra variable de mensaje: goal_trajectory = control_msgs.msg.FollowJointTrajectoryGoal(); goal_trajectory.trajectory.joint_names = [‘shoulder_pan_joint’, ‘shoulder_lift_joint’, ‘elbow_joint ‘wrist_1_joint’, ‘wrist_2_joint’, ‘wrist_3_joint’]; control_msgs.msg.FollowJointTrajectoryGoal.trajectory.points: Donde definíamos la trayectoria de puntos de nuestro movimiento en el espacio articular, dentro de points debíamos definir dos subcampos: - control_msgs.msg.FollowJointTrajectoryGoal.trajectory.points.positions: Valor articular de nuestra trayectoria, en nuestro caso, era válido enviarle simplemente posición inicial y final - control_msgs.msg.FollowJointTrajectoryGoal.trajectory.points.time_from_start.secs: Definiendo así la velocidad del movimiento, es decir, el instante en el que queríamos que nuestro robot estuviese en cada posición. Una vez completos estos campos realizábamos la petición de acción y movíamos el robot de forma satisfactoria. Pero antes de la petición había que realizar un trabajo previo, ya que inicialmente todas nuestras posiciones destino las obteníamos mediante la herramienta TF en valores cartesianos, por lo que hay que aplicar funciones de cinemática inversa para poder continuar con el subproblema. Esto constituyó uno de los principales problemas para la resolución del proyecto, ya que inicialmente se decidió usar la librería de ROS KDL, la más generalizada y usada para la resolución de problemas cinemáticos tanto directos como inversos, pero en nuestro caso nunca dio resultados satisfactorios, ya que realizaba los movimientos con poca precisión, por lo que no nos era válido debido a que estos errores de posición daban lugar a contacto robot-pieza de trabajo, algo que debíamos evitar a toda costa.
Algoritmo de planificación y control de proceso de remachado 38 38 Finalmente, se decidió utilizar la librería ur_kin_py (explicada en capítulos anteriores) para este problema, realizando las funciones de cinemática inversa de manera satisfactoria. Todo esto se implementó en la función “move_to” que usamos en la máquina de estado, donde la función recibe la posición destino, y se encargará de realizar todo lo necesario descrito anteriormente. En resumen, para el movimiento del robot era necesario: 1. Conocer, mediante la herramienta ROS TF, la posición inicial y final en coordenadas cartesianas de nuestro movimiento deseado. 2. Transformar estos valores cartesianos en articulares aplicando cinemática inversa. 3. Rellenar la estructura de mensaje de la petición de acción ROS. 4. Petición de acción. 5. Esperar y obtener resultados. Siguiendo este esquema, se consiguió de manera satisfactoria mover nuestro robot, obteniendo siempre buenos resultados y resolviendo nuestros problemas iniciales con la cinemática inversa con la librería que finalmente usamos. 6.3 Detectar agujero de remachado Durante la ejecución de la tarea, nuestro agujero a remachar de forma cíclica no se publica de forma explícita, sino a través de un TF frame llamado hole_guess que se publica automáticamente en cada ciclo, y que es una aproximación del verdadero agujero de la pieza a remachar, y que debemos identificar y localizar nosotros desde la posición inicial, que es uno de los objetivos de nuestra tarea. Nuestra pieza de trabajo está compuesta por un total de 33 agujeros, distribuidos en tres caras o superficies distintas de la pieza. Para localizar nuestro agujero a remachar, decidí usar la herramienta de ROS TF, que nos permite obtener posiciones relativas entre distintos TF frame. Nuestra función “detecting_hole_guess”, de forma general, realiza un bucle recorriendo los 33 agujeros de la pieza, comparando cada uno de sus TF frames con el TF frame hole_guess, buscando así, el agujero que minimice el valor absoluto de la comparación en posición y orientación. Ésta nos devolvería una cadena de caracteres indicando de qué agujero se trata, para realizar la operación de remachado sobre él en ese ciclo. For I in xrange(33): h_i = “h”+str(i) hi_pos = self.get_tf_transform(“base_link”, h_i) pos_dif = numpy.array(hi_pos)-numpy.array(hole_guess_pos) result_i = numpy.linalg.norm(pos_dif) if result_i<result: h_result=”h”+str(i) hole_numb = i if hole_numb == -1: rospy.loginfo(“Hole_guess not detected”) q_home = -1 else: rospy.loginfo(“Hole_guess detected: “) rospy.loginfo(h_result)
39 39 Operación de remachado mediante robot manipulador industrial basado en ROS Además, con vistas a la eficiencia de la ejecución de nuestro algoritmo, se que según la cara en la cual se encontrase nuestro agujero (conocemos cuál agujero pertenece a cuál cara), realizaríamos una trayectoria diferente con nuestro robot, es decir, encararíamos a la pieza de forma diferente, con el fin de realizarlo con mayor velocidad y eliminar posibles errores de cinemática inversa en nuestra trayectoria. Por lo que en nuestra función, además de localizar el agujero a remachar, nos devuelve en valores articulares las distintas posiciones de nuestra trayectoria para realizar la operación en función de la cara de la pieza donde se encuentre el agujero. A continuación mostramos imágenes sobre los “encaramientos” de nuestro robot hacia la pieza: Figura 32: Posición intermedia de remachado para cara superior. Figura 33: Posición intermedia de remachado para una cara lateral.
Algoritmo de planificación y control de proceso de remachado 40 40 6.4 Ejemplo de ejecución A continuación mostraremos una serie de imágenes que nos visualiza un ejemplo de ciclo de remachado de nuestro robot: Figura 34: Posición inicial “rivet_home”. Figura 35: Robot detectando “hole_guess”. Figura 36: Robot encarando pieza Figura 37: Inserción de la herramienta de remachado A continuación, volveríamos a la posición inicial y volveríamos a buscar de nuevo el siguiente “hole_guess”.
41 41 Operación de remachado mediante robot manipulador industrial basado en ROS 7 RESULTADOS Y CONCLUSIONES on la solución propuesta al problema expuesta en el capítulo anterior, tras la evaluación de la organización EuRoC, los resultados de la tarea fueron los siguientes tras su ejecución: SUBTAREA MEDIDA RESULTADO PUNTUACIÓN OBTENIDA Localización de agujeros a remachar Media de error 0 10 Remachar agujeros Número de agujeros remachados correctamente 9 2 Colisiones robot-pieza de trabajo Número de colisiones robot-pieza de trabajo 0 10 Tabla 6: Resultados de evaluación. Dentro de la tarea del proyecto, obtuvimos un total de 22/30 puntos, y englobando todas las tareas de la primera fase del concurso, obtuvimos un total de 43 puntos, 21 de la tarea 1, 22 de la presente, y 0 puntos tanto para la tarea 3 y 4, ya que finalmente no presentamos ninguna solución para esta parte de la primera fase del Challenge 1. Puede ver la tarea 2 en el formato digital aquí Esta puntuación nos permitió para clasificarnos para la segunda fase del Challenge 1, obteniendo un octavo puesto de los 32 participantes (recordamos que solo se clasificaban los 15 primeros clasificados), que ya quedó en manos del Centro Tecnológico CATEC y en el que no participé. A la vista de los resultados en la evaluación, nuestro punto flojo fue la rapidez con la que realizábamos cada ciclo de remachado, pero formaba parte de la estrategia de optimización de obtención de puntos, ya que como desarrollamos en el capítulo anterior, en el desarrollo, no fue posible darle mayor velocidad a la trayectoria del robot de manera estable sin obtener colisiones entre el robot y la pieza de trabajo, por lo que se decidió asegurar los 10 puntos referente al número de colisiones frente al número de remachado de agujeros, ya que aunque aumentásemos la velocidad del robot en sus movimientos y tuviésemos algunas colisiones (que esto nos daría directamente 0 puntos en la subtarea de colisiones) habría que realizar un total de 15 o más remachados de forma correcta para obtener los 10 puntos de esa subtarea, cosa que no se consiguió, por lo que se optó por la estrategia presente. Por otra parte, mediante la herramienta TF de ROS conseguimos obtener de forma exitosa todas las localizaciones de los agujeros que había que remachar, teniendo un error nulo en cada uno de ellos. Si hubiésemos conseguido una herramienta más eficiente para cálculo de cinemática inversa, ya que con la que disponíamos debíamos realizar trayectorias predefinidas que nos hacían movernos cíclicamente de forma más lenta, hubiésemos podido planificar trayectorias más directas entre posición inicial y posición de remachado y ganar tiempo, pudiendo realizar un mayor número de remachados en el tiempo de ejecución dado. C
Anexo A: Arranque del Sistema 42 42 ANEXO A: ARRANQUE DEL SISTEMA ara iniciar nuestra infraestructura proporcionada por EuRoC y la resolución al problema propuesto, debemos instalar previamente los paquetes desde el servidor de la organización, una vez instalados debemos distinguir dos extremos de comunicación: Nodo servidor: En su ejecución inicializa todo lo necesario para comenzar la tarea, es decir, el entorno de simulación en gazebo (los modelos visuales de todos los elementos del escenario), topics, servicios, TF frames… etc. Una vez inicializado todo, se mantiene a la espera de la ejecución del nodo cliente, que resolverá la tarea. Nodo cliente: Contiene el ejecutable para la resolución de la tarea, es decir, la llamada a la función de la máquina de estado, una vez lo arrancamos, resuelve la tarea automáticamente. Figura 38: Esquema de comunicación servidor-cliente. Para arrancar el nodo servidor debemos hacer un roslaunch en la consola Linux o sistema operativo usado: roslaunch ipa325_euroc_sim track1.launch euroc_test_com_server:=False Este launch contiene el nodo servidor llamado ipa325_com_server.py, una vez lanzado el launch, se nos inicializará toda la estructura y permanecerá a la espera cliente, que también se llama por medio de roslaunch: roslaunch ipa325_com_client ipa325_com_client.launch De Nuevo permanecerá en stadby la ejecución esperando que le indiquemos que tarea vamos a resolver, esto se lo indicaremos a través de un servicio ROS rosservice, que identificará qué tarea queremos resolver e irá a la parte del código del nodo cliente relativa a la tarea seleccionada: rosservice call solvetaskid:’2’ Una vez iniciado el servicio comenzará automáticamente la resolución de la tarea, que podremos seguir sus resultados a través de Gazebo o RVIZ de forma visual, o a través de los mensajes que van imprimiendo los nodos por pantalla en la consola P
43 43 Operación de remachado mediante robot manipulador industrial basado en ROS ANEXO B: STATE MACHINE CODE from enum import Enum import rospy import control_msgs import std_srvs import std_msgs import std_msgs.msg from catec_t12_trajectories import trajectory_generation, robot_interface from catec_t12_trajectories.robot_interface import RobotInterface from catec_t12_trajectories import trajectory_generation; from catec_t12_trajectories.trajectory_generation import TrajectoryGenerator from hrl_geom.pose_converter import PoseConv import tf import numpy import math import pylab import sys import time from catec_t12_trajectories.position_manager import PositionManager class State(Enum): STARTING = 1 GOING_RIVET_HOME = 2 DETECTING_HOLE_POSE = 3 GOING_HOLE_GUESS = 4 MOVING_INTO_HOLE = 5 RIVETING = 6 MOVING_OUT_FROM_HOLE = 7 class DrillingWorkflow: def __init__(self): self.current_state = State.STARTING self.robot = RobotInterface(connect_server=True) self.trajectory_generator=TrajectoryGenerator() self.count_rivet_success=0 #-------------------------------------------------------------------- self.location_pose_aux=None; self.rivet_aux=None; self.globalAt=1; self.positions_manager=PositionManager(self.trajectory_generator); self.pm=self.positions_manager; self.rivet_home_pos = None
Anexo B: State Machine Code 44 44 #Booleans variables to change state self.detecting_hole_guess_bool = None self.going_hole_guess_bool = None self.moving_into_hole_bool = None self.riveting_bool = None self.moving_out_from_hol_bool = None #-------------------------------------------------------------------- self.rivet_home=None; self.hole_guess=None; rospy.Subscriber("target_frame",std_msgs.msg.String,self.on_target_frame_message_received) #---- PERIODIC UPDATE FUNCTIONS INSIDE STATES ------------------- def update_starting_state(self): m = rospy.wait_for_message('target_frame', std_msgs.msg.String); target_frame = m.data; if target_frame == '/rivet_home': self.change_state(State.GOING_RIVET_HOME) def update_going_rivet_home(self): m = rospy.wait_for_message('target_frame', std_msgs.msg.String); target_frame = m.data; if target_frame == '/hole_guess': self.change_state(State.DETECTING_HOLE_POSE) def update_detecting_hole_pose(self): if self.detecting_hole_guess_bool: self.detecting_hole_guess_bool=False self.change_state(State.GOING_HOLE_GUESS) def update_going_hole_guess(self): if self.going_hole_guess_bool: self.going_hole_guess_bool=False self.change_state(State.MOVING_INTO_HOLE) def update_moving_into_hole(self): if self.moving_into_hole_bool: self.moving_into_hole_bool=False self.change_state(State.RIVETING) def update_riveting(self): if self.riveting_bool: self.riveting_bool=False self.change_state(State.MOVING_OUT_FROM_HOLE) def update_moving_out_from_hole(self): if self.moving_into_hole_bool: self.moving_into_hole_bool=False self.change_state(State.GOING_RIVET_HOME)
45 45 Operación de remachado mediante robot manipulador industrial basado en ROS #------- TRANSITIONS ----------------------------------------- def change_state(self, new_state): if self.current_state == State.STARTING and new_state==State.GOING_RIVET_HOME: rospy.loginfo("state starting"); rospy.loginfo("state going_rivet_home") self.rivet_home_pos = self.pm.get_tf_transform("base_link","rivet_home"); self.move_to(self.rivet_home_pos, "rivet_home") self.robot.load_rivet(); elif self.current_state == State.GOING_RIVET_HOME and new_state==State.DETECTING_HOLE_POSE: rospy.loginfo("state detecting hole guess") self.location_pose_aux, self.rivet_aux, q_int=self.pm.detecting_hole_guess() if q_int == -1: rospy.loginfo("State Machine blocked, trying to detected hole guess again") self.change_state(State.DETECTING_HOLE_POSE) else: int_configuration_trajectory=[ self.robot.get_current_configuration(), q_int]; goal_joint_trajectory=self.trajectory_generator.convert_goal_trajectory_from_joint _trajectory(int_configuration_trajectory,[0,1.0], At=self.globalAt) self.robot.send_goal_trajectory(goal_joint_trajectory,"intermediate position") rospy.sleep(2) self.detecting_hole_guess_bool=True elif self.current_state == State.DETECTING_HOLE_POSE and new_state==State.GOING_HOLE_GUESS: rospy.loginfo("state going hole guess") self.move_to(self.location_pose_aux, "location_pose_aux") self.going_hole_guess_bool=True elif self.current_state == State.GOING_HOLE_GUESS and new_state==State.MOVING_INTO_HOLE: rospy.loginfo("state moving into hole") self.move_to(self.rivet_aux, "rivet_aux") self.moving_into_hole_bool=True elif self.current_state == State.MOVING_INTO_HOLE and new_state==State.RIVETING: rospy.loginfo("riveting") self.robot.trigger_rivet(); self.count_rivet_success = self.count_rivet_success + 1 rospy.loginfo("Riveting reached:") print(self.count_rivet_success)