Aller au contenu


Photo

rantanplan


  • Veuillez vous connecter pour répondre
127 réponses à ce sujet

#61 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 24 mai 2020 - 02:41

Excellent, le Mouton Cadet . . .

 

Il me semble qu'il y a une petite différence entre ta séquence d'angles et celle de Myke (merci de confirmer, ou d'infirmer).

L'objectif, ce n'est pas de faire exécuter un mouvement d'un certain angle à tes servos.

L'objectif, c'est de définir un point en x, y, z, puis de définir les angles des servos de la patte afin qu'elle atteigne ce point.

On peut mémoriser par avance, l'ensemble des angles correspondant aux points pour tracer une droite, par exemple. Je pense que c'est ce que Myke fait.

Ce n'est pas ce que je fais. Je connais les point puis je calcule les angles à la volée.

 

Au final, que l'on ait une séquence de points ou une séquence d'angles, cela revient au même, à condition qu'il y ait correspondance entre les points et les angles.



#62 Jean Brunet

Jean Brunet

    Membre occasionnel

  • Membres
  • Pip
  • 94 messages

Posté 24 mai 2020 - 02:47

En reprenant mon code, si j'ai un traitement sous interruption, par exemple un sonar interrogé toutes les 5 ms, ou un détecteur d'obstacle branché sur une entrée qui déclenche une interruption. flagInterrupt passe à true;

void calculPos( int EpauleD, int CoudeD, int ms, int iterations){

int k;

EpauleD += offsetServoEpauleD;
CoudeD += offsetServoCoudeD;

CoudeD = 180 - CoudeD;
 calculTab(epauleTabD,memEpauleD,EpauleD,iterations);
 calculTab(coudeTabD,memCoudeD,CoudeD,iterations);
  for(k = 0; k < iterations; k++){
      servoEpauleD.writeMicroseconds(epauleTabD[k]);
      servoCoudeD.writeMicroseconds(coudeTabD[k]);
   // --------
     if(flagInterrupt == true)
     {
        memEpauleD = epauleTabD[k]; 
        memCoudeD = coudeTabD[k];
        return;
     }

 previousMillis=millis() ;
      while(millis() - previousMillis < tms) {}
    }
 memEpauleD = EpauleD; 
 memCoudeD = CoudeD;
}


#63 Jean Brunet

Jean Brunet

    Membre occasionnel

  • Membres
  • Pip
  • 94 messages

Posté 24 mai 2020 - 02:54

Oracid, pour créer un robot autonome capable de s'adapter à son environnement, oui je suis d'accord avec toi. 

Seule une unité de calcul intégrée peut le faire, ou peut-être reprendre des positions enregistrées et les modifier à la demande.

Il lui faut de toute façon une stratégie.



#64 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 24 mai 2020 - 03:09

Et tu n'as pas de retards dans le traitement des données ? Un servo un peu décalé ?

Parce que c'est ce que je craignais alors j'ai choisi de remplir d'abord un tableau et de le lire ensuite.

 

 

Hum ... 

Bon je vais essayer de faire un exemple concret avec 3 servo et parler en degré. 


Position de départ : 0 0 0 . 
Position souhaité : 90  60 30 
temps  de parcourt souhaité : 2 secondes. 
 

 

Imaginons que le calculateur découpe tout en 10 positions successive ( en vrai il découpe en beaucoup plus mais bon ... ) 

 

0 0 0   // T = 0 s
les positions successives envoyées par le séquenceur seront : 

 

9 6 3

18 12 6 
... 

45 30 15  ( au bout d'une seconde ) 
... 
81 54 27 
90 60 30  ( à 2s - deltaT ) 

 

Toutes ses positions intermédiaires sont calculées à la volée et stockée dans l'unique tableau "position actuelle " de mes servo


Imaginons que que pile poile après  T = une seconde (alors que le robot est à  45 30 15  ) un utilisateur envoit une nouvelle position  45 60 25  et un temps de 1secondes  


le robot va alors enchaîner ainsi 

 

45 33 16 
45 36 17 
45 39 18 
.... 
45 60 25     T + 1 seconde - deltaT         

 

 

Sur le principe  le même raisonnement marche aussi si c'est le robot lui même qui décide d'ajuster ça trajectoire, lui permettant ainsi d'avoir la possibilité de s'adapter à son mouvement. ( Bon il faut savoir calculer la nouvelle position à atteindre ;) mais ça c'est un autre sujet et c'est pas forcément le plus compliqué =) )



