Friday, January 23, 2015

TLPS - The Transverse Laser Profiling System


This post is under construction...

The ICS was developed to perform...

Technologies:
Windows XP
C++ in Microsoft Visual Studio 8 (2005) IDE
Visual Basic in Microsoft Visual Studio 8 (2005) IDE
.NET Framework 2
Common Language Runtime (CLR)
Multiple Document Interface (MDI) applications
Single Document Interface (SDI) applications
Microsoft Fondation Classes (MFC 8.0)
Modeless Dialog Boxes
Modal Dialog Boxes
Objects Serialization
Afx Threads and critical sections
Software Interrupts
Timer Events (onTimer())
Windows Registry to save and retrieve persistent application’s data
Windows Contextual Help in compressed HTML file
Installation Wizard (Setup.exe)
Point Grey Research Scorpion and Dragonfly high-resolution digital cameras on an IEEE 1394 bus (FireWire™)
PCI-3E US Digital – Three Incremental Encoder with I/O Port, PCI Card
Trimble GPS connected via RS-232 serial port
NMEA (National Marine Electronics Association)
Multiple SATA Hard-drives

Picture Gallery

New feature in development that was not terminated.

I have started to add a new type of document that the application could open and display: 3D surfaces.

When I stopped working on that project, my application was able to read data for three dimensional lines and to represent them in a view.

For example, consider the following script file:
#
# Filename: \tmp\CapturedGeometry.txt
# Author:   CameraManager
# Date:     Feb/24/2010 08:23:22
#
# Description: This file contains saved geometry.
#

# Line3D is a new CameraManager script instruction that defines a 3-D line
# using a start and an arrival point:
#
# Syntax
#   LINE3D x1 y1 z1 x2 y2 z2;

LINE3D 8.991185 879.958142 0.000000 8.991185 879.958142 0.000000 ;
LINE3D 8.991185 879.958142 0.000000 9.991771 879.932176 0.000000 ;
LINE3D 9.991771 879.932176 0.000000 10.995455 879.723784 0.000000 ;
LINE3D 10.995455 879.723784 0.000000 11.984334 880.386899 0.000000 ;
LINE3D 11.984334 880.386899 0.000000 12.983302 880.456176 0.000000 ;
LINE3D 12.983302 880.456176 0.000000 13.990395 880.047127 0.000000 ;
LINE3D 13.990395 880.047127 0.000000 14.989369 880.116005 0.000000 ;
LINE3D 14.989369 880.116005 0.000000 15.987314 880.245462 0.000000 ;
LINE3D 15.987314 880.245462 0.000000 16.986637 880.293790 0.000000 ;
LINE3D 16.986637 880.293790 0.000000 17.993493 879.898738 0.000000 ;
                                o
                                o
                                o
LINE3D 588.066698 880.431100 2320.000000 589.064360 880.577163 2320.000000 ;
LINE3D 589.064360 880.577163 2320.000000 590.073927 880.022510 2320.000000 ;

The program could parse these instructions to create the following representation using OpenGL:

État sur l’avancement du projet TLPS

Voici un compte-rendu sur l’avancement du projet TLPS.

Ce qui est réalisé et ce qui fonctionne

Le système mesure un profile en retournant une série de points avec des valeurs en X, mesurant la largeur. À chacun de ces points en X, une valeur Z est associée pour déterminer une hauteur ou distance à chacun des ces points en X.
Le système TLPS permet de faire ceci présentement avec des caméras simulées ainsi qu’avec des caméras Dragonfly de Point Grey Research montées dans un détecteur qui associe un laser, une caméra avec double iris et des lentilles polarisantes.
Voici un exemple:

Figure: Profile mesuré par une caméra avec BIRIS.PNG
Image 1. Profile mesuré par une caméra avec BIRIS.
Picture 1. Profile mesuré par une caméra avec BIRIS.

Changer les coordonnées BIRIS(X,Z) en PROFILE(X,Y,Z)

