FLASH INFORMATIQUE FI



Images virtuelles Aide au guidage d’un hélicoptère




Jean-Roland Schuler

François Kilchoer

Claude Magliocco

Philippe Nussbaumer


Présentation du projet

Il y a quelque temps, M. Luca Carlino, alors étudiant de la filière électronique à l’école d’ingénieurs et d’architectes de Fribourg (EIA-FR), nous a proposé un projet très ambitieux : fournir une aide au pilotage d’un hélicoptère par mauvais temps.

Cette aide consistait à afficher en temps réel et en 3 dimensions le paysage que verrait le pilote par beau temps. Etant lui-même pilote d’hélicoptère, il se rendait compte de l’avantage d’un tel système. Pour le réaliser, il faut conna"tre la position de l’hélicoptère, la topologie du paysage et un ordinateur (se trouvant dans l’hélicoptère) qui calcule et affiche le paysage.

fig. 1 - Paysage vu de l’hélicoptère 

La position de l’hélicoptère (fig. 2)est principalement donnée par le système GPS (Global Positionning System) qui permet de conna"tre la longitude, latitude, hauteur de l’hélicoptère.

fig. 2 - Position de l’hélicoptère 

Pour la topologie du paysage, nous avons acheté à l’office fédéral de la topographie la base de données contenant les informations de longitude, latitude, hauteur de la région de Bellinzone. Ayant ces informations, nous avons réalisé un programme permettant d’afficher en temps réel, le paysage en 3 dimensions.

fig. 3 - Lunettes de visualisation 

Afin de rendre le pilotage le plus aisé possible, nous affichons le paysage sur des lunettes semi-transparentes qui permettent au pilote de voir les images de synthèse et le paysage réel. La figure 3 en page 12 représente les lunettes semi-transparentes montées sur le casque du pilote.

Nous avons réalisé un vol réel pour tester le prototype ; ce jour-là était bien choisi car la visibilité était mauvaise. La figure 4 représente une photo prise depuis l’hélicoptère lors de la phase d’atterrissage. L’aérodrome se trouvait à 1 kilomètre et n’était pas visible, par contre les images affichées sur les lunettes permettent de voir l’aérodrome et toute la vallée.

fig. 4 - Photographie prise depuis l’hélicoptère et images virtuelles aidant le pilote 

Affichage en 3 dimensions du paysage et des obstacles

Une première version du programme d’affichage avait été réalisée avec le programme IrisPerformer de SiliconGraphics. Cette version remplissait les exigences graphiques mais malheureusement le processeur de l’ordinateur était utilisé à 100%.

Afin d’améliorer ceci, nous avons décidé de réaliser une nouvelle version en utilisant le standard OpenGL1 qui nous permet de mieux utiliser le processeur de la carte graphique (GPU). Le résultat est impressionnant : pour les mêmes fonctionnalités le processeur de l’ordinateur est utilisé à moins de 1% et le GPU effectue une grande partie des calculs.

Afin de comprendre ces optimisations, il faut expliquer les points suivants :
• Dessin d’un objet en 3 dimensions.
• Création de la topologie d’un paysage en 3 dimensions d’après les données de l’office fédéral de la topographie.
• Matériel utilisé.

Dessin d’une image en 3 dimensions

Sous ce point, nous expliquons simplement comment représenter une scène en 3 dimensions sur un écran (à 2 dimensions).

On peut utiliser des triangles pour représenter des formes simples. La fig. 5 représente, dans un repère x-y-z, la décomposition d’un cube en triangles. Il existe d’autres représentations mais celle-ci convient bien pour notre application.

fig. 5 - Représentation d’un cube avec des triangles 

Pour définir un triangle, fig. 6, en OpenGL nous devons le programmer de cette manière :

        glBegin(GL_TRIANGLES);
                glVertex3f( 0.0f, 1.0f, 0.0f);
                glVertex3f(-0.5f, 0.0f, 0.0f);
                glVertex3f( 0.5f, 0.0f, 0.0f);
        glEnd( );

La fonction glBegin définit le début du triangle, glEnd la fin du triangle, glVextex3f les coordonnées des points du triangle.