Note, en fonction de tes considérations tu peux choisir deltaT comme étant = 0 , 1 incrément de temps, voir 1/2 incrément ... 

Si ton temps entre deux incréments et faible et que les delta de position servo sont faible aussi, en restant dans les possibilité de ce que peut faire ton servo, tu obtiens un résultat fluide et doux, et tu as pas vraiment de soucis de retard ou de servo décalé. 

Par contre je calibre mes servo avant de faire quoi que ce soit ... Voir la calibration sur le blog de briel ...  ça permet de s'affranchir d'une partie des problèmes de géométrie ... Le problème qui reste étant un défaut de linéarité en fonction de la qualité des servo que tu utilises, mais déjà tu améliorera grandement la précision de tes servo quand tu veux donner des positions précises en degré ...

Bref vraiment rien de sorcier, si ça se trouve tu fais déjà le même genre de chose (je me suis pas penché en détail sur tes tableaux ... ) 
 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#65 Jean Brunet

Jean Brunet

    Membre occasionnel

  • Membres
  • Pip
  • 94 messages

Posté 24 mai 2020 - 03:27

Oui, la différence entre nos deux approches est la détermination du temps.

Tu donnes un temps défini pour le mouvement de l'ensemble de tes servos sur N positions et moi je définis une temporisation à chaque boucle du tableau et le nombre de dimensions du tableau. Mais en fait cela revient au même.

 

J'ai donc des mouvements rapides si le tableau est petit et des mouvements plus coulés s'il est grand. Je l'ai fixé à 20 dimensions ce qui m'a semblé suffisant.
Toutefois si les valeurs sont mal choisies la course des servos n'a pas le temps d'aller au bout du mouvement.



#66 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 24 mai 2020 - 03:47

Oui, la différence entre nos deux approches est la détermination du temps.

Tu donnes un temps défini pour le mouvement de l'ensemble de tes servos sur N positions et moi je définis une temporisation à chaque boucle du tableau et le nombre de dimensions du tableau. Mais en fait cela revient au même.

 

J'ai donc des mouvements rapides si le tableau est petit et des mouvements plus coulés s'il est grand. Je l'ai fixé à 20 dimensions ce qui m'a semblé suffisant.
Toutefois si les valeurs sont mal choisies la course des servos n'a pas le temps d'aller au bout du mouvement.

 

 

Oui mais est ce que tu laisse tes servo aller à la vitesse qui le souhaitent ? ou bien est ce que tu contrôle la vitesse à laquelle vont tes servo  ? 

Si tu veux faire un mouvement tout en douceur, comme le ferait un paresseux  qui tranquillement bougerait la patte ... tu peux avec ton système actuel ? Sans avoir à définir manuellement plein de positions intermédiaire ? Si oui alors c'est tout bon =)  et je retourne au fond de la classe =) 

Si non, alors c'est là que réside l'intérêt de notre différence =) 

Quelque soit la vitesse de déplacement souhaité, j'ai un seul tableau de position final souhaité et j'ai juste à ajuster mon paramètre de temps. 
ça combiné avec le fait que je n'ai pas à me préoccuper de ma position actuelle je peux envoyer à n'importe quel moment un tableau de position et et un temps souhaité et le robot le fera avec la transition aussi fluide que possible en fonction des commandes que j'envoies et de sa position actuelle. 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#67 Jean Brunet

Jean Brunet

    Membre occasionnel

  • Membres
  • Pip
  • 94 messages

Posté 24 mai 2020 - 04:54

Je reprends la réponse que j'avais fait à Oracid

 

 

Si j'ai un mouvement de 90° à 120°, je calcule la différence et je divise cette différence par le nombre d'itérations.

120 - 90 = 30. Si j'ai 10 itérations alors 30 / 10 = 3 ce qui me donne le pas à ajouter dans mon tableau entre chaque angle.

