Tutorial:ODE y robots modulares:Módulo

De WikiRobotics
Revisión del 08:25 8 ene 2009 de Obijuan (Discusión | contribuciones) (Funcionamiento del servo)

Saltar a: navegación, buscar
Servo screenshot3.png

Simulación de un módulo

Capítulo anterior
Índice
Capítulo siguiente

Introducción

El siguiente paso para empezar a simular robots modulares es saber cómo implementar un servo. Construiremos un módulo constituido por dos cuerpos unidos mediante un servo. En la simulación de ejemplo, el usuario podrá establecer las posiciones de -90, 90 y 0 grados para este servo y verá cómo varían las posiciones relativas de los dos cuerpos.

Objetivo

  • Aprender a simular un servo y construir nuestro primer módulo

Código

Programa principal
Creación y dibujo del módulo
Definición de las constantes.
Definición de los prototipos de modulo.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 servo_ex/servo.o servo_ex/servo.cpp
g++  -Iinclude -c -o servo_ex/module.o servo_ex/module.cpp
g++ -o servo servo_ex/servo.o servo_ex/module.o  libdrawstuff.a -lm -lode  -lX11 -lm -lGL -lGLU

Ejecución

Para probar el ejemplo, teclear:

./servo

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

 Keys for moving the servo: 
 1: Set the servo angle to 90 degrees
 2: Set the servo angle to  0 degrees
 3: Set the servo angle to -90 degrees
 q: Quit

Por medio de las teclas '1', '2' y '3' el usuario puede establecer la posición del servo a 90, 0 y -90 grados respectivamente.

Capturas de pantalla

Visualización del módulo en las tres posiciones:

Servo en posición de 90 grados
Servo en posición de 0 grados
Servo en posición de -90 grados

Vídeo

Servo video thumb.png video.mpg

Modelo de módulo

Figura 1: El módulo empleado en este ejemplo

El módulo está formado por dos cuerpos, que denominaremos izquierdo y derecho. Tienen diferente masa y longitud, pero la altura y anchura son las mismas. Ambos cuerpos tienen como geometría un hexaedro, como se muestra en la figura 1.

  • Cuerpo izquierdo:
    • Masa: MASS0
    • Dimensiones: W x L0 x H
  • Cuerpo derecho:
    • Masa: MASS1
    • Dimensiones: W x L1 x H

La estructura de datos para representar el módulo está definida en el fichero module.h:

struct MyModule {
  dJointID joint;       
  dReal servo_ref_pos;   
 
  dBodyID body_left;     
  dGeomID geom_left;       
 
  dBodyID body_right;     
  dGeomID geom_right;
};

Además de los dos cuerpos y sus correspondientes geometrías, la estructura tiene el identificador de la articulación y la posición angular en la que situar el servo: servo_ref_pos.

Los dos hexaedros que forman los cuerpos unidos por una articulación rotan alrededor del eje z que pasa por el punto de anclaje de la articulación, situado en las coordenadas (0,L0,0) con respecto al origen de coordenadas.

Al rotar, los dos hexaedros entran en colisión. Sin embargo, como vimos en el [del capítulo 2], si dos objetos están conectados mediante una articulación, las colisiones no se tienen en cuenta. Por ello, los dos hexaedros pueden rotar y penetrarán el uno en el otro.

Funcionamiento del servo

Tutorial ode module servo pos.png

Figura 2: Respuesta del servo al escalón

Tutorial ode module servo vel.png

Figura 3: Velocidad del servo al aplicar un escalón

Para la implementación del servo se han seguido las recomendaciones indicadas en el manual del ODE. Se ha utilizado un controlador de tipo proporcional que viene dado por la ecuación: <math> w\left(t\right)=K_{p}\left[\varphi\left(t\right)-p\right]</math>, donde:

  • <math>w\left(t\right)</math>: es la velocidad angular instantánea
  • <math>K_{p}</math>: Es la ganancia del servo
  • <math>\varphi\left(t\right)</math>: Posición instantánea del servo
  • p: Es la posición de referencia

Explicación del código

Función Module_new()

Función Module_render()

Simulación del servo

Función Main

Enlaces

Capítulo anterior
Índice
Capítulo siguiente