-
Notifications
You must be signed in to change notification settings - Fork 1
8: G ARM Septiembre 2023
Tras 3 meses de escritura de la memoria del TFG, se retoma esta WIKI debido a que se ha decidido incluir dos anexos a la memoria en los cuales es necesario realizar más desarrollo. El primero consiste en realizar una guía sencilla DIY para que siguiendo unos pasos puedas acceder a todos los recursos y montar tu propio robot G-Arm. El segundo consiste en un ejemplo de uso de este robot en la asignatura de Robótica Industrial de mi carrera.
Realmente no supuso mayor problema ya que todos los recursos están en este repositorio. Solamente hizo falta aclarar bien los pasos y concretar las rutas en las que se encuentran los recursos y el software del que dependen.
El objetivo se estableció con Julio Lora. Consta en realizar una trayectoria (con algo en la punta del robot) para simular una operación de soldadura. Para esto pensé que lo ideal es utilizar Moveit ya que te resuelve las cinemáticas y te permite visualizar todo en el ordenador. Pero he tenido problemas al utilizar la API de programación que proporcionan. Primeramente, probé con Python. Resulta que no está totalmente funcional a día de hoy en Moveit2 (Para ROS1 sí) pero existe un paquete llamado Pymoveit2. Tras instalarlo de fuentes en mi workspace no he conseguido hacerlo funcionar. Obtengo el siguiente error:
Por lo visto no está usando el nombre de mi controlador, el necesita otro. ¿Cómo puedo cambiarlo? Añadiendo esto último, le digo que utilice este servicio (que si existe). Ahora no se mueve el robot en el Rviz pero no saca ningún error. En el Rviz aparece como parpadeante. Quizás si se quiera mover pero el plugin de Rviz no le esté dejando. Añadiendo la siguiente línea utiliza una acción llamada move_action del propio moveit. Pero obtengo este error: (Esa acción existe por lo que no sé cuál es el problema) Buscando en los resultados que puede devolver una acción, este significa: # The goal was terminated by the action server without an external request. -> int8 STATUS_ABORTED = 6.
Tras fijarme detenidamente en las trazas del launcher del robot, descubrí que había una traza que se quejaba de que el grupo de planificación de mi brazo no era una cadena cinemática válida. Jamás le di importancia ya que en el Rviz todo se abría y planificaba correctamente. (Más adelante descubrí que
en Rviz planifica en el espacio de joints y no en el cartesiano por lo que sí podía resolverlo sin realizar la CI).
Por probar, hice el mismo ejemplo pero con la API de c++, pero resultó en lo mismo (solo trataba de descartar el tema de la API).
Añadí un plugin de CI al kinematics.yaml pero tampoco resultó.
En internet vi que podía ser por que no se estuviese publicando toda la información necesaria que definía el robot, por lo que añadí esto
al launcher. Tampoco resultó, si arregló algún error que mencionaba la escena y el SRDF pero no arregló lo de la cadena.
Finalmente, descubrí donde podía venir el problema. Según un usuario (con un problema distinto al mio) en el SRDF solo debían aparecer como joints
aquellos pertenecientes a la cadena cinemática correspondiente. En mi caso puse todos y se hace un lío. Tras quitar los que no debían estar... No funcionó.
Probando a la desesperada, retiré el joint 3 de ese fichero (joint fundamental al 100%) y surgió la magia.
Si retiro el joint3 (el unico no directo en esa rama de la cadena) si la construye pero falla al tratar de resolverlo ya que depende de joint3. Como se ve, con esto si se pone el Marcador visual del Rviz sobre el end-effector pero al tratar de moverlo con la mano, se cierra el programa (depende de un joint no existente). Pero hasta ahora nunca me había salido el marcador ese para poder desplazar el end effector del robot a mano. Esto era un avance.
Para saber que estaba ocurriendo realicé un dibujo de mi sistema de eslabones y joints y descubrí un posible problema.
Yo realicé mi robot URDF idéntico al real, donde cada joint estaba en el sitio real. El problema es que a nivel analítico el joint3 no estaba dentro de la cadena (no puede tener ramificaciones). Aún así si estaba usándola en los joints mímicos porque era relevante.
Tras casi tirar la toalla, se me ocurrió la siguiente idea: Intercambiar los nombres del joint3 y uno de sus mimícos (aquel con multiplicador igual a 1 positivo). En principio solo esto debería engañar a Moveit y así tener los 3DOF dentro de la misma cadena y comportarse igual que el robot real. En el
siguiente dibujo se muestra:
Funcionó! Ya no está el error y puedo mover la cabeza del robot a mano.
Peeeero... Seguía abortando el plan hecho en el código de C++, aunque al menos ahora lo aceptaba rápido. Vi en la terminal del launcher este error:
Finalmente, la solución fue encontrada! Al añadir position_only_ik: True en el kinematics.yaml y aumentando los tiempos e iteraciones del solver en ese mismo fichero ya si podía alcanzar las posiciones sin problema. Aunque el comentario de error del launcher persiste, no afecta en nada al funcionamiento final.
El siguiente paso que se ha llevado a cabo es implementar un programa en python usando Pymoveit2 para moverse a lo largo de unos puntos. Esto es realmente sencillo y a funcionado a la perfección.
Peeeero... ha surgido un nuevo problema. Algunos puntos llega a ellos pero no es capaz de alcanzarlos/salir de ellos. Esta vez la solución se encontró más rápido: cambiar el parámetro execute_via_moveit a False en la configuración de pymoveit2. Ahora no solo alcanza todos los puntos posibles sino que lo hace muy rápido y en la terminal de Rviz se ve el progreso sin problemas.
Para hacer las pruebas generé un programa en python que genera polígonos y devuelve sus puntos para posteriormente trazarlos con el robot. Aquí abajo dejo el cuadrado y el corazón (uno de pocos puntos y otro de muchos):
El resultado es excepcional, tan es así que el robot real realiza lo mismo y resulta en un dibujo perfecto:
En este punto concluye este trabajo de fin de grado que tantos dolores de cabeza me ha dado y mi CORAZÓN ha robado. La cantidad de cosas que he aprendido durante este proyecto no tienen precio. El proceso ha resultado en una experiencia dura pero muy gratificante que quedará para la posteridad y servirá a muchos estudiantes a realizar proyectos y aprender tanto como yo he aprendido con él. Aquí despido esta Wiki con amor, Vidal.