Robot Delta avec asservissement visuel suite

De fablab
Aller à : navigation, rechercher

Description du sujet

  • Responsable : Stéphane Mancini ; stephane.mancini@imag.fr
  • Sujet:

Les robots delta sont les plus rapides car ce sont des robots dits 'parallèles', semblables à celui visible sur cette page: [1]

Robot delta.jpg
omron

Chacun des 3 bras du robot est contrôlé par un moteur fixe et la position de la tête du robot est directement liée aux angles de rotation de chacun des moteurs.

En comparaison, un robot séquentiel tel que celui de cette vidéo [2] nécessite le réglage de 5 axes de rotation et les moteurs de chaque axe se déplacent avec le robot. Les robots parallèles ont cependant l'inconvénient de supporter moins de charge et sont essentiellement utilisé pour la manipulation de petits objets.

Dans ce projet de Fablab, l'objectif est de réaliser un robot delta dont la position de la tête est asservie visuellement: une caméra est placée sur la tête du robot et le logiciel de contrôle du robot fera en sorte qu'elle soit capable de suivre un point lumineux qui se déplace.

Un objectif bonus serait de déplacer la tête du robot pour atteindre un objet détecté (sardine, patate, etc ...).

Concrètement, le robot delta sera construit à partir de pièces de modélisme (servomoteurs et rotules) et sera contrôlé par un logiciel sur carte Raspberry-Pi [3], avec sa caméra. [4].

RPI camera.jpg

La Raspberry-Pi est une carte constituée d'un processeur ARM connecté à de nombreux périphériques (entrée/sortie vidéo, etc ...). Il est possible d'installer un système d'exploitation Linux , distribution Raspbian, et se programme donc comme un PC. La caméra Raspberry-Pi est compatible avec toutes les bibliothèques classiques de traitement d'image dont OpenCV. Il est également possible de programmer les applications de traitement d'image et contrôle/commande en Python.

  • Vous serez formé aux différents aspects du projet et il n'est pas nécessaire d'être un initié, seule votre motivation pour découvrir de nouvelles applications suffit !
  • Les différentes tâches (mécanique, programmation, câblage), seront réparties dans l'équipe.
  • Vous partirez du robot réalisé l'année dernière, en résolvant les problèmes apparus

Introduction

Notre Projet est la suite d'un projet de l'année précédente, donc nous vous recommandons fortement d'aller voir la page web détaillée dédié à la présentation du travail que les anciens étudiants ont fait, en cliquant ce lien: ProjetRobotDelta2016-2017.

Notre travail de cette année est de baser sur le travail que les anciens élèves ont fait, et essayer de l'améliorer et l'avancer le plus possible que l'on peut.

Nous sommes une équipe de trois étudiants de trois nationalités différentes, nous sommes composé d'un français, un colombien et une chinoise et nous sommes réunis ici par intérêt sur ce projet. Nos langues maternelles peuvent être différentes, nos motivations initiales de participer à ce projet peuvent être différents, cependant notre objectif est commun, c'est d'attribuer une force chacun afin de bien réussir ce projet. Admettons les différences culturelles, nous faisons chacun des efforts afin de faciliter la communication au sein de l'équipe.

Comme nous voyons assez clairement les différentes parties dans le projet, qui sont le contrôle des moteurs, le traitement d'image et la partie mécanique, donc nous avons séparé nos tâches dès le début de ce projet. Dans les sections qui suivent, nous allons vous présenter chacun son travail dans sa partie.

Contrôle des servomoteurs

Une grande partie de ce projet consiste à contrôler simultanément les trois moteurs de robot en utilisant la carte Raspberry Pi et la carte PCA9685 16 sorties PWM.

Comme le début, personne entre nous avait des expériences sur l'utilisation de la carte de Raspberry Pi pour conduire des projets, nous avons tout d'abord fait des recherches sur Internet pour savoir comment faire fonctionner les moteurs en utilisant ces deux cartes. Nous avons trouver un site web qui nous aide beaucoup à démarrer la réalisation. Vous pouvez le consulter en cliquant ce lien: Raspberry et carte PCA9685 16 sorties PWM.

En suivant ce tutoriel, nous avons d"abord installer les bibliothèques nécessaires qui permet de vérifier la présence de la carte en ligne de commande(python-smbus et i2c-tools). Et également, il faut pas oublier de configurer le port I2C enabled dans la carte Raspberry Pi.

SMBus (System Management Bus) est un sous-ensemble du protocole I2C. Lors de l'écriture d'un pilote pour un périphérique I2C, essayez si possible d'utiliser les commandes SMBus (si le périphérique utilise uniquement ce sous-ensemble du protocole I2C) car il est possible d'utiliser le pilote de périphérique sur les cartes SMBus et I2C.

Le port I2C0 ou I2C1 est l'un des suivants:

    sudo i2cdetect -y 0
    //or
    sudo i2cdetect -y 1

L'adresse I2C à 7 bits de tous les périphériques trouvés sera affichée (en ignorant le bit R / W, l'adresse I2C 0000 0110 est affichée sous la forme hex 03).

Et nous réalisons finalement le câblage comme la figure montrée ci-dessous.

PCA9685 2 bb.jpg


Les servomoteurs sont pilotés par un fil de commande et alimentés par deux autres fils. Habituellement, ces 3 fils sont rassemblés dans une prise au format standard.