J'aurai donc :

93,96,99,102,105,108,111,114,117,120

C'est donc une progression linéaire, et comme je remplis un tableau pour chaque servo, ils sont tous synchronisés sur une trajectoire linéaire.

 

Et comme je mets une temporisation à chaque tour de boucle, je contrôle la vitesse, il faut juste vérifier que la temporisation n'est pas trop rapide pour la course que le servo doit faire.

Alors là, oui, dans le code sur l'ESP32 le calcul du temps minima n'est pas fait, je le détermine avec le logiciel. Il serait plus safe de le faire dans l'ESP32.

 

J'ai fait un test à très basse vitesse et avec 20 itérations et  200ms à chaque c'est haché. Il faut donc que j'augmente le nombre à  50 probablement.



#68 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 24 mai 2020 - 08:29

bon je suppose que ce découpage : 

93,96,99,102,105,108,111,114,117,120

c'est pas toi qui le fait, mais c'est bien ton code qui le fait automatiquement  pour toi, et qui stock lui même ce résultat dans des tableaux. 

Dans ce cas la seule différence entre nos deux façon de faire c'est que toi tu génères un tableau avec toutes les positions que les servomoteurs devront faire et qui sera de taille plus ou moins longue en fonction de la " précision " que tu veux avoir dans le mouvement / vitesse désirée ... 
Ainsi Toi tu lis dans un tableau ce que moi je calcul à chaque fois à la volée  (= la position suivante), en fonction de ma position actuelle, de l'instant t actuel , de la position finale désirée, et de l'instant Tf , moment où je suis censé arriver à ma position finale. ( et de ma constance de temps de calculs = 1/ fréquence d'actualisation des consignes )

Et si on me change ma position finale / le temps final pour y arriver pendant que je suis en train de me déplacer c'est pas grave, le calcul suivra son cours avec les nouvelles valeurs. J'ai pas tout un tableau à recalculer =) L'avantage c'est que c'est plus " flexible " l'inconvénient c'est que des " calculs " ça prend un peu plus de temps que juste lire une valeur dans un tableau. 

Ta méthode et beaucoup plus logique dans le cadre d'un automate qui doit jouer une séquence prédéfinie sans "soucis d'interruptions " => On calcul une seule fois les tableaux , on stock tout en mémoire et on peut tout jouer très rapidement sans rien avoir à calculer
Donc l'analogie de la partition de musique qui doit être jouée est parfaite dans ce cas. 

Ma méthode bien qu'assez proche part d'un fondamental différent à savoir que ce n'est pas un automate qui doit jouer une séquence prédéfinie et qui ne sera pas interrompu dans son action. C'est un automate qui doit faire ce qu'on lui dit au moment où on le lui dit, dans un délais imparti, et qu'en plus on peut changer d'avis à tout moment => Interruptions très probables . Dans un tel cas calculer la totalité d'un tableau à jouer ( chose qui potentiellement n'arrivera jamais à son terme car une interroption peut provoquer une nouvelle position ) n'a que peu d'intérêt. 
Du coup au lieu de calculer une grosse fois et ensuite de lire rapidement on fait le choix de calculer plein de petites fois. à chaque fois qu'on aura une interruption dans le mouvement on aura eu raison de choisir cette approche, à chaque fois qu'on sera arrivé à la position finale on aura été moins optimal qu'en ayant tout calculer à l'avance comme dans ta méthode. 

Après sur le principe je pense qu'il est plus intéressant de lisser les calculs dans le temps plutôt que d'avoir des pics de calculs avant chaque mouvement... ça permet en théorie une plus grande réactivité en cas de changement de consigne ...

Enfin, au delà des concepts qui sont derrière, on est dans des  temps de calculs si petits, que je ne suis pas sûr qu'il y ait une grosse différence de performance perceptible entre les deux méthodes dans nos cadres d'études... ( Bon tu peux éventuellement arriver à court de mémoire si tu discrétises énormément tes tableaux ... 
De la même façon si on veut me faire calculer super vite à la volée des centaines de servo à un moment donné mon calculateur pourrait ne plus suivre là où toi tu pourrais mouliner pendant un moment puis ensuite répéter en boucle la séquence de manière très fluide ... mais bon  dans un cas comme dans l'autre avant d'en arriver là ...  )

Bon cette fois ci je retourne au fond de la classe et continue de suivre en silence  ;) 


 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#69 Jean Brunet

