RaydiumWikiNi

CreationBras

PagePrincipale :: DerniersChangements :: ParametresUtilisateur :: Vous êtes ec2-3-144-25-248.us-east-2.compute.amazonaws.com
Retour

CREATION DU BRAS SOUS RAYDIUM



Fonctions utilisés pour créer le bras

Création des axes 1 à 5

Pince

Teste pince

problèmes rencontrés






Pour créer le bras, nous avons écrit une fonction nommée "simul_createBras()". Dans celle-ci, certaines fonctions de ODE ont été utilisées.
Récapitulatif des fonctions à utiliser :














Pour la plupart de ces fonctions, nous pouvons utiliser les noms ou bien les ID pour référencer les éléments. Pour celà, il suffit soit d'enlever soit de mettre "name" à chaque nom de fonction.
exemple :

L'ID d'un objet peut être stocké dans une variable de type entier. Lorsque l'on créé une boîte par exemple, la fonction utilisée retourne l'identifiant de la boîte créée : raydium_ode_object_box_add retourne un entier.



CREATION DES 5 AXES
Passons à la création du bras. Nous n'allons pas détailler toute sa création ici. Nous créerons seulement la base, les axes 2 et 3 et la pince.
Tout d'abord, créons la base. Pour la créer, nous allons tout d'abord ajouter une boite à la position (0,0,0) du monde avec les dimensions de la base.
Pour celà, il faut déplacer la boite de la moitier de sa hauteur. Car à la création, raydium place le centre du repère où l'objet a été créé (blender) au centre du monde de Raydium, c'est à dire à la position (0,0,0) du monde. Nous verrons que sous blender, nous avons placé le centre de l'objet créé au centre du repère. Donc pour que la boîte soit sur le sol, il faut la déplacer de la moitié de sa hauteur sur l'axe z.

//*********************************************************************************************
                            //creation de la base
//*********************************************************************************************
 
    //création d'une boite avec les dimensions et l'aspect de "base.tri" dans l'objet a
    raydium_ode_object_box_add("test_bras_base",a,10,L_BASE,L_BASE,H_BASE,RAYDIUM_ODE_STANDARD,0,"base.tri");
 
    //Déplacement de la base de la moitié de la hauteur de la base sur l'axe des z pour créer l'objet en 0,0,0
    raydium_ode_element_move_name_3f("test_bras_base",0,0,H_BASE/2);
 
    //Création d'un joint pour attacher la base du bras au sol
    raydium_ode_joint_attach_fixed("fixe",raydium_ode_element_find("test_bras_base"),RAYDIUM_ODE_JOINT_FIXED);
 
 
//*********************************************************************************************
//********************************************************************************************* 
 


Voici ce que ce code donne :

Image hébergée par servimg.com


Ensuite, il faut créer l'axe 1 juste au dessus de la base. Mais nous ne montrerons pas le code de celui-ci. Voyons comment créer l'axe 2. Il se situe juste au dessus de l'axe 1 et il a une liaison en x avec cet axe. Voici comment celà se présente :

Image hébergée par servimg.com

//*********************************************************************************************
                                //creation de l'axe 2
//*********************************************************************************************
 
    //création d'une boite avec les dimensions et l'aspect de "axe2.tri" dans l'objet a
    raydium_ode_object_box_add("test_bras_axe2",a,POID_AXES,H_AXE2,L_AXE2,La_AXE2,RAYDIUM_ODE_STANDARD,0,"axe2.tri");
 
    //*********************************************************************************************
                    //creation de la liaison entre l'axe1 et l'axe2
    //*********************************************************************************************
 
        //Déplacement de l'axe2 juste au dessus de l'axe1
        raydium_ode_element_move_name_3f("test_bras_axe2",0,0,H_BASE_AXE1+H_AXE2/2);
 
        //rotation de l'axe 2 pour qu'il soit dans le bon sens
        raydium_ode_element_rotate_name_3f("test_bras_axe2",0,PI/2,0);
 
        //création de la liaison entre l'axe1 et l'axe2, libre en X
        raydium_ode_joint_attach_hinge_name("test_bras_axe2_liai","test_bras_axe1","test_bras_axe2",0,0,
                                                                 H_BASE_AXE1+L_AXE2/2,RAYDIUM_ODE_JOINT_AXE_X);
 
    //*********************************************************************************************
                //creation du moteur pour faire bouger l'axe2 par rapport à l'axe1
    //*********************************************************************************************
 
        raydium_ode_motor_create("test_bras_mot_axe2",a,RAYDIUM_ODE_MOTOR_ANGULAR);
        raydium_ode_motor_attach_name("test_bras_mot_axe2","test_bras_axe2_liai",0);
        raydium_ode_motor_power_max_name("test_bras_mot_axe2",FORCE_MOT);
 