Nous avons ainsi compris le fonctionnement du servomoteur en lissant la page wikipédia: Servomoteur. Les servomoteurs sont des actionneurs très utilisé en modélisme et dans l'industrie. Ils sont commandés par l'intermédiaire d'un câble électrique à trois fils qui permet d’alimenter le moteur et de lui transmettre des consignes de position sous forme d’un signal codé en largeur d'impulsion plus communément appelé PWM. Cela signifie que c'est la durée des impulsions qui détermine l'angle absolu de l'axe de sortie et donc la position du bras de commande du servomoteur. Le signal est répété périodiquement, en général toutes les 20 millisecondes, ce qui permet à l'électronique de contrôler et de corriger continuellement la position angulaire de l'axe de sortie, cette dernière étant mesurée par le potentiomètre.

Lorsque le moteur tourne, l'axe du servomoteur change de position, ce qui modifie la résistance du potentiomètre. Le rôle de l'électronique est de commander le moteur pour que la position de l'axe de sortie soit conforme à la consigne reçue : c'est un asservissement.

Après avoir bien compris le fonctionnement du servomoteur et bien câblé les cartes, nous pouvons maintenant passer à l'étape suivante, c'est de les programmer pour que l'ensemble peut bien fonctionner comme il faut.

De nombreux servomoteurs utilisent une fréquence PWM de fréquence = 50 Hz correspondant à une période PWM de T = 20 ms. La relation entre l'impulsion et la direction est linéaire et dépend du moteur et de l'engrenage.

Exemple:

Servomot1.png
Servomot3.png
700ox

En adaptant ce formule cette équation, il nous suffit de lui donner la valeur de a et la valeur de b dans notre cas, par la suite, nous pouvons facilement changer de la direction de moteur à n'importe quel angle qu'on veut.

Traitement d'image

Quant à l'analyse d'image nous avons fait le même traitement que les étudiants du projet précédent ont fait avec des petites modifications que nous allons énumérer ici. Mais tout d'abord nous allons vous présenter une synthèse de l'algorithme utilisé.

  • Nous avons utilisé cvtColor afin de transformer l'image en une Gray scale image, cette étape est vraiment importante, étant donné que nous allons trouver bords dans l'image.
  • Ensuite nous avons filtré l'image dans le but de diminuer le bruit présent : GaussianBlur
  • L'utilisation de la commande canny va nous donner finalement les bords de l'image, et la commande contours va nous renvoyer tous les objets présents dans l'image.
  • Après la procédure précédent il suffit d'ajouter les contours à l'image (drawContours) et la montrer sur l'écran (imshow) le résultat est montré dans la Figure 1.
Figure 1 : Points détectés par l'algorithme de traitement d'image

Différences principales

  • Avant la méthode pour trouver les points dans l'image était vraiment lourde, en fait il s'agissait de deux cycles for qui parcourraient chaque pixel de l'image. En conséquence le temps de traitement était réellement longe. Nous avons utilisé la commande contours qui a le même résultat mais il est plus rapide, étant donné que l'algorithme présent dans la librairie d'Opencv est compilé en langage C.

FAQ

  • La caméra de la Raspberry ne marche pas :
    • Il faut s'assurer que la caméra est bien branchée Installation caméra raspberry py
    • Après il faut lancer la commande raspi-config, interfacing options, enable camera pour activer le support de caméra à la carte raspberry.
    • Si le caméra fonctionne avec d'autres applications mais toujours pas avec Opencv il faut lancer la commande sudo modprobe bcm2835-v4l2 dans la console pour donner les droits d'accès à la caméra à Opencv.
  • Quelle version d'Opencv a été utilisée :
    • La version que nous avons utilisé est la version 2.4.10.

Kinematics

Pour cette partie nous avons trouvé une page web Rotary Delta Robot Forward/Inverse Kinematics Calculations laquelle est vraiment utile au moment de calculer les équations de mouvement du robot. , Pour commencer il suffit de mesurer les extrémités du robot delta est les inclure dans le formulaire présent dans la page. En plus, nous pouvons réaliser la même opération avec les positions de chaque axe et de cette manière vous allez obtenir les angles de chaque servomoteur.

Ensuite au moment d'introduire les angles de chaque moteur, nous allons obtenir la position relative aux trois axes X, Y, Z.

Figure 1 : Calculer les positions relatives avec les angles
Figure 2 : Formulaire Kinematics

Amélioration de robot

En ce qui concerne le robot nous avons effectué quelques améliorations par rapport à la version précédente.

Tout d’abord nous avons découpé au laser une plaque que l’on a fixé en dessous de la nacelle et sur laquelle on a fixé la caméra. En effet, la caméra n’etait pas bien fixé et le mouvement du robot faisait bouger la caméra.

Ensuite nous avons modifier la position du Raspberry Pi sur la nacelle. En le plaçant verticalement au centre de la nacelle il ne gènes plus les mouvements des bras du robot.

Enfin nous avons ajouter de vrais rotules au bout des bras du robot pour que le mouvement soit plus précis et pour éviter les vibrations.

Toutes ces améliorations nous ont permis d’avoir un robot plus robuste et plus stable notamment lors de mouvement rapide.

Difficultés rencontrés

Aspect technique
  • Projet combiné de plusieurs diciplines
  • Peu de connaissances du fonctionnement de la carte Raspberry Pi
  • Souci rencontré lors de la réalisation
    • Problème de l’alimentation
    • Tremblement innatendu d’un moteur
Aspect d’organisation
  • Pas assez de temps commun en dehors de travail
  • Besoin d’être présent au Fablab pour pouvoir tester le robot
  • Temps de travail limité

Code Source

Nos fichiers de code ainsi que quelques images de test peut être récupérés dans l'archive suivante : Fichier:CodeSource2018.tar.gz .

NB : Aucune bibliothèque de programmation n'a été jointe à cette archive et le code est compatible avec la version 2.7 de Python, mais pas nécessairement avec une version 3.X.