CUBE REVOLUTIONS: SOFTWARE I


Introducción

En este nivel se solucionan los problemas de controlar los servos del robot desde el PC, caracterización de las secuencias de movimiento, cómo generarlas manualmente, su almacenamiento en ficheros y su reproducción:

Todo esto no es específico del robot Cube Revolutions, sino que es válido para cualquier otro robot articulado que tenga hasta 8 servos.


Control de servos desde el PC

Cube Revolutions es un robot NO autónomo, que se conecta al PC a través del puerto serie. En el PC se programan los algoritmo para conseguir la locomoción y estudiar sus propiedades.

Se ha creado una API en C para poder posicionar los servos desde el PC y trabajar con Cube Revolutions como si fuese un periférico. Al solicitar un servicio, como por ejemplo establecer la posición de un servo, se envía una trama por el puerto serie que llega al microcontrolador y éste se encarga de generar la señal PWM para el posicionamiento del servo. La comunicación se realiza a 9600 Baudios.

Esta manera de controlar los servos forma parte del proyecto stargate y el servidor que se ejecuta en el microcontrolador es el servos8.


Funciones de la API SERVOS8

Desde cualquier aplicación en C en plataformas Linux, podemos controlar los servos utilizando la API definida en el módulos SERVOS8. Las funciones son:

  • void sg_servos8_init(int fd);

  • void sg_servos8_pos1_grados(int servo, int pos);

  • void sg_servos8_pos8_grados(int s1, int s2, int s3, int s4, int s5, int s6, int s7, int s8);

  • void sg_servos8_enable(int mask);


Programa de ejemplo “hola mundo”

El siguiente programa es un ejemplo de uso del módulo servos8. Se abre el puerto serie, se inicializa el módulo servos8, se habilitan los servos y se posiciona el servo 1 en un extremo y luego a su posición central.

#include <stdio.h>
#include <unistd.h>

#include <stargate/stargate.h>
#include "sg-tramas-servos8.h"

int main(void)
{
  int serial_fd;  /*-- Descriptor puerto serie */
        
  printf ("Test de servos8\n");
        
  /* Abrir el puerto serie */
  serial_fd=sg_serial_open("/dev/ttyS0");

  /* Inicializar el modulo servos8 */
  sg_servos8_init(serial_fd);
 
  /*-Llevar todos los servos a la posicion inicial  */
  sg_servos8_pos8_grados(0,0,0,0,0,0,0,0);
  
  /* Habilitar todos los servos  */
  sg_servos8_enable(0xFF);
  
  /* Llevar servo 1 a un extremo */
  sg_servos8_pos1_grados(1,-90);
  
  /* Esperar */ 
  sleep(1);
  
  /* Llevar servo a posicion inicial */
  sg_servos8_pos1_grados(1,0);
  
  /* Esperar */
  sleep(1);
  
  /* Deshabilitar servos  */
  sg_servos8_enable(0x00);
 
  /* Cerrar puerto serie  */
  close(serial_fd);
        
  return 0;
}

Las fuentes de este programa se pueden bajar de aquí: test-servos8.tgz

Para compilarlo es necesario tener instalada la librería stargate (1.0.1)


Secuencias de movimiento

En un instante de tiempo, la forma del gusano está caracterizada por los ángulos de las articulaciones. Esos ángulos constituyen el vector de posición angular.

Una secuencia de movimiento queda descrita mediante una serie de vectores de posición angular, que van determinado la forma del gusano en cada instante. Así, las secuencias se pueden representar mediante matrices, cuyas filas son los vectores de posición angular. En la siguiente figura se muestra un ejemplo de una matriz de 11x8, que representa una secuencia de movimiento de 11 pasos para un robot articulado de 8 articulaciones.

Estas matrices de movimiento, se almacenan en ficheros ASCII, para luego ser reproducidas. Los ficheros que guardan las secuencias de movimiento de Cube Revolutions tienen extensión .f8. Aquí se muestra un fichero de ejemplo:

NSERVOS=8
[0 0 0 0 0 0 0 0 ],0;
[0 0 0 0 0 0 90 90 ],200;
[0 0 0 0 0 90 90 90 ],500;
[0 0 0 -5 90 90 6 -90 ],500;
[9 0 13 -11 90 24 86 -90 ],300;
[9 0 13 -11 90 24 -42 -90 ],300;
[9 0 13 -11 90 48 -89 -46 ],300;
[-64 82 13 -11 90 48 -89 -46 ],300;

La primera línea indica el número de servos, y por tanto el número de elementos de los vectores de posición angular (o el número de filas de la matriz de movimiento). Para el caso de Cube Revolutions este número es 8.

A continuación están los vectores de posición angular, para los diferentes instantes. El número situado al final de cada vector es el tiempo en milisegundos que los servos deben permanecer en esa posición antes de pasar a la siguiente.


Reproducción de secuencias y generación manual

Los programas cube-play y cube-reverse-play, ambos en el paquete cube-play.tgz, leen los ficheros de secuencias y los envían a Cube Revolutions , utilizando la API Servos8. Cube-play reproduce la secuencia en el sentido normal (recorre la matriz de arriba hacia abajo) y Cube-reverse-play en sentido contrario.

Para compilarlos y utilizarlos es necesario tener instalada la librería stargate (1.0.1)

Para probar los motores de Cube Revolutions y generar secuencias manuales, resulta mucho más útil utilizar el programa star-servos8, que tiene una interfaz gráfica. Este programa no es específico de Cube, sino que es válido para generar/reproducir secuencias en cualquier robot o sistema que tenga hasta 8 servos.

Nombre: star-servos8
Servicio: Cliente para el Stargate servos8
Lenguaje: C
Plataforma: Linux
Tipo: Convencional
Descripción: Control de servos del tipo Futaba 3003 o compatibles desde el PC. Movimiento mediante barras deslizantes y Canvas. Generación, grabación y reproducción de secuencias
Aplicaciones: Prototipado rápido de sistemas articulados. Por ejemplo robots.

Entre otras cosas, el star-servos8 permite posicionar manualmente los servos por medio de unos deslizadores. Con ello se pueden generar secuencias de movimiento sencillas que luego se guardan en un fichero .f8.

Ventana principal para el posicionamiento de servos. Movimiento con el raton cada una de las barras deslizante, se actúa sobre cada uno de los servos. Se pueden habilitar/deshabilitar los servos marcando las casillas de la izquierda. El botón de Reset lleva a todos los servos a la posición inicial.




[Cube Revolutions]

IEA ROBOTICS

Juan González