//*************************************************************************************************
//************************************************************************************************* 
 


Résultat :

Image hébergée par servimg.com

Résultat après un mouvement du moteur de l'axe 2 :

Image hébergée par servimg.com


Après avoir créé l'axe 2, passons à l'axe 3. On doit les positionner et les lier au niveau de leur entre-axes. Ils ont un degré de liberté en x.
Voici comment se présente l'axe 3 :

Image hébergée par servimg.com

//*********************************************************************************************
                                //creation de l'axe 3
//*********************************************************************************************
 
    //création d'une boite avec les dimensions et l'aspect de "axe3.tri" dans l'objet a
    raydium_ode_object_box_add("test_bras_axe3",a,POID_AXES,H_AXE3,L_AXE3,La_AXE3,RAYDIUM_ODE_STANDARD,0,"axe3.tri");
 
    //*********************************************************************************************
                    //creation de la liaison entre l'axe 2 et l'axe3
    //*********************************************************************************************
 
        //Déplacement de l'axe3 par rapport à l'axe2
        raydium_ode_element_move_name_3f("test_bras_axe3",0,-H_AXE3/2+ENTRAXE_AXE_2,H_BASE_AXE1+H_AXE2-L_AXE2/2);
 
        //rotation de l'axe3 pour qu'il soit dans le bon sens
        raydium_ode_element_rotate_name_3f("test_bras_axe3",-PI/2,PI/2,PI);
 
        //création de la liaison entre l'axe2 et l'axe3, libre en X
        raydium_ode_joint_attach_hinge_name("test_bras_axe3_liai","test_bras_axe2","test_bras_axe3",0,0,
					H_BASE_AXE1+H_AXE2-L_AXE2/2,RAYDIUM_ODE_JOINT_AXE_X);
 
 
    //*********************************************************************************************
                //creation du moteur pour faire bouger l'axe 3 par rapport à l'axe4
    //*********************************************************************************************
 
        raydium_ode_motor_create("test_bras_mot_axe3",a,RAYDIUM_ODE_MOTOR_ANGULAR);
        raydium_ode_motor_attach_name("test_bras_mot_axe3","test_bras_axe3_liai",0);
        raydium_ode_motor_power_max_name("test_bras_mot_axe3",FORCE_MOT);
 
//*************************************************************************************************
//************************************************************************************************* 
 


Résultat :

Image hébergée par servimg.com

Résultat après mouvement du moteur de l'axe 3 :

Image hébergée par servimg.com

La création des autres axes se font de la même façon. Nous ne détaillerons donc pas tout le code ici. Si le code vous intéresse, vous pouvez télécharger le code source sur la page précédente.


CREATION DE LA PINCE

Détaillons tout de même la création de la pince. Celle-ci a posé quelques soucis car elle ne fonctionne pas comme tous les autres axes. En effet, en réalité il est assez simple de créer une pince, mais pour la modéliser ça l'est beaucoup moins.

De plus, il y a aussi un soucis de contact avec cette pince. Car à terme, elle sert à tenir un objet, il fallait donc réfléchir pour créer un contact aussi stable que possible. Nous avons alors créer un objet pour la base de la pince, puis 3 sphère pour le bout de la pince pour permettre un contact ponctuel avec un autre objet. Car avec une boite, le contact aurait été plane.

Ici, nous créerons donc aussi des sphères. Voyons la fonction pour en créer une :

Voici comment est composée la pince :

Image hébergée par servimg.com

La pince est donc composée de 10 éléments. Les 4 premiers permettent de faire le squelette de la pince, avec sont rendu. Et les 6 derniers sont les 6 sphères qui servent à la liaison ponctuelle.
Nous avons été obligé de créer un moteur pour chacune des sphères pour qu'elle puisse suivre le mouvement de la pince. Les centres de rotation des ces sphères sont donc au même endroit que les centres des axes 6_3 et 6_4. Ca fait qu'il y a 4 moteurs au même endroit.

A la création des sphères, il faut définir un paramètre "slip". Car dans notre cas, il faut que la pince puisse tenir un objet. Et le paramètre slip définit le type de contact qu'aura un élément. Pour celà, il faut faire appel à cette fonction :

//variable pour type de contact de la pince
#define slip 0 
 


En ce qui concerne le code, nous n'allons détailler seulement la création d'une seule sphère car le reste est redondant avec la créations des autres axes vu ci dessus.

//*********************************************************************************************
                                //creation de la pince