Si on considère les coordonnées en Z (de la hauteur ou distance) comme des coordonnées en Y, alors on peut facilement assimiler un profile à une fonction f(x) = x dans un plan cartésien.
Si on projette cela dans un plan cartésien nous pourrions affirmer que les coordonnées Z sont en fait des coordonnées Y dans un système de coordonnées main droite (right-handed coordinate system  http://en.wikipedia.org/wiki/Cartesian_coordinate_system).
Lorsque le véhicule (camion ou automobile) sur lequel le système TLPS sera installé va avancer, le DMI (Distance Measuring Instrument) va fournir une valeur en Z pour chacun des points (X,Y) mesurés sur la largeur.  Une caméra Dragonfly peut retourner 640 points au maximum sur une largeur à mesurer.  Selon la position de cette caméra, selon qu’elle soit plus près ou plus éloigné de la surface à mesurer, on peut mesurer une bande plus ou moins large.  Donc, dorénavant on aura des points (X,Y,Z), où Z est la mesure alors que le véhicule (DMI) avance.
Le logiciel peut rendre ce profile de niveau, c’est-à-dire le mettre à l’horizontale.  En effet, en effectuant une rotation de la courbe mesurée, le logiciel peut la rendre horizontale.  De plus, il est possible d’effectuer une translation des valeurs en X mesurées par l’instrument.  En d’autres mots, on peut choisir à partir de quelle et jusqu’à quelle valeur en X l’appareil fait une mesure.  Il serait très facile aussi d’ajouter des facteurs d’échelle pour modifier les paramètres de largeur et de hauteur.
Lorsque le système affiches les profiles à l’écran en temps réel, les performances sont intéressantes.  Mais lorsque le système n’affiche rien et qu’il effectue seulement les calculs, alors les performances sont impressionnantes.

Surface en 3-D à Partir de Plusieurs Profiles

Cette section porte sur une recherche que j’ai effectuée pour moi-même et pour me donner de nouvelles idées sur la finalité de ce projet.
Puisque le système TLPS mesure des profiles avec des coordonnées (X,Y,Z), je me suis dit que cela serait une bonne idée que de pouvoir représenter les profiles dans un système 3-D pour générer la représentation d’une surface.
Donc, j’ai écrit quelques lignes de programmation en C++ pour visionner de la géométrie en trois dimensions dans l’application.  C’est un prototype, de la recherche pure seulement.  Je voulais expérimenter et tenter de représenter une surface en 3-D.
En consultant quelques bouquins (cf. les références à la fin de ce document), j’ai développé un prototype.
La surface suivante est constituée 116 profiles avec en moyenne 576 mesures de distances par profile.  Il y a en fait 53 114 lignes constituant cette surface.  Voir la figure 3-D Surface Example 001.PNG.  Les données brutes qui ont servies à générer cette surface sont fournies en attachement dans le fichier CapturedGeometry.zip.
Cette surface a été acquise en filmant le mur du bureau que j’occupais chez GIE.  L’espèce de crevasse à été causée par ma tasse à café que j’ai fait passer dans le faisceau laser.  Les endroits où il n’y a pas de lignes ont été causés par moi quand j’ai passé devant le faisceau laser.
Image 2. Exemple de surface 3D rendue avec OpenGL.

Figure: 3-D Surface Example 001.PNG
Ici, je ne désire pas passer énormément de temps pour expliquer comment j’ai réalisé la représentation de cette surface.  Mon but n’est pas de donner un cours de graphisme en 3-D.  En fait, tout ce que je pourrais dire ici serait une répétition des textes que je donne en référence à la fin de ce document.
Toutefois, je vous montre quelques captures d’écran avec des exemples éloquents.
Dans l’exemple suivant on voit la même surface, mais on voit aussi deux autres documents qui montrent les profiles mesurés pour les images 130 et 158 d’une caméra Dragonfly.  Notez que l’image 158 montre très bien le profile de ma tasse à café:
Image 3. Autre exemple de surface 3D avec details en coupe.
Image 3. Autre exemple de surface 3D avec details en coupe.


Figure: 3-D Surface Example 002.PNG
L’écran suivant montre trois vues de la même surface.  La seconde vue montre la surface horizontalement (à plat), donc on voit bien sa hauteur.  La troisième vue montre un détail de cette surface:

Image 4. Exemple de surface 3D  avec trois point de vue différents.
Figure: 3-D Surface Example 003.PNG
Pour réaliser cette représentation de surfaces en 3-D, j’ai développé un prototype pour projeter de la géométrie tridimensionnelle sur un écran d’ordinateur.  Le but de ce document n’est pas d’expliquer cela, toutefois, je vous montre un dernier écran qui démontre qu’en effet j’ai réalisé un programme qui permet d’afficher de la géométrie tridimensionnelle sur un écran selon un point de vue quelconque:

Figure: 3-D Viewing System Example 001.PNG
Le but du projet actuel n’est pas de calculer des surfaces pour détecter des crevasses ou des nids-de-poule dans les pavages.  Le but du projet actuel est simplement de calculer l’orniérage d’une route.
Cependant, je crois que les exemples montrés précédemment donnent à penser qu’il serait possible d’effectuer plus de recherche et de développement pour réaliser un système qui serait capable de calculer et d’identifier les crevasses, nids-de-poule, et autres anomalies dans les pavages.  Est-ce que ça vaudrait la peine de faire cela?  Est-ce possible de le faire? Y aurait-il une bonne raison pour le faire?  Je ne le sais pas pour l’instant.
Image 5. Viewing system example.
Image 5.  Viewing system example.

Prochaines Étapes

Actuellement le logiciel peut mesurer des profiles à partir d’une ou plusieurs caméras.

Renommer l’application

Je vais changer le nom de l’application.  Elle va s’appeler TLPS, au lieu de CameraManager.

Renommer BIRIS

Une fois, vous m’avez mentionné qu’il faudrait changer le nom de BIRIS dans l’application.  J’ai fait une classe CBiris (qui est l’adaptation de BIRIS en C vers C++) et à beaucoup d’endroits dans la documentation, dans l’interface avec l’usager (GUI) ainsi que dans le code source, je fais référence à BIRIS.  Je peux facilement effectuer un Global Find and Replace pour changer ce nom par un autre.  Ma question est la suivante: Par quoi devrais-je remplacer le mot BIRIS?  J’attends vos suggestions à ce sujet, Liviu.

Implémenter la logique pour le DMI et le GPS

Je dois implémenter la logique pour faire fonctionner le DMI et le GPS.  J’ai déjà commencé cette tâche d’ailleurs.  Je vais pouvoir rédiger une grande partie de ce code chez-moi en me basant sur ce que j’ai déjà fait dans ICS.  Mais éventuellement, je vais devoir aller chez GIE pour effectuer des tests et les mises au point finales.

Intégrer les profiles mesurés par plusieurs caméras

Maintenant, il faut intégrer les données de mesures de profiles provenant de plusieurs caméras pour former un profile plus large.  Il faut aussi tenir compte de la distance parcourue par le véhicule.  Cette information proviendra du module DMI.  Évidemment, on aura aussi une coordonnée GPS (latitude, longitude et temps) associée à chaque point.
Image 6. Exemple d'assemblage de profiles provenant de N systèmes.
Image 6. Exemple d'assemblage de profiles provenant de N systèmes.

Depuis le début du projet, j’ai toujours eu en tête de créer un système qui pourrait fonctionner de manière distribué.  C’est-à-dire que le système pourrait fonctionner sur plusieurs machines qui communiquent ensemble par des connexions TCP/IP – des network sockets dans un réseau informatique.
Il sera possible de faire fonctionner le système sur une seule machine.  En effet, un seul ordinateur pourrait acquérir des images de caméras Dragonfly, calculer les profiles, acquérir les données du DMI et du GPS,  envoyer les signaux de déclenchement (triggers) aux diverses caméras et faire l’assemblage et la sauvegarde du profile de la route.  Mais, il sera aussi possible de distribuer les traitements sur plusieurs machines pour obtenir une puissance de traitement  théoriquement illimitée.  La configuration distribuée du système sera déterminée par l’utilisateur.  C’est-à-dire que l’utilisateur pourra décider quelle machine fait quoi et quelle machine gère les autres.

Document de type Profile

Je vais créer un nouveau type de document.  Un type de document qui va acquérir la géométrie provenant d’une ou plusieurs caméras qui mesurent et calculent des profiles à l’aide de BIRIS et les intégrer de ce nouveau type de document pour l’afficher dans une nouvelle vue ou bien encore sauver cette nouvelle géométrie.
Ce type de document pourra contrôler des caméras installées sur un seul ordinateur ou encore sur plusieurs machines mises en réseau.

Conclusion

Il reste encore beaucoup de travail à faire.  Je n’ai pas tout détaillé dans ce document.  Je vous tiens au courant des progrès.  N’hésitez pas à communiquer avec moi si vous le désirez.

Marc Lemay
450-661-4602

Références

Fundamentals of Three-Dimensional Computer Graphics
By Alan Watt, University of Sheffield
© 1989 Addison-Wesley Publishers Ltd.
ISBN 0-201-15442-0
Graphics Library Programming Guide
Written by Patricia McLendon
Document Number 007-12-10-040
© 1991, Silicon Graphics Inc.
End of this post.


No comments:

Post a Comment