Diferencia entre revisiones de «Tutorial:ODE y robots modulares:Configuración PP»

De WikiRobotics
Saltar a: navegación, buscar
(Función Robot_new())
(Función Robot_new())
Línea 151: Línea 151:
 
== Explicación del código ==
 
== Explicación del código ==
 
=== Función Robot_new() ===
 
=== Función Robot_new() ===
Esta es la función que se encarga de crear el robot. Primero se crea '''el cuerpo izquierdo''', que está compuesto únicamente por una geometría. Tiene de masa MASS/2 y está situado en las coordenadas (0,-L/4,H/2)
+
Esta es la función que se encarga de crear el robot. Primero se crea '''el cuerpo izquierdo''', que está compuesto únicamente por una geometría. Tiene de masa MASS/2 y está situado en las coordenadas (0,-L/4,H/2). Sus dimensiones son (W, L/2, H):
  
 
  pp->body_left = dBodyCreate(world);
 
  pp->body_left = dBodyCreate(world);

Revisión del 07:47 9 ene 2009

La configuración PP

Simulación de la configuración mínima PP

Capítulo anterior
Índice
Capítulo siguiente

Introducción

En este ejemplo simulamos nuestro primer robot modular, constituido únicamente por la unión de dos módulos de tipo cabeceo. Es la configuración mínima que puede moverse en línea recta. Se conoce bajo el nombre de configuración PP (Pitch-Pitch). El usuario puede mover el robot hacia adelante, atrás o pararlo, por medio del teclado.

Objetivos

  • Simular la locomoción del robot modular más sencillo
  • Presentar la técnica de locomoción mediante osciladores sinusoidales

Código

Programa principal
Creación y dibujo del robot
Definición de las constantes.
Definición de los prototipos de robot.cpp y las estructuras de datos.

Compilación

Todos los ejemplos de este tutorial compilan tecleando "make". Sin embargo se describe a continuación cómo se compila directamente usando el GCC:

g++ -Iinclude -c -o PP_ex/PP.o PP_ex/PP.cpp
g++ -Iinclude -c -o PP_ex/robot.o PP_ex/robot.cpp
g++ -o PP PP_ex/PP.o PP_ex/robot.o libdrawstuff.a -lm -lode -lX11 -lGL -lGLU

Ejecución

Para probar el ejemplo, teclear:

./PP

Además de los mensajes impresos en pantalla por la drawstuff, aparecerá el siguiente menú:

 Keys for controlling the robot: 
 1: Move Backward
 2: Move Forward
 3: Stop
 q: Quit

Por medio de las teclas '1', '2' y '3' el usuario hace que el robot se mueva hacia atrás, adelante o se pare.

Capturas de pantalla

Visualización del robot en tres instantes diferentes:

Pinchar para ampliar
Pinchar para ampliar
Pinchar para ampliar

Vídeo

PP video thumb.png video.mpg

Modelo de robot

Figura 1:Modelo geométrico de la configuración PP

El modelo geométrico de la configuración PP se muestra en la figura 1. Está compuesta por:

  • 2 Módulos iguales, de dimensiones W x L x H y masa MASS.
  • 3 cuerpos: izquierdo, central y derecho. El izquierdo y el derecho están formados por una geometría de longitud L/2 mientras que el central por la unión de dos, con una longitud de L
  • 4 geometrías: Denominadas geometría izquierda, geometría derecha y las centrales: geometría 1 y 2.
  • 2 articulaciones.

Las posiciones de los elementos con respecto al origen de coordenadas son:

Articulación 1 (0,-L/2, H/2)
Articulación 2 (0,-3L/2, H/2)
Cuerpo izquierdo: (0,-L/4, H/2)
Cuerpo derecho: (0, -7L/4, H/2)
Cuerpo central: (0, -L, H/2).

Las dos geometrías del cuerpo central están desplazadas -L/4 y L/4 a lo largo del eje y