//*********************************************************************************************
 
 
    //*********************************************************************************************
                    //creation des axes 6_1 et 6_2
    //*********************************************************************************************
	...
 
    //*********************************************************************************************
                    //creation des axes 6_3 et 6_4
    //*********************************************************************************************
	...
 
    //*********************************************************************************************
                    //creation des axes 6_5 et 6_6
    //*********************************************************************************************
 
    //création d'une sphere
    raydium_ode_object_sphere_add("test_bras_axe6_5",a,0.01,TAILLE_PINCE,RAYDIUM_ODE_STANDARD,0,"");
    raydium_ode_element_slip_name("test_bras_axe6_5",slip);
 
    //création d'une sphere
    raydium_ode_object_sphere_add("test_bras_axe6_6",a,0.01,TAILLE_PINCE,RAYDIUM_ODE_STANDARD,0,"");
    raydium_ode_element_slip_name("test_bras_axe6_6",slip);
 
    //*********************************************************************************************
                    //creation de la liaison entre l'axe 5 et les axes 6_5 et 6_6
    //*********************************************************************************************
 
        //Déplacement des axes 6_5 et 6_6 par rapport aux axes 6_1 et 6_2
        raydium_ode_element_move_name_3f("test_bras_axe6_5",-DIST_AXE6_3_X+0.2,
					-2.2-H_AXE3+ENTRAXE_AXE_2+ENTRAXE_AXE_3-ESP_AXE4_Y-H_AXE4-H_AXE_6_12,
					H_BASE_AXE1+H_AXE2-L_AXE2/2+ESP_AXE4_Z+DIST_AXE45+DIST_AXE6_Z);
 
        raydium_ode_element_move_name_3f("test_bras_axe6_6",DIST_AXE6_4_X-0.2,
					-2.2-H_AXE3+ENTRAXE_AXE_2+ENTRAXE_AXE_3-ESP_AXE4_Y-H_AXE4-H_AXE_6_12,
					H_BASE_AXE1+H_AXE2-L_AXE2/2+ESP_AXE4_Z+DIST_AXE45+DIST_AXE6_Z);
 
        //création des liaisons entre les axes 6_5 et 6_6 par rapport aux axes 6_1 et 6_2, libre en Z
        raydium_ode_joint_attach_hinge_name("test_bras_axe6_5_liai","test_bras_axe6_1","test_bras_axe6_5",
					-DIST_AXE6_3_X,
					2-H_AXE3+ENTRAXE_AXE_2+ENTRAXE_AXE_3-ESP_AXE4_Y-H_AXE4-H_AXE_6_12,
					H_BASE_AXE1+H_AXE2-L_AXE2/2+ESP_AXE4_Z+DIST_AXE45+DIST_AXE6_Z,
					RAYDIUM_ODE_JOINT_AXE_Z);
 
        raydium_ode_joint_attach_hinge_name("test_bras_axe6_6_liai","test_bras_axe6_2","test_bras_axe6_6",
					DIST_AXE6_4_X,
					2-H_AXE3+ENTRAXE_AXE_2+ENTRAXE_AXE_3-ESP_AXE4_Y-H_AXE4-H_AXE_6_12,
					H_BASE_AXE1+H_AXE2-L_AXE2/2+ESP_AXE4_Z+DIST_AXE45+DIST_AXE6_Z,
					RAYDIUM_ODE_JOINT_AXE_Z);
 
    //*********************************************************************************************
                //creation du moteur pour faire bouger la pince par rapport à l'axe 5
    //*********************************************************************************************
 
        raydium_ode_motor_create("test_bras_mot_axe6_5",a,RAYDIUM_ODE_MOTOR_ANGULAR);
        raydium_ode_motor_attach_name("test_bras_mot_axe6_5","test_bras_axe6_5_liai",0);
        raydium_ode_motor_power_max_name("test_bras_mot_axe6_5",FORCE_PINCE);
 
        raydium_ode_motor_create("test_bras_mot_axe6_6",a,RAYDIUM_ODE_MOTOR_ANGULAR);
        raydium_ode_motor_attach_name("test_bras_mot_axe6_6","test_bras_axe6_6_liai",0);
        raydium_ode_motor_power_max_name("test_bras_mot_axe6_6",FORCE_PINCE);
 
 
    //*********************************************************************************************
                    //creation des axes 6_7 et 6_8
    //*********************************************************************************************
	...
 
    //*********************************************************************************************
                    //creation des axes 6_9 et 6_10
    //*********************************************************************************************
	...


Résultat :

Image hébergée par servimg.com

Résultat après un mouvement de la pince :

Image hébergée par servimg.com

Nous voyons bien que le bout de la pince est modélisé avec 6 sphères identiques pour permettre un contact ponctuel. Cependant, ces sphères n'ont aucun rendu car ils ne doivent pas être visible à l'utilisateur en tant que sphère. C'est pour celà que nous avons tout d'abord créé une boite avec le rendu réel de la pince. Et ensuite nous avons positionné les sphères pour qu'elles dépassent de peu entre les 2 extrémités de la pince.