Jean Brunet

    Membre occasionnel

  • Membres
  • Pip
  • 94 messages

Posté 24 mai 2020 - 09:20

 

bon je suppose que ce découpage : 

93,96,99,102,105,108,111,114,117,120

c'est pas toi qui le fait, mais c'est bien ton code qui le fait automatiquement  pour toi, et qui stock lui même ce résultat dans des tableaux.

 

Bien sur, c'est le code qui le fait dans l'ESP32. Tu as la fonction de calcul plus haut, je l'ai publiée.

Je peux très bien interrompre aussi la lecture de mon tableau, et recalculer un autre tableau pour un nouvel angle. Par contre il n'y a qu'une fonction sous interruption qui peut mettre une variable à true, puisque je suis dans la boucle d'une fonction qui n'est pas visible depuis void loop() Voir mon code plus haut.



#70 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 25 mai 2020 - 06:41

on est dans des  temps de calculs si petits, que je ne suis pas sûr qu'il y ait une grosse différence de performance perceptible entre les deux méthodes dans nos cadres d'études... 

Effectivement, les temps de calcul sont très courts, d'autant plus avec un ESP32.
C'est pour cette raison que je fais les calculs à la volée.
Je donne un interval et je calcule dans une boucle toutes les positions intermédiaires, avec un pas de 1mm, dans une boucle.
Dans mon cas, je suis même obligé de freiner avec la fonction delayMicroseconds().
Lorsque la position suivante est très proche, le servo arrive à suivre, sinon il n'a pas le temps d'y arriver, d'autant plus s'il doit inverser sa rotation.

#71 Jean Brunet

Jean Brunet

    Membre occasionnel

  • Membres
  • Pip
  • 94 messages

Posté 25 mai 2020 - 08:45

J'avais pensé à intégrer un calcul qui me donnerait le temps minima pour chaque déplacement du servo.
Si le temps donné par l'ordre est trop petit alors il l'allonge.

Le problème est que le temps varie en fonction du poids du robot et du terrain. Et si le déplacement est mal calculé une patte peut frotter et créer un effort.
Avec un encodeur le problème est vite réglé, ou alors peut-être mettre un module qui mesure le courant consommé ? 



#72 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 934 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 25 mai 2020 - 01:09

Plus simple dans ton cas tu peux "hack le potentiomètre de tes servo"  pour l'utiliser en feedback. Pour cela il suffit d'ouvri ton servo, ajouter un fil  sur le point milieu du potentiomètre et refermer le servo ...

Là encore faudrait une calibration de tout tes servo... mais ça se ferait en même  temps que tu calibres tes pwm min et max par rapport aux angles réels =)


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#73 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 25 mai 2020 - 01:17

<grillé par Mike>

Voici une vidéo qui montre comment modifier un servo pour avoir le retour de sa position, ici un SG90.

Je l'ai fait avec un SG90 et MG95 ou MG96, cela fonctionne très bien.

Mais je n'ai jamais eu à utiliser cette fonctionnalité.

 

Il y a d'autre vidéos, tu dois chercher, "servo position feedback".

 



#74 Jean Brunet

Jean Brunet

    Membre occasionnel

  • Membres
  • Pip
  • 94 messages

Posté 25 mai 2020 - 02:26

Merci, c'est vrai j'oubliais cette possibilité.

Oracid, quand j'avais évoqué le tapis roulant j'avais pensé à cette possibilité, regarde la vidéo

 



#75 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 25 mai 2020 - 04:54

Ah, mais, c'est pas mal du tout, ça ! Vraiment une bonne idée !

Ton mouvement m'a l'air tout à fait correcte.

J'ai fait un tapis roulant en Lego, il était formé de maillons de chenille, et donc pas très rigide. Par contre, ton idée de faire avancer/reculer une pièce rigide résout bien des problèmes.

