rapport final

Transcription

rapport final
ÉCOLE DE TECHNOLOGIE SUPÉRIEURE
UNIVERSITÉ DU QUÉBEC
RAPPORT TECHNIQUE
PRÉSENTÉ À L’ÉCOLE DE TECHNOLOGIE SUPÉRIEURE
DANS LE CADRE DU PROJET DE FIN D’ÉTUDES
SIMPLIFICATION AU PROBLÈME DE DÉFINITION
DE POINTS DE RÉFÉRENCE D’UN ROBOT
PAR
MASSÉ, Éric
MONTRÉAL, LE 12 AVRIL 2010
RÉSUMÉ
Ce projet est la conception d'une application pour le "FlexPendant" d'un robot ABB.
L'application permet de modifier les "RobTarget" du contrôleur à l'aide d'un écran simple et
visuel. L'édition des trois valeurs de positions (x,y,z) est directement modifiée à l'aide du clavier
numérique et l'orientation se modifie à l'aide de six boutons effectuant des rotations selon un
seul axe à la fois. Une représentation de l'orientation du référentiel peut être dessinée en 3D par
projection orthogonale ou centrale. Les données sont bien sûr sauvegardées dans le contrôleur.
Ce rapport porte sur les étapes de conception du projet en plus de parler de certaines notions
importantes à son développement.
LISTE DES FIGURES
Figure 1 Calculs de projection centrale ..................................................................................... 5
Figure 2 Deux types de projection ............................................................................................ 6
Figure 3 Schéma de l’objet « Controller » .............................................................................. 12
Figure 5 Classe CControleur ................................................................................................... 13
Figure 6 Classe CAngleEuler .................................................................................................. 13
Figure 4 Classe CRobTarget ................................................................................................... 13
Figure 7 Méthode Sauvegarder ............................................................................................... 16
Figure 8 Fenêtre principale de l'application ............................................................................ 17
Figure 9 Fenêtre d'édition ........................................................................................................ 18
Figure 10 Fenêtre d'édition avec représentation orthogonale.................................................. 19
Figure 11 Clavier numérique................................................................................................... 20
Figure 12 Validation des résultats ........................................................................................... 22
ii
TERMINOLOGIE
Classe : En programmation orientée objet, modèle abstrait définissant des variables et des
méthodes pour un type donné d'objet, et à partir duquel sont créés des objets concrets
possédant des valeurs particulières.
Une classe d'objets est un moule général sur lequel on crée des objets. Elle se
caractérise par ses variables et ses méthodes. Ainsi, lorsqu'on déclare l'appartenance
d'un objet à une classe, on le fait hériter automatiquement des propriétés de la classe.
Définition tirée du Grand Dictionnaire Terminologique1
FlexPendant : Le FlexPendant est la commande de contrôle du robot avec un écran tactile, des
boutons, un manche à balai (joystick) et des boutons de sécurités.
Méthode : En programmation orientée objet, fonction associée à une classe d'objets, qui
contribue à définir le comportement des objets de ce type de classe. 2
Persistante : Une persistante peut être décrite comme étant une variable “persistante”. Lorsqu’un
programme est sauvegardé, la valeur d’initialisation reflète la valeur actuelle de la
persistante.3
RobTarget : Un RobTarget est une structure d’enregistrement permettant de définir la position
d’un outil du robot par rapport à un référentiel. La structure comprend la position,
l’orientation, la configuration des articulations et d’autres paramètres de contrôle.
Dans ce projet, seules la position et l’orientation seront utilisées.
Pour plus d’information, voir consulter la page 4 des notes de cours du cours de robot industriel, GPA5464
1
http://www.olf.gouv.qc.ca/ressources/gdt.html
2
Ibid
3
http://www.gpa.etsmtl.ca/cours/gpa546/Notes/Cours03.pdf, page 14
4
http://www.gpa.etsmtl.ca/cours/gpa546/Notes/DocSup2.pdf
iii
TABLE DES MATIÈRES
Page
Introduction ............................................................................................................................... 1
CHAPITRE 1 REVUE DE LA DOCUMENTATION ........................................................... 3
1.1
L’environnement de développement ............................................................................. 3
1.2
La représentation 3D ..................................................................................................... 4
1.2.1
La projection orthogonale ............................................................................... 4
1.2.2
La projection centrale ...................................................................................... 5
1.3
La gestion de matrices ................................................................................................... 6
CHAPITRE 2 MÉTHODOLOGIE DE TRAVAIL ................................................................ 7
2.1
La documentation .......................................................................................................... 7
2.2
La stratégie de développement ...................................................................................... 7
2.3
Les tests préliminaires ................................................................................................... 8
2.4
Les quaternions et les angles d’Euler ............................................................................ 8
2.5
Les référentiels à dessiner ............................................................................................. 9
2.6
Les matrices ................................................................................................................... 9
2.7
L’interaction avec l’opérateur ..................................................................................... 10
CHAPITRE 3 PROCESSUS DE CONCEPTION ................................................................ 11
3.1
La préparation de l’environnement de développement ............................................... 11
3.2
Le développement de classes d’objets......................................................................... 11
3.2.1
Le contrôleur ................................................................................................. 12
3.2.2
La classe CControleur ................................................................................... 12
3.2.3
La classe CRobTarget ................................................................................... 14
3.2.4
La classe CAngleEuler .................................................................................. 14
3.3
Les méthodes de gestion des contrôles visuels ........................................................... 17
3.4
Installation de l’application ......................................................................................... 20
3.4.1
Pour un système virtuel ................................................................................. 20
3.4.2
Pour un vrai contrôleur .................................................................................. 20
CHAPITRE 4 INTERPRÉTATION DES RÉSULTATS ET DISCUSSION ...................... 21
4.1
La représentation 3D ................................................................................................... 21
4.2
La validation des résultats ........................................................................................... 22
4.3
Les résultats manquants............................................................................................... 22
Conclusion et recommandations ............................................................................................. 23
Références ............................................................................................................................... 24
Annexes ................................................................................................................................... 25
iv
INTRODUCTION
Dans le cadre du projet de fin d’études en production automatisée, il est intéressant de
concevoir une application pour la manette de contrôle, appelée « FlexPendant », d’un Robot
ABB. Cette application permettra d’étudier les possibilités de développement des outils
disponibles capable de répondre à différents besoins. Dans le cas présent, l’objectif est de
développer une application capable de gérer l’orientation des « RobTarget » avec la notion des
angles d’Euler.
Des « RobTarget » sont des points de référence du robot dans le jargon des robots ABB.
Présentement, il est très difficile de modifier l’orientation d’un « RobTarget » manuellement
parce que les robots ABB utilisent les quaternions. Le seul moyen disponible pour modifier
l’orientation par le « FlexPendant » est de l’enseigner en mode « Jogging » soit le mode de
déplacement manuel du robot. Pour modifier l’orientation en inscrivant des valeurs à l’aide du
pavé numérique, c’est pratiquement impossible puisque les valeurs d’un quaternion doivent
toujours être normalisées. En plus, il est difficile de se faire une image du résultat d’un
quaternion. Ce n’est vraiment pas intuitif.
Pour remédier à ce problème, il faudrait une application utilisant les angles d’Euler. De cette
façon, il serait très facile d’inscrire directement une valeur d’angle entre 0° et 360° pour chacun
des axes de rotation. De plus, il faudrait avoir dans le même écran, un référentiel représentant
graphiquement l’orientation en cours d’édition. Pour modifier les rotations, il serait fort simple
pour l’opérateur de manier le « joystick » ou d’appuyer sur de simples boutons. En associant
les trois mouvements de rotation aux trois axes du « joystick » en plus de présenter en temps
réel le nouveau référentiel à l’écran, ça deviendrait très intuitif d’enregistrer des orientations de
« RobTarget » bien précise. Il faudrait ajouter la possibilité d’effectuer les rotations par rapport
au référentiel d’origine ou par rapport au nouveau référentiel transformé en tout temps. Pour
que l’application soit plus complète, il serait intéressant de pouvoir gérer et modifier les
informations des « RobTarget » en entier comme la position, le nom et les autres informations
de déclarations. Permettre de créer, supprimer ou copier de nouveau « RobTarget » rendrait
l’application capable de faire pratiquement toute la gestion de ceux-ci.
Le projet sera développé par étapes. Au début, il faut bien sûr apprendre à utiliser les outils,
surtout les nouveaux logiciels dans ce cas-ci. Une fois un peu plus familier avec
l’environnement de développement, il faut créer des fonctions et des procédures pour gérer les
données du contrôleur, gérer une orientation à l’aide de matrices, représenter des référentiels
en trois dimensions et finalement utiliser le tout à l’aide de l’écran tactile du « FlexPendant ». Il
faudra développer des algorithmes pour convertir les quaternions en angles d’Euler et viceversa ainsi que pour récupérer les angles d’Euler d’une matrice d’orientation.
Tout au long de ce rapport, on y retrouvera plusieurs sections concernant le déroulement du
projet. Un résumé des points importants de la documentation consultée tout au long du
développement permettra de comprendre d’où viennent certains concepts et d’en expliquer
leur utilité au projet. Ensuite, il y aura une description de la méthodologie de travail adoptée
pour résoudre la problématique. Suivra l’explication du processus de conception détaillé du
projet. Cette section porte sur les parties développées en parlant des buts à atteindre
initialement pour chaque étape, des méthodes de création et de la solution finalement
implantée. Une interprétation des résultats finaux et une discussion accompagneront le rapport
pour analyser le projet plus en profondeur et valider les objectifs en fonction des résultats. Le
rapport se terminera d’une conclusion afin de faire un retour sur l’ensemble du projet et des
recommandations seront suggérées pour améliorer ou continuer l’application.
2
CHAPITRE 1 REVUE DE LA DOCUMENTATION
1.1 L’environnement de développement
Sur le site Internet de ABB5, on retrouve beaucoup de documentation sur leurs logiciels. Le
document portant sur l’application « Robot Application Builder » est très bien fait. Il contient
une très bonne base pour démarrer une application pour le robot et possède même des
exemples de programmation.
Parmi les points intéressants de la documentation, on retrouve les manœuvres d’installation
de l’environnement de développement. Il faut respecter un ordre d’installation spécifique des
logiciels pour que chacun fonctionne correctement. Il y a une section décrivant comment
démarrer une nouvelle application et la tester dans un « FlexPendant » virtuel. Un des sujets
très utiles de la documentation est l’explication des différents moyens permettant de
déverminer le code d’une application. La façon de démarrer un suivi pas à pas pour tester
notre application est un peu plus longue et plus compliquée qu’une application conventionnelle
puisque l’exécution n’est pas à l’intérieur de l’environnement de développement. Il faut
démarrer l’application par le « FlexPendant » virtuel dans Robot Studio et ensuite lier ce
processus Windows avec l’application par l’environnement de développement Visual Studio.
Il y a aussi plusieurs descriptions des différents contrôles disponibles et des modèles
d’utilisation. Une section spécialement conçue pour aider à développer une application robuste
explique bien les limites de mémoire du contrôleur et donne des conseilles de programmation
pour améliorer la performance.
De plus, un peu de documentation a été consulté dans le but de créer un algorithme pour
convertir des quaternions en angles d’Euler. Cette recherche n’a finalement pas servi puisque
le contrôleur possède déjà toutes les méthodes nécessaires.
5
ABB, http://www.abb.ca/product/seitp327/4a08adf3b8bd7976c12570fc00348b3f.aspx
3
1.2 La représentation 3D
Pour gérer graphique les référentiels dans une application « FlexPendant », il a fallu
beaucoup de recherche pour trouver la possibilité d’y arriver. Il y a plusieurs méthodes en
programmation pour faire de la représentation 3D, mais plusieurs d’entres elles ne semblent
pas être compatibles pour un « FlexPendant » ou du moins, pour l’environnement virtuel. Par
contre, de nombreuses sources offrent des moyens de faire des dessins par projections en
trois dimensions. Un des sites retenus est le site « The code Project »6 qui offre du code
complet pour dessiner et effectuer des rotations dans l’espace. Ce code a plus tard été laissé
de côté puisqu’il ne permet pas une bonne gestion des rotations et de l’affichage des
référentiels. Les raisons seront expliquées davantage un peu plus loin dans ce rapport.
1.2.1
La projection orthogonale
C’est finalement les bases mêmes de la projection orthogonale qui ont été utilisées et
complètement codées à l’aide d’une référence en mathématique « MathWorld »7 et du soutien
du professeur Ilian Bonev. Ce dernier a fourni les équations suivantes prêtes à être codé dans
l’application afin de faire une projection orthogonale :
0 1
0 0
0
1
Les matrices de rotation :
1
0
0 cos 0 sin cos 0
sin cos sin 0
6
http://www.codeproject.com/KB/GDI-plus/Plot3D.aspx
7
http://mathworld.wolfram.com/Plane.html
0
sin cos 0 sin 1
0 0 cos sin cos 0
0
0
1
4
Pour dessiner le référentiel fixe :
!"
Extrémité de l’axe des X : 30° 45° 0
0
0
Extrémité de l’axe des Y : 30° 45° !" 0
0
0
Extrémité de l’axe des Z : 30° 45° !"
Le même principe est utilisé pour le référentiel transformé, mais avec une matrice d’orientation
R de plus et une longueur d’axe différente. Cette matrice est modifiée avec les mêmes
matrices de rotation , % .
!(
Extrémité de l’axe des X : 30° 45° ' 0
0
0
Extrémité de l’axe des Y : 30° 45° ' !( 0
0
0
Extrémité de l’axe des Z : 30° 45° ' !(
1.2.2
La projection centrale
On n’est pas vraiment habitué à voir des systèmes d’axes avec une projection orthogonale à
l’écran. On voit plus souvent des représentations 3D par une projection centrale. Cette
projection a été développée pour ainsi donner le choix à l’opérateur de la projection qu’il désire.
Les équations se trouvent facilement à l’aide d’un graphique comme la figure suivante.
+
· sin ,
· cos Y
*
X
Figure 1 Calculs de projection centrale
5
Donc, les équations pour obtenir les coordonnées (x, y) dans l’écran pour un point 3D (x, y,
z) sont les suivantes :
é./01 23 23 cos é./01 23 23 sin Les équations semblent beaucoup plus complexes dans le code du projet, mais c’est
l’ajustement de l’écran par rapport à l’origine qui augmente légèrement l’équation. Il y a aussi
des facteurs de profondeur qui ont été ajoutés pour donner une certaine perspective de
profondeur. Voici donc les deux types de représentations disponibles dans l’application.
Projection orthogonale
Projection centrale
Z
Z
Y
X
Y
X
Figure 2 Deux types de projection
1.3 La gestion de matrices
Puisque l’application est basée sur des manipulations d’orientation de point, la notion de
matrice est très utile. Malheureusement, aucune librairie de gestion de matrice n’est fournie par
le langage VB.net. Pour pallier ce manque, plusieurs sources de code sont disponibles sur
Internet et la classe « Matrice » offerte sur le site de « Codes-Source »8 a été intégrée au
projet.
Pour créer les matrices de rotations et obtenir les angles d’Euler d’une matrice d’orientation, il
faillait programmer les algorithmes nécessaires. Initialement, les définitions des matrices ont
8
http://www.csharpfr.com/code.aspx?ID=34171
6
été faites à l’aide de sources Internet comme le site non officiel, mais très complet sur le sujet,
« EuclideanSpace »9 réalisé par monsieur Martin John Baker.
Ce site contient beaucoup
d’information sur les quaternions, les angles d’Euler, les matrices et contient même du code
pour programmer et gérer les méthodes expliquées informatiquement. Par contre, on peut se
rendre compte que ce site n’est pas une référence très fiable et une validation des principes
est nécessaire. Heureusement qu’une vérification a été faite puisque la procédure pour obtenir
les trois angles d’Euler à partir d’une matrice d’orientation ne semble pas fonctionner. C’est
l’événement qui a donné l’idée de réutiliser les fonctions offertes pour la calculatrice graphique
dans le cadre du cours de robots industriels, GPA546. L’utilitaire est disponible sur le site du
cours10 et il ne reste plus qu’à adapter le code des fonctions dans le code du projet VB.net.
CHAPITRE 2 MÉTHODOLOGIE DE TRAVAIL
2.1 La documentation
Tout d’abord, la première étape est bien sûr la lecture de documentation. Il faut comprendre
l’environnement de développement et apprendre comment démarrer un projet. Le guide portant
sur l’application « Robot Application Builder » est très bien fait et possède toutes les bases
nécessaires à la création du projet. Par exemple, l’installation des logiciels nécessaires et les
configurations requises sont bien expliquées. La création d’un nouveau projet est décrite étape
par étape et plusieurs méthodes sont possibles pour tester et déverminer l’application. Il est
très facile d’explorer le comportement de l’application sur un « FlexPendant » virtuel avec le
logiciel « Robot Studio ».
2.2 La stratégie de développement
Avant de se lancer directement dans le code de l’application finale, le plus simple est de
fractionner les objectifs du projet en plusieurs parties. De cette façon, plusieurs miniapplications sont créées pour les tester efficacement individuellement et ensuite les intégrer au
projet global avec une meilleure structure.
9
http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToEuler/index.htm
10
GPA546, http://www.gpa.etsmtl.ca/cours/gpa546/index.htm
7
2.3 Les tests préliminaires
La première étape de programmation est de maitriser les contrôles graphiques et la librairie
du contrôleur de robot. Pour ce faire, l’objectif est de recueillir et afficher tous les
« RobTarget » dans une liste. Cette partie est la plus simple, mais donne un bon point de
départ pour se familiariser avec le langage de programmation VB.net, l’environnement de
développement Visual Studio et l’environnement de test Robot Studio. Selon les méthodes
d’obtention des données dans le contrôleur, il est probablement plus pratique de créer des
classes contenant toutes les données membres et les méthodes nécessaires. Une meilleure
structure des données simplifie et clarifie le code par la suite.
2.4 Les quaternions et les angles d’Euler
Puisque les robots ABB utilisent les quaternions pour définir les orientations, le plus simple
est de la convertir en angles d’Euler pour faciliter les traitements. La définition des quaternions
par Techno-Sciences.net est la suivante : « Les quaternions, notés
, sont un type de
nombres hypercomplexes, constituant une extension des nombres complexes, extension
similaire à celle qui avait conduit des nombres réels aux nombres complexes. »11. On peut le
représenter sous la forme linéaire d’une somme de parties réelles et imaginaires comme
l’équation suivante :
4 5·167·869·:6;·<
Un quaternion est un vecteur unitaire de quatre valeurs (q1, q2, q3, q4) comprises entre -1 et
1. Étant unitaire, la racine carrée de la somme des carrées est toujours égale à 1 :
=>" ( 6 >( ( 6 >2 ( 6 >? ( 1
Il est beaucoup plus simple de travailler avec les angles d’Euler et une méthode simple de les
obtenir est de passer par la matrice de rotation. Voici comment on peut construire cette
matrice :
11
5( 6 7 ( 9 ( ; (
2 · 5 · ; 6 2 · 7 · 9
2·7·;2·5·9
2·7·92·5·;
5( 7 ( 6 9 ( ; (
2·5·762·9·;
2·5·962·7·;
2 · 9 · ; 2 · 5 · 7
5( 7 ( 9 ( 6 ; (
http://www.techno-science.net/?onglet=glossaire&definition=5067
8
L’ensemble des fonctions permettant de convertir les quaternions et les angles d’Euler sont
des algorithmes assez complexes. Heureusement, le contrôleur du robot possède déjà les
outils pour effectuer les conversions. Le type de données « Orient » qui est le type pour
l’orientation possède la méthode « ToEulerAngles » pour convertir les quaternions en angles
d’Euler et pour faire l’inverse, il suffit d’utiliser la méthode « FillFromEulerAngles ».
2.5 Les référentiels à dessiner
Dessiner les référentiels est la section qui est sans aucun doute la plus complexe et la plus
longue de toutes. Pour représenter l’orientation des « RobTarget » graphiquement, il faut
commencer par analyser le code téléchargé à partir du site « The code Project »12. Il est
important de s’assurer que ce code source permet de faire des référentiels à l’écran dans une
orientation fournie. Puisque ce code est développé en langage C-Sharp.Net, il faudra soit le
convertir en VB.Net ou le jumeler en tant que deuxième projet dans « Visual Studio ». Il est
certain qu’il faudra personnaliser les classes de code, car elles sont conçues pour dessiner des
cubes et les faire pivoter par rapport à différentes références. Dans le cadre du projet, il faut
définir les trois axes des référentiels pour qu’ils deviennent les axes de rotation. Les seuls
paramètres envoyés pour dessiner les référentiels devraient être des angles ou une matrice
d’orientation. Ici, il y aura peut-être des problèmes concernant la gestion de mémoire comme le
prévoit le guide de l’application « Robot Application Builder ».
2.6 Les matrices
Par la suite, on peut programmer les matrices de rotations ainsi que leurs fonctions de
gestion. Cela est pour permettre de changer l’orientation du référentiel par des calculs
matriciels. Les rotations peuvent se faire par rapport à deux systèmes d’axes. Il faut ajouter un
paramètre indiquant le référentiel à utiliser pour pouvoir effectuer des rotations en fonction du
référentiel fixe ou du référentiel transformé. Cela affecte seulement l’ordre de multiplication des
matrices. Le plus compliqué est d’obtenir les angles d’Euler à partir d’une matrice résultante
12
http://www.codeproject.com/KB/GDI-plus/Plot3D.aspx
9
puisqu’il existe toujours au moins deux réponses possibles. Les cas de singularités quant à eux
possèdent une infinité de réponses qui faut tenir compte dans l’algorithme.
2.7 L’interaction avec l’opérateur
Ensuite, c’est surtout de la gestion de l’interaction avec l’opérateur qu’il faut faire. Comme
rendre le « joystick » responsable de faire les rotations selon la direction des mouvements. Il
suffit de lier chacun de ses axes à un axe de rotation du référentiel. Lorsque le « joystick » est
poussé vers la droite, c’est une rotation en X dans le sens positif qui se fait. Pour un
mouvement vers le haut, c’est une rotation en Y dans le sens positif et pour un mouvement de
rotation du « joystick » dans le sens horaire, c’est une rotation selon l’axe Z dans le sens
positif. Si par incapacité ou par manque de temps la gestion du « joystick » n’est pas possible,
les rotations pourront être faites par de simples boutons à l’écran.
Finalement, il reste à rendre le tout fonctionnel et fiable. Il devrait y avoir deux fenêtres, une
pour la liste des points et une autre pour modifier l’orientation. Il ne faut pas seulement modifier
l’orientation des « RobTarget », mais aussi sauvegarder les modifications dans le contrôleur. Si
le temps le permet, il faudrait rendre l’application robuste pouvant gérer tout ou presque tous
les cas d’exceptions d’opération normale.
10
CHAPITRE 3 PROCESSUS DE CONCEPTION
3.1 La préparation de l’environnement de développement
La première étape après avoir fait la recherche et lu sur le sujet est d’installer et organiser
tout le nécessaire pour la conception. Afin de concevoir une application pour le
« FlexPendant », il faut respectivement installer les logiciels « Robot Studio » qui contient le
contrôleur et le « FlexPendant » virtuel, « Visual Studio » qui est l’environnement de
programmation et « Robot Application Builder ». Il est très important que « Robot Application
Builder » soit le dernier à être installé pour que les deux autres héritent des librairies de
programmation du contrôleur de robot. Pour ce projet, le langage de programmation choisi est
du VB.Net, mais cette décision est tout à fait arbitraire.
Au départ, il faut se familiariser avec l’environnement de développement et le meilleur moyen
est d’expérimenter les exemples offerts dans la documentation pour créer un nouveau projet.
En créant une application tout à fait bidon, ça permet d’explorer les possibilités de
programmations et de faire l’essai de différents contrôles graphiques qui seront utilisés plus
tard pour le vrai projet. Les sections importantes à parcourir sont l’affichage de liste avec
plusieurs colonnes pour afficher plusieurs informations, la gestion d’une application à plusieurs
écrans et surtout la capacité d’explorer les données du contrôleur comme les « RobTarget ».
3.2 Le développement de classes d’objets
Une fois les tests préliminaires faits, il est temps de démarrer le vrai projet. Malgré le fait que
ce ne soit pas un travail de fin d’études en génie de la production automatisée et non pas en
génie logiciel, la programmation est réalisée dans le but d’avoir un code le mieux structuré
possible respectant les normes apprises tout au long des études. C’est pour cette raison que la
conception de classes13 orientées objets a été réalisée. Pour le projet, les deux objets
principaux sont le contrôleur et les « RobTarget » qui sont deux classes importantes. Ces deux
classes permettent d’englober toutes leurs méthodes et leurs données membres nécessaires.
13
Voir définition au début du document.
11
3.2.1
Le contrôleur
Le contrôleur est l’objet qui représente le robot. Lorsqu’on veut communiquer avec le robot,
c’est à partir du contrôleur qu’il faut le faire. Il possède les programmes, les variables dont les
« RobTarget » font partie et les procédures nécessaires pour bouger. Voici un petit schéma
pouvant aider à se le représenter :
Figure 3 Schéma de l’objet « Controller »
On peut donc voir que pour accéder à une variable « RobTarget » qui fait parti des
« RapidData », il faut passer par la « Task » et le « Module ».
3.2.2
La classe CControleur
La classe principale nommée CControleur, dont son schéma UML est illustré dans la figure 5
de la page suivante, possède une instance du contrôleur du robot et une liste de tous les
« RobTarget ». Il y a donc une méthode pour récupérer tous les « RobTarget » de toutes les
« Task »
et
de
tous
les
modules
du
contrôleur.
La
méthode
s’appelle
« ObtenirListeRobTarget » et peut être consultée dans l’annexe A. Par contre, les
« RobTarget » de type constante ne sont pas récupérés, seulement les persistants et les
variables puisqu’il n’est pas possible de modifier une constante. Cette classe contient aussi
12
d’autres utilitaires dont la méthode « RobTargetSelonNom » présente dans l’annexe B qui
permet d’obtenir l’instance d’un objet « RobTarget » en spécifiant son nom. Il faut bien sûr que
la variable existe et qu’elle soit de type « RobTarget » sinon la méthode retourne un message
d’erreur qui sera affiché à l’opérateur. Il y a finalement une dernière méthode dans cette
classe, « RemplirListView » présente en annexe C, qui permet de remplir une liste avec
plusieurs colonnes de tous les « RobTarget » du contrôleur. Dans le schéma UML, on peut voir
ces trois méthodes énoncées précédemment plus son constructeur « New » qui permet de
créer l’objet « CControleur » et d’initialiser toutes données membres. Il n’y a que deux données
membres avec chacune leur propriété respective. Une pour l’instance du contrôleur du robot et
une liste de « CRobTarget » qui est défini dans la section qui suit.
Figure 4 Classe CControleur
Figure 6 Classe CRobTarget
Figure 5 Classe CAngleEuler
13
3.2.3
La classe CRobTarget
La classe « CRobTarget » est une classe personnalisée très proche de la classe
« RobTarget » qui existe déjà. La nécessité de créer cette nouvelle classe permet d’ajouter et
de regrouper de l’information qui n’est pas directement atteignable par la classe de base. Par
exemple, la classe « RobTarget » ne possède aucune propriété faisant référence à l’objet
« Task » pour lequel il appartient, ou le module. Ce sont deux informations importantes
puisqu’ils sont nécessaires lorsqu’on veut obtenir l’instance d’un « RobTarget » à l’aide de la
méthode « GetRapidData(<Nom_Tache>, <Nom_Module>, <Nom_Variable>) » pour ensuite lire
leurs informations. Donc cette classe possède des données membres avec leur propriété
associée pour le nom de module, le nom de la « Task », le nom du « RobTarget » lui-même et
l’instance de l’objet « RobTarget » pour toutes les autres informations comme sa position et
son orientation. La classe implémente aussi l’interface « IComparable » qui permet d’ajouter
une méthode de comparaison entre deux instances « CRobTarget ». La comparaison est
basée sur le nom du « RobTarget » pour permettre de les trier en ordre alphabétique dans une
liste.
3.2.4
La classe CAngleEuler
La classe qui a demandé le plus de temps de développement a été la classe
« CAngleEuler ». Celle-ci permet de gérer l’orientation d’un « RobTarget », les rotations et
d’afficher graphiquement les référentiels. Afin d’accélérer la conception et de réduire l’ampleur
du projet, l’idée initiale était d’utiliser du code déjà tout fait pour faire les dessins de projection
en 3D à l’écran et pour gérer des matrices. Finalement, seul l’usage d’une classe pour les
matrices a été retenu puisqu’elle répond exactement aux besoins. La classe « Matrice »14 a été
compilée et ajoutée directement aux références du projet puisqu’il n’y avait aucune
modification à faire. Cette classe permet de créer un objet « Matrice » en spécifiant le nombre
de lignes et de colonnes désirées. On peut aussi lui assigner des valeurs très facilement
comme avec des tableaux. La classe possède toutes les méthodes nécessaires, dont les
opérateurs de multiplication de matrices qui est fort utile pour les rotations.
14
http://www.csharpfr.com/code.aspx?ID=34171
14
Par contre, l’ensemble de classes de dessin initialement trouvé sur le site « The code
Project »15 et modifié pour s’adapter au projet a été laissé de côté. La base de l’orientation des
référentiels demandait en paramètre de recevoir trois angles de rotation, les situations de
singularité ne pouvaient donc pas être gérées convenablement. En fait, chaque fois que l’angle
de rotation autour de l’axe des Y donnait ±90º, il y avait une infinité de possibilités avec l’axe X
et Z pour afficher le référentiel. On peut observer la cause de cette lacune en analysant
l’algorithme de la procédure « GetAngles » en annexe D. Pourtant, une seule représentation
est censée exister. C’est pourquoi les méthodes de dessin ont complètement été développées
dans la classe « CAngleEuler ».
Pour revenir plus particulièrement au contenu de la classe « CAngleEuler » qui englobe la
plus part des méthodes de calculs, elle possède toutes les méthodes qui gèrent les rotations.
Elle a plusieurs données membres dont une pour la matrice d’orientation du référentiel
transformé, trois autres pour retenir les trois angles d’Euler équivalent, une pour savoir si les
rotations se fond par rapport au référentiel original ou par rapport au nouveau et une dernière
donnée membre qui fait directement référence à la fenêtre sur laquelle les référentiels sont
dessinés. Il y a ensuite trois méthodes qui retournent une matrice de rotation selon l’angle
fournie. Il aurait été possible de faire seulement une méthode capable de retourner la matrice
de rotation pour les trois axes ensemble, mais c’est plus simple et plus clair d’en avoir une par
axe. Une autre méthode effectue la rotation en multipliant la matrice d’orientation courante
avec la matrice de rotation spécifiée. Selon le référentiel sur lequel la rotation doit se faire,
l’ordre de multiplication est ajusté. La méthode « GetAngles » retourne les trois angles d’Euler
de la matrice d’orientation. L’algorithme est tiré de la fonction fournie sur le site du cours de
GPA546 pour la calculatrice graphique Voyage200. L’algorithme a été légèrement adapté pour
éviter les doubles solutions avec un calcul de différence entre l’orientation précédente et la
nouvelle pour conserver le résultat le plus proche. Ce n’est pas vraiment un calcul nécessaire,
mais cette approche est surtout pour éviter de grand changement d’angles à chaque rotation.
15
http://www.codeproject.com/KB/GDI-plus/Plot3D.aspx
15
D’autres méthodes servent à afficher le référentiel d’origine et celui orienté à l’aide
d’équations de projection. Il y deux méthodes puisqu’il est possible de choisir le type de
projection désiré. Soit la projection orthogonale et centrale.
Au départ, cette classe devait aussi avoir une méthode pour convertir les quaternions en
angles d’Euler, mais finalement le contrôleur du robot possède déjà la méthode nommée
« ToEulerAngles » pour l’orientation en quaternions d’un « RobTarget » qui est de type
« Orient ». L’inverse existe aussi avec la méthode « FillFromEulerAngles » pour enregistrer la
nouvelle rotation.
L’enregistrement d’une variable dans le contrôleur semble une tâche simple, mais plusieurs
étapes sont nécessaires. Premièrement, il faut créer une nouvelle instance de « RobTarget » à
partir de celui déjà existant afin d’avoir la même base d’informations. Ensuite, il faut modifier ce
nouveau
« RobTarget »
par
les
nouvelles
données
avec
des
méthodes
comme
« FillFromString » et « FillFromEulerAngles ». Jusqu’ici, aucune donnée n’a été changée dans
le contrôleur. Afin que les données soient modifiées dans le contrôleur, il faut absolument
affecter la propriété « Value » du RapidData avec le nouveau « RobTarget ». Sans cette étape,
il n’est pas possible de modifier directement une valeur dans le contrôleur. On peut voir la
méthode de sauvegarde dans la figure suivante.
Figure 7 Méthode Sauvegarder
16
3.3 Les méthodes de gestion des contrôles visuels
Le reste de la conception vise à rendre l’application opérationnelle. Tout le corps du
traitement est dans les classes présentées jusqu’ici et le restant fait l’appel à ces méthodes par
des contrôles dans les fenêtres de l’écran. La première fenêtre, qu’on peut voir dans la figure
8, est la fenêtre de démarrage de l’application. Elle liste tous les « RobTarget » du contrôleur
du robot en ordre alphabétique et permet d’en sélectionner un pour le modifier. Pour ouvrir la
fenêtre d’édition d’un « RobTarget », il faut soit double cliquer sur celui-ci ou cliquer sur
« Modifier la valeur » dans le menu du bas. Le bouton « Mettre à jour » permet seulement de
recharger la liste avec les données actuelles. La liste possède trois colonnes, la première pour
afficher le nom de variable du « RobTarget », la deuxième pour afficher les valeurs de position
et d’orientation en angles d’Euler et la dernière colonne pour afficher le module
d’appartenance.
Figure 8 Fenêtre principale de l'application
La fenêtre d’édition de la figure 9, possède tous les contrôles nécessaires pour modifier la
position du « RobTarget » ou son orientation. Pour modifier l’orientation, six boutons permettre
de changer séparément l’orientation par rapport à l’axe des X, Y ou Z selon le référentiel choisi
par les options Xr, Yr, Zr ou Xt, Yt, Zt. Une barre de défilement permet de choisir le pas
d’incrémentation en degré pour chaque clique de rotation entre 1º et 45 º. Si les boutons de
rotation sont maintenus, la rotation est continue et la vitesse de rotation augmente jusqu'à un
17
certain maximum. Le maintien d’un bouton de rotation ne modifie pas la valeur
d’incrémentation de la barre de défilement. Bien sûr, l’affichage des angles d’Euler et les
référentiels à droite de la fenêtre sont constamment mis à jour après chaque modification. Le
bouton « Réinitialiser » permet de ramener les valeurs du « RobTarget » aux dernières
données sauvegardées. Le bouton « Enregistrer » permet d’enregistrer les valeurs
actuellement visibles à l’écran dans le contrôleur. Le bouton « Ok » permet de quitter la fenêtre
d’édition après avoir sauvegardé les nouvelles données dans le contrôleur pour retourner à la
fenêtre initiale puis réafficher la liste des « RobTarget » qui sont toutes mises à jour. Le bouton
« Annuler » fait exactement la même chose que le bouton « Ok » à l’exception qu’il ne fait
aucune sauvegarde de données.
Figure 9 Fenêtre d'édition
18
Le bouton « Projection » permet de choisir le type de projection des référentiels comme le
démontre la figure 10. Les choix sont bien entendu les mêmes que vue dans la classe
« CAngleEuler » soit une projection orthogonale et centrale. La figure 9 montre une projection
centrale tandis que celle-ci montre une projection orthogonale.
Figure 10 Fenêtre d'édition avec représentation orthogonale
En cliquant dans l’une des boîtes d’éditions de la position X, Y, Z ou EX, EY, EZ, un clavier
numérique apparaît et tous les autres contrôles deviennent inaccessibles, comme le démontre
la figure 11.
19
Figure 11 Clavier numérique
3.4 Installation de l’application
3.4.1
Pour un système virtuel
Pour installer l’application sur un « FlexPendant » virtuel, il suffit de copier les fichiers
assemblés de l’application dans le dossier « Home » du projet « Robot Studio ». Ce dossier se
trouve
par
défaut
dans
l’arborescence
de
dossiers
suivant :
« \Mes
documents\RobotStudio\Systems\<NOM_DU_PROJET_ROBOT_STUDIO>\HOME ». Dans ce
cas-ci, les fichiers à copier se nomment « TpsViewRobTargetAvecAngleEuler.gtpu.dll » et
« TpsViewRobTargetAvecAngleEuler.dll » plus le fichier contenant les fonctions des matrices
« Maths.dll ». Il faut absolument redémarrer le « FlexPendant » pour que ça fonctionne. Il faut
absolument que « Robot Ware » soit installé sur le système pour que ça fonctionne. S’il y a des
problèmes, il est possible qu’il manque des fichiers de références dans le dossier système de
« Robot Studio ». On peut donc copier tous les « .dll » qui sont dans le dossier de compilation
du projet « Visual Studio » (ce dossier peut être soit « …\Bin\Debug\ » ou « …\Bin\Release\ »)
vers le dossier source qui
est par défaut « C:\Program Files\ABB Industrial IT\Robotics
IT\RobotStudio 5.12\Bin » selon la version du logiciel ».
3.4.2
Pour un vrai contrôleur
Pour installer l’application sur un vrai « FlexPendant », il faut copier les mêmes fichiers que
sur le virtuel, mais l’endroit de destination est différent. Il faut télécharger les fichiers « .dll »
dans le dossier « System » ou « Home » du contrôleur. Il est préférable de les mettre dans le
dossier « Home » puisqu’ils feront partie des éléments de sauvegarde. La méthode la plus
simple pour transférer les fichiers est par la commande « File Transfer » du menu « Online »
de « Robot Studio ». Pour avoir plus d’informations ou connaitre d’autre méthode de transfert,
le manuel16 de « Robot Application Builder » possède une section entière sur l’installation d’une
application dans la section « Run-time environnement».
16
http://www05.abb.com/global/scot/scot352.nsf/veritydisplay/e44ab257b45db7ccc125766d003a46db/$File/
3HAC028083-001_RevD_en.pdf
20
CHAPITRE 4 INTERPRÉTATION DES RÉSULTATS ET DISCUSSION
La grande problématique du projet se situe à la gestion des angles et des rotations. Le
problème de conversion de quaternions vers les angles d’Euler et vis versa à finalement
disparue lorsque les méthodes fournit par le contrôleur ont été trouvées.
4.1 La représentation 3D
L’affichage de référentiel en trois dimensions n’a pas été aussi simple. D’abord, ça a
nécessité une longue recherche avant de trouver un ensemble de classes fournissant les
utilitaires pouvant faire le travail. Plusieurs solutions existent pour faire de la représentation
dans l’espace, mais les possibilités du « FlexPendant » semblent assez limitées. La plus part
des codes sources trouvés utilisent le « DirectX » qui exécute du traitement par une carte
graphique. Ça fonctionne bien pour les ordinateurs, mais les librairies du contrôleur de robot
pour le « FlexPendant » ne semblent pas aussi développées et ne prennent pas en compte ce
genre de méthode. C’est pour cela qu’une solution basée sur la librairie « Drawing » a été
utilisée. C’est une librairie bien simple qui est capable de tracer des lignes ou des points sur un
système cartésien (x;y) pratiquement identique à celle de la librairie Windows, mais un peu
plus restreint. C’est une solution beaucoup plus limitée, mais ça permet quand même d’obtenir
des résultats d’affichage respectable. C’est certain qu’il manque l’effet de réel 3D qui
permettrait à coup sûr de comprendre l’orientation du référentiel. Quelques fois, selon
l’orientation, il faut analyser correctement le dessin pour comprendre l’orientation des axes. La
troisième dimension n’est pas toujours évidente et il faut parfois regarder l’ordre des axes pour
savoir si l’axe se dirige en profondeur de l’écran ou sort de l’écran. Le fait d’avoir un choix de
projection peut aider dans ce sens.
De plus, la représentation d’un référentiel selon l’orientation demandée n’a vraiment pas été
une chose simple. Certaines classes de dessin qui ont été téléchargées ont dû subir une
grande adaptation de code pour répondre aux objectifs précis du projet. Par contre, après
discussion avec le superviseur de projet, les classes ont dû être abandonnées parce que
l’orientation dans l’espace était basée sur trois angles. Ce qui provoque de nombreuses
complications de représentation en situation de singularités. Ce problème n’a aucune raison
d’exister dans le dessin puisque la matrice d’orientation possède toute l’information nécessaire
à l’unique représentation. C’est pourquoi les méthodes de dessins ont complètement été
refaites à l’aide des équations de projection 3D sur un écran 2D.
21
4.2 La validation des résultats
Pour valider les angles en fonction de la représentation du référentiel, il y a eu des séances
d’analyse de rotation pas à pas avec le logiciel « RobotStutio ». La méthode était simple, mais
assez longue. Le but était de faire des rotations avec l’application créée et d’observer la
rotation du référentiel. Ensuite, aller en mode « Jogging » du robot pour atteindre la nouvelle
orientation du point. On peut donc comparer les vues des référentiels pour s’assurer que
l’orientation est la même comme à la figure 12. Pour que le résultat soit bon, il faut aussi que
les valeurs affichées en angle d’Euler soient les mêmes que le logiciel « RobotStudio » l’affiche
dans son mode « Jogging ». Tous les types de rotation ont été testés selon le référentiel
d’origine et le nouveau référentiel transformé.
Figure 12 Validation des résultats
4.3 Les résultats manquants
Par manque de temps, l’application ne gère pas beaucoup des cas d’exception. La plupart
des méthodes du contrôleur devraient avoir une validation, car plusieurs problèmes peuvent
survenir. Par exemple, des « RobTarget » peuvent être modifiés ou simplement effacés
pendant que l’application roule et la sauvegarde ne fonctionnera pas. Il y aurait surement
d’autres validations du genre à faire selon l’état du contrôleur.
Tout le projet à été testé dans un environnement virtuel du « Robot Studio ». La contrainte de
temps n’a pas permis d’explorer les possibilités sur un contrôleur réel, l’application a déjà
fonctionné sur une « FlexPendant » réel. On peut malheureusement voir que l’application n’a
pas été optimisée pour fonctionner dans un environnement réel puisqu’un message d’erreur
spécifiant une erreur de mémoire se manifeste assez rapidement.
22
CONCLUSION ET RECOMMANDATIONS
Ce projet vise à modifier l’orientation de « RobTarget » d’un robot ABB à l’aide de soutien
visuel pour simplifier la représentation. L’application est développée en langage VB.Net pour
s’intégrer au système du « FlexPendant ». Il faut gérer l’orientation avec des angles d’Euler
plutôt que des quaternions comme le suggèrent présentement les applications présentes dans
le système. L’application s’intègre avec les autres programmes déjà existants du robot afin de
pouvoir être lancée lorsque l’opérateur le désire. Cet utilitaire permet à l’opérateur de
sélectionner un « RobTarget » et de modifier sa position manuellement à l’aide du clavier
numérique ou de modifier l’orientation axe par axe à l’aide de boutons. Le soutien visuel est un
ensemble de deux référentiels, un pour l’origine et l’autre pour l’orientation du « RobTarget ».
Ces référentiels sont dessinés à l’aide de simples lignes voulant représenter l’effet trois
dimensions selon une projection orthogonale ou centrale. La représentation graphique serait
un des points à améliorer de l’application. Si le réel effet 3D est possible comme il était
question dans l’hypothèse initiale, il faudrait plutôt l’utiliser puisque de simples lignes donnent
un effet visuel souvent difficile à comprendre.
Le développement s’est fait en suivant le plus possible les normes de programmation
apprises tout au long du cheminement collégial et universitaire. C’est pourquoi plusieurs
classes ont été développées pour regrouper les méthodes et les données membres
nécessaires. D’autres classes ont été jointes au projet pour répondre à différents besoins
comme la gestion de matrices.
L’application avait initialement été pensée pour gérer les rotations de chaque axe à l’aide du
« joystick ». Par manque de temps, le contrôle a plutôt été fait par de simples boutons, mais
peut facilement être adapté si les méthodes de gestion du « joystick » sont découvertes plus
tard.
Pour terminer, le projet semblait assez simple au début, mais tout au long du développement,
la complexité devenait de plus en plus intense. Un des buts du projet était d’évaluer les
possibilités de développement des outils. On peut donc voir que les possibilités sont assez
grandes. Il reste aussi à voir si les mêmes tests faits sur un contrôleur virtuel fonctionnent bien
sur un contrôleur de robot réel. Il y a vraisemblablement les problèmes de mémoire, qui
faudrait gérer pour permettre de fonctionner sans erreur.
23
RÉFÉRENCES
ABB. « ROBOT APPLICATION BUILDER OVERWIEW ». IN LE SITE DE LA
DOCUMENTATION ABB. EN LIGNE.
<HTTP://WWW.ABB.CA/PRODUCT/SEITP327/4A08ADF3B8BD7976C12570FC00348B3F.A
SPX>. CONSULTÉ LE 24 JANVIER 2010.
CODES-SOURCES. 2005. « CLASSE MATRICE ». IN LE SITE DE CODES-SOURCES. EN
LIGNE. <HTTP://WWW.CSHARPFR.COM/CODE.ASPX?ID=34171>. CONSULTÉ LE 15
FÉVRIER 2010.
ÉCOLE DE TECHNOLOGIE SUPÉRIEURE. SITES DE COURS. « GPA546 ». IN LE SITE DU
COURS DE ROBOTS INDUSTRIELS. EN LIGNE.
<HTTP://WWW.GPA.ETSMTL.CA/COURS/GPA546/INDEX.HTML>. CONSULTÉ LE 27
FÉVRIER 2010.
TECHNO-SCIENCE.NET. QUATERNION. IN LE SITE DE TECHNO-SCIENCE.NET. EN
LIGNE. <HTTP://WWW.TECHNOSCIENCE.NET/?ONGLET=GLOSSAIRE&DEFINITION=5067>. CONSULTÉ LE 8 AVRIL
2010.
THE CODE PROJECT. 2006. « A 3D PLOTTING LIBRARY IN C# ». IN LE SITE THE CODE
PROJECT. EN LIGNE. <HTTP://WWW.CODEPROJECT.COM/KB/GDIPLUS/PLOT3D.ASPX>. CONSULTÉ LE 3 MARS 2010.
WOLFRAM MATHWORLD. « PLANE ». IN LE SITE DE WOLFRAM MATHWORLD. EN
LIGNE. <HTTP://MATHWORLD.WOLFRAM.COM/PLANE.HTML>. CONSULTÉ LE 31 MARS
2010.
24
ANNEXES
ANNEXE A ObtenirListeRobTarget
''' <summary>
''' Obtenir la liste de tous les RobTarget du controleur
''' </summary>
Public Sub ObtenirListeRobTarget()
Dim
Dim
Dim
Dim
Dim
Dim
Tache As Task
SProp As RapidSymbolSearchProperties
ListRapidSymbol As RapidSymbol()
RpdSbl As RapidSymbol
RpdTgt As RobTarget
LeRobTarget As CRobTarget
'La tâche
'Options de recherche de RapidData
'Liste des RapidData trouvé
'
'Un RobTarget
'Le RobTarget à ajouter à la liste
'Définir les options de recherche pour récupérer tous les RobTarget
SProp = RapidSymbolSearchProperties.CreateDefault()
SProp.IsInUse = False
SProp.SymbolType = SymbolTypes.RapidData
'Supprimer la liste des RobTarget
m_ListRobTarget.Clear()
'Parcourir tous les tâches du contrôleur
For Each Tache In m_Controleur.Rapid.GetTasks
'Récupérer tous les RobTarget de la tâche reçue en paramêtre
ListRapidSymbol = Tache.SearchRapidSymbol(SProp, "robtarget", String.Empty)
'Parcourir tous les RobTarget obtenus
For Each RpdSbl In ListRapidSymbol
'Obtenir les valeurs de positionnement du RobTarget courant
'Scope(1): C'est le nom du module
RpdTgt = RobTargetSelonNom(RpdSbl.Name, Tache.Name, RpdSbl.Scope(1))
LeRobTarget = New CRobTarget(RpdSbl.Name, Tache.Name, RpdSbl.Scope(1),
RpdTgt)
m_ListRobTarget.Add(LeRobTarget)
Next
Next
'Libérer les variables
Tache = Nothing
RpdSbl = Nothing
RpdTgt = Nothing
SProp = Nothing
LeRobTarget = Nothing
ListRapidSymbol = Nothing
End Sub
25
ANNEXE B RobTargetSelonNom
''' <summary>
''' Retourner un RobTarget selon le nom, la tache et le module reçus en paramètre
''' </summary>
''' <param name="NomRobTarget">Nom du RobTarget</param>
''' <param name="NomTache">Nom de la "task"</param>
''' <param name="NomModule">Nom du module</param>
Public Function RobTargetSelonNom(ByVal NomRobTarget As String, ByVal NomTache As
String, ByVal NomModule As String) As RobTarget
Dim RpdData As RapidData
Dim IRpdData As IRapidData
Dim RpdTgt As RobTarget
'Obtenir les valeurs de positionnement du RobTarget courant
RpdData = m_Controleur.Rapid.GetRapidData(NomTache, NomModule, NomRobTarget)
IRpdData = RpdData.Value
RpdTgt = DirectCast(IRpdData, RobTarget)
Return RpdTgt
End Function
26
ANNEXE C RemplirListView
'Remplir une ListView dont la référence est reçue en paramètre de tous les points du
contrôleur
Public Sub RemplirListView(ByRef List As ListView)
Dim
Dim
Dim
Dim
Dim
RpdRbt As CRobTarget
LstAdd As ListViewItem
Yaw As Double
Pitch As Double
Roll As Double
'Point courant (RobTarget courant)
'Ligne à ajouter dans la ListView
'Rotation autour de l'axe des X
'Rotation autour de l'axe des Y
'Rotation autour de l'axe des Z
'Obtenir tous les RobTarget du contrôleur
ObtenirListeRobTarget()
'Vider la liste
List.Items.Clear()
m_ListRobTarget.Sort()
'Parcourir tous les RobTarget et les ajouter à la ListView
For Each RpdRbt In m_ListRobTarget
'Créer une nouvelle ligne
LstAdd = New ListViewItem(RpdRbt.Nom)
'Obtenir les angles d'Euler du RobTarget
RpdRbt.LeRobTarget.Rot.ToEulerAngles(Yaw, Pitch, Roll)
'Ajouter les informations du point courant dans la nouvelle ligne
LstAdd.SubItems.Add(RpdRbt.LeRobTarget.Trans.ToString() & "[" &
Math.Round(Yaw, 2).ToString() & ", " & Math.Round(Pitch, 2).ToString() & ", " &
Math.Round(Roll, 2).ToString() & "]")
LstAdd.SubItems.Add(RpdRbt.LeModule)
'Ajouter la ligne à la liste
List.Items.Add(LstAdd)
Next
End Sub
27
ANNEXE D GetAngles
'Retourner les angles d'Euler de la matrice reçue en paramètre.
'La fonction retourne faux si la représentation des angles retournés n'est pas
l'unique solution.
Private Function GetAngles(ByVal m As Matrice, ByRef Roll As Double, ByRef Pitch As
Double, ByRef Yaw As Double) As Boolean
Dim vRoll As Double
Dim vPitch1 As Double
Dim vPitch2 As Double
Dim vPitchGarde As Double
Dim vYaw As Double
Dim UniqueSolution As Boolean
'Vérifier les singularités
If m(2, 0) > 0.998 Then
vYaw = 0
vPitchGarde = -Math.PI / 2
vRoll = Math.Atan2(-m(1, 2), m(1, 1))
UniqueSolution = False
ElseIf m(2, 0) < -0.998 Then
vYaw = 0
vPitchGarde = Math.PI / 2
vRoll = Math.Atan2(m(1, 2), m(1, 1))
UniqueSolution = False
Else
'Il y aurait 2 solutions, mais seulement le complément au angles de 180 degrée
UniqueSolution = True
'Cette étape n'est pas nécessaire, mais les résultats sont plus constants en
'comparant les deux possibilités.
'Calculer les deux possibilités
vPitch1 = Math.Atan2(-m(2, 0), (-1) * Math.Sqrt(m(0, 0) * m(0, 0) + m(1, 0) * m(1, 0)))
vPitch2 = Math.Atan2(-m(2, 0), Math.Sqrt(m(0, 0) * m(0, 0) + m(1, 0) * m(1, 0)))
'Prendre la réponse la plus proche de l'angle avant la rotation
If Math.Abs(m_Pitch - (vPitch1 * (180/Math.PI))) < Math.Abs(m_Pitch - (vPitch2 * (180/Math.PI))) Then
vPitchGarde = vPitch1
Else
vPitchGarde = vPitch2
End If
Dim t As Double = Math.Cos(vPitchGarde)
vRoll = Math.Atan2(m(1, 0) / t, m(0, 0) / t)
vYaw = Math.Atan2(m(2, 1) / t, m(2, 2) / t)
End If
'Retourner les angles en degré
Roll = vRoll * (180 / Math.PI)
Pitch = vPitchGarde * (180 / Math.PI)
Yaw = vYaw * (180 / Math.PI)
'Retrouner vrai s'il n'y a pas de situation de singularité
Return UniqueSolution
End Function
28
ANNEXE E DessinerRefCentrale
'Dessiner les référentiels selon une projection centrale
Private Sub DessinerRefCentrale()
Const FACTEUR_PROFONDEUR_FIXE As Double = 0.65
l'axe de profondeur
Const FACTEUR_PROFONDEUR_VAR As Double = 0.75 / 200
l'axe de profondeur selon la valeur en X
Const FACTEUR_PROFONDEUR_INIT As Double = 0.625
longeur de l'axe de profondeur
Const ANGLE_CAMERA As Double = Math.PI / 4
Dim
Dim
Dim
Dim
Dim
Dim
Dim
'Facteur qui réduit la longueur de
'Facteur qui réduit la longueur de
'Facteur initiale qui réduit la
'Angle de l'axe de profondeur
canvas As Graphics
crayon As Pen = New Pen(Color.Red)
Police As Font = New Font("Arial", 10, FontStyle.Italic)
ValeurY, ValeurZ As Integer
ProfondeurX, ProfondeurY As Double
Facteur As Double
EcranX, EcranY As Integer
canvas = m_Form.CreateGraphics()
canvas.Clear(m_Form.BackColor)
'Mettre le référentiel fixe plus épais
crayon.Width = 2
'Axe des Xr---------------------------------------------------------ValeurY = 0
ValeurZ = 0
'Nx * Longueur*(0.625 + Nx*Longueur*0.75/200)
Facteur = LONGUEUR_REF_R * ((FACTEUR_PROFONDEUR_INIT + LONGUEUR_REF_R *
FACTEUR_PROFONDEUR_VAR)) * FACTEUR_PROFONDEUR_FIXE
'Facteur transposé sur l'axe des x ou y
ProfondeurX = Math.Cos(ANGLE_CAMERA) * Facteur
ProfondeurY = Math.Sin(ANGLE_CAMERA) * Facteur
'Valeur en X,Y à l'écran
EcranX = Convert.ToInt32(ORIGINE_X + ValeurY - ProfondeurX)
EcranY = Convert.ToInt32(ORIGINE_Y - ValeurZ + ProfondeurY)
crayon.Color = Color.Red
canvas.DrawLine(crayon, ORIGINE_X, ORIGINE_Y, EcranX, EcranY)
'Axe des Yr---------------------------------------------------------crayon.Color = Color.Green
canvas.DrawLine(crayon, ORIGINE_X, ORIGINE_Y, Convert.ToInt32(ORIGINE_X + LONGUEUR_REF_R),
Convert.ToInt32(ORIGINE_Y))
'Axe des Zr---------------------------------------------------------crayon.Color = Color.Blue
canvas.DrawLine(crayon, ORIGINE_X, ORIGINE_Y, Convert.ToInt32(ORIGINE_X),
Convert.ToInt32(ORIGINE_Y - LONGUEUR_REF_R))
'Dessiner nouveau référentielle
crayon.Width = 1
'Axe des Xt---------------------------------------------------------'Valeur catésienne directe (Y,Z).
ValeurY = Convert.ToInt32(m_MatriceOrientation(1, 0) * LONGUEUR_REF_T)
ValeurZ = Convert.ToInt32(m_MatriceOrientation(2, 0) * LONGUEUR_REF_T)
29
'Nx * Longueur*(0.625 + Nx*Longueur*0.75/200)
Facteur = m_MatriceOrientation(0, 0) * LONGUEUR_REF_T * ((FACTEUR_PROFONDEUR_INIT +
m_MatriceOrientation(0, 0) * LONGUEUR_REF_T * FACTEUR_PROFONDEUR_VAR)) * FACTEUR_PROFONDEUR_FIXE
'Facteur transposé sur l'axe des x ou y
ProfondeurX = Math.Cos(ANGLE_CAMERA) * Facteur
ProfondeurY = Math.Sin(ANGLE_CAMERA) * Facteur
'Valeur en X,Y à l'écran
EcranX = Convert.ToInt32(ORIGINE_X + ValeurY - ProfondeurX)
EcranY = Convert.ToInt32(ORIGINE_Y - ValeurZ + ProfondeurY)
crayon.Color = Color.Red
canvas.DrawLine(crayon, ORIGINE_X, ORIGINE_Y, EcranX, EcranY)
canvas.DrawString("Xt", Police, New SolidBrush(Color.Red), EcranX, EcranY)
'Axe des Yt---------------------------------------------------------'Valeur catésienne directe (Y,Z).
ValeurY = Convert.ToInt32(m_MatriceOrientation(1, 1) * LONGUEUR_REF_T)
ValeurZ = Convert.ToInt32(m_MatriceOrientation(2, 1) * LONGUEUR_REF_T)
'Nx * Longueur*(0.625 + Nx*Longueur*0.75/200)
Facteur = m_MatriceOrientation(0, 1) * LONGUEUR_REF_T * ((FACTEUR_PROFONDEUR_INIT +
m_MatriceOrientation(0, 1) * LONGUEUR_REF_T * FACTEUR_PROFONDEUR_VAR)) * FACTEUR_PROFONDEUR_FIXE
'Facteur transposé sur l'axe des x ou y
ProfondeurX = Math.Cos(ANGLE_CAMERA) * Facteur
ProfondeurY = Math.Sin(ANGLE_CAMERA) * Facteur
'Valeur en X,Y à l'écran
EcranX = Convert.ToInt32(ORIGINE_X + ValeurY - ProfondeurX)
EcranY = Convert.ToInt32(ORIGINE_Y - ValeurZ + ProfondeurY)
crayon.Color = Color.Green
canvas.DrawLine(crayon, ORIGINE_X, ORIGINE_Y, EcranX, EcranY)
canvas.DrawString("Yt", Police, New SolidBrush(Color.Green), EcranX, EcranY)
'Axe des Zt---------------------------------------------------------'Valeur catésienne directe (Y,Z).
ValeurY = Convert.ToInt32(m_MatriceOrientation(1, 2) * LONGUEUR_REF_T)
ValeurZ = Convert.ToInt32(m_MatriceOrientation(2, 2) * LONGUEUR_REF_T)
'Nx * Longueur*(0.625 + Nx*Longueur*0.75/200)
Facteur = m_MatriceOrientation(0, 2) * LONGUEUR_REF_T * ((FACTEUR_PROFONDEUR_INIT +
m_MatriceOrientation(0, 2) * LONGUEUR_REF_T * FACTEUR_PROFONDEUR_VAR)) * FACTEUR_PROFONDEUR_FIXE
'Facteur transposé sur l'axe des x ou y
ProfondeurX = Math.Cos(ANGLE_CAMERA) * Facteur
ProfondeurY = Math.Sin(ANGLE_CAMERA) * Facteur
'Valeur en X,Y à l'écran
EcranX = Convert.ToInt32(ORIGINE_X + ValeurY - ProfondeurX)
EcranY = Convert.ToInt32(ORIGINE_Y - ValeurZ + ProfondeurY)
crayon.Color = Color.Blue
canvas.DrawLine(crayon, ORIGINE_X, ORIGINE_Y, EcranX, EcranY)
canvas.DrawString("Zt", Police, New SolidBrush(Color.Blue), EcranX, EcranY)
End Sub
30