Tutorial:ODE y robots modulares:Caida libre (II)
Contenido
Simulación de un cubo en caida libre (II)
Índice del tutorial. |
Introducción
En este ejemplo partiremos de la simulación del cubo en caida libre presentada en el capítulo anterior, añadiremos el suelo e implementaremos la detección de colisiones. Ahora el cubo chocará contra el suelo y permanecerá sobre él hasta el final de la simulación. Se presentan los nuevos parámetros que hay que definir para la realización de las colisiones y código necesario para su implementación.
Objetivos
- Incorporar detección de colisiones en el mundo virtual
- Presentar los nuevos parámetros que aparecen
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 box2 box2_ex/box2.cpp -lm -lode
Ejecución
[[|thumb|right|200px|Resultado de la simulación del ejemplo box2]] Para su ejecución redireccionaremos la salida estándar hacia el fichero z.m para poder visualizarlo con octave:
./box2 > 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.
Conceptos sobre colisiones
Cuerpos y geometrías
Los objetos que se simulan en ODE constan de dos elementos:
- Cuerpos (bodies): Son los elementos de simulación del ODE. Se comportan como sólidos rígidos. En sus propiedades se definen todas las magnitudes cinemáticas y dinámicas: vector de posición, orientación, velocidades lineales y angulares, aceleraciones lineales y angulares, fuerzas externas, etc.
- Geometrías: Determinan la forma del cuerpo. Se utilizan para la detección de colisiones y la representación en la pantalla. Un cuerpo puede tener la forma de hexaedro, cilincro, espera, plano, etc.
Los objetos a simular en ODE tiene estos dos componentes: el cuerpo y la geometría. Si no estamos interesados en las colisiones ni en la representación gráfica de los objetos, no será necesario definir ninguna geometro (En el ejemplo de la simulación del cubo en caída libre, del capitulo anterior, no definimos ninguna geometría)
Para la simulación de los objetos utilizaremos la estructura MyBody, que contiene los identificadores del cuerpo y la geometría:
struct MyBody { dBodyID body; //-- The ODE body dGeomID geom; //-- The body's geometries };
Puntos y articulaciones de contacto
En la figura 1 se muestran tres instantes de la simulación de un hexaedro en caida libre. En la izquierda el objeto está cayendo y se acerca al suelo. En el instante <math>t_{1}</math> se produce la colisión y aparece un punto de contacto entre la geometría del objeto y el suelo. Durante la transición entre los instantes <math>t_{1}</math> y <math>t_{2}</math>, la trayectoria del objeto se modifica debido a la colisión. En ODE eso se modela colocando una articulación especial sobre el punto de contacto, denominada articulación de contacto. Esta articulación impone restricciones a la hora de moverse el objeto y se tendrá en cuenta al realizar el paso de simulación entre <math>t_{1}</math> y <math>t_{2}</math>.
En el siguiente paso de simulación (instante <math>t_{3}</math>) se repetirá el proceso: se determinará cuáles son los puntos de contactos y se situará sobre ellos una articulación de contacto. Por tanto, los pasos generales a realizar para simular colisiones son:
- Determinar si ha habido una colisión y obtener los puntos de contacto
- Colocar una articulación de contacto sobre cada uno de ellos
- Realizar un paso de simulación
- Eliminar las articulaciones de contacto