Simulation sous Raydium de WifiBots et liaison virtuelle.
Entreprise / Client ->LASMEA / M.L. ADOUANE (lounis.adouane@lasmea.univ-bpclermont.fr)
Auteurs -> ALBARAKEH Zaher (zaher.albarakeh@poste.isima.fr)
Dans le cadre de mes études en double cursus génie électrique en troisième année (2008-2009) à l’université Libanaise (faculté de génie 1), et master 2 recherche MSIR, moi Zaher AL BARAKEH j’ai travaillé sur le projet intitulé " Simulation de la liaison virtuelle de robots mobile par vision et navigation de robots mobiles sur la plateforme Raydium ". Ce projet à été proposé par M. L. Adouane enseignant/chercheur au LASMEA et M. T. Château enseignant/chercheur au LASMEA, sous la supervision du M. J. Laffont. Le but principal du projet est de réaliser sous la plateforme Raydium un convoi virtuel de robots et de simuler la liaison par vision entre les robots mobiles. Le robot de tête est manuellement contrôlé (tache du clavier) et le suiveur envoie les images de sa camera a un ordinateur déporté, qui calcule le suivi de la trajectoire, et les renvoi au robot. Mais est ce qu’on peut envoyer les images, et manipuler les différentes vues des cameras. Le travail à réaliser est divisé en plusieurs parties: la première étant la création des robots dans la plateforme, la deuxième est la création des textures, la troisième consiste à assurer la récupération des images, et la dernière sera la récupération des commandes de vitesse.
Mots clefs
Convoi de robots, commande, vision, raydium, image.
In my studies in electrical engineering 3rd year (2008-2009) at the Lebanese university (faculty of engineering 1), and Master 2 research MSIR. Me, Zaher ALBARAKEH worked on the project entitled:” virtual link simulation of mobile robots and navigation in the raydium platform” this project was proposed by M. L. Adouane who is a teacher / researcher at LASMEA and Mr. T. Chateau a teacher / researcher at LASMEA, under the supervision of M. J. Laffont.
The project's main goal is to realize a virtual environment of the robot convoy in Raydium and to simulate the visual link between them.
The leader robot is controlled manually (by keyboard) while the follower sends the data of his camera to a remote computer where all the necessary calculation for tracking are done, than resend them. But are we able to send every angle of cameras? We came to divide the work into several parts: the first one is creating the skeleton of these robots; the second will be creating the textures, then acquiring the images, and last will be sending commands back.
Le projet qui nous concerne a pour but de réaliser une simulation virtuelle de convoi par vision de robots mobiles. Ce projet s'inscrit dans le cadre de la commande et de la vision de robots par liaison virtuelle. Il a été proposé par M. ADOUANE, enseignant/chercheur au LASMEA. Ce projet sera réalisé par Zaher ALBARAKEH, élèves en double cursus de l’Université Libanaise (faculté de génie I), et Master 2 recherche MSIR. En effet le projet était la représentation de ce qui a été fait les années precedentes dans une simulation virtuelle. Ce convoi sera réalisé tout en virtuelle, c'est pour cela il se pose la problématique de savoir si l’interfaçage entre les différentes fonctions à utiliser est possible et si ce n'est pas le cas alors quelle solution proposons nous!
Nous allons réaliser une simulation de convoi de robots mobiles par vision en déporté. On aura un robot de tête contrôlé manuellement et un suiveur en envoyant par liaison wifi à un ordinateur les images de sa camera pour effectuer les calculs nécessaires pour la vision en embarqué. Le robot de tête est muni d'un motif plan (quatre points réalisant un carré, figure 2) qui est placé dans son dos. La caméra du robot suiveur devra capturer l'image du motif plan ensuite la simulation doit transmettre à l’ordinateur contrôleur cet image qui analyse les quatre points qui sont sur l'image pour déterminer la distance à laquelle se trouve le robot de tête et la direction du robot de tête (figure 1). La distance et la direction ainsi déterminées, permettront l'asservissement de la vitesse des roues du robot suiveur pour pouvoir suivre le robot de tête.
Figure 1: Schema de la simulation
Figure 2: Robot de tête avec plan motif.
Figure 3: les 2 robots en simulation.
- Etudier le système robotique et sa documentation,
- Créer les robots virtuelle,
- assurer la communication pour la commande des robots,
- Objectif : convoi de robot par vision•Véhicule de tête contrôlé manuellement,
•Véhicule suiveur muni d’une caméra observant un motif plan sur le robot de devant,
•Calculs des commandes effectués sur un PC déporté et connecté au robot via une liaison TCP/IP.
Figure 4: Robot Wifibot (vure de face)
Le problème posé par ce projet, est d’effectuer la représentation virtuelle de tous ce qui a été fait dans les projets d’avant De plus il faut faire des robots qui doivent être très semblables aux robots mobiles. L’environnement raydium ne permet pas d’avoir plus qu’une fenêtre pour présenter les différents vue des cameras, alors on arrive a des problèmes d’acquisition des images. Néanmoins, on peut afficher plusieurs vue de différentes cameras dans une même fenêtre (figure 3)
Raydium est un environnement virtuelle, qui utilise les fonctions openGL, mais pas tous ses fonctions. Alors, la manipulation du camera, et les façons du capture d’image étaient très basiques.
Dans le projet on a besoin de 2 wifibots. Alors dans la programmation en raydium, on a donné la même squelette aux 2 robots, dont le corps est un parallélépipède et que chaque roue est représentée par une sphère, et la camera par un cube.
Création des robots Virtuelles:
Figure 5: Squelette des robots.
La démarche est qu’on doit créer un objet, et ajouter à cet objet des propriétés géométriques.
group=raydium_ode_object_create (char *name)
avec:
groupe : c’est cette variable donnée qui définit un objet. Alors chaque fois qu’on veut ajouter une propriété à l’objet, on doit l’indiquer à cette variable. Et « name » est le nom donné à l’objet, par exemple « wifibot ».
Le corps: on ajoutte une boite « box ».
raydium_ode_object_box_add (char *name, int group, dReal mass, dReal tx, dReal ty,dReal tz, signed char type, int tag, char *mesh)
dans ce cas: name est le nom donné à cet propriété, on donne sa masse, les dimensions en x,y,z. type : standard, mesh : c’est le nom du ficher .tri de la texture à attribuer.
Les roues :
Chaque roue est créée comme une sphère :
raydium_ode_object_sphere_add (char *name, int group, dReal mass, dReal radius,signed char type, int tag, char *mesh)
Tous comme avant, mais pour les dimensions, on donne le radium le rayon du sphère.
La camera est la même que le corps, un box.
Ici la création est finie, maintenant, on va donner des propriétés mécaniques à cet objet. Et de lier les différentes parties.
Le wifibot contient 2 moteurs, gauches et droits. Pour cela, on a crée 2 moteur.
raydium_ode_motor_create (char *name, int obj, signed char type)
obj, est la variable de l’objet, pour que ce moteur soit attribuée a cet objet.
On attribue a chaque moteur, une force max :
raydium_ode_motor_power_max_name (char *name, dReal power)
pour chaque roue, on donne un nom, et on attribue une valeur de friction:
raydium_ode_element_rotfriction_name (char *e, dReal rotfriction
puis pour chaque roue, on le transporte a sa position dans l’objet:
raydium_ode_element_move_3f(int elem, dReal x,dReal y, dReal z)
et on fait une liaison mécanique avec le corps:
raydium_ode_joint_attach_hinge_name (char *name, int elem1, int elem2, dReal posx, dReal posy, dReal posz, dreal axe)
name, est le nom du corps initiale ou le roue s’attache. Dans l’axe on définit l’axe dont la rotation se fait : ici : RAYDIUM_ODE_JOINT_AXE_Y c.à.d. la rotation se fait dans l’axe y.
raydium_ode_motor_attach_name (char *motor, char *joint, int joint_axe)
Ici on relie la roue à un moteur.
pour definer le glissement, e est le nom du roué.
raydium_ode_element_slip_name (char *e, dReal slip)
Figure 6: Creation des textures sous Blender.
Les unités de surface dans Raydium, et dans Blender doivent être identiques. S’il ya des différances, il faut la rectifier dans Blender avant de lancer le programme Raydium.
Utilisables dans Blender, pour créer des textures utiliser par le raydium, il faut que tous le dessin se fasse en Mesh.
Et pour que le raydium prenne la texture, il faut qu’elle soit formée par en des triangles.
Figure 7: Les textures sous Blender.
La récupération d’images se fait par simple groupe de fonctions dans raydium, qui fait la capture d’images.
Ces fonctions disposes de différents arguments, dépendant de la problématique étudiée.
Dans ce projet, la fonction utilisée est : raydium_capture_frame_jpeg("PICT.jpg");
Cette fonction est utilisée, car chaque frame qu’elle prend, elle l’enregistre dans le même fichier « Pict.jpg ».
Pour envoyer l’image, un simple programme est conçu qui envoie le fichier JPEG de l’image sous programmation socket, TCP/IP.
Pour la programmation en socket, les fonctions réalisées sont les suivant :
void creat_socket(char adress);
Qui définit une adresse IP et une porte pour le socket. Ces paramètres sont utilisées dans tout le programme.pour fermer le socket à la fermeture du programme: void close_socket(void) ;
Pour envoyer le fichier, la fonction suivante a été développée:
memset(buffer,0,sizeof(buffer));
int err=0;
err=send(sock,nomfichier,sizeof(buffer),0);
char size[50];
itoa(filesize(fichier),size,10);
printf("\n%s\n",size);
err=send(sock,size,sizeof(size),0);
char *bufferfichier = (char*)malloc(sizeof(char)*255);
int i;
for(i=0;!feof(fichier);i+=255){
fread(bufferfichier,255,1,fichier);
}err=send(sock,bufferfichier,255,0);
err=send(sock,"fin",255,0);
La réception des commandes consiste à recevoir simplement 2 caractères, un pour la vitesse de la roue gauche, et l’autre pour celle de la droite.
Comment récupérer une image sous raydium pour réaliser un traitement d'images ?
Je n’ai pas pu réaliser le convoi demandé mais je suis arrivé à la réalisation de plusieurs travaux tels que la création des textures, le programme de TCP/IP et quelque autres fonctions, que je n’ai pas utilisé enfin de compte dans le programme.
Pour faire la capture d’image, on doit savoir qu’à chaque nouvelle frame, on aura une nouvelle image, et sachant qu’on a autant de 60 frame par second, il n’est pas utile d’envoyer toutes ces frames, car on va envoyer plus d’information que demander, et si processus de calcul prend du temps, on peut saturer le calculateur. Pour cela, j’ai décidé d’envoyer seulement 6 images par seconds.
Pour les projets futurs, il serait bien d'utiliser le flux vidéo pour la récupération de l'image car il est possible de faire dans l’environnement Raydium une vidéo des frames successifs. Et utiliser des entiers et non des flottants dans le programme de traitement de l'image.
Notes sur la manipulation et control de la camera dans raydium :
Chaque nouveau frame, la position de la camera doit être réécrite dans la fonction :
Positionnement de la camera.
Déplacer le « drawing cursor » vers la position de l’objet.
Dessin de l’objet.
Réinitialisation de la camera à la position initiale (la position de la première étape)
Déplacer le « drawing cursor » vers la position d’un autre objet.
Dessiner un autre objet.
Les étapes 4 et 5 peuvent être faites par raydium_camera_replace_go().
raydium_camera_look_at_roll
pour diriger la camera vers une direction spécifié, utiliser la fonction : void raydium_camera_vectors
on doit, apres chaque dessin d’un objet, réinitialiser la position de la camera void raydium_camera_replace (void)
Exemple d’utilisation de la camera :Notes sur la création de l’environnement dans la main :
Création de la fenêtre:
raydium_texture_filter=RAYDIUM_TEXTURE_FILTER_TRILINEAR;
Création de la position zéro de la camera:
raydium_projection_near=0.01;
raydium_projection_far=2500;
raydium_projection_fov=60;
Création du texture de l’environnement:
raydium_ode_ground_set_name("rail_world_full.tri");
Pour la création des objet, on doit écrire la fonction suivante, pour que le système peut créer des objet:
Création de la fenêtre:
raydium_window_create(640,480,RAYDIUM_RENDERING_WINDOW,"train's test");
Spécification du type du filtre:raydium_texture_filter=RAYDIUM_TEXTURE_FILTER_TRILINEAR;
Création de la position zéro de la camera:
raydium_projection_near=0.01;
raydium_projection_far=2500;
raydium_projection_fov=60;
raydium_ode_ground_set_name("rail_world_full.tri");
Pour la création des objet, on doit écrire la fonction suivante, pour que le système peut créer des objet:
raydium_object_find_load()
Autres notes sur le projet :
Il n'y a pas de commentaire sur cette page.
[Afficher commentaires/formulaire]


