Conception SolidWorks
Le dispositif de contrôle de conformité géométrique a été intégralement modélisé sur SolidWorks.
Motorisation
Deux moteurs sont utilisés dans notre dispositif : un moteur pour le barillet de positionnement des molettes, un moteur pour la rotation des molettes lors de la prise de vue latérale. Il s'agit de moteurs intelligents Dynamixel AX-12A connectés à un ordinateur via une clé USB usb2dynamixel.
Les deux moteurs peuvent fonctionner selon deux modes distincts. Un premier mode "wheel" permet seulement de contrôler le couple du moteur : nous avons écarté ce mode de fonctionnement car il était difficile d'être précis sur la position finale des molettes. Nous avons choisi d'utiliser le second mode nommé "joint". Ce mode permet de définir une cible angulaire entre 0 et 300 degrés. Son inconvénient est de ne pas permettre une rotation complète du barillet (il existe une zone angulaire "morte" entre 300 et 360 degrés).
Caméra latérale
Référence de la caméra : Q-scope 80200-P, 8.0 millions de pixels, grossissement 10x-50x, filtre polarisant. Le grossissement 200x existe mais est plus difficilement exploitable (longueur focale élevée, profondeur de champ trop faible).
La résolution est de 3264x2448 pixels. L’objectif est de mesurer des détails de 10 microns, ce qui correspond à 1/100 de l’épaisseur de la molette. Pour que cela soit possible, il faut que l’épaisseur de la molette occupe au moins 300 pixels de hauteur à l’écran (précision à 3 pixels près), soit 1/10 de la largeur de l’image et le grossissement doit donc être important.
La molette doit être extrêmement proche de la caméra (moins de 1cm de la lentille frontale de l'objectif) et la collerette transparente doit être retirée. Le fil de découpe de la molette (sur le contour d’intérêt) doit être net (c’est sur ce fil que doit être réglée la mise au point).
Caméra frontale
Pour la prise de vue frontale/verticale, l’exigence de précision est moindre (la tolérance géométrique est plus grande). Cela explique le choix d'un montage plus souple et d'une caméra de qualité inférieure (la résolution des images est plus faible qu'avec la caméra latérale).
Référence de la caméra : microscope USB Bysameyee SB-NDD, 2.0 millions de pixels, grossissement 1000x.
La mise au point s'effectue en deux étapes. On commence par placer la molette à une distance intermédiaire de la caméra (la vis de réglage de hauteur doit pouvoir être tournée dans les deux sens de rotation). On fait ensuite une mise au point grossière à l'aide de la bague de mise au point intégrée à la caméra. La molette doit sembler "presque nette" sur l'écran. Enfin, on fait un réglage plus fin avec la vis de réglage de hauteur. On souhaite une mise au point au niveau du fil de découpe externe et interne de la molette.
Interface graphique
Le contrôle d’une molette est possible en utilisant l’application « CAMOL » développée en langage Python. La fenêtre principale est très facile d’utilisation et ne nécessite aucune connaissance préalable de l’opérateur en langage Python. Plus précisément, cette fenêtre dispose de deux boutons à cliquer : un bouton « contrôler une molette », un bouton « quitter l’application ». (ajouter une capture d’écran)
Un clic sur le bouton “contrôler une molette” lance le programme global de contrôle d’une molette : mise en mouvement du barillet, positionnement de la molette dans l’axe des caméras, commande électronique du moteur pour la prise de vue latérale, déclenchement des deux caméras et exportation des images, traitement et analyse des images, export des résultats dans un fichier Excel accessible à l'opérateur. Cette opération peut être renouvelée pour la molette suivante par un simple clic.
Le code source de l’application « CAMOL » utilise les packages Python os, sys, cv2 et PyQt5 (ces packages devront être installés et/ou importés sur l’ordinateur de l’opérateur avant de pouvoir exécuter le code). Le code complet et commenté de l'interface est présenté en annexe.
Interface de l'application CAMOL
Le traitement et l’analyse des images sont réalisés sur Python avec la librairie de Computer Vision “OpenCV”. L’utilisateur doit avoir préalablement installé les librairies suivantes : numpy, OpenCV 1, imutils 2, os.
TRAITEMENT DES IMAGES (VUE LATÉRALE)
Importation des librairies/fonctions utiles
import numpy as np
import cv2
import imutils
import os
from math import sqrt
Pré-traitement des images
L’image est convertie en niveaux de rouge, puis une rotation et un recadrage peuvent être effectués. Un seuillage (cv2.threshold, avec une valeur de seuil déterminée au préalable en fonction des conditions d’éclairage) permet d’obtenir une image binaire, isolant au mieux la molette du reste de l’image 3. À partir de cette image binaire, on détecte les contours fermés sur l’image (cv2.findContours), et on extrait la forme détectée de plus grande aire, afin d’éliminer le bruit dû aux petites zones d’ombres potentielles en arrière plan. On sélectionne l’enveloppe convexe du contour ainsi obtenu pour simplifier la forme (cv2.convexHull). En effet le contour est ensuite approximé par un polygone (cv2.approx), dont il est vérifié qu’il s’agit bien d’un hexagone pour que le traitement soit possible (un exception est levée si le polygone n’est pas un hexagone, et l’image n’est alors pas incluse dans l’analyse). On enregistre alors ces 6 sommets: les coordonnées 2D de ces 6 points d'intérêt permettent ensuite de déterminer les caractéristiques géométriques principales de la molette en vue latérale.
Ce pré-traitement et l’extraction des coordonnées d'intérêt de la molette sont réalisés sur l’ensemble des images d’une même molette (acquises successivement après rotation de la molette afin de couvrir l’ensemble de la tranche), et ces données sont ainsi stockées ensemble dans deux array numpy.
Extraction des caractéristiques de la molette
En vue latérale, les caractéristiques de la molette mesurées sont les suivantes : diamètre, épaisseur, angle d'affûtage, défaut de voile, parallélisme des faces. Les paramètres d'intérêts sont générés à partir des array numpy précédemment obtenus : les valeurs moyennes sont calculées (moyennes des paramètres entre les différentes images) ainsi que les variances, et, dans certains cas, les extrema des paramètres obtenus.
TRAITEMENT DES IMAGES (VUE VERTICALE)
Importation des librairies/fonctions utiles
import numpy as np
import cv2
from math import sqrt
Pré-traitement des images
L’image est convertie en niveaux de gris. Le contour de la molette et de l'alésage sont successivement détectés et approximés par des cercles à l'aide une fonction OpenCV utilisant la transformée de Hough (cv2.HoughCircles), avec des paramètres fixés différents.
Extraction des caractéristiques de la molette
En vue verticale, les caractéristiques de la molette mesurées sont les suivantes : diamètre de la molette, diamètre de l'alésage, concentricité entre la molette et l'alésage.
Géométrie
Différents paramètres calculés, méthodes de calcul, etc.
Annexe 1 - Code Python
Annexe 2 - Suggestions d'améliorations
> La précision des instruments de mesure et la possibilité de les régler manuellement pourraient faire l'objet d'une attention particulière. Il serait notamment intéressant d'avoir accès à des caméras ou appareils photographiques ayant des résolutions plus élevées et une meilleure gestion numérique des hautes sensibilités. En effet, cela nous permettrait de fermer les diaphragmes des objectifs utilisés, d'augmenter considérablement la profondeur de champ et ainsi de gommer toutes les erreurs de détection liées aux zones floues des images.
> À l'heure actuelle, l'opérateur doit cliquer sur un bouton de l'interface à chaque fois qu'il souhaite contrôler une molette. Il serait tout à fait envisageable d'imaginer un système pour lequel l'opérateur ne clique qu'une seule fois et contrôle N molettes (avec N aussi grand que la capacité de charge du barillet). Cette amélioration n'a pas été mise en oeuvre dans le cadre du projet CAMOL à cause du nombre trop important d'erreurs liées à la position des molettes sur le barillet et à quelques erreurs récurrentes d'exécution du code Python.
> Il pourrait être intéressant d'optimiser notre code Python afin de diminuer le temps de calcul global (durée entre un clic sur le bouton "contrôler une molette" et l'export des résultats dans le fichier Excel). Certaines étapes du contrôle des molettes, notamment la prise de vue verticale, semblent encore prendre plus de temps que nécessaire.
> L'éclairage des molettes lors de la prise de vue pourrait être considérablement amélioré. Il faudrait concevoir un système d'éclairage plus sophistiqué qui permette aux algorithmes d'analyse d'images utilisés de distinguer plus facilement la molette de son support. Il s'agirait notamment de réduire l'intensité des reflets et d'éclairer de façon uniforme la molette avec une source relativement "diffuse". Une autre possibilité serait de changer la nature/couleur du matériau support afin d'augmenter le contraste entre la molette et le support.
> Il serait possible de se passer de la librairie OpenCV et de concevoir un programme de d'analyse d'images "maison" particulièrement adapté aux images de molettes Adler. Ce travail de programmation n'a pas été envisagé étant donné la durée relativement courte du projet mécatronique. Il pourrait toutefois s'agir d'un axe d'amélioration.
> machine learning ?
> étape de calibrage ?