bg

Ingénieur informatique et automatique

Lieu

ISTIA - École d'ingénieur option Automatique et Génie Informatique (AGI) | Angers - FR (2008 - 2011)

Missions

  • Cours : tronc commun ingénieur, programmation Unix & Windows, temps réel, web, sécurité réseau, réalité virtuelle, traitement du signal, supervision, traçabilité, systèmes embarqués
  • Projet : reconnaissance d'objets (SIFT/SURF) pour la cartographie d'un espace par robot (80h, 3 personnes) : défi CAROTTE, consortium Cartomatic
  • Projet : "Journée des Métiers": organisation de la journée d'accueil annuelle de 40 entreprises à l'école (12 personnes)

Détail du projet : reconnaissance d'objets

Top

L'objectif de ce projet était de développer un système de reconnaissance d'objets par ordinateur robuste et fiable; afin de réaliser une plateforme multi robots distribuée pour l'exploration et la cartographie de bâtiment. Ce projet s'articulait autour de quatre grands points:

  • La réalisation d'une plateforme multi robots, chaque robot disposant d'une base d'objets reconnaissables commune.
  • La localisation de chaque robot dans l'espace.
  • L'architecture et la stratégie de déploiement de la flotte de robots.
  • La reconnaissance visuelle d'objet et l'apprentissage.

Notre équipe (3 personnes) avait pour but de développer, en 80 heures, le quatrième point concernant la reconnaissance d'image ainsi que de constituer la base d'objets commune à chaque robot.

Nous avions pour consignes de projet, d'étudier la méthode SIFT (Scale Invariant Feature Transform) qui permet de caractériser les points importants d'une image (contour, angle, etc.). Ainsi que les librairies graphiques OpenCV et GTK pour gérer respectivement l'acquisition vidéo et l'interface graphique (IHM).

L'ensemble du projet a été développé sous un système UNIX.

Présentation du projet :
left
left
right
Télécharger le rapport
PDF
Conclusion :

Ce projet a été pour nous l'occasion de voir à quoi ressemble un processus de recherche technologique et comment travailler en équipe.
Le partage des tâches, l'entraide, l'apprentissage et la satisfaction du travail réalisé ont été les maitres mots durant ce projet.
Appliqué aux domaines de la sécurité, culturel ou purement commercial, le traitement et la caractérisation d'une image sont des technologies en vogue en ce moment.
La découverte de ces technologies a été pour nous un point important de notre formation, c'est pour cela que nous tenons à remercier l'ensemble des personnes qui nous ont guidés tout au long de ce projet.

Détail du projet : jeu 3D en C++ avec OpenGL

Top

Caractéristiques :
  - Utilisation du moteur graphique Physics
  - Physicalisation d'objets et génération de sons lors des collisions
  - Contrôle à la Wiimote, clavier et souris
  - Modélisation d'objet 3D (3D Explorer, Blender)

1) Jeu en C++ utilisant OpenGL
2) Suivi du vaisseau par la caméra
3) Liste des touches utilisées
4) Gestion des collisions
5) Dessin d'une Skybox en C
6) Contrôle à la Wiimote
7) Inclure des sons en cpp
8) Tir de missiles avec OpenGL
9) Scène finale : 3 planètes + 2 satellites
10) Téléchargement du jeu OpenGL
1) Jeu en C++ utilisant OpenGL

Voici un exemple de la première scène dévellopée, elle était composée d'un vaisseau spatial de type « NabooFighter » téléchargé sur le site www.scifi3d.com et d'une surface de lune dessinée avec www.earthsculptor.com.

image.jpg
2)Suivi du vaisseau par la caméra

La fonction gluLookAt permet de suivre le mobile avec la caméra. La position de la caméra sera modifiée de la même manière que le mobile. Les constantes présentent dans les paramètres de rapport à l'objet. Le sinus qui influe la position en Y « à regarder » permet d'anticiper la vision sur le déplacement.

image.jpg

3)Liste des touches utilisées

Voici la liste des touches utilisées ainsi que leurs effets :

image.jpg


4) Gestion des collisions

La « physicalisattion » permet d'interagir avec les objets lors de collision. Ici uniquement la terre (fixe) et le vaisseau (mobile) ont été phisycalisé pour minimiser les ressources nécessaires à l'exécution du jeu.

Si le vaisseau percute la terre :

-        il recule automatiquement jusqu'à que l'on reprenne le contrôle de sa vitesse

-        un son d'alarme et joué

Chargement des objets :

 

tab3DS[1].Load("data/Naboo2/NabooFight2_mini.3ds");

      affichInfo3ds(1);

tab3DS[4].Load("data/map/earth5.3DS");

      affichInfo3ds(4);

Physicalisation des éléments mobile et fixe par des fonctions prédéfinies :

InitNx3DS(1);

      CreateNxAvatar(1);

InitNx3DS(4);

      CreateNx3DS(4,FIXE);

Gestion des collisions :

if(events & NX_NOTIFY_ON_START_TOUCH)   

            {

                  printf("\nStart touch\n");

                  Vitesse=-2;

            }

            if(events & NX_NOTIFY_ON_TOUCH)               

            {

                  printf("On touch\n");

                  FSOUND_PlaySound(1, samp1);

            }

            if(events & NX_NOTIFY_ON_END_TOUCH)      printf("End touch\n\n");


