Académique Documents
Professionnel Documents
Culture Documents
Stéphane Bazeille
Université de Haute-Alsace
E-mail : stephane.bazeille@uha.fr
1 Introduction 3
1.1 Contenu du cours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Volume horaire et contrôle de connaissance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4 Compétences acquises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 La robotique 4
2.1 Une discipline complexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Qu’est-ce qu’un robot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.3 Des automates aux robots autonomes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
5 Travaux dirigés 19
5.1 Ex 1 : Exemple d’utilisation des fonctions de mouvement . . . . . . . . . . . . . . . . . . . . . . 19
5.2 Ex 2 : Dépilement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.3 Ex 3 : Palettisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.4 Ex 4 : Communication avec une caméra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
6 Travaux pratiques 22
6.1 Présentation des Tps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
6.2 TP 1. Prise en main de SRS 2016 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
6.3 TP 2. Dépilement et rangement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
6.4 TP 3. Tri RGB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6.5 TP 4. Tours de Hanoï . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
6.6 TP 5. Prise de pièce localisée par un système de vision . . . . . . . . . . . . . . . . . . . . . . . . 37
D Table ASCII 45
2
Chapitre 1
Introduction
1.3 Prérequis
Avant de commencer ce cours de robotique il est indispensable d’avoir les notions d’informatique suivantes :
— Algorithmique de base (affectation, condition, boucle...)
— Manipulation des tableaux (parcours, recherche de valeur...)
— Programmation procédurale (fonction, paramètre, valeur de retour, structures...)
Quelques rappels et exercices sont fournis en annexe. Il est recommandé aux étudiants qui ne sont pas à l’aise
avec ces notions de se mettre à niveau avant le début de ce cours.
3
Chapitre 2
La robotique
4
CHAPITRE 2. LA ROBOTIQUE 5
et arithmétiques. Sa structure physique actuelle fait que toutes les opérations reposent sur la logique binaire
et sur des nombres formés à partir de chiffres binaires. Dès sa mise sous tension, un ordinateur exécute, l’une
après l’autre, des instructions qui lui font lire, manipuler, puis réécrire un ensemble de données enregistrées en
mémoire. Des tests et des boucles permettent de passer à l’instruction suivante et donc d’agir différemment en
fonction des données. Le comportement global du robot géré par l’ordinateur peut être plus ou moins complexe.
À un niveau réactif, le robot peut traduire l’information brute d’un capteur directement en commande d’un
actionneur (par exemple un arrêt d’urgence, si un obstacle est détecté alors on arrête les moteurs). Avec des
tâches plus sophistiquées, il faut utiliser des algorithmes. Le programme robotique est en charge de suivre l’évo-
lution du retour des capteurs et prévoir en permanence la séquence d’actions à réaliser par le robot : comme par
exemple recalculer la trajectoire à suivre lorsque la première trajectoire calculée a donné lieu à une collision. Le
programme principal est en général la partie la plus complexe du robot. Plus le robot est autonome plus son
programme informatique doit prendre en compte un nombre important de variables.
Contrairement aux automates, machines dont l’origine remonte au XVIIIe siècle (date des premiers automates
mécaniques), les robots sont des systèmes polyvalents et capables d’agir et de réagir de façon autonome. Dans
leur définition générale, les robots sont dotés d’une plus grande liberté d’action, de capteurs pour percevoir leurs
mouvements et l’environnement et d’une capacité de calcul importante qui les rendent capables de prendre "des
décisions". Unimate était le premier robot créé. Il fut créé par George Devol dans les années 1950 et a été utilisé
pour travailler sur les chaînes d’assemblage de General Motors à partir de 1961 (Fig. 2.3). Ce robot avait peu de
capacités de réaction, lui et ses successeurs étaient destinés à exécuter certaines tâches répétitives, éprouvantes
ou toxiques pour un opérateur humain : peinture ou soudage des carrosseries automobiles. Dans les années qui
ont suivi, l’évolution de l’électronique a permis de développer des robots plus faciles à contrôler, plus précis et
plus rapides. Aujourd’hui, grâce à l’accroissement très important de la puissance de calcul les robots deviennent
de plus en plus autonome, au sens qu’ils sont capable de gérer des situations problématiques qui surviennent
lors de l’exécution d’une tâche. Avec ces développements, ils se sont imposés dans de nombreux domaines :
— la robotique industrielle et la robotique domestique,
— la robotique médicale et la robotique militaire,
— la robotique scientifique, par exemple pour l’exploration de l’espace, des fonds marins,
— la robotique de transport (de personnes et de marchandises),
Quelques exemples de robots utilisés aujourd’hui dans différents domaines sont présentés sur la figure 2.4
le robot à réagir à des événements. Pour cela, il faut développer un programme qui interprète le retour de tous
ses capteurs et adapte le comportement du robot en conséquence.
Dans la suite de ce cours, nous nous intéresserons aux robots industriels. Les robots industriels peuvent être
téléguidés à l’aide d’une télécommande, on appelle ce mode contrôle le mode manuel cependant ce mode est
peu utilisé. Les robots industriels sont en général programmés pour effectuer une suite de mouvement automa-
tiquement (mode automatique). Dans la prochaine partie, nous allons-nous apprendre comment programmer
des robots industriels.
Chapitre 3
8
CHAPITRE 3. PROGRAMMATION DES ROBOTS INDUSTRIELS 9
— les modèles de transformation entre l’espace opérationnel (dans lequel est définie la situation de l’outil) et
l’espace articulaire (dans lequel est définie la configuration du robot). Parmi ces modèles, on distingue :
+ les modèles géométriques direct et inverse qui expriment la situation de l’outil en fonction des variables
articulaires du mécanisme et inversement,
+ les modèles cinématiques direct et inverse qui expriment la vitesse de l’outil en fonction des vitesses
articulaires et inversement.
— les modèles dynamiques définissant les équations du mouvement du robot, qui permettent d’établir les
relations entre les couples ou forces exercés par les actionneurs et les positions, vitesses et accélérations
des articulations.
La trajectoire et les positions articulaires du robot le long de la trajectoire seront calculées à partir des modèles
géométriques, le déplacement du robot incluant les vitesses de déplacement à partir du modèle cinématique et
le contrôle du robot prenant en compte les forces par le modèle dynamique.
Avec le modèle géométrique inverse, il s’agit de calculer les équations inverses nécessaires pour positionner l’outil
à une position particulière dans l’espace de travail. Ce modèle permet de répondre à la question suivante :
dans quelles positions dois-je régler les articulations du robot pour déplacer l’outil dans une position donnée ?
Cependant, les choses ne sont pas si simples. Contrairement au modèle géométrique direct, la plupart des robots
avec plus de deux actionneurs auront de multiples solutions possibles. La géométrie inverse est compliquée à
résoudre car il y a un grand nombre de solutions possibles pour les chaînes cinématiques complexes. Un robot
1R (par exemple un axe fixé à un moteur) n’aura qu’une seule solution cinématique inverse possible pour décrire
la position du point final. Un robot 2R (par exemple une chaîne de 2 axes avec un moteur chacun) aura deux
solutions possibles pour décrire la même position du point final. Chaque articulation ajoutera plus de complexité
à la géométrie inverse et plus de solutions possibles au choix. Lorsque l’on cherche à résoudre le problème inverse
on a plusieurs possibilités :
— absence de solution lorsque la situation désirée est en dehors de la zone accessible du robot. Celle-ci est
limitée par le nombre de degrés de liberté, les débattements articulaires et la dimension des segments ;
— infinité de solutions lorsque : - le robot est redondant vis-à-vis de la tâche ; - le robot se trouve dans
certaines configurations singulières ;
— solutions en nombre fini, exprimées par un ensemble de solution. On dit dans ce cas que le robot ma-
nipulateur est résoluble. Il est possible de calculer toutes les configurations permettant d’atteindre une
situation donnée. Aujourd’hui, tous les manipulateurs série ayant jusqu’à 6 degrés de liberté et qui ne sont
pas redondants peuvent être considérés comme résolubles.
Cas des positions singulières
Quelque soit le robot (redondant ou non), il se peut que sur certaines trajectoires, le robot passe par des
configurations dites singulières c’est à dire que 2 axes d’articulations prismatiques se retrouvent parallèles
ou deux axes d’articulations rotoïdes se retrouvent confondues. Une singularité est donc définie comme "un
problème causé par l’alignement colinéaire de deux ou plusieurs axes du robot, ce qui peut entraîner sur un tout
petit mouvement, des déplacements articulaires très grand et donc des vitesses imprévisibles du robot". Les
singularités des robots se produisent parce que les robots sont contrôlés par les mathématiques (ou des résultats
égaux à l’infini sont possibles), mais dans le monde réel, les robots sont faits de mobiles physiques qui ont des
limites de vitesse. Si une équation commande à une articulation de robot de "tourner de 180 degrés à une vitesse
CHAPITRE 3. PROGRAMMATION DES ROBOTS INDUSTRIELS 10
angulaire infinie", l’articulation du robot ne pourra effectuer le mouvement. Dans ce cas le contrôleur affichera
un message d’erreur. Il faudra déplacer un peu le point de destination pour sortir de cette position particulière
qui pose problème.
Figure 3.1: Les repères liés au robot (repère world et repère outil) et le repère lié à l’objet.
trajectoire entre le repère outil et le repère objet. Ensuite la librairie contrôle le mouvement le long de cette
trajectoire jusqu’à ce que ces deux repères se retrouvent superposés.
Début du programme
1. Déplacer vers P1 (point de départ)
2. Déplacer vers P2 (point de dégagement)
3. Déplacer vers P3 (point de prise)
4. Fermer la pince
5. Déplacer vers P2 (point d’approche du point de prise)
6. Déplacer vers P4 (point d’approche du point de dépose)
7. Déplacer vers P5 (point de dépose)
CHAPITRE 3. PROGRAMMATION DES ROBOTS INDUSTRIELS 12
Haute vitesse
Faible vitesse
P1
P2 P4
P3
P5
Figure 3.2: Décomposition des mouvements pour la prise et la dépose d’une pièce.
8. Ouvrir la pince
9. Déplacer vers P4 (point de dégagement)
10. Déplacer vers P1
Fin du programme
On voit dans cet exemple une tâche simple qui consiste à prendre un objet cubique (en P3) puis le déposer (en
P5). Cette tâche nécessite 10 étapes et ne fonctionnera qu’avec le type d’objet pour lequel elle a été programmée.
Le robot ne sera capable de prendre l’objet que s’il est exactement à la place prévue dans le programme. A noter
également que les points d’approches (P2 et P4) sont très importants pour forcer le robot à arriver sur l’objet
par le haut et ne pas heurter et déplacer l’objet lors de la phase d’approche. On peut comprendre aisément que
pour que le robot soit plus autonome et soit capable de prendre l’objet quelle que soit sa position il faudrait
faire intervenir un système de vision qui donnerait au robot la position de l’objet.
Figure 3.4: Le bras robotisé, le contrôleur, le teach (ou télécommande) ; et l’outil (pince ou ventouse).
Le bras articulé est l’élément mécanique qui sera en mouvement qui est caractérisé par son nombre de degré
de liberté. Le contrôleur est le cerveau du robot, il permet de piloter les mouvements. Il est composé d’un
calculateur et d’un boitier de puissance. La télécommande permet de téléguider le robot ou bien d’écrire lancer
des programmes. L’outil quant à lui est attaché au bout du bras robotisé et est dédié à la tâche que le robot va
exécuter. Les robots sont en général vendus sans outil, c’est à l’utilisateur d’équiper son robot avec l’outil de
son choix.
— de simuler en 3D les mouvements du bras dans des tâches de prise et dépôt d’objets. Ce mode simulé
utilise les librairies de planification de trajectoire et de contrôle basé sur les modèles du robot réel. Le code
simulé est donc fonctionnel sur le robot. A noter que le simulateur permet aussi de prendre en compte les
collisions avec l’environnement,
— d’écrire et vérifier le code avec des outils tel que : un débuggeur, une assistance à la saisie, un formatage
automatique du code,
— de transférer le code du PC vers le robot ou bien du robot vers le PC,
Dans SRS, les programmes sont écrits dans un langage propriétaire appelé VAL3. Le programme VAL3 utilise
le contrôleur du robot réel. A la fin de la simulation il suffit juste de transférer le code simulé sur un robot réel
pour ensuite l’exécuter.
Chapitre 4
Fonctions et paramètres
L’appel à des sous fonctions se fait via le mot-clé call suivi du nom de la fonction.
Exemple : call triTableau(Tab).
Dans ce cas, le paramètre Tab est passé par valeur il ne peut être modifier dans la fonction triTableau Cependant,
les paramètres peuvent aussi être envoyé à la fonction par référence comme en C. L’envoie d’un paramètre par
référence permet dans ce cas de modifier la valeur de la variable dans la fonction. Une référence est notée du
symbole & après le type de données dans la définition de la fonction. Pour finir, les fonctions ne renvoient rien
en VAL3 mais le mot clé return peut être utilisé pour sortir directement d’une fonction.
15
CHAPITRE 4. LE LANGAGE VAL3 ET LA PROGRAMMATION DES ROBOTS STAUBLI. 16
Quelques exemples :
A=true
//A est un booléen
Pi=3.14159
// Pi est un num
s="Bonjour"
//s est une chaîne de caractère
P1=[100 100 100 0 0 0]
//P1 est de type \textit{point} en VAL3. P1 a 6 coordonnées car c’est un point 3D
//Il est défini à la fois par une position 3D (x y z) et une orientation dans l’espace
//(rx, ry rz).
J1=[50 90 50 0 0 0]
//J1 est de type \textit{joint} en VAL3. J1 a 6 valeurs correspondant au 6 positions
//angulaires des 6 articulations qui compose le robot.
Pour modifier un attribut d’une classe ou d’une structure on utilise le "." comme en C. Par exemple pour
modifier l’attribut "x" d’une variable de type "point" on écrit :
ou
i=0
while (i<10)
...
i=i+1
endWhile
switch i
case 0
...
break
case 1
...
break
case 2
...
break
endSwitch
géométrique de type trsf. Par exemple : P2=appro(P3,{0,0,-100,0,0,0}). P2 est donc situé 100mm au-dessus de
P3. Le vecteur {0,0,-100,0,0,0} est de type trsf.
begin
//Se positionner en position initiale
movej(jOrigin,pince,rapide)
//Se déplacer vers l’objet
movej(appro(pPrise,translationZ),pince,rapide)
open(pince)
movel(pPrise,pince,lent)
//prendre l’objet
close(pince)
movel(appro(pPrise,translationZ),pince,lent)
//se déplacer
movej(appro(pDepose,translationZ),pince,rapide)
movel(pDepose,pince,lent)
//déposer l’objet
open(pince)
movel(appro(pDepose,translationZ),pince,lent)
//retour à l’origine
movej(jOrigin,pince,rapide)
//en raison du problème d’anticipation du robot le code doit se terminer par WaitEndMove().
WaitEndMove()
end
Travaux dirigés
Cas 1. Cas 2.
begin begin
movej(P2,pince,rapide) movej(P2,pince,rapide)
close(pince) movel(P3,pince,lent)
movej(P3,pince,rapide) close(pince)
open(pince) movel(P2,pince,lent)
movej(P1,pince,rapide) movej(P4,pince,rapide)
end movel(P5,pince,lent)
open(pince)
movel(P4,pince,lent)
movej(P1,pince,rapide)
end
P1
P2 P3
Figure 5.1: Cas 1 : Mouvement d’une pièce en 3 étapes. Cas 2 : Mouvement prenant en 7 étapes.
19
CHAPITRE 5. TRAVAUX DIRIGÉS 20
5.2 Ex 2 : Dépilement
On suppose maintenant que l’on a plusieurs pièces empilées les unes sur les autres comme sur la Fig. 5.2.
P1
P2
P3
— Q1. En se basant sur l’exemple de code précédent (cas 1), écrire un programme qui récupère 5 pièces
cubiques (de côté 100) sur une pile en P2 et qui dépose ces pièces en ligne à partir du point P3. Les pièces
doivent être empilées au départ et alignées sur la table à la fin de l’exercice. On rappelle que le structure
point qui définit P1, P2 et P3 contient 1 champ trsf qui contient lui-même 6 champs : x y z rx ry rz. On
modifie donc un point par le code suivant :
P1.x=P1.x+100
— Q2. Pour être sûr que le robot ne percute pas les pièces en se déplaçant. On appliquera pour chaque
déplacement d’une pièce le code suivant correspondant à la Fig. 5.1.b (cas 2). On définira un point situé
au-dessus d’un autre par rapport à celui-ci en faisant appel à la fonction appro. Réécrire le code demandé
dans l’exercice 1 en utilisant les movej, movel, et appro. Dans le code les point P2 et P4 ne doivent donc
plus exister.
Exemple d’utilisation de appro : appro(P,0,0,-100,0,0,0)) renvoie le point situé à 100mm au-dessus de P.
— Q3. Sachant que ce code de déplacement va être utilisé à plusieurs reprise. Ecrire une fonction qui prend
en paramètre un point P1 et un point P3 et qui déplace un objet.
— Q4. Reprendre la Q1 de l’exercice 1 et écrire une fonction qui calcule les points de prise et de pose puis
appelle la fonction précédente.
5.3 Ex 3 : Palettisation
On suppose que l’on a une pile de 9 cubes et que l’on veut ranger ces cubes sur une palette en 3x3.
— Q1. Ecrire un code qui place les 9 cubes sur une palette comme sur la Fig. 5.3. Ce code réutilisera la
fonction déplacement créée dans l’exercice précédent.
CHAPITRE 5. TRAVAUX DIRIGÉS 21
— Q2. Modifier ce code pour que le robot se déplace plus doucement avant la prise et la dépose de la pièce.
— Q3. Forcer le robot à partir d’une position initiale de type jointrx et à finir aussi sur cette position initiale.
Une caméra est placée à 1 mètre au-dessus d’un objet à déplacer. Par traitement d’image on suppose qu’on est
capable de calculer la position du centre de gravité de l’objet dans l’image par rapport au point P (voir Fig. 5.4).
Le système de vision envoie cette information de position dans une trame TCP. La chaîne de caractères (par
exemple 123,018 !) est reçue par le robot et on suppose que le caractère de séparation est le caractère virgule
et le point d’exclamation le caractère de fin de chaîne (on a donc 123 pixels en colonne et 18 pixels en ligne).
On suppose aussi que la position en pixel envoyée par le traitement d’image est codée sur maximum 3 caractères.
— Q2. Ecrire une fonction qui reçoit la chaîne de caractère en paramètre et met à jour deux variables entières
x et y qui code la position de l’objet comme par exemple : x = 123 et y = 18.
— Q3. Compléter la fonction pour obtenir la position du jeton dans le repère du robot. On suppose que le
point P est connu.
Travaux pratiques
Les Tps peuvent se faire seul ou en binôme. Les Tps se développé sous SRS (Staubli Robotiques Suite), une
suite logicielle sous licence Staubli permettant le développement et la maintenance d’applications robotiques
dédiées aux robots de la marque Staubli. Vous devrez faire valider votre code de simulation pour chaque TP
par l’enseignant présent. La durée de chaque TP est seulement donnée à titre indicatif, passez au TP suivant
lorsque vous avez terminé et fait valider.
Étape 1 : Loguez-vous sur le PC (compte : formation, mot de passe : formation). Sur le disque D, dans le dossier
Robotique créez un nouveau dossier à votre nom. Puis dans ce dossier créez un dossier TP1. Pour rappel, dans la
salle B4 il n’y a pas d’accès au réseau pour des raisons de sécurité avec les robots. Vous travaillerez donc en local.
22
CHAPITRE 6. TRAVAUX PRATIQUES 23
Étape 2 : Lancez SRS et cliquez sur l’icône rond Staubli en haut à gauche et cliquez sur "Créer une nouvelle
cellule avec contrôleur".
−→ Nom : MaPremiereApplication. Sauvez l’application dans le dossier que vous avez créé appelé TP1.
Étape 4 : Sélectionnez un robot TX60 avec la fixation sol, la connexion horizontale, voyant et butée.
−→ Ne pas modifier les options du contrôleur local. Cliquez directement sur "Terminer".
−→ En haut de la fenêtre, observez les différents onglets : Accueil, VAL3, Modeleur, Simulation.
Pour la suite s’il vous manque des fenêtres parce qu’elle ont été fermé, retourner dans Accueil
puis "Général" et vous pourrez retrouver toutes les fenêtres (Cellule, Données, Géométrie, Pro-
priétés...).
Étape 6 : Dans le menu cellule (à droite, voir Fig. 6.2), faites un clic droit sur Controller1 et cliquer sur "Nou-
velle application".
−→ Nom : Depalettisation. Surtout ne rien remplir dans la zone "Destination" ! (voir Fig. 6.1).
Étape 8 : Dans le menu "Données" (voir Fig. 6.2) nous allons créer les variables nécessaires à notre programme.
Étape 9 : Dans le menu cellule, cliquez sur le fonction start. Une fenêtre va s’ouvrir.
CHAPITRE 6. TRAVAUX PRATIQUES 24
−→ Ecrivez le code suivant dans la fonction start. Pour rappel la fonction start est la fonction princi-
pale automatiquement appelée lors du lancement de l’application (la fonction start est équivalent du main en C).
begin
movej(jDepart,ventouse,rapide)
movej(jFinal,ventouse,rapide)
waitEndMove()
end
−→ Vous devez obtenir aucune erreur ce qui veut dire que la syntaxe du code est bonne.
Étape 11 : S’il n’y a pas d’erreur, lancer la simulation, sinon lisez la description de l’erreur et corrigez la...
Étape 12 : Dans le simulateur de teach (Fig. 6.3.b) cliquez 3 fois sur le cercle blanc et jaune.
−→ Le logo bleu doit changer. Sélectionnez le carré bleu indique que le mode sélectionné est : automatique.
Étape 13 : Dans le simulateur de teach. Mettre le robot sous tension (rond blanc trait noir) et cliquer sur "move".
−→ Le bras doit se déplacer. Vous avez créé votre première application de robotique !
−→ Si le robot ne bouge pas... reportez-vous à la partie 5 quelques pages plus loin.
Étape 14 : Nous allons maintenant créer l’outil et un objet dans le simulateur. A l’aide de l’outil de dessin
(onglet Modeleur), créez la ventouse nécessaire à la manipulation d’objet. Elle sera représentée par un cylindre
dans votre cas pour simplifier.
Étape 15 : Lorsque le cylindre a la bonne taille (fenêtre Propriétés), le définir en tant qu’outil (clic droit).
Étape 16 : En mode édition placez le repère handler (côté prise) et le repère handle (côté robot).
−→ Les 2 repères doivent être centrés sur les faces avant et arrière de l’outil et avoir l’axe Z dans le même
sens. L’axe Z doit être parallèle à la longueur du cylindre (voir exemple Fig. 6.4).
Étape 17 : Sortez du mode édition et attachez l’outil au robot (clic droit sur l’outil).
−→ Vérifiez que le repère handler de l’outil est bien placé. Le handler doit correspondre à la figure 6.5.
Étape 18 : Initialisez la donnée outil dans la variable de type tool ventouse avec les données de l’outil. (faites
un clic droit sur le handler de l’outil puis cliquez sur "copier les données de l’outil" et collez dans ventouse).
Étape 19 : Créez un objet avec le modeleur (côté 50 mm) et le définir en tant que nouvelle pièce (clic droit).
Étape 20 : Placez l’objet dans une bonne position dans la scène. Faites un clic droit sur l’objet et cliquez sur
"Editer la position" (voir Fig. 6.7). Lorsque l’objet est placé, vérifiez que le robot peut l’atteindre en déplaçant
CHAPITRE 6. TRAVAUX PRATIQUES 26
(a) (b)
Figure 6.4: Un dessin du handle et du handler de la ventouse tel qu’ils doivent être. a) handle, b) handler.
Figure 6.6: L’objet cubique que l’on va manipuler avec son repère handle.
automatiquement le bras sur l’objet (clic droit sur le handle de l’objet et "Déplacer à".
−→ Si le robot ne se positionne pas sur l’objet avec la partie basse de la ventouse (le hand-
ler ). Faites un clic droit sur handler et cliquez sur définir comme TCP courant.
Étape 21 : Dans les données, créez une donnée pPrise (type PointRx ) puis (clic droit sur votre point de prise)
puis cliquez sur "ici" pour affecter la position courante du robot simulé dans la variable pPrise.
Étape 22 : Ajoutez un movej vers pPrise entre les movej vers jDepart et jFinal. Lancez la simulation.
Étape 23 : Sauvegardez la position initiale de l’objet dans l’onglet "Simulation". Vous pourrez ainsi le replacer
au point de départ facilement avant la réexécution du code en cliquant sur "ramener l’objet en position initiale"
s’il a été déplacé.
Étape 24 : Dans la fenêtre "Environnement de simulation" faites un clic droit sur tool, et cliquez sur "Configurer
l’équipement" pour définir les fonctions open et close (Fig. ?? et 6.8).
Étape 25 : Ajoutez dans la fonction start un open(ventouse) après le movej vers pPrise. L’objet doit avoir été
attrapé.
Étape 26 : Déplacez manuellement l’objet à une autre position et amenez le robot sur ce point.
Étape 27 : Définissez une variable pDepose (type pointRx ) et cliquez sur "ici" pour enregistrer cette position
du robot.
Étape 28 : Modifiez le code en ajoutant un appel à la fonction : close(ventouse) pour lâcher l’objet.
Étape 29 : Testez votre programme qui prend l’objet et le dépose en un autre point. Faire valider votre simula-
tion par l’enseignant présent.
Lors de la programmation de vos applications, vous aurez principalement deux types de problèmes :
— des problèmes de compilation qui empêche le fonctionnement de l’application.
— des problèmes de destination impossible lors de l’exécution due à une erreur dans les coordonnées d’un
point 3D à rejoindre.
CHAPITRE 6. TRAVAUX PRATIQUES 28
Problème de compilation : Sous SRS, la compilation est faite implicitement lors de l’exécution du programme.
Si vous avez un problème de compilation, le programme affichera une erreur comme celle présentée sur la figure
6.9.a. Ce problème provient la plupart du temps d’une erreur de syntaxe :
— nom de variable ou nom de fonction erronés,
— variable ou fonction non déclarée,
— paramètre manquant ou en trop lors de l’appel à une fonction,
— boucle ou structure de contrôle non fermée,
— attribut non existant pour un type donné...
Problème de destination : En VAL3, les fonctions de déplacements movej et movel prennent en paramètres
des jointrx ou pointrx. Dans le cas du pointrx la fonction doit calculer les positions des articulations pour
rejoindre la position de l’outil envoyée en paramètres. Si cette position/orientation n’est pas possible pour le
robot vous obtiendrez l’erreur présentée sur la figure 6.9.b. L’exemple le plus courant est d’envoyée à la fonction
movej une variable de type point non initialisée c’est à dire contenant le point 0 0 0 0 0 0. Ce point étant situé
dans le robot lui-même (au centre du repère world) un déplacement de l’outil à cet endroit est impossible.
Figure 6.9: Les deux erreurs les plus courantes sous SRS.
CHAPITRE 6. TRAVAUX PRATIQUES 30
Étape 1 : A partir du TP1, faites un copier-coller la première pièce et construisez une pile de pièce respectant
une distance constante entre les pièces dans le but de pouvoir modifier les points de prise et dépose dans une
boucle (voir Fig. 6.10).
Étape 2 : Créez deux autres variables de type pointrx appelés pPriseTemp et pDéposeTemp. On y affectera la
valeur de pPrise et pDepose au début de la fonction start.
Étape 3 : N’utilisez plus pPrise et pDepose par la suite. Utiliser seulement pPriseTemp et pDeposeTemp que
l’on modifiera pour aller chercher un autre objet de cette manière :
pPriseTemp.trsf.z=pPriseTemp.trsf.z+50
Étape 4 : Complétez ce code de simulation pour prendre 9 objets empilés et les placer sur une palette (voir Fig.
6.10).
Étape 5 : Ajoutez un mdesc lent (vitesse 5) pour les passages par les points d’approche et de dégagement que
nous allons créer par la suite. Dans l’aide cherchez le détail de la fonction appro.
CHAPITRE 6. TRAVAUX PRATIQUES 31
Haute vitesse
Faible vitesse
P1
P2 P4
P3
P5
Étape 6 : Modifiez la fonction Mouvement en ajoutant le passage par des points d’approches (voir Fig. 6.11).
Pour passer par le point P2 sans ajouter un niveau point on utilisera la fonction appro comme dans l’exemple
suivant :
movej(appro(P3,{0,0,-100,0,0,0},ventouse,rapide)
movel(P3,ventouse,rapide)
Étape 8 : Modifiez le code pour prendre maintenant 4 objets pour les placer dans un meuble comme sur la figure
6.12.
Étape 9 : Faites valider votre code qui range 4 objets dans un meuble.
.
CHAPITRE 6. TRAVAUX PRATIQUES 32
Étape 2 : Importez le modèle de l’outil pince (voir figure 6.13) et l’attachez au robot.
Étape 4 : Créez un objet cylindrique (R 30 mm, H 30 mm) et construisez vos piles en les espaçant de 100mm.
Chaque pile d’objet contiendra 3 objets et sera de couleur distincte (Rouge, Vert, Bleu). Voir figure 6.14.
Étape 5 : Sauvegardez les positions initiales. Faites la prise de point des points de prise et de dépose.
Étape 6 : Créez une nouvelle fonction (clic droit "Ajouter nouveau programme"). Attention juste écrire le
nom de la fonction sans rien spécifier la variable Disk. On appellera cette fonction Deplacer. Copier-
coller le code de manipulation d’un objet du TP précédent (étape 16).
Début
movej(jDepart,pince,rapide)
CHAPITRE 6. TRAVAUX PRATIQUES 33
call Deplacer(pPrise,pDepose)
movej(jFinal,ventouse,rapide)
waitEndMove()
Fin
Étape 9 : Créez une donnée de type chaîne de caractères (string) qui encode les couleurs demandées.
Étape 10 : Afficher le code ASCII de toutes les lettres de la chaîne avec la fonction put pour vérifier votre code.
Le code ASCII des caractères est : R=82, G=71, B=66.
−→ Pour obtenir le code ASCII d’une lettre utilisé la fonction asc. Voir dans l’aide l’utilisation de la
fonction asc.
Étape 11 : En fonction du code ASCII de la lettre de la chaîne mettre à jour le point de prise et en fonction de
l’indice du caractère traité mettre à jour le point de pose.
Étape 12 : Testez la prise et la dépose du premier objet. Modifiez la chaîne de caractère et vérifier que la couleur
de la pièce prise correspond à la couleur demandée dans la chaîne.
Étape 13 : Modifiez le point de dépose après la dépose d’une pièce. Le point de dépose des pièces suivantes sera
espacé de 20mm. Effectuez le déplacement des 6 pièces demandée par l’utilisateur.
−→ Regardez dans l’aide pour obtenir les détails sur la fonction get.
Étape 15 : Testez puis faites valider votre code l’enseignant. Vous devez obtenir un résultat similaire à celui
présenté figure 6.15.
Figure 6.16: Les différentes étapes pour la résolution du problème des tours de Hanoï avec 3 disques.
Ce TP a pour but de vérifier votre maîtrise des points de prise et de dépose. On écrira un code général qui
permet la résolution pour n disques. L’algorithme qui vous est fourni vous donnera directement le nombre de
coup minimum.
Étape 2 : Créez 4 objets cylindriques (R 30-45-60-75 mm, H 50 mm) et construire votre pile de départ sur le
piquet 0.
Étape 4 : Créez une ventouse simple (un cylindre), attachez la au robot et configurez la.
Étape 5 : Attrapez puis déposez le premier objet à 100 mm dans la direction de votre choix pour vérifier que la
prise d’objet fonctionne (voir figure 6.17). Le troisième point de dépôt sera placé à 200mm de la première pile
dans la même direction.
Étape 6 : Copiez le code suivant dans la fonction start. Ce code met le robot en position initiale, initialise les
variables et appelle la fonction récursive Hanoï pour 4 disques. La pile de départ étant la pile 0, la pile finale la
pile 2 et la pile intermédiaire la pile 1.
begin
cls()
call Hanoi(3,0,2,1)
waitEndMove()
end
Étape 7 :Créez une nouvelle fonction appelée Hanoï avec les 4 paramètres suivant : num nb, num D, num A,
num I.
−→ Clic droit "Ajouter nouveau programme" pour créer la fonction puis clic droit sur la fonction et
"Ajouter nouveau paramètre" pour créer les paramètres. Attention ! L’ordre des paramètres est très im-
portant ! Pour rappel lors de la création de la fonction ne rien spécifier la variable Disk.
begin
if(nb>0)
call Hanoi(nb-1,D,I,A)
call Deplacement(D,A)
call Hanoi(nb-1,I,A,D)
endIf
end
Étape 9 : Créez la fonction Deplacement avec les paramètres suivants : num D, num A.
Début
put(D)
put(A)
put(" ")
Fin
−→ Les éléments affichés le sont dans le menu simulation ou s’affiche aussi les messages d’exécution (par
exemple "mouvement invalide") mais dans la partie utilisateur. Pour obtenir l’affichage utilisateur cliquer sur
le bouton "user". Pour revenir à l’affichage d’erreur d’exécution cliquer sur "menu".
−→ Pour illustration, l’appel à la fonction Hanoi avec les paramètres 3,1,3,2 entraîne les appels récursifs
suivants :
Hanoi(3, 0, 2, 1)
Hanoi(2, 0, 1, 2)
Hanoi(1, 0, 2, 1)
Hanoi(0, 0, 1, 2)
Déplacer 0 vers 2
Hanoi(0, 1, 2, 0)
Déplacer 0 vers 1
Hanoi(1, 2, 1, 0)
Hanoi(0, 2, 0, 1)
CHAPITRE 6. TRAVAUX PRATIQUES 36
Déplacer 2 vers 1
Hanoi(0, 0, 1, 2)
Déplacer 0 vers 2
Hanoi(2, 1, 2, 0)
Hanoi(1, 1, 0, 2)
Hanoi(0, 1, 2, 0)
Déplacer 1 vers 0
Hanoi(0, 2, 0, 1)
Déplacer 1 vers 2
Hanoi(1, 0, 2, 1)
Hanoi(0, 0, 1, 2)
Déplacer 0 vers 2
Hanoi(0, 1, 2, 0)
Vous devez obtenir donc 02 01 ce qui signifie "Déplacement d’un disque de la pile 0 vers la pile 2, déplacement
d’un disque de la pile 0 vers la pile 1..." Cette information permet de savoir au fur et à mesure la colonne ou
l’on prend et la colonne ou l’on dépose le disque. Pour résoudre le jeu en simulation, il nous manque la hauteur
de prise et de dépose.
Étape 11 : Créez un tableau de dimension 3 contenant des num appelé TabHauteur. Ce tableau contiendra le
nombre de disques par pile au fur et à mesure de la résolution du jeu. Dans la fonction start initialiser ce tableau
avec les valeurs suivantes :
TabHauteur[0]=3
TabHauteur[1]=0
TabHauteur[2]=0
Étape 12 : Modifiez le code de la fonction Deplacement de manière à calculer puis afficher le nombre de disque
par pile au fur et mesure que l’on déplacer les disques. On affichera donc le nombres de disque par pile de la
manière suivante :
Étape 13 : Le nombre de disque par pile donne une information sur la hauteur de prise. Compléter la fonction
Déplacement pour calculer à chaque étape la valeur du point de prise et du point de dépose.
Étape 14 : Dans cette fonction, faites ensuite appel à une nouvelle fonction Mouvement qui déplace une pièce
en utilisant des movej et movel et des appro. Cette fonction aura 2 paramètres : un pointrx pPriseHanoi et un
pointrx pPoseHanoi.
Étape 15 : Testez votre code. Une étape intermédiaire et l’étape finale sont présentées ci-dessous.
Figure 6.18: Gauche : position intermédiaire de la simulation, Droite : position finale de la simulation
Étape 1 : Créez un nouveau projet SRS et choisir le robot TP80 (n’importe quelle version).
Étape 2 : Créez votre application et faire bouger le robot. Faites ensuite varier les positions cartésiennes pour
vérifier l’espace de travail du robot.
−→ Attention avec le robot TP80 qui est un robot 4 axes, on n’utilisera pas des pointrx ou
jointrx comme sur les robot 6 axes mais des pointrs ou jointrs. Attention également à la faible portée
du robot en Z seulement 50mm.
Étape 3 : Créez une ventouse cylindrique (R 25mm, H 50mm), l’attacher au robot et la configurer.
Étape 4 : Créez 2 pièces (une blanche et une noire) à attraper en simulation (R 25mm, H 10mm). Voir exemple
figure 6.20.
Étape 5 : Créez un pointrs pPriseBlanc (jeton blanc) et pPriseNoir (jeton noir) et faire une prise de point.
Sauvegardez les positions initiales des 2 pièces.
Étape 7 : Testez la prise de la pièce blanche et sa dépose sur le point de dépose correspondant. Ensuite testez
la prise de la pièce noire et sa dépose sur le point de dépose correspondant.
Étape 8 : Créez une chaine de caractère contenant la couleur de la pièce qui servira à choisir le point de dépose.
Étape 9 : Créez une variable pointrs pRef qui représente le point P sur la figure 6.19. Déplacez la pièce blanche
et faire la prise de point. Ensuite replacer la pièce blanche à sa place.
−→ Ce point pRef doit être positionné en haut à gauche des deux pièces.
Étape 10 : Créez des variables de type num appelées couleur, xposblanc, yposblanc, xposnoir, yposnoir. Cal-
culez les différences en xposblanc et yposblanc entre pRef et pPriseBlanc, et xposnoir et yposnoir entre pRef
et pPriseNoir. Ces décalages qui seront ajouter à pRef attraper la pièce blanche ou la pièce noire sans utiliser
pPriseBlanc et pPriseNoir.
Étape 11 : Créez des variables de type num appelées couleur, x et y. Créez pour chacun une variable chaîne
de caractère contient chaque valeur. Par exemple, ch1 = [300]. Ensuite écrire une fonction pour extraire leurs
valeurs numériques à partir de la chaîne de caractères de taille 3. Vérifier en affichant les num dans la console.
−→ Pour convertir une suite de caractères numériques en num on utilisera encore la fonction asc auquel
on retranchera 48 (48 étant le code ASCII de zéro).
Étape 12 : Créez une chaîne qui contiendra 9 caractères : la couleur de la pièce, un espace, le décalage en x
sur trois caractères, un espace, et le décalage en y sur 3 caractères pour attraper la pièce blanche à partir de pRef.
Étape 13 : Mettre à jour une nouvelle variable pPrise en fonction des décalages et une nouvelle variable pDepose
en fonction de la couleur. Vérifier le bon fonctionnement en vérifiant que le programme change la position de
prise et de dépose lorsque la chaîne change. Testez aussi la prise en envoyant la chaîne qui permettra de prendre
le jeton blanc.
Étape 14 : Ajoutez une boucle pour répéter ce comportement à l’infini. Testez votre code et le faire valider par
l’enseignant présent.
Étape 16 : Dans la console simulé du robot. Créer un socket TCP/IP, mode client avec l’adresse IP de la caméra,
le caractère de fin de chaîne 13, le délai maximum de 5s.
CHAPITRE 6. TRAVAUX PRATIQUES 39
Étape 17 : Dans les données de l’application créer maintenant une variable de type sio.
Étape 18 : Pour déclencher une prise d’image on va envoyer la chaîne de caractère "snap".
−→ Pour envoyer une donnée chaîne via le socket on fera : nom_sio = chaine_envoyee.
−→ Lorsque la caméra enverra une donnée, nous la récupérerons dans une variable de type string en
faisant : chaine_recue = nom_sio.
Étape 20 : Lorsque vous récupérez la chaîne, utilisez la ensuite pour modifier le comportement du robot. Testez
votre code et le faire valider par l’enseignant présent.
Annexe A
Ces exercices de TD ont pour but de réviser les notions d’algorithmique nécessaire au bon déroulement des Tps.
Vous devez savoir faire ces exercices avant le début des Tps. Répondez aux questions en pseudo code.
Ex 2 : Moyenne glissante
L’idée de moyenne glissante sur 3 valeurs est de créer à partir d’un signal de taille n, un nouveau signal de
même taille et d’associer à la valeur d’indice i du nouveau tableau, la moyenne des cases i-1 i et i+1 du tableau
initial (avec i allant de 1 à n-1 pour éviter les problèmes aux bords).
On suppose que l’on a un signal numérique représentant un Dirac défini par un vecteur de dimension 19 composé
de zéros partout sauf en position 9. On a donc S=[0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0].
— Q1. Ecrire une fonction qui permet à partir du signal d’entrée de construire une gaussienne comme sur la
figure A.1 avec une moyenne glissante de taille 3.
— Q2. Modifier votre fonction pour avoir une moyenne glissante de taille 5.
— Q3. Modifier votre fonction pour prendre en compte les effets de bords. Pour un élément du bord du
tableau on fera la moyenne sur les éléments existants seulement.
Ex 3 : Tri Bulle
Le tri à bulles ou tri par propagation est un algorithme utilisé pour classer par ordre croissant ou décroissant un
tableau de valeur. Il consiste à comparer répétitivement les éléments consécutifs d’un tableau, et à les permuter
lorsqu’ils sont mal triés. Il doit son nom au fait qu’il déplace à chaque parcours du tableau le plus grand élément
en fin de tableau, comme une bulle d’air qui remonterait à la surface d’un liquide. On répète ce parcours du
tableau tant que des déplacements sont nécessaires. Le tri à bulles est souvent enseigné en tant qu’exemple
d’algorithmique, car son principe est simple. Mais c’est le plus lent des algorithmes de tri, il n’est donc guère
utilisé en pratique.
40
ANNEXE A. EXERCICES DE REMISE À NIVEAU : ALGORITHMIQUE ET PROGRAMMATION 41
Ex 4 : Fibonacci
Du point de vue de la programmation, une fonction récursive est une fonction qui s’appelle elle-même dans sa
définition ; on parle également de définition récursive ou d’appel récursif de fonction.
La suite de Fibonacci est définie de la façon suivante :
— F0 = 0
— F1 = 1
— Fn = F (n − 2) + F (n − 1)
C’est une suite d’entiers dans laquelle chaque terme est la somme des deux termes qui le précèdent. Ses premiers
termes sont :
0, 1, 1, 2, 3, 5, 8, 13, 21...
— Q1. Ecrire un programme en C qui calcule puis affiche la suite de Fibonacci jusqu’au nombre n envoyé en
paramètre.
— Q7. Ecrire une fonction qui trie un tableau selon la méthode du tri bulle.
Figure A.2: Filtrage simple d’une image. a) image originale, b) image filtrée avec un filtre moyenne, c) image
de Sobel binarisée. On garde toutes les valeurs supérieures à un seuil.
— Q2. Ecrire une nouvelle fonction qui implémente la convolution avec le filtre gradient horizontal de Sobel
[-1 -2 -1 ;0 0 0 ;1 2 1].
— Q3. Ecrire une nouvelle fonction qui calcule la moyenne des deux images de gradients. Le résultat est
présenté sur la figure A.3.b.
— Q4. Ecrire une nouvelle fonction qui garde tous les pixels supérieurs à 200. Le résultat est présenté sur la
figure A.3.b.
Figure A.3: Filtrage convolutif sur une image. a) image originale, b) image filtrée avec un filtre de Sobel c)
image de Sobel binarisée.
Annexe B
43
Annexe C
44
Annexe D
Table ASCII
45
46