Le code ci-dessus définit le triangle suivant :

fig. 6 - Définition d’un triangle en OpenGL 

Afin de donner du réalisme à l’image, on peut appliquer des textures sur les faces du cube :

fig. 7 - Cube avec textures 

Lorsque nous avons plusieurs objets, nous devons déterminer quel objet est au premier plan et cache les autres. La figure 8 représente un cube imbriqué dans une pyramide, le cube étant au premier plan :

fig. 8 - Cube imbriqué dans une pyramide 

Ensuite nous devons projeter les objets en 3 dimensions sur l’écran à 2 dimensions :

fig. 9 - Projection sur l’écran 

Topologie du paysage

Comme mentionné, nous avons acheté à l’office fédéral de la topographie la base de données contenant les informations de longitude, latitude, hauteur de la région de Bellinzone.

tableau 1 - Longitude-latitude-hauteur 

Nous remarquons que la hauteur est donnée tous les 10 mètres (707500-707510). La zone que nous avons décidé de modéliser est un carré d’environ 10 km de côté. On peut donc utiliser une matrice à 2 dimensions h[i, j] pour mémoriser la hauteur. L’indice i représente la longitude et j la latitude, par exemple :
• le contenu de h [0, 0] est la hauteur au point d’origine ;
• le contenu de h [0, 1] est la hauteur au point d’origine plus 10 mètres en latitude.

Afin de mémoriser toutes les hauteurs nous avons besoin d’une matrice de 1000x1000.

Sans optimisation, nous aurions 2 millions de triangles à afficher environ 30 fois par seconde.

fig. 10 - Triangles non optimisés 

Afin de diminuer le nombre de triangles, il est nécessaire d’augmenter la surface de ceux-ci. En effet une zone dont la hauteur varie peu sera modélisée par de grands triangles, par contre les zones accidentées seront modélisées par des petits triangles.

Pour diminuer le nombre de triangles, nous avons utilisé l’algorithme ROAM2 qui permet d’optimiser la représentation en 3 dimensions de la topologie du paysage. La figure 11 permet de voir le résultat de cet algorithme : les zones plates sont modélisées par de grands triangles, les zones accidentées par de petits triangles. De cette manière nous sommes passés de 2 millions à seulement 20’000 triangles.

fig. 11 - Résultats de l’algorithme ROAM sur les triangles 

Afin de rendre plus réaliste le paysage, nous avons ajouté des textures. N’ayant malheureusement pas les textures réelles de la région, nous avons scanné une carte de géographie. La figure 12 représente la topologie du terrain avec la texture.

fig. 12 - Textures 

Comme vous le savez, les câbles aériens (lignes électriques,...) causent régulièrement des accidents d’hélicoptères. Pour augmenter la sécurité, nous avons introduit des obstacles que le pilote peut voir sur son écran afin de les éviter plus facilement. La figure 13 représente l’insertion de lignes électriques.

fig. 13 - Insertion de lignes électriques 

Matériel utilisé

Afin d’optimiser la vitesse d’affichage d’une image en 3 dimensions, il est important de bien comprendre :
• quelle est l’architecture de l’ordinateur ?
• où sont mémorisées les informations ?
• comment s’effectue le transfert de données entre le processeur de l’ordinateur et la carte graphique ? Pour notre application, nous avons utilisé un PC standard ayant ces caractéristiques :
• processeur : AMD K7 (Athlon)
• fréquence : 1.3GHz
• mémoire centrale : 256 Mbytes
• Chipset : Via Apollo KT133A
• système d’exploitation : Linux, distribution Redhat, kernel 2.4.18 Nous avons utilisé une carte graphique standard ayant ces caractéristiques :
• ASUS 8200
• processeur graphique (GPU) : Nvidia Geforce3
• mémoire : 64 MBytes La figure 14 représente l’architecture interne de chaque PC.

fig. 14 - Architecture interne d’un PC 

