Diferencia entre revisiones de «Tutorial:ODE y robots modulares:Cuerpos compuestos (I)»

De WikiRobotics
Saltar a: navegación, buscar
(New page: = <font color="#0000FF">Modelado de cuerpos compuestos (I)</font> = == Introducción == == Objetivo == == Descripción == == Enlaces == * [[Tutorial: ODE y robots modulares|Índice del tu...)
 
(Vídeo)
 
(No se muestran 25 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 +
[[Imagen:Compound1 screenshot1.png|thumb|250px|Pinchar para ampliar]]
 +
 
= <font color="#0000FF">Modelado de cuerpos compuestos (I)</font> =
 
= <font color="#0000FF">Modelado de cuerpos compuestos (I)</font> =
 +
 +
{| {{tablabonita}}
 +
| <center>{{Click || image=Icon_arrow_left.png| link=Tutorial:ODE y robots modulares:Caida libre (III)|width=32px | height=34px}} [[Tutorial:ODE y robots modulares:Caida libre (III)|Capítulo anterior]]</center>
 +
| <center>{{Click || image=Icono_index.png| link=Tutorial:_ODE_y_robots_modulares|width=32px | height=32px}} [[Tutorial: ODE y robots modulares|Índice]]</center>
 +
| <center>{{Click || image=Icon_arrow_right.png| link=Tutorial:ODE y robots modulares:Cuerpos compuestos (II)|width=32px | height=34px}} [[Tutorial:ODE y robots modulares:Cuerpos compuestos (II)|Capítulo siguiente]]</center>
 +
|}
  
 
== Introducción ==
 
== Introducción ==
 +
En este ejemplo se muestra '''cómo construir un cuerpo compuesto por dos geometrías'''. Se parte del [[Tutorial:ODE y robots modulares:Caida libre (III)|capítulo anterior]] en el que se ha simulado la caida libre de un cubo y se ha representado en 3D, y se sustituye este cubo por un objeto compuesto por dos geometrías.
 +
 +
La librería drawstuff nos permite dibujar geometrías básicas: cilindros, hexaedros, esferas, etc. A partir de ellas se pueden construir cuerpos más complejos. Esto permite hacer simulaciones donde los cuerpos se parezcan más a los objetos reales.
 +
 
== Objetivo ==
 
== Objetivo ==
== Descripción ==
+
* Crear cuerpos compuestos sencillos
 +
 
 +
== Código ==
 +
{| {{tablabonita}}
 +
|
 +
* [http://svn.iearobotics.com/ode_mr/trunk/compound1_ex/compound1.cpp compound1_ex/compound1.cpp]
 +
| Programa principal
 +
|-----------------
 +
|
 +
* [http://svn.iearobotics.com/ode_mr/trunk/compound1_ex/body.cpp compound1_ex/body.cpp]
 +
| Creación y dibujo del cuerpo compuesto
 +
|-----------------
 +
|
 +
* [http://svn.iearobotics.com/ode_mr/trunk/compound1_ex/parameters.h compound1_ex/parameters.h]
 +
| Definición de las constantes.
 +
|-----------------
 +
|
 +
* [http://svn.iearobotics.com/ode_mr/trunk/compound1_ex/body.h compound1_ex/body.h]
 +
| Definición de los prototipos de body.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 compound1_ex/compound1.o compound1_ex/compound1.cpp
 +
g++  -Iinclude -c -o compound1_ex/body.o compound1_ex/body.cpp
 +
g++ -o compound1 compound1_ex/compound1.o compound1_ex/body.o libdrawstuff.a -lm -lode  -lX11 -lm -lGL -lGLU
 +
 
 +
== Ejecución ==
 +
 
 +
Para probar el ejemplo, teclear:
 +
 
 +
./compound1
 +
 
 +
Además de los mensajes impresos en pantalla por la drawstuff, aparecerá el siguiente menú:
 +
 
 +
Keys:
 +
1: Drop the compound body
 +
q: Quit
 +
 
 +
La tecla '1' sitúa el cuerpo en su posición inicial, por lo que vuelve a caer. La tecla 'q' finaliza la simulación.
 +
 
 +
== Capturas de pantalla ==
 +
 
 +
Visualización de la caida del cuerpo, en tres instantes diferentes:
 +
 
 +
{|
 +
| [[Imagen:Compound1 screenshot1.png|thumb|200px|Pinchar para ampliar]]
 +
| [[Imagen:Compound1 screenshot2.png|thumb|200px|Pinchar para ampliar]]
 +
| [[Imagen:Compound1 screenshot3.png|thumb|200px|Pinchar para ampliar]]
 +
|}
 +
 
 +
== Vídeo ==
 +
 
 +
{| {{tablabonita}}
 +
| [[Imagen:Compound1 video thumb.png]]
 +
|
 +
* [http://www.iearobotics.com/wiki/images/8/8b/Tutorial_ode_compound1_video.mpg video.mpg]
 +
* [http://www.youtube.com/watch?v=zTqp0k1X8xk Vídeo en Youtube]
 +
|}
 +
 
 +
== Modelo de cuerpo ==
 +
[[Imagen:Compound1.png|thumb|352px|'''Figura 1''': Modelo de cuerpo compuesto]]
 +
El cuerpo se muestra en la '''figura 1'''. Está formado por dos geometrías iguales, de tipo hexaédrico. Las dimensiones del cuerpo son L x W x H y las de las geometrías: L/2 x W x H. La masa total es M.
 +
 
 +
Los centros de masas de las geometrías están a una distancia de L/4 del centro de masas del cuerpo.
 +
 
 +
La estructura de datos para el cuerpo consta del identificador del cuerpo y de las dos geometrías:
 +
 
 +
struct MyBody {
 +
  dBodyID body;     
 +
  dGeomID geom[2];   
 +
};
 +
 
 +
La geometría geom[0] es la de la izquierda y geom[1] la de la derecha.
 +
 
 +
== Explicación del código ==
 +
El programa principal, en el fichero '''compound1.cpp''' es similar al del ejemplo del [[Tutorial:ODE y robots modulares:Caida libre (III)|capítulo anterior]]. La diferencia está las funciones '''Body_new()''' y '''Body_Render()''' del archivo '''body.cpp''': el cuerpo se construye y se dibuja de manera diferente.
 +
 
 +
=== Función Body_new() ===
 +
Una vez creado el cuerpo, se crean las dos geometrías especificando su tamaño: W x L/2 x H:
 +
 
 +
body->geom[0] = dCreateBox (space, W, L/2, H);
 +
body->geom[1] = dCreateBox (space, W, L/2, H);
 +
 
 +
A continuación hay que '''asociarlas al cuerpo''':
 +
 
 +
dGeomSetBody (body->geom[0],body->body);
 +
dGeomSetBody (body->geom[1],body->body);
 +
 
 +
En este momento el cuerpo consta de dos geometrías que tienen sus centros de masas situados sobre el del cuerpo. Ahora hay que indicar las posiciones relativas de sus centros de masas con respecto al del cuerpo. Como se ve en la figura 1, el de la geometría izquierda está situado en '''y=L/4''' y el de la derecha en '''y=-L/4'''.
 +
 
 +
dGeomSetOffsetPosition(body->geom[0], 0.0, L/4,0.0);
 +
dGeomSetOffsetPosition(body->geom[1], 0.0, -L/4, 0.0);
 +
 
 +
{| {{Tablabonita}}
 +
| '''¡Muy importante!''' La llamada a la función '''dGeomSetOffsetPosition()''' sólo se puede realizar una vez que la geometría se ha asociado a un cuerpo
 +
|}
 +
 
 +
=== Función Body_render() ===
 +
La función de dibujado es muy sencilla. Primero se establece la textura:
 +
 
 +
  dsSetTexture (DS_WOOD);
 +
 
 +
Luego se dibuja la geometría izquierda, de color amarillo:
 +
 
 +
  dsSetColor (1,1,0);
 +
  drawGeom(body->geom[0]);
 +
 
 +
Y por último la geometría derecha, de color verde:
 +
 
 +
  dsSetColor (0,1,0);
 +
  drawGeom(body->geom[1]);
 +
 
 
== Enlaces ==
 
== Enlaces ==
* [[Tutorial: ODE y robots modulares|Índice del tutorial]].  
+
{| {{tablabonita}}
 +
| <center>{{Click || image=Icon_arrow_left.png| link=Tutorial:ODE y robots modulares:Caida libre (III)|width=32px | height=34px}} [[Tutorial:ODE y robots modulares:Caida libre (III)|Capítulo anterior]]</center>
 +
| <center>{{Click || image=Icono_index.png| link=Tutorial:_ODE_y_robots_modulares|width=32px | height=32px}} [[Tutorial: ODE y robots modulares|Índice]]</center>
 +
| <center>{{Click || image=Icon_arrow_right.png| link=Tutorial:ODE y robots modulares:Cuerpos compuestos (II)|width=32px | height=34px}} [[Tutorial:ODE y robots modulares:Cuerpos compuestos (II)|Capítulo siguiente]]</center>
 +
|}
  
  
 
[[Categoría:Tutorial ODE y robots modulares]]
 
[[Categoría:Tutorial ODE y robots modulares]]

Revisión actual del 02:53 13 ene 2009

Pinchar para ampliar

Modelado de cuerpos compuestos (I)

Capítulo anterior
Índice
Capítulo siguiente

Introducción

En este ejemplo se muestra cómo construir un cuerpo compuesto por dos geometrías. Se parte del capítulo anterior en el que se ha simulado la caida libre de un cubo y se ha representado en 3D, y se sustituye este cubo por un objeto compuesto por dos geometrías.

La librería drawstuff nos permite dibujar geometrías básicas: cilindros, hexaedros, esferas, etc. A partir de ellas se pueden construir cuerpos más complejos. Esto permite hacer simulaciones donde los cuerpos se parezcan más a los objetos reales.

Objetivo

  • Crear cuerpos compuestos sencillos

Código

Programa principal
Creación y dibujo del cuerpo compuesto
Definición de las constantes.
Definición de los prototipos de body.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 compound1_ex/compound1.o compound1_ex/compound1.cpp
g++  -Iinclude -c -o compound1_ex/body.o compound1_ex/body.cpp
g++ -o compound1 compound1_ex/compound1.o compound1_ex/body.o libdrawstuff.a -lm -lode  -lX11 -lm -lGL -lGLU

Ejecución

Para probar el ejemplo, teclear:

./compound1

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

Keys: 
1: Drop the compound body
q: Quit

La tecla '1' sitúa el cuerpo en su posición inicial, por lo que vuelve a caer. La tecla 'q' finaliza la simulación.

Capturas de pantalla

Visualización de la caida del cuerpo, en tres instantes diferentes:

Pinchar para ampliar
Pinchar para ampliar
Pinchar para ampliar

Vídeo

Compound1 video thumb.png

Modelo de cuerpo

Figura 1: Modelo de cuerpo compuesto

El cuerpo se muestra en la figura 1. Está formado por dos geometrías iguales, de tipo hexaédrico. Las dimensiones del cuerpo son L x W x H y las de las geometrías: L/2 x W x H. La masa total es M.

Los centros de masas de las geometrías están a una distancia de L/4 del centro de masas del cuerpo.

La estructura de datos para el cuerpo consta del identificador del cuerpo y de las dos geometrías:

struct MyBody {
  dBodyID body;      
  dGeomID geom[2];    
};

La geometría geom[0] es la de la izquierda y geom[1] la de la derecha.

Explicación del código

El programa principal, en el fichero compound1.cpp es similar al del ejemplo del capítulo anterior. La diferencia está las funciones Body_new() y Body_Render() del archivo body.cpp: el cuerpo se construye y se dibuja de manera diferente.

Función Body_new()

Una vez creado el cuerpo, se crean las dos geometrías especificando su tamaño: W x L/2 x H:

body->geom[0] = dCreateBox (space, W, L/2, H); 
body->geom[1] = dCreateBox (space, W, L/2, H); 

A continuación hay que asociarlas al cuerpo:

dGeomSetBody (body->geom[0],body->body);
dGeomSetBody (body->geom[1],body->body);

En este momento el cuerpo consta de dos geometrías que tienen sus centros de masas situados sobre el del cuerpo. Ahora hay que indicar las posiciones relativas de sus centros de masas con respecto al del cuerpo. Como se ve en la figura 1, el de la geometría izquierda está situado en y=L/4 y el de la derecha en y=-L/4.

dGeomSetOffsetPosition(body->geom[0], 0.0, L/4,0.0);
dGeomSetOffsetPosition(body->geom[1], 0.0, -L/4, 0.0);
¡Muy importante! La llamada a la función dGeomSetOffsetPosition() sólo se puede realizar una vez que la geometría se ha asociado a un cuerpo

Función Body_render()

La función de dibujado es muy sencilla. Primero se establece la textura:

 dsSetTexture (DS_WOOD);

Luego se dibuja la geometría izquierda, de color amarillo:

 dsSetColor (1,1,0);
 drawGeom(body->geom[0]);

Y por último la geometría derecha, de color verde:

 dsSetColor (0,1,0);
 drawGeom(body->geom[1]);

Enlaces

Capítulo anterior
Índice
Capítulo siguiente