École de technologie supÉrieure … · projection orthogonale ou centrale. les données sont bien...

36
É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

Upload: dobao

Post on 14-Sep-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

É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.

ii

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

iii

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

iv

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

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

2

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 vice-

versa 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.

3

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

4

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 00 0 1� Les matrices de rotation :

��� � �1 0 00 cos � sin 0 sin cos �

��� � � cos 0 sin 0 1 0� sin 0 cos �

��� � �cos � sin 0sin cos 00 0 1�

6 http://www.codeproject.com/KB/GDI-plus/Plot3D.aspx 7 http://mathworld.wolfram.com/Plane.html

5

Pour dessiner le référentiel fixe :

Extrémité de l’axe des X : � � ��30°� � ���45°� � ������ �!"00 � � ����

Extrémité de l’axe des Y : � � ��30°� � ���45°� � � 0����� �!"0 � � ����

Extrémité de l’axe des Z : � � ��30°� � ���45°� � � 00����� �!"� � ����

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°� � ' � ������ �!(00 � � ����

Extrémité de l’axe des Y : � � ��30°� � ���45°� � ' � � 0����� �!(0 � � ����

Extrémité de l’axe des Z : � � ��30°� � ���45°� � ' � � 00����� �!(� � ����

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

6

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.

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

Z Z

X

Y

X Y

Projection orthogonale Projection centrale

Figure 2 Deux types de projection

7

é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 mini-

applications 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

8

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 · 1 6 7 · 8 6 9 · : 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 :

� � �5( 6 7( � 9( � ;( 2 · 7 · 9 � 2 · 5 · ; 2 · 5 · 9 6 2 · 7 · ;2 · 5 · ; 6 2 · 7 · 9 5( � 7( 6 9( � ;( 2 · 9 · ; � 2 · 5 · 72 · 7 · ; � 2 · 5 · 9 2 · 5 · 7 6 2 · 9 · ; 5( � 7( � 9( 6 ;(�

11 http://www.techno-science.net/?onglet=glossaire&definition=5067

9

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

10

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.

11

CHAPITRE 3 PROCESSUS DE CONCEPTION

3.1 La préparation de l’environnement de développem ent

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.

12

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

13

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

14

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

15

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

16

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

17

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

18

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

19

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.

20

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

21

CHAPITRE 4 INTERPRÉTATION DES RÉSULTATS ET DISCUSS ION

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.

22

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é.

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.

Figure 12 Validation des résultats

23

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.

24

RÉFÉRENCES

ABB. « ROBOT APPLICATION BUILDER OVERWIEW ». IN LE SITE DE LA DOCUMENTATION ABB. EN LIGNE. <HTTP://WWW.ABB.CA/PRODUCT/SEITP327/4A08ADF3B8BD797 6C12570FC00348B3F.ASPX>. 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.TECHNO-SCIENCE.NET/?ONGLET=GLOSSAIRE&DEFINITION=5067>. CON SULTÉ 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/GDI-PLUS/PLOT3D.ASPX>. CONSULTÉ LE 3 MARS 2010. WOLFRAM MATHWORLD. « PLANE ». IN LE SITE DE WOLFRAM MATHWORLD. EN LIGNE. <HTTP://MATHWORLD.WOLFRAM.COM/PLANE.HTML>. C ONSULTÉ LE 31 MARS 2010.

25

ANNEXES

ANNEXE A ObtenirListeRobTarget

''' <summary> ''' Obtenir la liste de tous les RobTarget du contr oleur ''' </summary> Public Sub ObtenirListeRobTarget() Dim Tache As Task 'La tâche Dim SProp As RapidSymbolSearchProperties 'Options de recherche de RapidData Dim ListRapidSymbol As RapidSymbol() 'Liste des RapidData trouvé Dim RpdSbl As RapidSymbol ' Dim RpdTgt As RobTarget 'Un RobTarget Dim LeRobTarget As CRobTarget 'Le RobTarget à ajouter à la liste 'Définir les options de recherche pour récupérer to us les RobTarget SProp = RapidSymbolSearchProperties.CreateDefau lt() 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(S Prop, "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

26

ANNEXE B RobTargetSelonNom

''' <summary> ''' Retourner un RobTarget selon le nom, la tache e t 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(NomTa che, NomModule, NomRobTarget) IRpdData = RpdData.Value RpdTgt = DirectCast (IRpdData, RobTarget) Return RpdTgt End Function

27

ANNEXE C RemplirListView

'Remplir une ListView dont la référence est reçue e n paramètre de tous les points du contrôleur Public Sub RemplirListView( ByRef List As ListView) Dim RpdRbt As CRobTarget 'Point courant (RobTarget courant) Dim LstAdd As ListViewItem 'Ligne à ajouter dans la ListView Dim Yaw As Double 'Rotation autour de l'axe des X Dim Pitch As Double 'Rotation autour de l'axe des Y Dim Roll As Double '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 L istView 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, P itch, Roll) 'Ajouter les informations du point courant dans la nouvelle ligne LstAdd.SubItems.Add(RpdRbt.LeRobTarget.Tran s.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

28

ANNEXE D GetAngles

'Retourner les angles d'Euler de la matrice reçue e n 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ém ent au angles de 180 degrée UniqueSolution = True 'Cette étape n'est pas nécessaire, mais les résulta ts 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))) < Ma th.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 sing ularité Return UniqueSolution End Function

29

ANNEXE E DessinerRefCentrale

'Dessiner les référentiels selon une projection cen trale Private Sub DessinerRefCentrale() Const FACTEUR_PROFONDEUR_FIXE As Double = 0.65 'Facteur qui réduit la longueur de l'axe de profondeur Const FACTEUR_PROFONDEUR_VAR As Double = 0.75 / 200 'Facteur qui réduit la longueur de l'axe de profondeur selon la valeur en X Const FACTEUR_PROFONDEUR_INIT As Double = 0.625 'Facteur initiale qui réduit la longeur de l'axe de profondeur Const ANGLE_CAMERA As Double = Math.PI / 4 'Angle de l'axe de profondeur Dim canvas As Graphics Dim crayon As Pen = New Pen(Color.Red) Dim Police As Font = New Font( "Arial" , 10, FontStyle.Italic) Dim ValeurY, ValeurZ As Integer Dim ProfondeurX, ProfondeurY As Double Dim Facteur As Double Dim 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, E cranX, EcranY) 'Axe des Yr---------------------------------------- ------------------ crayon.Color = Color.Green canvas.DrawLine(crayon, ORIGINE_X, ORIGINE_Y, C onvert.ToInt32(ORIGINE_X + LONGUEUR_REF_R), Convert.ToInt32(ORIGINE_Y)) 'Axe des Zr---------------------------------------- ------------------ crayon.Color = Color.Blue canvas.DrawLine(crayon, ORIGINE_X, ORIGINE_Y, C onvert.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)

30

'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 * FACTE UR_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, E cranX, 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 * FACTE UR_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, E cranX, 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 * FACTE UR_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, E cranX, EcranY) canvas.DrawString( "Zt" , Police, New SolidBrush(Color.Blue), EcranX, EcranY) End Sub