P20 Projet marionnette déformable interactive

De Wiki de Projets IMA
Révision datée du 15 juin 2018 à 22:42 par Rex (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)


Vidéo HD


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 Total
Présentation du projet ou définition/redéfinition des objectifs x x x
Rédaction du wiki x x x x x x x x x x x x x x x x
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 1 1 1 6
Prise en main de la LeapMotion et Sofa 2 2 4
Rédaction rapport et préparation soutenance 4 6 5 15
Identification des actuators et programmation d'un nouveau moteur 6 6
Actionnement des treize moteurs 5 5
Test des temps de réponse des commandes 8 8
Actionnement dans les axes X et Z 10 20 30

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.

Photo 6 : Simulation et acquisition des information avec la Leapmotion.

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.

Semaine 4

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 "DATA_SIZE" à 60 au lieu de 50 (dans la librairie Herkulex). En conclusion, j'ai identifié chaque moteur, ajouté un treizième et ré-installer les moteurs dans leurs socles correspondant.

Semaine 5

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);
    }
    
  }
  
}

Pour que l'actionnement soit fluide à l'utilisateur nous souhaitons avoir un actionnement de la marionnette dans un temps qui ne dépasse pas 40ms. Nous souhaitons avoir au moins un "Frame Rate" de 24fps, et donc chaque "Frame" ne doit pas dépasser 40ms. J'ai transmis les résultats du log dans un fichier Excel pour mieux interpréter les résultats qui sont les suivantes. La commande moveOne prends entre 5 et 6ms pour actionner un moteur, ayant treize moteurs cela donne 69ms et donc cette commande n'est pas utilisable dans notre cas. En revanche, la commande moveAllAngle prends entre 0 et 1ms pour préparer un moteur pour un actionnement synchrone avec les autres moteurs. moveAllAngle doit etre suivi par la commande actionAll qui elle prendre environs 10ms pour actionner tout les moteurs au même temps. Dans les pires des cas ou chaque moteur prends 1ms pour être préparer, la totale de temps consommé est de 23ms ce qui nous laisse assez de temps pour l'actionnement de la marionnette dans l'axe x avec un moteur pas-à-pas et de toujours respecter la contrainte de 24 fps minimum.

Semaine 6(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.

Semaine 7

Mouvement dans l'axe Z: La distance entre la LeapMotion et la main est exprimée en millimètres. Le code ci-dessous traite cette information comme suivant; de 0 à 150mm nous considérons que l'utilisateur voudrais la position la plus basse de la marionnette (pour avoir assez d'espace pour plier les doigts et contrôler la marionnette), à partir de 400mm la position la plus haute est choisie. Dans le cas contraire, une hauteur intermédiaire est choisie pour notre marionnette. Un filtre exponentiel est utilisé pour éviter des mouvements brusques afin de garder la stabilité de la marionnette dans l'espace.

global interZ
global lastValueZ
if vectors[10][1] <= 150:
    interZ = 0
elif vectors[10][1] >= 400:
    interZ = 250
else:
    interZ = vectors[10][1]-150
outputVector[12] = lastValueZ * (1-alpha) + interZ * alpha
lastValueZ = outputVector[12]

La valeur de ouputVector[12] est alors ajoutée aux autres moteurs pour permettre à la marionnette d'être levé et de conserver sa forme simulée, à une certaine limite bien sûr.

for i in range(0,12):
    if outputVector[i] < 0:
        outputVector[i] = 0
    outputVector[i] = 255/116*outputVector[i]
    #adding an offset to compensate for lifting the robot
    outputVector[i] += (outputVector[12])
    if outputVector[i] > 250:
        outputVector[i] = 250

Mouvement dans l'axe X: Nous n'avons que 18cm à manipuler dans l'axe X, nous avons donc limité les mesures de la LeapMotions entre -200mm et 200mm. Lorsque la valeur respecte cette condition, elle sera transformée en une valeur entre 4 et 22cm qui sont le minimum et maximum respectivement.

if vectors[10][0] > -200 and vectors[10][0] < 200:
    outputVector[13] = (vectors[10][0]+200)*18/400+4
elif vectors[10][0] < -200:
    outputVector[13] = 4
else:
    outputVector[13] = 22

L'Arduino reçois un tableau de 14 valeurs par le port série qu'il traite ensuite pour déplacer chacun des 13 servomoteurs qui lui sont connectés. La dernière valeur est celle destinée au moteur pas-à-pas contenant la distance à atteindre entre 4 et 22cm. Le démonstrateur est équipée d'un capteur ultrasons. La distance mesurée, entre le capteur et la plaque de moteurs, est utilisée pour activer ou non le moteur pas-à-pas. La vitesse du moteur est proportionnelle à la différence entre la position désirée et la position actuelle de la plaque.

Semaine 8

Documentation du travail effectué, mis-au point avec l'ingénieur R&D, tournage de la vidéo de présentation, rédaction du rapport et préparation de la soutenance.

Conclusion

Annexes