IMA3/IMA4 2021/2023 P9 : Différence entre versions
Ligne 19 : | Ligne 19 : | ||
− | =<div class="mcwiki-header" style="border-radius: 15px; padding: 15px; font-weight: bold; color: #0000000; text-align: center; font-size: 80%; background: #d4d0d0; vertical-align: top; width: 98%;"> Objectifs du | + | =<div class="mcwiki-header" style="border-radius: 15px; padding: 15px; font-weight: bold; color: #FFFFFF; text-align: center; font-size: 80%; background: #dc143c; vertical-align: top; width: 98%;"> SEMESTRE 7 </div>= |
+ | |||
+ | =<div class="mcwiki-header" style="border-radius: 15px; padding: 15px; font-weight: bold; color: #0000000; text-align: center; font-size: 80%; background: #d4d0d0; vertical-align: top; width: 98%;"> Objectifs du semestre 7 </div>= | ||
Se familiariser avec le Robot NED 1 et sa bibliothèque PyNiryo en testant plusieurs applications. | Se familiariser avec le Robot NED 1 et sa bibliothèque PyNiryo en testant plusieurs applications. | ||
Ligne 444 : | Ligne 446 : | ||
− | =<div class="mcwiki-header" style="border-radius: 15px; padding: 15px; font-weight: bold; color: # | + | =<div class="mcwiki-header" style="border-radius: 15px; padding: 15px; font-weight: bold; color: #000000; text-align: center; font-size: 80%; background: #d4d0d0; vertical-align: top; width: 98%;"> Etat d'avancement du SEMESTRE 7 </div>= |
===Séance du 10.10.2022=== | ===Séance du 10.10.2022=== | ||
Ligne 488 : | Ligne 490 : | ||
== Planning du S8 == | == Planning du S8 == | ||
[[Fichier:Gantt.png|500px]] | [[Fichier:Gantt.png|500px]] | ||
+ | |||
+ | |||
+ | |||
+ | =<div class="mcwiki-header" style="border-radius: 15px; padding: 15px; font-weight: bold; color: #FFFFFF; text-align: center; font-size: 80%; background: #dc143c; vertical-align: top; width: 98%;"> SEMESTRE 8 </div>= |
Version du 16 mai 2023 à 15:59
Sommaire
- 1 Sommaire
- 2 SEMESTRE 7
- 3 Objectifs du semestre 7
- 4 NIRYO NED 1 AVEC PYNIRYO 1
- 5 Traitement d'image et Aphelion
- 6 Aphelion, un logiciel pour le traitement d’image
- 7 Le traitement d’image, qu’est ce que c’est?
- 8 Prétraitement : amélioration de la qualité de l’image (Amélioration et Restauration d’images)
- 9 Restauration de l’image:
- 10 Analyse : extraction de l'information essentielle dans l’image (Segmentation)
- 11 Etat d'avancement du SEMESTRE 7
- 12 Perspectives
Sommaire
1 - Semestre 7 :
I- Objectifs du semestre 7
II- Robot Nyrio NED1
III- Traitement d'image et Aphelion
IV- Etat d'avancement
V- Perspectives pour le Semestre 8
2 - Semestre 8 :
I- Contexte et objectifs du semestre 8
II- Notes opérationnelles
III- Etat des lieux
IV- Rapport d'avancement
V- Présentation des résultats (vidéo)
SEMESTRE 7
Objectifs du semestre 7
Se familiariser avec le Robot NED 1 et sa bibliothèque PyNiryo en testant plusieurs applications.
Utilisation de la caméra et l'obtention de plusieurs images qui vont nous servir pour le traitement d'image.
Expérimenter le traitement d’image avec le logiciel Aphelion.
Tenter de contrôler le robot à travers le logiciel Aphelion.
NIRYO NED 1 AVEC PYNIRYO 1
Le Robot
Ned est un bras robot collaboratif 6 axes conçu pour l’éducation et la recherche. Ned est conçu pour reproduire tous les mouvements requis dans les utilisations les plus avancées de l’industrie 4.0, avec une précision et une répétabilité de 0.5mm. La structure en aluminium de Ned lui confère une robustesse exemplaire, lui permettant d’accomplir avec fluidité les mouvements nécessaires à vos projets de robotique. Ce robot tire pleinement profit des capacités de la Raspberry Pi 4, avec un processeur 64-bit ARM V8 haute performance, 2Go de RAM, et une connectivité améliorée. Ned est un robot basé sur Ubuntu 18.04 et ROS (Robot Operating System) Melodic, une solution open-source complète conçue pour la robotique. Avec ROS, Ned dispose d’un ensemble de librairies permettant de concevoir des programmes les plus simples aux plus complexes pour répondre à vos besoins de manière flexible.
Les spécifications techniques des outils de Ned
Avec le système Easy Connect, changer d’outil n’a jamais été aussi simple. Il vous suffit de brancher votre outil, de connecter son câble et il est prêt à être utilisé. Ned est fourni avec un Gripper Custom. Ses mors standards peuvent manipuler de petits objets, et si vous possédez une imprimante 3D, vous pouvez créer vos propres mors.
Ned peut également être utilisé avec :
- Le Gripper Large qui a la capacité de saisir des objets plus gros tout en gardant la possibilité de se fermer entièrement.
- Le Gripper Adaptatif qui permet au robot de saisir des objets non standards avec des formes complexes (ex. un œuf).
- La Pompe à vide pour saisir des objets avec des surfaces planes et non poreuses. L’Électroaimant utile pour manipuler de un à plusieurs objets métalliques (ex. vis, boulons…).
- L’écosystème de Ned est conçu pour vous permettre de reproduire des cas d’utilisation avancés de l’industrie 4.0
- 2.7 si vous utilisez Python 2
- 3.6 si vous utilisez Python 3
Les spécifications techniques du Gripper Custom
Spécifications techniques de Ned
Interface mécanique
Ned est un bras robot 6 axes collaboratif. Il se compose de six articulations robotisées en aluminium recouvertes de plastique. Ned comprend 7 parties :
Espace de travail - Ned
Logiciel
Ned est un robot basé sur Raspberry, Arduino & ROS. Il utilise ROS afin de créer une interface entre le matériel et les liaisons de haut niveau. Voici sur le schéma suivant un aperçu global du logiciel de Ned afin de comprendre où sont placées chaque partie du logiciel.
PyNiryo est une API TCP créée avec Python, qui permet aux développeurs de créer des programmes robotiques et de contrôler les robots en communiquant à distance par le biais de leurs ordinateurs. Contrairement au Wrapper ROS Python, l’utilisateur ne nécessitera pas d’être connecté au robot par le biais d’un terminal.
Avant de programmer avec la bibliothèque PyNiryo 1, il faut avoir installé le langage de programmation Python sur son ordinateur. La version doit être égale ou supérieure:
Après, on vous montre quelque exemple du code avec PyNiryo 1:
Premier code pour tester le fonction de base
from pyniryo import* #l'adresse 'robot_ip_address' depend de son connection #avec le robot #si Connexion ethernet directe: 169.254.200.200 #si Mode Hotspot: 10.10.10.10 #si Simulation ou directement sur le robot: 127.0.0.1 #si l'Ordinateur et robot sont connectés au même routeur: il faut trouver #l'addresse IP du robot dans le VLAN robot_ip_address = "10.10.10.10" #connecter avec le robot et calibrer le robot = NiryoRobot(robot_ip_address) robot.calibrate_auto() #bouger les axes robot.move_joints(0.2, -0.3, 0.1, 0.0, 0.5, -0.8) #allumer le mode learning robot.arm.set_learning_mode(True) #arrêter le connection TCP robot.close_connection()
- Dans la ligne 1 on importe toutes les fonctions de la bibliothèque ‘pyniryo’.
- Dans la ligne 12 on définit l’adresse du robot, qui dépend de notre connexion avec Ned.
- Dans la ligne 15 on crée une instance de la classe NiryoRobot avec l’adresse IP correspondante pour avoir l’accès à toutes les fonctions du robot.
- Dans la ligne 16 on démarre une calibration automatique des moteurs si les moteurs n’ont pas encore été calibrés.
- Dans la ligne 19 on bouge les 6 axes du robot en donnant la position des 6 axes en radians (6 floats)
Il a y aussi le possibilité de bouger les robots avec:
'NiryoRobot.move_pose(x, y, z, roulis, tangage, lacet)’
x,y,z (floats) sont exprimés en mètres et roulis, tangage, lacet (floats) sont exprimés en radians
- Dans la ligne 22 on allume ‘learning mode’, qui nous permet de bouger Niryo au main et récupère la position
- Dans la ligne 25 on arrête la connexion avec Niryo
Code pour utiliser le gripper
from pyniryo import* robot_ip_address = "x.x.x.x" # Robot address # The pick pose pick_pose = PoseObject( x=0.25, y=0., z=0.15, roll=-0.0, pitch=1.57, yaw=0.0) # The Place pose place_pose = PoseObject( x=0.0, y=-0.25, z=0.1, roll=0.0, pitch=1.57, yaw=-1.57) def pick_n_place_version_2(robot): height_offset = 0.05 # Offset according to Z-Axis to go over pick & place poses gripper_speed = 400 pick_pose_high = pick_pose.copy_with_offsets(z_offset=height_offset) place_pose_high = place_pose.copy_with_offsets(z_offset=height_offset) # Going Over Object robot.move_pose(pick_pose_high) # Opening Gripper robot.open_gripper(gripper_speed) # Going to picking place robot.move_pose(pick_pose) # Closing gripper robot.close_gripper(gripper_speed) # Raising robot.move_pose(pick_pose_high) # Going Over Place pose robot.move_pose(place_pose_high) # Going to Place pose robot.move_pose(place_pose) # Opening Gripper robot.open_gripper(gripper_speed) # Raising robot.move_pose(place_pose_high) if __name__ == '__main__': # Connect to robot client = NiryoRobot(robot_ip_address) # Calibrate robot if robot needs calibration client.calibrate_auto() # Changing tool client.update_tool() # Commence du fonction pick_n_place pick_n_place_version_2(client) # Releasing connection client.close_connection()
- Dans les lignes 5-12 on définit les positions de saisir et déposer
- Dans ligne 17 il faut définir la vitesse du mouvement du gripper
- Dans les lignes 19-20 on définit les positions un peu dessus des positions de saisir et déposer
- Dans les lignes 22-35 on fait le process de se rendre jusqu'à la position de prélèvement avec move_pose, d’avant saisir un objet avec close_gripper, on ouvre le gripper avec open_gripper. Après on se rend à la position de placement et on y place l’objet.
- Dans ligne 47 update_tool() est pour équiper un nouvel outil. Cette fonction scannera les connexions au moteur et ajoutera le nouvel outil
- Dans ligne 51 on déconnecte alors le robot.
Code pour utiliser l’autre outil
from pyniryo import* robot = NiryoRobot("10.10.10.10") robot.calibrate_auto() robot.update_tool() # Pour relâcher un objet avec n’importe quel outil, vous pouvez utiliser la fonction robot.release_with_tool() robot.move_pose(0.2, -0.1, 0.25, 0.0, 1.57, 0.0) # Afin d’attraper des objets avec n’importe quel outil, vous pouvez utiliser la fonction robot.grasp_with_tool() robot.move_pose(0.2, 0.1, 0.25, 0.0, 1.57, 0.0) robot.release_with_tool() robot.close_connection()
Dans ligne 9 pour relâcher un objet avec n’importe quel outil, on peut utiliser la fonction release_with_tool()
- Open gripper pour les grippers
- Push Air pour la Pompe à Vide
- Deactivate pour l’Électroaimant
Dans ligne 13 Afin d’attraper des objets avec n’importe quel outil, on peut utiliser la fonction grasp_with_tool()
- Close gripper pour les grippers
- Pull Air pour la Pompe à vide
- Activate pour l’Électroaimant
Code pour utiliser le gripper
from pyniryo import* from PIL import Image # PIL = Pillow Library #source website https://note.nkmk.me/en/python-numpy-image-processing/ #another source https://www.pluralsight.com/guides/importing-image-data into-numpy-arrays robot = NiryoRobot("10.10.10.10") #hotspot mode robot.calibrate_auto() robot.update_tool() #getting image img_compressed = robot.get_img_compressed() img_array = uncompress_image(img_compressed) #displaying show_img_and_wait_close("img_stream", img_array) #transfers image_array into image file and saves it in the designated path im_jpg = Image.fromarray(img_array) img_array.save('~/Desktop/image_niryo.jpg') # ~ = user’s home directory
- Dans la ligne 2 on utilise la bibliothèque PIL sauvegarder l’image sur son ordinateur
- Dans la ligne 9 on met à jour les outils connectés au robot pour pouvoir utiliser le camera.
- Dans la ligne 12 on obtient l’image du flux vidéo dans un format compressé pour éviter de saturer le réseau.
- Dans la ligne 13 on décompresse l’image compressé.
- Après on affiche l’image et la sauvegarde sur l’ordinateur.
Traitement d'image et Aphelion
Aphelion, un logiciel pour le traitement d’image
Depuis plus de 25 ans, ADCIS fournit des produits logiciels de traitement et d’analyse d’images qui sont reconnus et appréciés. Aphelion Dev est le logiciel de choix pour les personnes qui développent des applications avancées en imagerie. Il bénéficie de l’expertise de l’équipe de développement d’ADCIS et des partenariats stratégiques avec des laboratoires de recherche internationaux. De plus, l’équipe d’ADCIS est reconnue pour l’efficacité et le professionnalisme du support technique fourni à ses clients.
L’interface utilisateur d’Aphelion Dev exploite les plus récents outils de Windows®, tels les composants .Net® et les outils de développement associés. Cette interface guide le nouvel utilisateur depuis l’acquisition d’images, en passant par l’analyse et le traitement, jusqu’à la génération d’un rapport d’analyse prêt à l’emploi. Dev fournit aux utilisateurs les plus expérimentés des outils pour développer des traitements avancés et automatisés qui deviennent rapidement des applications prêtes à être déployées. Plusieurs langages de macro-commandes sont disponibles afin d’automatiser une application d’imagerie.
Le traitement d’image, qu’est ce que c’est?
Trois grandes étapes résumées:
- Acquisition : de la scène physique à une forme numérique (capteur + système de numérisation)
- Pré-traitement : amélioration de la qualité de l’image (Restauration d’images, compression d’images, amélioration d’images)
- Analyse : extraction de l'information essentielle dans l’image (Segmentation, Représentation et Description structurelle, Reconnaissance des formes)
- Interprétation : description sémantique de l’image
(Passage à la description sémantique en regard à certains objectifs, Mesure de paramètres sur des formes, Description du contenu de la scène en termes de concepts non mathématiques, Modèles de connaissance pour estimer et prendre des décisions, Gestion de la base de connaissances, Système d’interrogation, Evaluation de la pertinence des réponses, Prise de décision)
Deux niveaux de traitement des images : Haut Niveau et Bas Niveau
Notre démarche s’inscrit dans le traitement d’image de bas niveau où les différentes étapes sont:
- Acquisition, numérisation
- Transmission, compression
- Rehaussement, restauration, amélioration, filtrage (prétraitements)
- Segmentation (contours, régions, texture)
- Reconnaissance des formes
- Compréhension de l’image
- Aide au diagnostic
- Commande d’automatismes
Le Haut Niveau de traitement d’image n’est pas nécessaire dans notre cas de figure, il est surtout utile pour des tâches plus complexes et sert à réaliser une interprétation d'images utilisant des connaissances expertes.
Domaines d’application du traitement d’images
-Imagerie aérienne et spatiale (Ressources naturelles et humaines, surveillance, météorologie,..)
-Industrie (Contrôle, Inspection et mesures automatiques, Vision robotique)
-Médecine (Cytologie, Tomographie, Echographie)
-Sciences (Interventions en milieu confiné, Astronomie, Robotique mobile,
-Biologie, Microscopie électronique)
-Art et communication (Télévision et vidéo, Transport information visuelle, Photographie, Edition, Archivage)
-Domaine militaire (Surveillance, Guidage automatique et poursuite d'engins, Topographie)
Dans notre cas de figure, il est question d’application dans l’industrie, ou on retrouve des projets qui s’apparentent au nôtre.
Prétraitement : amélioration de la qualité de l’image (Amélioration et Restauration d’images)
Amélioration de l’image:
Nous allons d’abord nous pencher sur l’amélioration d’image avant de passer à la restauration. Les techniques de prétraitement visant à l’amélioration de la qualité visuelle de l’image sont :
- Modification de l’histogramme
- Recadrage de la dynamique (Linéarisation)
- Egalisation
Modification d’histogramme par recadrage de la dynamique (Linéarisation)
L'intérêt des histogrammes réside dans l’évaluation de la qualité de la numérisation (amélioration) et l’adaptation de la dynamique des densités à la dynamique des niveaux de quantification Le redressement permet d'aligner horizontalement une image numérisée pour compenser l'inclinaison. Cette option permet de régler le contraste et la luminosité des images en couleur ou en niveaux de gris. Convertit les images en couleur en images à niveaux de gris.
Modification par égalisation
En traitement d'images, l'égalisation d'histogramme est une méthode d'ajustement du contraste d'une image numérique qui utilise l'histogramme. Elle consiste à appliquer une transformation sur chaque pixel de l'image, et donc d'obtenir une nouvelle image à partir d'une opération indépendante sur chacun des pixels.
Restauration de l’image:
A présent nous allons nous concentrer sur la restauration de l’image. L’objectif de la restauration est d’éliminer au maximum les distorsions du système d’acquisition afin d’obtenir une image la plus proche possible de l’image idéale. Ces distorsions peuvent êtres d’origines différentes. En effet, le “bruit” peut être lié au contexte de l’acquisition (mouvement, modification ponctuelle des conditions d’éclairage le rendant impossible à corriger sans l’opérateur humain), au capteur (distorsion des niveaux de gris ou à une mauvaise mise au point), à l’échantillonnage (effet « poivre et sel » au niveau de la discrétisation spatiale, mais peut être également lié à la nature de la scène Les techniques de prétraitement visant à la restauration de l’image après dégradations se décomposent en deux partie qui sont le lissage linéaire et le lissage non linéaire.
L’hypothèse fondamentale derrière le filtrage linéaire est que la moyenne de plusieurs échantillons devrait réduire le bruit (i.e. l’écart-type du signal résultat du moyennage de N échantillons devrait être plus faible que celui de la distribution de laquelle proviennent ceux-ci. Il se caractérise par une invariance à la position (le résultat du filtrage ne dépend que du voisinage d’un pixel et non de la position absolue du pixel dans l’image, et respecte les principes de mise à l’échelle et de superposition Le filtrage non linéaire quant à lui permet de réduire le bruit impulsionnel (multiplicatif), ce que le filtre moyenneur (ou même gaussien) n’arrive pas à faire, préserve mieux les discontinuités (sans les adoucir), est généralement plus coûteux en temps de calcul que le filtre linéaire moyenneur, et ne respecte pas les propriétés de commutativité et d’associativité du filtre linéaire
Analyse : extraction de l'information essentielle dans l’image (Segmentation)
On appelle segmentation d'une image l'opération consistant à identifier les structures d'intérêt dans cette image. On distingue deux types d'approches pour la segmentation : contour ou région. Dans l'approche contour, on cherche à isoler le ou les contours des objets d'intérêt. Le résultat se présente en général sous la forme d'un ensemble de chaînes de pixels, et des traitements additionnels sont souvent nécessaires pour associer les contours aux objets d'intérêt. L'autre approche cherche à identifier des régions de pixels homogènes au sein de l'image. Le critère d'homogénéité peut être l'intensité, la couleur, ou même la texture locale. Le résultat se présente soit sous la forme d'une image binaire, soit d'une image étiquetée, chaque étiquette ou label correspondant à une région.
Seuillage:
Il existe plusieurs méthodes pour détecter de manière automatique la valeur du seuil à appliquer. L'une des plus répandues est la méthode d'Otsu. Elle consiste à faire l'hypothèse que l'image contient deux classes, décrites chacune par une partie de l'histogramme de l'image. La qualité du seuillage est quantifiée en mesurant la variance des niveaux de gris de chaque classe. On cherche ensuite la valeur de seuil qui minimise les variances des deux classes, et on utilise cette valeur pour binariser l'image
Le but est d’affecter chaque pixel d’une image en niveaux de gris à une classe. Les classes correspondent aux intervalles de niveaux de gris. Le principe consiste à extraire des seuils à partir de l’histogramme (image/région), avant de passer à la classification d’un pixel p par comparaison de I(p) aux seuils
Etat d'avancement du SEMESTRE 7
Séance du 10.10.2022
Ayant débuté notre projet au semestre 7 et non au semestre 6, nous avons fait les premières recherches sur notre sujet. Pour préciser on fait des recherches sur le robot Bra Niryo Ned 1. L'objectif du projet sera de réaliser le traitement d’image avec un capteur de vision (caméra), cela signifie prendre l’image avec la caméra et la transmettre à un logiciel de traitement d’image (Aphelion) pour enfin envoyer l’image traitée à un robot bras et exécuter l’instruction.
Date: 21.10.2022
Aujourd’hui on a essayé de mettre en place une communication avec le robot bras Niryo Ned 1. On a essayé d’abord de se connecter avec le raspberry Pi, qui est le système d’exploitation du Niryo. On a essayé de mettre en place une communication visuelle avec VNC Viewer, mais on a rencontré plusieurs problèmes avec cette méthode. Par exemple, il n’était pas possible de mettre à jour notre programme en vue de corriger les erreurs. Mais on a réussi à se connecter avec le robot via le programme Niryo Studio, mais également à réaliser la communication avec le robot directement via remote sur notre computer, à savoir avec Pyniryo, qui est un TCP API fait avec python. Aussi, on s’est familiarisé avec le code fourni dans la documentation PyNiryo, bien que nous ayons eu des difficultés à coder le contrôle des pinces du robot.
Date: 28.10.2022
Aujourd’hui, on a essayé de fixer le problème de la pince, mais on n’a pas réussi. Puis, on a avancé sur la communication d'une caméra avec le robot bras. L’image prise par le robot est de meilleure qualité si on connecte la caméra au USB Port 3.0 que 2.0.
Date: 18.11.2022
Aujourd’hui, on a consulté différentes sources sur internet afin d’essayer de fixer le problème de la pince. On a également échangé avec l’autre groupe qui travaille sur le Niryo Ned 1. Malheureusement, pas de succès. On a décidé d'abandonner le problème de pince compte-tenu du fait que la priorité est le traitement d’image.
Date: 21.11.2022
Aujourd’hui, on a mis en place la communication avec la pince via une bibliothèque différente, à savoir la bibliothèque Python Ros Wrapper mais il était plus compliqué de commander le Niryo. Nous avons également contacté le bureau d’Aphelion afin d’obtenir la clé d’activation en vue d’obtenir la licence pour une période d’essai d’un mois.
Date: 25.11.2022
Aujourd’hui, on a écrit le code pour obtenir l’image d’une caméra et on a commencé à se familiariser avec le logiciel Aphelion. On a relevé la nécessité d’une documentation plus approfondie pour mieux comprendre le logiciel. On a demandé au professeur quelques documents/ TP concernant Aphelion.
Date: 28.11.2022
Aujourd’hui on a travaillé avec le logiciel aphelion pour le comprendre mieux. On a appris ce que la signification de l’histogramme. L’abscisse donne l’information concernant la couleur, du gris et ses différentes nuances au RGB (rouge, bleu et vert). On a cherché à comprendre le fonctionnement du traitement d' image, à savoir la convolution de chaque pixel de l’image par une matrice symétrique. En fonction de la valeur de la matrice on peut obtenir différents résultats via le traitement d'image. Après plusieurs tentatives pour contrôler le robot à travers Aphelion qui se sont soldées par des échecs. Finalement, la seule solution pour atteindre cet objectif aurait été d’ajouter la bibliothèque PyNyrio au logiciel Aphelion, ce qui n’est pas possible comme ce dernier n’est pas OPENSOURCE.
Date: 08.12.2022
On a échangé avec Matéo Pourrier, futur membre de notre groupe de projet, qui nous rejoindra au prochain semestre. On a pris le temps de parler de l’état d’avancement du projet, de ce qui a été réalisé jusqu’à maintenant (code de contrôle du robot Niryo, traitement d’image via Aphelion), mais également des perspectives futures que nous prévoyons par la suite. Cet échange nous a permis de faire le point sur la soutenance du 06/01.
Date: 15.12.2022
Aujourd’hui, on a fait le bilan avec M.Lakhal pour faire le point sur l’avancement de notre projet, sur la soutenance et sur les perspectives futures que nous avons pour le prochain semestre.
Perspectives
Création d’une interface Format : Page web
Fonctionnalités : Capturer des images à distance
Effectuer le traitement de l’image
Transmettre les données obtenues au robot et le Commander
Planning du S8