Projet IMA3 P7, 2017/2018, TD1 : Différence entre versions
(→Explication des fonctions de la librairie C créée) |
(→Explication des fonctions de la librairie C créée) |
||
Ligne 241 : | Ligne 241 : | ||
'''TEST DE L'ALGORITHME DE RECONSTRUCTION AVEC SIMULATION DE POINT D'ACQUISITION V1.0''' | '''TEST DE L'ALGORITHME DE RECONSTRUCTION AVEC SIMULATION DE POINT D'ACQUISITION V1.0''' | ||
− | + | [[Fichier:Vmatrix.jpg]] | |
− | La première approche de reconstruction est faite en créant une | + | [[Fichier:Reconstruction1.png]] |
+ | La première approche de reconstruction est faite en créant une matrice des vertex collectés (VMatrix) - graphique1. On crée une Facet à partir de chaque trois Vertex voisins. Le principe pour créer un solide fermé est que chaque Facet partage chacun de ses côtés avec d'autres Facets. Ceci implique que les vertex de la derniere colonne devrons se lier avec ceux de la première comme on peut le voir sur le graphique2. | ||
Version du 18 juin 2018 à 12:47
Sommaire
Projet IMA3-SC 2017-2018- Replica
Pour ce projet, nous déposerons tous nos programmes et documents pour la partie informatique ainsi que pour la partie électronique sur un dépôt GIT[1].
Ce dépot sera régulièrement mis à jour et il sera partagé avec les encadrants du projet afin de permettre la visualisation du travail réalisé.
Description du système
Replica est un objet connecté capable de réaliser un scan en 3D d'une pièce et de la reproduire sous un format STL imprimable sur une imprimante 3D. La commande du scanner se fait à travers une interface web sur laquelle un utilisateur pourra s'authentifier et choisir les paramètres du scan. Après avoir déposé préalablement la pièce à reproduire sur le support, l'utilisateur peut lancer le scan depuis le site. Le dispositif fait alors des acquisitions de points sur les contours de la pièce. Après l'acquisition,il transforme ce nuage de points en une representation 'maille de triangles' (triangle mesh) sous un format STL. Ce fichier pourra être téléchargé une fois le processus terminé.
Cahier des charges
Ce projet a pour but de :
1. Acquisition de mesures de distance
2. Pilotage des moteurs pas-à-pas
3. Transmission des points de mesure depuis l'arduino à la Raspberry en liaison série.
4. Reconstruction de la géométrie de l'objet scanné
5. Génération d'un fichier STL
6. Réalisation de l'interface web et mise en place de la communication
Objectif global: un système capable de fonctionner pour une catégorie d'objets solides plus ou moins uniformes.
Séance 1
Préparation de la séance
Préalablement à cette séance, nous avions:
1. formé notre groupe et avons déjà réfléchi a notre idée de projet.
2. étudié la faisabilité et les éventuelles difficultés.
3. récupéré sur internet des modèles 3D du support d'un projet similaire sur internet que nous avons adapté à notre cas.
4. préparé une liste des composants et du matériel nécessaire.
Partie électronique
Nous avons défini deux sous-objectifs pour cette partie:
- Le conditionnement du signal du capteur:
En effet, le capteur de distance fourni revoie, d'après la datasheet (Ref: 2Y0A21F7Y), un signal variant entre 0.3V et 3.1V. Pour plus de précision nous allons conditionner ce signal pour que la valeur varie entre 0V et 5V. Pour réaliser cette transformation, nous utilisons un montage à base d'amplificateurs opérationnels. Après avoir effectué les calculs des paramètres, nous validons l'approche et entamons la simulation.
- Pilotage des moteurs pas-à-pas :
Nous avons besoin de piloter deux moteurs pas-à-pas pour reproduire les mouvements du scanner. La rotation du support et le balayage vertical du capteur.
Après l'analyse de la datasheet des moteurs qui nous ont été fournis, nous avons relevé les caractéristiques de courant et de tension ainsi que la configuration du moteur.
Partie informatique
Durant La première séance nous avons entamé l'installation et la configuration de la raspberry.
Travail supplémentaire entre les deux séances
Lancement des impressions 3D du support du scanner.
Séance 2
Préparation de la séance
Nous avons défini les sous-objectifs suivants à réaliser pendant la séance:
- Calibrage du controleur moteur et mise en marche du moteur
- Conception physique du conditionneur de signal et test
- Configuration de la Rasberry pour fonctionner en hotspot
Partie électronique
Apres nous avons etudie les traits des moteurs et du controleur moteur, on a essaye de calibrer le controleur pour n'avoir pas un courant qui peut endommager le moteur. Pour faire ca, nous avons cherche comment limiter le courant avec ce type de controleur. Nous avons trouve la methode suivante:
- calculer la valeur optimale pour le courant de sortie de controleur, en utilisant la formule specifique pour nos composants ( Controleur A4988, Moteur pas-à-pas)
- mettre le courant (en entournant le potentiometre) qui sort du controleur a la valeur que nous avons calcule
- ajouter le moteur, le circuit pour controler le moteur, l'Arduino pour une source de 5V et la source de 12V
- allumer les sources
- verifier si le moteur tourne comme prevu
- sinon, tourner le potentiometre jusqu'a le bon mouvement du moteur, comme s'il n'y a pas assez ou trop de courant, le moteur ne tourne pas facilement
Finalement, nous avons calibre le controleur pour avoir en sortie 0.6A.
Pour verifier que notre circuit conditionneur convertit correctement le signal, nous avons ajoute le capteur de distance dans notre montage.
Sur le logiciel Arduino, nous avons cree un code qui nous donne les valeurs recus par le capteur et nous avons les mettre en temps reels sur un graphe. Dans le video au-desous, on peut voir que la sortie du capteur est entre 0V et 5V, donc que notre circuit fonctionne correctement.
Nous avons réalisé un test du circuit de conditionnement pour l'acquisition de la distance :
Video
Travail supplémentaire entre les deux séances
Test des moteurs et de la translation verticale.
Travail supplémentaire
Partie programmation: Arduino
- Dans cette partie nous allons vous détailler notre code Arduino
- Le programme attend de recevoir l'information sur la précision (envoyé par l'interface web) du scan puis la validation pour commencer.
En fonction de la précision le programme va faire plus ou moins de capture de point de l'objet par rotation. Vu que nous avons pas pu avoir de contrôleur moteur fonctionnel, nous faisons une acquisition de points toute les X microsecondes. Avec les contrôleurs nous aurions fait la prise de point tout les X degrés de rotation de l'objet (X sera calculé en fonction de la précision envoyé).
Les points sont ensuite envoyé un a un par liaison série jusqu’à la Raspberry pour être traité. On envoie dans un premier temps les paramètres du scan, c'est a dire la précision et la hauteur de l'objet, puis tout les points renvoyés par le capteur.
Reconstruction 3D
Les points arrivent un a un via la liaison série sur la Raspberry, un programme python récupère les deux paramètres puis l'ensemble des points et les ajoutent a la ligne dans un fichier texte.
20 2 655 640 625 610 620 623 610 ... .. .
Programme de récupération liaison série : Fichier:Recup fichier.zip
C'est ensuite un programme en C qui récupère le fichier texte précédent et pour chaque points calcule les coordonnées cartésienne et stocke le tout dans un autre fichier texte.
10 5.000000 0.000000 0.000000 4.755282 1.545085 0.000000 4.045085 2.938926 0.000000 2.938926 4.045085 0.000000 1.545085 ... ..
Programme de conversion : Fichier:CylindriqueTOcartesien.c.zip
Ensuite, on convertie ce fichier texte en Format STL [2]:
Pour réussir la conversion, nous avons dû construire en premier lieu une librairie C contenant les types de données ainsi que les fonctions de base nécessaires pour travailler. Dans la représentation STL, le modèle 3D est représenté en utilisant les élements géométriques suivants: Les points (Vertex), Les Vecteurs (Vectors), Les vecteurs normaux (Normal), les faces (Facet), les solides (Solid) et les objets(Object).
- ICI SONT REPRESENTES LES STRUCTURES DE DONNEE DE BASE
typedef struct { float x; float y; float z; } Vertex; typedef struct { float vx; float vy; float vz; } Vector; typedef struct { Vector normal; Vertex v1; Vertex v2; Vertex v3; } Facet; typedef Facet* Solid;
En ce qui concerne l'élement objet (Object), ce dernier n'est pas un type de donnée explicite mais juste un contenaire (Wrapper). Il est juste utilisé pour parser à la phase finale le fichier STL en encodage ASCII.
Explication des fonctions de la librairie C créée
- AFFICHAGE CONSOLE
void dispVertex(Vertex ver); void dispVector(Vector vect); void dispFacet(Facet facet); void dispSolid(Solid solid, int NB_facets);
- GENERATION DU FICHIER STL
void generateFile(Solid s, int NB_facets); //FONCTION MERE FAISANT APPEL SEQUENTIELLEMENT AUX FONCTIONS SUIVANTES void genVertex(Vertex ver, FILE* fp); //ECRIRE UN VERTEX DANS LE FICHIER STL void genVector(Vector vect, FILE* fp); //ECRIRE UN VECTEUR DANS LE FICHIER STL void genFacet(Facet facet, FILE* fp); //ECRIRE UNE FACET DANS LE FICHIER STL void genSolid(Solid solid,int NB_facets, FILE* fp); //ECRIRE UN SOLIDE DANS LE FICHIER STL
- CONSTRUCTEURS D ELEMENTS ALEATOIRES POUR LE TEST DES ALGORITHMES
Vertex likelyRandomVertex(int level,int precision,int circle_pos, int max); //GENERE SEQUENTIELLEMENT LES POINTS DE LA SURFACE D UN CONE float randomCoordinate(); Vertex randomVertex(); Facet randomFacet(); Solid randomSolid(int NB_facets); //GENERE UN SOLID AVEC UN NOMBRE DONNE DE FACETs
- CONSTRUCTEURS D ELEMENTS DEFINIS
Vertex getVertex(float x,float y, float z); //CREE UN VERTEX A PARTIR DE 3 COORDONEES CARTESIENNES Vector getVector(Vertex A ,Vertex B); //CREE UN VECTEUR A PARTIR DE 3 VERTEX Facet getFacet(Vector normal, Vertex ver1,Vertex ver2, Vertex ver3); //CREE UNE FACET A PARTIR DE 3 VERTEX ET UN VECTEUR NORMAL Facet makeFacet(Vertex ver1, Vertex ver2, Vertex ver3); //CREE UNE FACET A PARTIR DE 3 VERTEX SEULEMENT Solid allocateSolid(int NB_facets); //ALLOCATION DYNAMIQUE DU SOLIDE
- CALCUL
Vector crossProduct(Vector a,Vector b); //CALCULE LE PRODUIT VECTORIEL POUR CREER UN VECTEUR NORMAL
TEST DE L'ALGORITHME DE RECONSTRUCTION AVEC SIMULATION DE POINT D'ACQUISITION V1.0
La première approche de reconstruction est faite en créant une matrice des vertex collectés (VMatrix) - graphique1. On crée une Facet à partir de chaque trois Vertex voisins. Le principe pour créer un solide fermé est que chaque Facet partage chacun de ses côtés avec d'autres Facets. Ceci implique que les vertex de la derniere colonne devrons se lier avec ceux de la première comme on peut le voir sur le graphique2.
Programme conversion texte vers stl: Fichier:TexteTOstl.zip
Interface web
Dans un premier temps l'utilisateur doit se logger pour pouvoir accéder a l'interface de scan :
Ensuite il arrive sur la page du scan :
Les boutons qui envoient l'information de la precision sont les suivants :
<button onclick="sendMessage(1); bas">MAX 200pts (1)</button> <button onclick="sendMessage(2);">INTER1 40pts (5)</button> <button onclick="sendMessage(3);">MIN 20pts (10)</button>
Notre interface de scan :
//Mettre photo finale
Démonstration