La estructura de datos está definida en el fichero robot.h:

struct MyRobot {
  dJointID joint[2];      //-- Robot joints. 0--> left, 1--> right
  dReal servo_ref_pos[2]; //-- Reference positions for the servos
 
  dBodyID body_left;       //-- This is the body on the left
  dGeomID geom_left;       //-- and its geometry (a box)
 
  dBodyID body_center;    //-- Central body. It has two geometries
  dGeomID geom1;          //-- One in the left and another 
  dGeomID geom2;          //-- in the right
 
  dBodyID body_right;     //-- This is the body on the right 
  dGeomID geom_right;     //-- and its geometry (a box)
};

Modelo de control

Figura 2: Modelo de control para la configuración PP

Para mover este robot usaremos un controlador bioinspirado basado en osciladores sinusoidales que actúan sobre las articulaciones. De esta manera, las posiciones de referencia de los servos están dadas por las ecuaciones:

  • <math>\varphi_{1}\left(n\right)=A\sin\left(\frac{2\pi}{N}n\right)</math>
  • <math>\varphi_{2}\left(n\right)=A\sin\left(\frac{2\pi}{N}n+\Delta\phi\right)</math>

donde los parámetros son:

A Amplitud de las oscilaciones (grados)
<math>\Delta\phi</math> Diferencia de fase entre el oscilador izquierdo y derecho
N Número de muestras por ciclo
n Tiempo discreto
<math>\varphi_{1},\varphi_{2}</math> Posiciones de referencia en el instante n

Secuencias de movimiento

Las secuencias de movimiento son las tablas que continen las posiciones de referencia para los servos. Se calculan mediante las ecuaciones anteriores. En total se establecen N posiciones de referencia para cada servo (N es el número de muestras). Sólo cuando ambos servos han alcanzado sus posiciones de referencia se establecen las siguientes. Esta es la condición para saltar a la siguiente posición. De esta manera se consigue que los servos estén siempre sincronizados.

Según se mostró en el capítulo anterior, la velocidad del servo es proporcional a la distancia que le queda por llegar hasta la posición de referencia (el error). Según se acerca, la velocidad cada vez es menor y al alcanzarla es de 0. Cuando se aplica este controlador a la locomoción de un robot, el efecto que se observa es que los servos se mueven "a tirones", de una forma brusca. Es debido a que se paran al llegar a la posición de referencia y luego vuelven a arrancar para ir a la siguiente. Para conseguir un movimiento más suave, no se va a esperar a que se alcance exactamente la posición de referencia indicada (ya que al llegar a ella el servo tendrá velocidad 0) sino que se considerará que la a alcanzado cuando se cumpla que: <math>\left|\varphi\left(t\right)-p\right|<ERROR</math>, donde:

  • <math>\varphi\left(t\right)</math> es la posición instantánea del servo
  • p: Es la posición de refencia
  • ERROR: Una constante. Su valor por defecto es de 5 grados.

Es decir, que antes de que el servo se pare, se establece la siguiente posición de referencia.

Explicación del código

Función Robot_new()

Esta es la función que se encarga de crear el robot. Primero se crea el cuerpo izquierdo, que está compuesto únicamente por una geometría. Tiene de masa MASS/2 y está situado en las coordenadas (0,-L/4,H/2). Sus dimensiones son (W, L/2, H):

pp->body_left = dBodyCreate(world);
dBodySetPosition(pp->body_left, 0.0, -L/4, H/2);
dMassSetBoxTotal (&m, MASS/2, W,L/2,H);
dBodySetMass (pp->body_left,&m);
pp->geom_left = dCreateBox (space, W,L/2, H); 
dGeomSetBody (pp->geom_left,pp->body_left);

Función Robot_Render()

Función servos_sim()

Función sequence_generation()

Funciones Main y Command()

Enlaces

Capítulo anterior
Índice
Capítulo siguiente