P20 Projet marionnette déformable interactive : Différence entre versions
(→Semaine 4) |
(→Semaine 5(05/02/2018)) |
||
Ligne 486 : | Ligne 486 : | ||
===Semaine 5(05/02/2018)=== | ===Semaine 5(05/02/2018)=== | ||
− | + | Cette semaine j'ai pu, en utilisant la librairie LeapMotion, récupérer la position de la paume d'une main. La position est décrite par la distance entre la paume et l'origine de la LeapMotion (centre du capteur). Avec ces données je suis maintenant capable d'actionner le treizième moteur pour monter ou descendre la pieuvre ainsi que le moteur pas-à-pas pour coulisser l'ensemble de plaque et pieuvre dans l'axe X. | |
− | + | Ayant bien identifié chaque moteur cette fois-ci j'ai pu faire une première simulation avec l'ancienne configuration de 12 moteurs. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== Conclusion == | == Conclusion == | ||
== Annexes == | == Annexes == |
Version du 7 février 2018 à 15:32
Cahier des charges
Présentation générale du projet
Contexte
Dans le cadre de ma cinquième année j'ai choisi de faire mon projet de fin d'études chez l'équipe DEFROST du laboratoire INRIA. Cette équipe a pour thème de travail la robotique déformable. Pour ce projet il s'agit de la mise en place d'un démonstrateur interactif dans lequel l'utilisateur pilote une marionnette déformable à travers d'un LeapMotion. Une simulation temps réel de la marionnette, grâce au simulateur SOFA, pilotera la version réelle du robot déformable.
Description et objectifs
Le projet consistera principalement de deux étapes:
- La première sera d'améliorer la version actuelle de la plate-forme d'actionnement. L'objectif est de la rendre généralisable, c'est-à-dire de pouvoir changer plus facilement de marionnette à actionner. Étant donné qu'actuellement cette procédure est très longue et fastidieuse.
- Deuxièmement, l'ajout d'un système d'actionnement contrôlé pour faire coulisser la plate-forme dans le plan X et potentiellement Y également. Ainsi que l'intégration du système de contrôle dans une carte de contrôle. Une carte Arduino sera utilisé dans un premier temps mais il est envisagé de passer à une carte plus puissante, Teensy 3.2 ou même 3.5 si besoin.
Calendrier prévisionnel
Avec l'ingénieur Recherche et Développement de l'équipe DEFROST, nous avons pu établir le calendrier prévisionnel suivant. Ce calendrier pourrait être mis à jour par la suite en fonction de l'avancement du projet et des éventuelles circonstances.
- Début Novembre: Mettre à jour l'organisation des moteurs sur la plaque et avoir la nouvelle plaque des moteurs de prêt.
- Début Décembre: Formation sur le logicielle de simulation et contrôle des corps déformable SOFA. Ainsi que se familiariser avec la scène contenant la marionnette et les capteurs utilisé pour détecter la main, sa forme ainsi que sa position.
- Mi-décembre: Prendre une décision concernant le micro-contrôleur à utiliser par la suite, soit continuer avec Arduino ou changer vers Teensy.
- Début Janvier: Équiper la plaque de moteurs pour avoir dans un premier temps un mouvement sur l'axe X (cf photo 2).
- Fin Janvier: Mapping de la main, c'est à dire d'associer la main et les doigts à certains parties de la marionnette pour pouvoir la contrôler et de prendre en compte un mouvement dans l'axe X.
- Février: Prospectif d'ajouter un mouvement de la plaque dans l'axe Y. Tester le système et faire des améliorations où c'est possible.
Feuille d'heures
Tâche | S38 | S39 | S40 | S41 | S42 | S43 | S45 | S46 | S47 | S48 | S49 | S50 | S51 | S2 | S3 | S4 | S5 | S6 | S7 | S8 | S9 | Total |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Présentation du projet et objectifs | 1 | 1 | ||||||||||||||||||||
Rédaction du wiki | 2 | 0,5 | 0,5 | 2 | 0.5 | 0.5 | 0.5 | 1 | 0.5 | 8 | ||||||||||||
Mise-à-jour de la plaque des moteurs (recherche d'améliorations) | 2 | 2 | 2 | 6 | ||||||||||||||||||
Prise en main de nouveau matériel | 1,5 | 1,5 | 2 | 2 | 7 | |||||||||||||||||
Préparation de la plaque des moteurs | 2 | 4 | 6 | |||||||||||||||||||
Impression et préparations des pièces 3D | 2,5 | 2 | 4 | 2 | 6 | 8.5 | 25 | |||||||||||||||
Remplacement de l'ancienne plaque des moteurs. | 6 | 6 | 12 | |||||||||||||||||||
Installation du logiciel de modélisation Sofa. | 3 | 3 | ||||||||||||||||||||
Prise en main du langage Python. | 3 | 3 | ||||||||||||||||||||
LeapMotion Software Developpement Kit. | 2 | 2 |
Avancement du Projet
Semaine 38
L'objectif de cette semaine était de rencontrer l'équipe avec laquelle je vais travailler et de me présenter au projet. Grâce à la réunion de cette semaine, j'ai une idée initiale des objectifs à réaliser ainsi qu'une liste de tâches sur lesquels commencer la semaine prochaine. Vous trouverez ci-dessous une liste d'objectifs sur lesquels nous nous sommes mis d'accord cette semaine:
- Rendre le dispositif plus modulaire et plus fiable. La procédure de changement de marionnette et très longues, ce qui poses des problèmes lors des démonstration. C'est pour cela qu'il est important de rendre cette opération essentiel le plus efficace possible.
- L'actuel disposition des moteurs n'est pas optimale. Il y a un jeux avec les socles des moteurs actuel et les engrenage traverse la plaque supérieure (cf photo 1), ce qui rend la gestion d'espace plus difficile (cf photo 1). Cela sera la première tâche sur laquelle je vais travailler, des nouvelles socles moteurs ont était crée et il faut donc imprimer assez pour tout les moteurs et mettre en place une nouvelle matrice de moteurs (plaque de moteurs actuel en photo 2).
- Les moteurs actuel ont pour but de faire bouger le corps de la marionnette ainsi que créer des mouvements sur l'axe Z. Mais des mouvements de la marionnette entière dans le plan XY (cf photo 2) n'est actuellement pas possible. Cela est également un problème à résoudre, il faut donc trouver une solution valable à implémenter.
- La carte Arduino actuellement utiliser cause des retard de réponse, même minimale, une migration de microcontrôleur vers une carte Teensy plus puissante est souhaité pour éliminer les retards.
Semaine 39
Durant cette semaine j'ai essayé de trouver une solution d'horaires pour mon projet au laboratoire. Effectivement les personnels arrivent vers 9h30 et c'est compliqué de travailler durant certains séances. Nous sommes toujours en train de discuter du sujet pour trouver une solution.
J'ai néanmoins pu réfléchir sur un nouveau plan de placement des moteurs et une méthode d'installation de fils connectant les moteurs et la marionnette. J'attends actuellement de re-rencontrer l'équipe pour en discuter de la faisabilité de mes idées et de savoir s'il faudrait changer quelque chose avant de commencer la création d'une nouvelle plateforme pour les moteurs.
Semaine 40
Durant la première séance de cette semaine j'ai reçu un "ZX gesture sensor", ce dispositif va nous permettre de suivre la position de la main de l'utilisateur et de d'actionner la marionnette en fonction de cette information. J'ai ensuite fait un simple montage avec un Arduino pour pouvoir le tester et en déduire si cela nous sera utile et si oui comment l'utiliser. Le champs de détection de ce capteur étant assez restreint et ses valeurs pas assez fiable, nous allons s’intéresser beaucoup plus à un Leapmotion pour ce qui concerne la détection d'une main.
Malheureusement je n'ai pas pu rencontrer l'ingénieur R&D de l'équipe pour discuter des solutions que je voudrais proposer pour ce qui concerne l'organisation des moteurs et l'installation des fils actionneurs.
Semaine 41
J'ai commencé la semaine par lire la documentation des servomoteurs ainsi que me familiariser avec la librairie Arduino qui va être utilisé pour les contrôler (Herkulex).
Ensuite j'ai pu discuter avec l’ingénieur R&D par rapport au solutions que je voudrais proposer concernant l'organisation des moteurs et l'installation des fils de contrôle. Ma proposition d'organisation a été accepté et nous allons poursuivre pour la réaliser, cf photo 3. La pièce a été ensuite envoyé à la découpe avec les dimencions 46cmx30cm. Mon idée idée installation des fils de contrôle n'as pas pu être acceptée à cause des éventuelles problèmes qui peuvent surgir lors du fonctionnement ou calibration de la marionnette. Je vais donc y revenir sur ce point par la suite.
J'ai récupéré les modèles 3D des pièces nécessaire pour tenir les moteurs en place sur la plaque de bois. L'ingénieur R&D m'as ensuite rappelé l'essentiel pour pouvoir utiliser l'imprimante 3D pour pourvoir imprimer les pièces nécessaire durant la semaine prochaine. Il y avait déjà plusieurs pièces d'imprimé, j'ai donc pris ces pièces là pour les nettoyer et les préparer à l'utilisation.
Semaine 42
J'ai pu commencer cette semaine à réaliser la plaque de moteurs que j'ai proposé. Il y avait déjà des socles moteurs imprimées mais j'ai aussi imprimé deux. Ensuite, j'ai nettoyer et lisser les pièces pour les préparer à l'installation. Une fois que les socles était installé, j'ai dû faire les trous traversantes pour installer les fils qui vont relier les moteurs et la marionnette. Cf photo 4.
Cette semaine j'ai également pu commencer à m'initier à l'utilisation d'un driver (DRV8825) pour contrôler le moteur pas à pas, qui servira à bouger la planche de moteurs sur l'axe X.
Semaine 43
Cette semaine j'ai proposé des modification à certains pièces qui pourront rendre les pièces imprimées 3D moins fragile et moins susceptible à la casse. Ensuite j'ai du effectuer les modifications sur le logiciel blender ainsi que les imprimer. J'ai malheureusement eu des problèmes techniques concernant l'imprimante lors de deux essaies. Je dois donc attendre le retour de l'ingénieur R&D de l'équipe pour réparer l'imprimante et continuer mes tests.
J'ai aussi continuer de travailler sur le moteur pas à pas et le code Arduino lui concernant.
Semaine 45
#define PINstep 10 #define PINdir 8 const long int stepspermm = 800; const int periode = 28; long int stepperposition = 0; byte header; unsigned char positions[13] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; long int steps; void setup() { OCR1A = periode; TCCR1B = TCCR1B & 0b11111000 | 0x12; pinMode (PINdir, OUTPUT); analogWrite(PINstep, 0); Serial.begin(115200); // Open serial communications analogWrite(PINstep, 0); } void loop() { analogWrite(PINstep, periode >> 1); for (long int i = 1; i < 1000; i++) { delayMicroseconds(periode); } analogWrite(PINstep, 0); }
Semaine 46
J'ai commencé cette semaine par lancer un impression 3D des pièces pour fixer les moteur sur la nouvelle plaque de moteurs. J'ai imprimé moins de pièces cette fois en espérant ne pas avoir de problèmes durant l'impression.
En parallèle, je continue à faire des tests sur des technologies qui pourront être utilisé pour la détection de la position de la plaque des moteurs, cette semaine j'ai commencé à tester un capteur ultrason (Ultrasonic Sensor - HC-SR04). Ce capteur est facile à prendre en main et assez précis au niveau des mesures de distance des objets situé devant ceci, je continue donc de le tester mais je pense que ça sera la technologie que nous allons employer pour cette fonctionnalité.
#define trigPin 13 #define echoPin 12 void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { long duration, distance; //In order to generate the ultrasound you need to set the Trig on High for 10µs digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // v=340m/s et donc 0.034cm/µs //The echo pin will outuput the time in µs the sound wave travelled back and forth duration = pulseIn(echoPin, HIGH); distance = (duration*0.034/2); /*http://howtomechatronics.com/tutorials/arduino/ultrasonic-sensor-hc-sr04/*/ //print result Serial.print(distance); Serial.println(" cm"); delay(500); }
La première impression lancé a aussi échoué, le fil de PLA a été coincé et ne sortais plus de l'embout de l'imprimante. J'ai donc remplacé le fil par un autre qui est plus flexible et relancé une impression de test.
Semaine 47
Pour la première séance de cette semaine j'ai nettoyé et installé deux socles moteurs sur la plaque ainsi que lancer l'impression de plusieurs autres pièces nécessaire à la plaque de moteurs. Les impressions 3D n'étaient pas optimale et les pièces avaient des point faible et susceptible à la casse. Malgré cela, j'ai pu utiliser un 3D pen (un stylo avec le même principe de fonctionnement qu'une imprimante 3D mais qui est plus manipulable) pour corriger les pièces et ajouter de la matière (PLA) la où il fallait. Cela m'as permis d'éviter de lancer une encore une longue impression et attendre jusque la fin de ceci. Une fois assez des pièces étaient prête, j'ai pu terminer l'installation des socles moteurs sur la plaque.
J'ai ensuite commencé à remplacer l'ancienne plaque des moteurs représenté sur les photo 1 et 2.
Semaine 48
Ayant fini l'installation de la nouvelle plaque, j'ai aujourd’hui installé les moteurs dans les socles ainsi que connecter la marionnette (corps déformable) en utilisant des fils de pêche.
Pour finir les séances de cette semaine j'ai commencé l’installation du logiciel de simulation SOFA.
La compilation et installation de SOFA étant très longue, j'ai commencé à faire des tutoriels du langage Python. C'est grâce à des scripts Python que les informations du LeapMotion sont récupéré et traité par SOFA.
Semaine 49
Cette semaine j'ai commencé à me familiariser avec la LeapMotion et le logiciel de simulation SOFA, comment les lancer et comment les utiliser.
Semaine 50
J'ai continué cette semaine la prise en main des logiciels et j'ai ensuite fait un premier test de l'ensemble, simulation et robot réel. J'ai pu constater quelque problèmes avec le robot et la réalisation de la forme simulé sur l'écran.
J'ai ensuite commencé la rédaction de mon rapport mi-parcours.
Semaine 51
Continuation de rédaction du rapport et préparation de mi-soutenance.
Semaine 2 (08/01/2018)
Prenant en compte le retour durant la soutenance sur la programmation de la carte Arduino avec l'IDE et non en C, j'ai rencontré l'ingénieur R&D pour en parler. Le résultat de notre discussion est résumé ci-dessous:
- Continuer la programmation de l'Arduino avec l'IDE; coût de changement sera trop élevée.
- Tester les temps de réponse des commandes d'actionnement des smart actuators (Herkulex DRS-0101) avec un script Python pour lancer le test et sauvegarder les résultats dans un log.
Semaine 3
Le but de cette semaine était de tester les temps de réponse des smart actuators mais j'ai rencontré un problème avec le ID de chacun. J'ai donc du identifier chacun d'entre eux (IDs entre 1 et 12). Vu que j'ai ajouté un moteur à la plaque je lui ai donné un ID (13) et changé son baud rate à 57600 pour être cohérent avec les autres moteurs et pouvoir l'utiliser. J'ai rencontré un problème avec la librairie Herkulex et le contrôle des 13 moteurs simultanément, effectivement il fallait changer la valeur d'un buffer de données dans la librairie "DATA_SIZE" à 60 au lieu de 50. En conclusion, j'ai identifié chaque moteur, ajouté un treizième moteur et ré-installer les moteurs dans leurs socles correspondant.
Semaine 4
Pour les tests des commandes de smart actuators nous avons choisi de tester 2 commandes Herkulex.moveOne(int servoID, int Goal, int pTime, int iLed) et Herkulex.moveAllAngle(int servoID, float angle, int iLed) suivi par Herkulex.actionAll(int pTime). Pour cela j'ai écrit un script python qui envoi un message par le port série pour lancer le test et ensuite enregistre les temps de réponse dans un fichier nommé log.txt.
Script python:
from time import sleep import serial ser = serial.Serial("/dev/ttyACM1", 9600) # Establish the connection on a specific port sleep(2) ser.write("1") f = open('log.txt','w') while True: f.write(ser.readline()) # Read the newest output from the Arduino ser.close() f.close()
Un des scripts Arduino (commande moveAllAngle):
#include <Herkulex.h> unsigned long time; int positions[13]; void setup() { Serial.begin(9600); // set the baud rate Herkulex.begin(57600, 12, 11); Herkulex.initialize(); for (int n=0; n<13; n++){ positions[n]=random(0,1023); } } void loop() { if (Serial.available() > 0){ Serial.read(); for (int n=0; n<13; n++){ Serial.println("Sending"); time = millis(); Serial.println(time); Herkulex.moveOne(n+1, positions[n], 2000, LED_BLUE); time = millis(); Serial.println(time); Serial.print("Command sent to motor "); Serial.println(n+1); } } }
Semaine 5(05/02/2018)
Cette semaine j'ai pu, en utilisant la librairie LeapMotion, récupérer la position de la paume d'une main. La position est décrite par la distance entre la paume et l'origine de la LeapMotion (centre du capteur). Avec ces données je suis maintenant capable d'actionner le treizième moteur pour monter ou descendre la pieuvre ainsi que le moteur pas-à-pas pour coulisser l'ensemble de plaque et pieuvre dans l'axe X.
Ayant bien identifié chaque moteur cette fois-ci j'ai pu faire une première simulation avec l'ancienne configuration de 12 moteurs.