Tutorial:ODE y robots modulares:Caida libre (I)

De WikiRobotics
Revisión del 08:54 5 ene 2009 de Obijuan (Discusión | contribuciones)

(dif) ← Revisión anterior | Revisión actual (dif) | Revisión siguiente → (dif)
Saltar a: navegación, buscar
Tutorial ode box1 1.png


Simulación de un cubo en caida libre (I)

Índice
Capítulo siguiente

Introducción

Este primer ejemplo es un "hola mundo" de cómo poner en marcha el ODE. Se crea un "mundo virtual" que tiene gravedad terrestre. Se sitúa dentro de él un hexaedro de dimensiones W x L x H y de masa MASS, situado a una cierta altura. Al comenzar la simulación, el cuerpo comenzará a caer, decrementando su altura (componente z).

No existe suelo por lo que el objeto caerá indefinidamente. El simulador calcula la posición y velocidad del cuerpo en cada instante. Cada uno de estos instante lo denominamos "tic" de simulación y su periodo está dado por la constante STEP (en este ejemplo es de 5ms).

El programa box1 lee la posición z del cubo para cada tic. Al cabo de TICKS tics la simulación se para y se sacan los datos por la salida estándar. El formato empleado es el de un script Octave. De esta forma es posible visualizar la gráfica de la evolución de la posición del cubo con el tiempo utilizando este programa matemático.

Objetivos

  • Comprobar si ODE está bien instalado y el ejemplo compila correctamente
  • Aprender a definir un cuerpo y realizar una simulación sencilla

Código

Programa principal
Definición de las constantes.

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  -o box1 box1_ex/box1.cpp -lm -lode

Ejecución

Resultado de la simulación del ejemplo box1

Para su ejecución redireccionaremos la salida estándar hacia el fichero z.m para poder visualizarlo con octave:

./box1 > z.m
octave z.m


La gráfica resultante se puede ver en la figura de la derecha. En el eje horizontal se representa el tiempo, en tics de 5ms. En el vertical la altura del cubo (coordenada z), que va disminuyendo con el tiempo.

Explicación

Primero se crea el "mundo" virtual donde se realizará la simulación y se establece la gravedad terrestre, que actúa sobre el eje z (altura).

 world = dWorldCreate();
 dWorldSetGravity (world,0,0,GRAVITY_CTE);

A continuación se añade el cubo a la simulación y se establecen sus propiedades: posición inicial, dimensiones y masa:

box = dBodyCreate(world);
dBodySetPosition(box, 0.0, 0, H/2+ZINI);
dMassSetBoxTotal (&m, MASS, W, L, H);
dBodySetMass (box,&m);

Ya se puede comenzar la simulación. Se realizan TICKS tics de simulación en total. En cada paso de simulación se invoca a la función dWorldStep() que es la encargada de actualizar la posición, velocidad y aceleración del cubo. Mediante dBodyGetPosition() se lee el vector de posición del centro de gravedad del cubo. Se devuelve un array de 3 elementos: pos[0], pos[1] y pos[2] correspondientes a las componentes x,y,z respectivamente. La componente que nos interesa (z) se imprime en la salida estándar. Es el bucle principal de la simulación.

 for (ticks=TICKS; ticks>0; ticks--) {
   dWorldStep(world,STEP);
   pos=dBodyGetPosition(box);
   printf ("%f,",pos[2]);
 }

Cuando este bucle, se imprimen por la salida estándar los comandos de Octave necesarios para dibujara la gráfica.
Finalmente se destruye el mundo virtual creado y la simulación termina:

dWorldDestroy (world);

Enlaces

Índice
Capítulo siguiente