C'est certain, il ne pourra pas avancer à l'infini, mais c'est déjà très bien !

 

Ceci dit, mon tapis roulant n'avait pas fonctionné parce que je mets un point d'honneur à utiliser des SG90. Leur faible couple de 0,5kg.cm démontre que si mon quadrupède avance, c'est parce que sa cinématique est bonne et non parce qu'il a de la réserve de puissance. Du coup, la puissance n'était pas suffisante pour supporter son propre poids et faire avancer le tapis roulant. Attention, dans ton cas, il ne supporte pas son propre poids.

Tu utilises des MG996 qui ont un couple de 13kg.cm. Le problème, c'est que trop de puissance peut cacher un problème de cinématique.

Un jour, tu voudras faire un quadrupède plus grand. Au moindre problème, tu décideras d'utiliser des servos encore plus puissants. Ce qui, à mon avis, est une mauvaise solution.

 

Je pars du principe qu'il faut toujours commencer avec une faible puissance quitte à l'augmenter au fur et à mesure de l'évolution du projet.

Je suis en train de terminer le meilleur quadrupède que j'ai jamais fait. Je pense qu'il est plus grand que tien, mais beaucoup moins lourd.

Et bien, j'ai conservé les mêmes servos. Et, crois moi, ce n'est pas faute d'avoir des servos puissants dans mes tirroirs . . .



#76 Jean Brunet

Jean Brunet

    Membre occasionnel

  • Membres
  • Pip
  • 94 messages

Posté 25 mai 2020 - 06:25

 

Attention, dans ton cas, il ne supporte pas son propre poids.

Ce n'est qu'à moitié vrai, car il faut une légère pression pour que le chariot bouge. 
Sur la fin de cette nouvelle vidéo, tu verras que le robot se soulève car j'ai mal dosé l'appui d'une patte arrière. 

Le robot est seulement posé. Pour qu'il ne glisse pas j'ai fait des trous et les vis qui dépassent du robot viennent se loger dedans.

 



#77 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 25 mai 2020 - 06:36

Mais ne t'inquiète pas trop. Fais les choses comme tu les ressens. Je suis certain qu'il en ressortira quelque chose de bien.

Qu'est ce que je disais !



#78 Jean Brunet

Jean Brunet

    Membre occasionnel

  • Membres
  • Pip
  • 94 messages

Posté 26 mai 2020 - 05:54

J'ai amélioré mon logiciel Little Jo. Je peux maintenant recopier un mouvement d'un pied sur n'importe quel autre pied.

Il reste toutefois le problème de l'avancement du robot, qui se traduit par une rotation de l'épaule et un ajustement du coude pour que le pied reste à la même hauteur.

Et donc arrive le moment de se pencher sur la cinématique.

Ce que je voudrais faire, c'est qu'au moment où je recopie un mouvement d'une patte vers une autre, je puisse lui donner une vitesse ou une distance d'avancement et qu'il me recalcule les angles de toutes les pattes.

 

Donc j'aimerai savoir comment m'y prendre, si il y a un tuto quelque part cela m'intéresserrait.



#79 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 6 732 messages
  • Gender:Male

Posté 26 mai 2020 - 06:15

si il y a un tuto quelque part cela m'intéresserrait.

Moi aussi !

 

Sur YouTube, j'ai vu beaucoup de choses sur la cinématique, mais hors de ma portée. Mais peut-être as-tu le niveau ?

Si tu optes pour la symétrie du mouvement, ce sera plus simple. C'est que la plupart des makers font, et moi également.

Sinon, bon courage !



#80 Jean Brunet

Jean Brunet

    Membre occasionnel

  • Membres
  • Pip
  • 94 messages

Posté 26 mai 2020 - 08:49

Je précise que j'ai eu un brevet des métiers de la musique, et je n'étais pas spécialement doué pour les maths. Mais j'aimais bien la géométrie jusqu'au Brevet élémentaire.

Comme la première chose à faire est de bien poser le problème, je vous met un petit schéma vite fait.

 

Image(s) jointe(s)

  • problème 1.jpg





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users