5)  Dessin d'une Skybox en C

Utilisation de plusieurs sphères de points positionnées les une dans les autres ce qui imite un ciel étoilé en utilisant une boucle « for ». Il y a aussi deux satellites qui tournent autour de la terre.

image.jpg image.jpg


6) Contrôle à la Wiimote

Le vaisseau monte, descend, tourne et s'incline en fonction de la position de la wiimote (les même fonctions sont possible avec la souris).

image.jpg

Inclusion des bibliothèques pour la Wiimote téléchagé sur http://www.wiiuse.net :

Exemple d'utilisation des boutons de la Wiimote :

image.jpg

On peut connaitre la position du vaisseau à tout instant en regardant la fenêtre de console :

image.jpg

7) Inclure des sons en cpp

Différents sons ont été inclus dans le jeu :

-          La musique originale de StarWars en fond

-        Un son de missile lors du lancement des missiles en pressant la touche « g »

-        Une alarme lors d'une collision avec la terre

Déclaration des bibliothèques de son pour le c++ :

#include "../data/Les_Sons/fmod.h"

#include "../data/Les_Sons/fmod_errors.h"

#pragma comment(lib, "fmodvc.lib")

Déclaration des variables de types son :

static FSOUND_SAMPLE *samp1;       / un son              

static FSOUND_SAMPLE *samp2;                                               

static FSOUND_SAMPLE *samp3;      

FSOUND_STREAM *musique = NULL;     / une musique de fond

Initialisation des différents sons utile au programme :

void initSon(){

      if (!FSOUND_Init(44100, 32, 0))

      {

            printf("Erreur");

      }

      samp1 = FSOUND_Sample_Load(FSOUND_FREE, "Data/Les_Sons/Burglar.wav", FSOUND_NORMAL | FSOUND_2D, 0, 0);            if(!samp1) printf("sound error");

      samp3 = FSOUND_Sample_Load(FSOUND_FREE, "Data/Les_Sons/missle.wav", FSOUND_NORMAL | FSOUND_2D, 0, 0);            if(!samp3) printf("sound error");

      musique = FSOUND_Stream_Open("Data/Les_Sons/starwars.wav", FSOUND_LOOP_NORMAL, 0, 0);

      FSOUND_Stream_SetLoopCount(musique, -1);                                     FSOUND_Stream_Play(FSOUND_FREE, musique);                                                                                       

}

Pour jouer le son missile.wav :

FSOUND_PlaySound(1, samp3);

 

8) Tir de missiles avec OpenGL

Ici il suffit de presser la touche « g » pour :

-        mettre une variable « fire » à 1 qui est utilisé par la boucle d'affichage

-        recopier la position et l'orientation du vaisseau dans les variables de position et d'orientation du missile

-        jouer un son

Code pour l'initialisation du tir :

case 'g':   fire = 1;                                                                    WeGD = RotGD;

                  WeHB = IncHB;

                  WeX = AvX;

                  WeY = AvY;

                  WeZ = AvZ;

                  FSOUND_PlaySound(1, samp3);break;


Etape pour l'affichage des missiles (dans la fonction display) :

-        positionnement à l'endroit où se trouve le vaisseau

-        ajustement juste devant la sortie des cannons pour le réalisme déplacement autonome en fonction du pas

-        redimensionnement (mise à l'échelle) des missiles

-        affichage du premier missile

-        déplacement jusqu'au second canon

-        affichage du second missile

-        arrêt du déplacement des missiles en fonction d'un seuil (ici 30 itérations)

Code pour l'affichage des missiles en mouvement indépendamment du mouvement du vaisseau:

glPushMatrix();  

            if(fire == 1 )

            {          

                  pas -= 1;

                  glTranslatef(WeX,WeY,WeZ);                                

                  glRotatef(WeGD, 0.0, 1.0, 0.0);

                  glRotatef(-WeHB, 1.0, 0.0, 0.0);

                  glTranslatef(-1.5,-0.8,pas-8);    

                  glScalef (0.01, 0.01, 0.01);                                                 tab3DS[5].Draw();

                  glTranslatef(250, 0.0, 0.0);                              

                  tab3DS[5].Draw();

                  if(pas < -30)

            {                 // défini la portée des misiles

                        fire = 0;

                        pas = 0;

                  }

            }

      glPopMatrix();   

image.jpg


9) Scène finale : 3 planètes + 2 satellites

image.jpg image.jpg image.jpg


10) Téléchargement du jeu OpenGL

Voici un fichier zip (16Mo) contenant l'exécutable ainsi que les fichiers .dll et .3ds nécessaires au fonctionnement. Ce jeu est exécutable sous windows, après l'avoir dézippé, et en cliquant sur start.exe. Au lancement, vous pouvez suivre l'initialisation de chaque objet dans la fenêtre "console". Ceci peut prendre plusieurs minutes en fonction de votre configuration. Une fois terminé, la liste des contrôles apparaît dans cette même fenêtre et une autre affiche le jeu. C'est le moment de jouer!