Dans toutes les illustrations au dessus, on peut voir des formes en rouge autour du bras. Ceux-ci sont les formes que le moteur physique prend en compte. C'est à dire que si un élément vient à percuter un endroit quelconque du bras, cet élément entrera en contact avec la forme en rouge et non pas avec le rendu du bras. On peut aussi voir certains nom en blanc et en vert. Ce sont les noms des éléments du bras (blanc) et le nom des liaisons du bras (vert).

Ils sont de la forme :

On peut voir tout celà car le mode "Debug" est activé grâce à une de ces commandes :

//dessine les objets normalement
    raydium_ode_draw_all(0);
    raydium_ode_draw_all(RAYDIUM_ODE_DRAW_NORMAL);
    //ajout du mode Debug
    raydium_ode_draw_all(RAYDIUM_ODE_DRAW_DEBUG);


On enlève alors le mode Debug pour voir le bras dans sa vraie apparence. Même si l'on ne voit plus les formes pour les collisions, celles-ci sont tout de même encore gérées.
Voici donc le résultat lorsque l'on enlève le mode Debug :

Image hébergée par servimg.com

Image hébergée par servimg.com




TESTE DE LA PINCE

Après avoir modélisé ce bras, il nous fallait tester si la pince pouvait prendre des objets. Alors nous avons intégré une boîte à notre environnement. Au début il y eut un problème car cette boîte glissait de la pince et tombait par terre. La solution a alors été de configurer la surface de la boîte et de la pince grâce à une commande de ODE :

//fonction qui configure la surface de l'élément name
	raydium_ode_element_slip_name(name,ContactName);


ContactName? définit le type de contact qu'aura l'élément.
Pour la pince, nous avons choisit de mettre 0, ce qui veut dire que le contact est infinie. Ce qui fait qu'il accrochera à l'objet tenu. Quant à la boîte, nous avons mis un contact appelé dContactMu2 (qui vaut 1). Ce type de contact se caractèrise par une force exercée à l'inverse de l'objet en contact. C'est ce qu'il nous fallait pour la pince pour qu'elle joue le rôle d'un étau sur la caisse.

Voici donc le code pour ajouter une caisse dans la scène :

int a;
            char name[255];
            //recherche de l'ensemble où se trouve le bras
            a=raydium_ode_object_find("GLOBAL");
            //On donne le nom "box" à name dans ODE
            raydium_ode_name_auto("box",name);
            //on configure la surface de la boîte avec le contact dContactMu2
            raydium_ode_element_slip_name(name,dContactMu2);
            //ajout d'une boîte de 5cm/5cm/5cm avec le rendu "crate.tri"
            raydium_ode_object_box_add(name,a,0.1,5,5,5,RAYDIUM_ODE_STANDARD,0,"crate.tri");
            //on bouge la caisse pour qu'elle soit devant le bras
            raydium_ode_element_move_name_3f(name,0,-22,2.5);


Pour commander les moteurs du bras, nous avons créé une fonction qui est détaillée dans la partie suivante : voir ici

Voici les essais en image pour prendre la caisse :

Image hébergée par servimg.com

Image hébergée par servimg.com

Image hébergée par servimg.com




PROBLEMES RENCONTRES

Le premier problème rencontré a été à la création des éléments. Car le repère de raydium a été différent du repère de blender. Ce qui fait que les éléments n'étais pas bien positionnés à leur création. C'est pour celà que nous avons dû effectuer certaines rotation sur ces éléments.
Pour corriger ce problème, nous aurions pû construire entièrement le bras avec les différents éléments sous blender. Cependant nous avons créé un fichier blender pour chaque axe.

Ensuite, nous avons eu un problème de taille lorsque le bras était terminé. Car au début, nous avions créé la pince avec seulement des boites. Ce qui faisait qu'elle n'arrivait pas à tenir un objet.
Nous avons donc créer des sphères comme on l'a vu au dessus. Mais il y eut encore un problème car la boîte que l'on voulait tenir glissait trop et donc tombait très rapidement. Après réflexion, nous avons vu qu'il fallait définir certains paramètres pour que la boite ne glisse pas, à savoir le "slip" qui défini le type de contact.
Après avoir paramètré tout celà, la pince arrivait à mieux tenir la boîte. Cependant, elle glisse toujours un peu, certe moins rapidement, mais au botu d'un certain temps, la boîte retombe au sol. Nous nous sommes arrêté ici pour les réglages de la pince car il y avait des problèmes plus important à résoudre.


Retour