La première grande optimisation a été de mémoriser les textures sur la carte graphique, en effet pour notre application, les textures utilisent 45Mbytes. Afin d’éviter un transfert permanent entre la mémoire principale et la mémoire de la carte graphique, nous avons copié les textures sur la carte graphique. Celle-ci n’ayant que 64Mbytes de mémoire RAM, il est possible que certaines textures peu utilisées soient copiées dans la mémoire principale. Afin que ceci soit réalisé le plus rapidement possible, nous avons activé l’option AGP Aperture Size du BIOS3 qui permet d’allouer une partie de la mémoire principale à la carte graphique et ainsi permettre au DMA4 d’effectuer des transferts très rapides. Grâce à cette optimisation, le processeur de l’ordinateur était utilisé à environ 30%.

La deuxième grande optimisation a consisté à utiliser le programme gprof5 qui permet de déterminer à quel endroit un programme passe le plus de temps. Nous avons trouvé que l’algorithme ROAM utilisait très souvent la fonction sqrt qui effectue une racine carrée. En analysant l’algorithme, il s’est avéré qu’une approximation de la racine carrée ne modifierait pas le résultat de celui-ci. Il se trouve que les processeurs AMD K7 possèdent un ensemble de registres et fonctions, appelés 3DNow, qui sont optimisés pour les calculs en virgules flottantes. La modification de l’algorithme ROAM en remplaçant la fonction sqrt par la fonction pfrsqrt, de 3DNow, qui effectue une approximation de la racine carrée, nous a permis de faire passer la charge du processeur de l’ordinateur de 30% à moins de 1%. Ce qui est extrêmement intéressant car il est possible d’utiliser le même ordinateur pour effectuer en même temps d’autres tâches.

Conclusions

La réalisation de cet ambitieux projet a été une suite continuelle de défis (mais n’est-ce pas le rôle des ingénieurs-chercheurs) car initialement nous avions très peu d’expérience dans le positionnement d’objets, la représentation en 3 dimensions en temps réel, ...

Tous ces défis ont été relevés avec succès. Par exemple nous avons pu améliorer le positionnement d’objets en réalisant le projet VGS (Virtual Guiding System) financé par la HES-SO6 et qui sera décrit dans un prochain article.

L’impact médiatique (télévision, radio, journaux) de ce projet nous a permis de réaliser d’autres projets tout aussi ambitieux qui utilisent le même principe : positionnement et représentation d’objets en 3 dimensions en temps réel.


1 OpenGL, Open Graphics Library., www.opengl.org
2 ROAM, Real-time Optimally Adapting Meshes, www.llnl.gov/graphics/ROAM/
3 BIOS, Basic Input/Output System
4 DMA : Direct Memory Access
5 gprof : GNU Profiler
6 HES-SO : Haute Ecoles Spécialisées de Suisse Occidentale



Cherchez ...

- dans tous les Flash informatique
(entre 1986 et 2001: seulement sur les titres et auteurs)
- par mot-clé

Avertissement

Cette page est un article d'une publication de l'EPFL.
Le contenu et certains liens ne sont peut-être plus d'actualité.

Responsabilité

Les articles n'engagent que leurs auteurs, sauf ceux qui concernent de façon évidente des prestations officielles (sous la responsabilité du DIT ou d'autres entités). Toute reproduction, même partielle, n'est autorisée qu'avec l'accord de la rédaction et des auteurs.


Archives sur clé USB

Le Flash informatique ne paraîtra plus. Le dernier numéro est daté de décembre 2013.

Taguage des articles

Depuis 2010, pour aider le lecteur, les articles sont taggués:
  •   tout public
    que vous soyiez utilisateur occasionnel du PC familial, ou bien simplement propriétaire d'un iPhone, lisez l'article marqué tout public, vous y apprendrez plein de choses qui vous permettront de mieux appréhender ces technologies qui envahissent votre quotidien
  •   public averti
    l'article parle de concepts techniques, mais à la portée de toute personne intéressée par les dessous des nouvelles technologies
  •   expert
    le sujet abordé n'intéresse que peu de lecteurs, mais ceux-là seront ravis d'approfondir un thème, d'en savoir plus sur un nouveau langage.