Laboratorio 4 de robótica 2023-2
- Norma Lorena Martinez Zavala
- Miguel Angel Sarmiento Cabarcas
- Jaime Andres Sanchez Peralta
• Crear todos los Joint Controllers con ROS para manipular servomotores Dynamixel AX-12 del robot Phantom X Pincher.
• Manipular los tópicos de estado y comando para todos los Joint Controllers del robot Phantom X Pincher.
• Manipular los servicios para todos los Joint Controllers del robot Phantom X Pincher.
• Conectar el robot Phantom X Pincher con MATLAB o Python usando ROS.
El primer paso para la elaboración de este laboratorio fué tomar las medidas de los estabones del robot, para ello se mide de junta a junta, como se muestra en la siguiente imagen:
Se hizo uso de SerialLink para la construcción del robot a partir de los parámetros DH estandar, también se calculó la matriz de transformación homogenea que relaciona el sistema de coordenadas de World con el sistema de coordendas del TCP (H0TCP).
El diagrama que describe el robot pincher es el siguiente
Los marcos de referencia para describir el robot a través de los parámetros DH con base en el diagrama del robot pincher y las distancias de las articulaciones ya medidas son:
PhantomII =
PhantomII:: 4 axis, RRRR, stdDH, slowRNE
tool: t = (0, 0, 0.065), RPY/xyz = (0, 0, 0) deg
H0TCP = 4×4
0 0 1.0000 0.1700
0 -1.0000 0 0
1.0000 0 0 0.1850
0 0 0 1.0000
q1 = 1×4
0.4363 0.4363 0.3491 -0.3491
q2 = 1×4
-0.6109 0.6109 -0.5236 0.5236
q3 = 1×4
1.4835 -0.3491 0.9599 0.4363
q4 = 1×4
1.3963 -0.6109 0.9599 -0.7854
Para iniciar el control de los motores del pincher, se debe modificar el archivo de configuracion de dynamixel one motor que se encuentra en el sitio web del curso, agregando los parametros correspondientes a los 5 motores que forman parte del brazo robotico. Luego, se debe escribir el codigo en python que importe las siguientes dependencias.
Para trabajar con ROS en python, se necesita importar el módulo de rospy, que proporciona las funciones y clases esenciales para interactuar con el sistema. También se utiliza el módulo de numpy, que permite realizar cálculos numéricos y operaciones matriciales de forma eficiente. Además, se requieren varios tópicos y mensajes específicos de ROS, como el tipo JointTrajectory, que representa una secuencia de posiciones y velocidades de las articulaciones.
La función Join_publisher se encarga de crear un objeto Publisher que publica en el tópico joint_trajectory, que es usado por el controlador del brazo robótico. Dentro de un bucle, mientras rospy esté activo, se envían los puntos guardados al motor. Esta función es una función residual de pruebas anteriores y no se utiliza en el código principal del programa.
Este código de python usa las funciones callback y listener para trabajar con los datos de los servomotores del robot. El listener inicializa el nodo de ROS y se suscribe al tópico de los estados de las articulaciones. El callback guarda una variable global con el ángulo de cada articulación en grados, usando una conversión simple de radianes a grados 180/pi.
La función jointCommand es una función que envía un comando de dynamixel al motor especificado, usando el servicio de transmitir al motor. El comando de dynamixel tiene cuatro parámetros: el número de comando, el identificador del motor, el nombre de la dirección de memoria y el valor nuevo. La función espera a que el servicio esté disponible y luego envía el comando. Después, espera un tiempo para ROS y devuelve el resultado del comando.
Cuando se ejecuta este archivo desde la terminal, se inicia el nodo de ROS y se suscribe al topic de los motores para recibir sus datos. Estos datos se muestran en la terminal junto con el nombre del grupo. A continuación, se crean listas con las posiciones posibles para enviar a los motores, tanto en bits como en grados. Se hace una lista de listas con estas posiciones y se le presentan al usuario en formato de grados.
El programa inicia un bucle while que se ejecuta indefinidamente, solicitando al usuario que ingrese un número de posición para controlar el pincher. Mediante un bucle for, se envían los comandos correspondientes a cada motor usando la función join_command, junto con un límite de torque por seguridad. La posición real de cada motor se muestra en la consola, junto con el error respecto a la posición deseada.
Partiendo del codigo ejemplo sync_write.m se genera un archivo que permite controlar 4 motores al tiempo y se genera un switch case para seleccionar cada una de las posiciones y para cerrar el ciclo y la comunicacion.
A continuación se muestra el pantallazo donde el robot alcanza cada una de las posiciones que son seleccionadas por el usuario:
En el siguiente video se observa el movimiento del robot
https://youtu.be/kAmjaRHJvHw?si=97m7ebpFJ07SqSqx
-El programa creado logra establecer una comunicación humano-máquina mediante la terminal, aunque la interfaz podría ser más intuitiva en próximos laboratorios. Se tiene como objetivo diseñar una interfaz más atractiva en futuras operaciones.
-Para realizar este laboratorio, se utilizaron los repositorios de referencia como base. Los archivos de la carpeta de Dynamixel One Motor, en particular los scripts, fueron los más relevantes para el proyecto. Estos archivos facilitaron el desarrollo del programa y el aprendizaje de los conceptos de control de motores Dynamixel.