Aller au contenu


Photo

rantanplan


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

#41 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 21 mai 2020 - 05:05

Tu peux, bien sûr, changer la configuration de ton quadrupède, mais peut-être que le plus simple serait de tout réimprimer, https://www.thingive...m/thing:3384371

Mais, je voulais simplement te donner un exemple de la course de la patte arrière.



#42 Jean Brunet

Jean Brunet

    Membre

  • Membres
  • 97 messages

Posté 21 mai 2020 - 06:00

Non je ne vais pas recommencer un autre robot.

Par contre je ferai sans doute une configuration avec le servo épaule et coude l'un au dessus de l'autre avec une tringlerie pour actionner l'articulation coude. Cela fera moins de masses qui se baladront.



#43 Jean Brunet

Jean Brunet

    Membre

  • Membres
  • 97 messages

Posté 22 mai 2020 - 12:49

Nouvelle vidéo



#44 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 22 mai 2020 - 12:57

Pourquoi ne mettrais-tu pas Rantanplan sur un piedestal ?

De cette manière, on pourrait mieux apprécier la cinématique que tu as programmée.



#45 Jean Brunet

Jean Brunet

    Membre

  • Membres
  • 97 messages

Posté 22 mai 2020 - 01:21

Oui, mais ce sont les mouvements du dos que j'ai voulu montrer ici. Et les problèmes de poids obligent à faire des corrections, par exemple pour monter la patte avant il faut un peu jouer sur les pattes arrières pour accentuer le déséquilibre. 

Je vais préparer une nouvelle vidéo.



#46 Jean Brunet

Jean Brunet

    Membre

  • Membres
  • 97 messages

Posté 22 mai 2020 - 02:02

La même au ralenti

 

Au début je joue sur les pattes avants, puis les pattes arrières. Puis basculement vers l'avant, les côtés, l'arrière.

Ensuite pivotement sur les côtés de l'avant puis de l'arrière, enfin il s'assoit et puis pivotement inversé des servos du corps. 



#47 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 22 mai 2020 - 05:04

Au début je joue sur les pattes avants, puis les pattes arrières. Puis basculement vers l'avant, les côtés, l'arrière.

Ensuite pivotement sur les côtés de l'avant puis de l'arrière, enfin il s'assoit et puis pivotement inversé des servos du corps. 

Ok !  C'est une stratégie. Cela me semble un peu compliqué, mais c'est le résultat qui compte.

 

Perso, pour débuter, ça va faire 2 ans maintenant, j'ai opté pour un mouvement "perpétuel".



#48 Jean Brunet

Jean Brunet

    Membre

  • Membres
  • 97 messages

Posté 22 mai 2020 - 08:23

A te dire vrai, le logiciel que j'ai développé ne peut pas être directement utilisé par un robot autonome.

Mais il permet de caler les offsets des moteurs facilement, de choisir visuellement les attitudes du robot qui peuvent être ensuite enregistrées dans le code sur le robot.

Mais le plus instructif est de comprendre ce qui se passe lors des mouvements. Pourquoi une patte glisse alors qu'elle devrait rester fixe, pourquoi si une patte se soulève le robot bascule. 

Alors on peut reprendre chaque articulation et observer ce qui se passe. Et à chaque fois on a l'impression qu'on a avancé un petit peu plus.

Pour un petit robot amusant, je pense qu'on peut bien s'amuser.



#49 Jean Brunet

Jean Brunet

    Membre

  • Membres
  • 97 messages

Posté 23 mai 2020 - 07:37

Voici une présentation rapide de Little Jo, le logiciel de commande de rantanplan

 



#50 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 23 mai 2020 - 08:11

Intéressant !

As-tu prévu la commande des servos en séquentiel, en simultané, ou les deux possibilités.



#51 Jean Brunet

Jean Brunet

    Membre

  • Membres
  • 97 messages

Posté 23 mai 2020 - 09:04

En fait, c'est surtout un éditeur de trame, mais pour l'instant il fonctionne soit avec des ordres individuels, soit avec une trame complète.

Si je comprends bien ta question, tu souhaiterais que je n'envoie qu'une patte (3 servos ) l'ESP32 se chargeant de les envoyer en décalé sur les autres pattes ?

Ou que le logiciel soit capable de le faire et d'éditer lui-même des trames en fonction d'un timing précis ?



#52 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 24 mai 2020 - 07:08

Si j'ai bien compris, avec ton logiciel, tu es capable de générer une séquence de mouvements pour chaque servo, soit 12 servos dans ton cas. Ces séquences seraient ensuite lues et exécutées par l'ESP32.

Je voulais attiré ton attention sur le fait qu'il fallait dès le début prévoir d'exécuter simultanément l'ensemble des séquences des servos de chaque patte, mais également l'ensemble des séquences de toutes les pattes.

Si ton quadrupède a une cinématique symétrique, alors tu peux juste élaborer une séquence pour une patte et affecter un déphasage pour les autres pattes.

C'est ce que je fais, mais tu verras, les problèmes de symétrie ne sont pas si simples qu'il y parait.

 

En résumé, si je fais l'analogie avec une partition d'orchestre, chaque instrument a sa portée. Les notes (les degrés dans ton cas) peuvent avoir une durée plus ou moins longue (blanche, noire, croche), mais toutes les portées sont exécutées avec le même tempo. Les mesures étant strictement exécutées simultanément, c'est à dire alignées dans le temps.

Je ne sais pas si tu es un peu musicien, mais même si tu ne l'es pas, je t'invite à réfléchir à cette analogie. Elle te permettra peut-être de bien appréhender l'ensemble du problème.

 

Je me suis toujours demandé si un séquenceur MIDI ne serait pas adapté à la robotique.

 

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.



#53 Jean Brunet

Jean Brunet

    Membre

  • Membres
  • 97 messages

Posté 24 mai 2020 - 09:19

J'ai bien compris ce que tu voulais dire. J'ai fait le conservatoire et décroché un premier prix de flûte traversière, donc, même si je n'en joue plus, l'analogie est bien choisie. 

J'avais d'ailleurs pensé à ajouter une trame du temps pour placer les mouvements des pattes dessus mais cela me parait difficile à programmer.

Idem pour insérer un robot en 3D que l'on pourrait bouger avec des poignées virtuelles et dont les mouvements seraient recopiés sur le robot. C'est un domaine de programmation que je ne connais pas, hélas.

La trame envoi les positions des 12 servos simultanés + une tempo + la longueur du tableau dans lequel le mouvement de chaque servo sera découpé.

Comme un peu de code est quelquefois plus parlant, je te mets un exemple pour 2 servos, une épaule et un coude droit. Le but est de synchroniser les mouvements en maîtrisant la vitesse. Il y a un inconvénient, c'est qu'un faible déplacement d'un servo sera plus lent qu'un fort déplacement. Mais on peut s'en affranchir en multipliant les positions et en jouant sur la temporisation.

On aurait donc une trame

$90,128,10,20 codée en octets sans les virgules

soit un angle de 90° et de 128°, avec une temporisation de 10 ms pour chaque boucle d'un tableau de 20 entiers. Cela donne sur l'ESP32

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

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

int calculTab(int tableau[nbMesures],int memPosition, int Position, int iterations)
{
  // un tableau de N positions est rempli avec un écart linéaire
  // si l'écart est faible, alors le temps de réaction sera lent
 
  float mB;
  int k;
  float temp;
  float val;
  int conv;
   if(memPosition < Position){
    // angle croissant
     mB = ((float)Position - (float)memPosition) / (float)iterations;
    //  Serial.println(mB,DEC);
     // sens en progression
      tableau[0] =  (int)mB + memPosition; // pour l'indice 0
      conv = map(tableau[0],0,180,500,2500);
      tableau[0] = conv;
      temp = mB + (float)memPosition;
     for(k = 1; k< iterations; k++){
        val = temp + mB;
        tableau[k] = map((int)val,0,180,500,2500);      
        temp = mB + temp;
     }
     tableau[iterations] = map(Position,0,180,500,2500); 
  }
  else if(memPosition > Position){
    // angle décroissant
      mB = ((float)memPosition - (float)Position) / (float)iterations; 
     //  Serial.println(mB,DEC); 
     tableau[0] =  memPosition - (int)mB;
      conv = map(tableau[0],0,180,500,2500);
      tableau[0] = conv;
     temp = (float)memPosition - mB;  // int - float 
     for(k = 1; k< iterations; k++){
       val = temp - mB;
       tableau[k] =  map((int)val,0,180,500,2500);       
       temp = temp - mB;
     }
       tableau[iterations] = map(Position,0,180,500,2500);
  }
  else if(memPosition == Position){
     for(k = 0; k< iterations; k++){
       tableau[k] = map(Position,0,180,500,2500);
     }
  }
  return 0;
}

C'est  un peu compliqué, et peut-être faudrait-il simplifier le code en particulier l'instruction map() mais cela fonctionne avec l'ESP32 qui est assez rapide.



#54 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 10 165 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 - 10:09

J'ai l'impression que ça se rapproche de ce que j'ai fais pour le robot Briel : https://www.robot-ma...u-projet-briel/ 

Le blog est pas fini alors que le projet est allé beaucoup plus loin ... J'ai jamais pris le temps de finir de le rédiger ... Mais je suis presque sûr que j'ai fourni un code plus complet quelque part sur le forum, dans une discussion que j'ai eu avec Oracid sur un de ces quadrupèdes ... Mais là tout de suite j'arrive pas à retrouver... 

Peut être qu'Oracid pourra retrouver la discussion dont je parle =) . 

L'intérêt de ce qui était fait était d'avoir un tablea représentant l'état " courant du robot " qui se met à jour en continue et à partir duquel tout déplacement commandé se fait. Cela permettait de calculer automatiquement le nécessaire pour que tous les servo finissent en même temps à la position demandé quelque soit la position de départ, même si le robot était interrompu en plein milieu d'un cycle entre deux positions ... 


Exemple précis : Imaginons que tu envois une trame  avec un mouvement lent pour aller d'une position A à une position B impliquant tous tes servomoteurs. 

Si avant d'atteindre la position B ,  (alors que tu es en mouvement à une position P que tu n'as pas réellement prévu dans ton code car c'est un état intermédiaire qui est calculé automatiquement.... ) et que tu décides de changer d'avis et lance la commande d'aller à une position C, alors le calcul en place permet d'aller de ta position P actuel à la position C de sortes à ce que tous les servo finissent en même temps à la position C. 

Je sais pas si je suis clair mais en retrouvant le code en question ça devrait être un peu plus parlant je pense =). 

Si ça t'intéresse je peux creuser un peu plus le sujet. Mais si tu as  pas besoin car tu as déjà l'équivalent ( ce qui est possible ;) )  ou que ça ne t'intéresse pas plus que ça je me remet à te suivre discrètement au fond de la classe ;) 


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  

 

 

 


#55 Jean Brunet

Jean Brunet

    Membre

  • Membres
  • 97 messages

Posté 24 mai 2020 - 10:26

Merci Mike118 pour ces précisions.

Si je te suis bien tu dimensionnes un tableau sur toute la longueur d'un mouvement de base, par exemple l'aller retour d'une patte et tu viens placer tes angles dedans selon la progression que tu veux.



#56 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 24 mai 2020 - 10:54

J'ai fait le conservatoire et décroché un premier prix de flûte traversière

Félicitation ! Je ne suis qu'un modeste clarinettiste. D'ailleurs, mon avatar, c'est mon reflet sur un des tampons de ma clarinette.

 

J'ai du mal à relire mon code, alors celui des autres, c'est mission impossible. Je vois que tu utilises un tableau, mais je n'en vois pas le contenu, or c'est plutôt cela qui m'intéresse dans un premier temps.

Jusqu'à récemment, j'utilisais également un (des) tableau contenant les positions (non les angles) de chaque patte. FR=Front Right, BR=Back Right, FL=Front Left, BL=Back Left

int FRx[]= { 50, 45, 40, 35, 30, 25, 20, 15, 10,  5,  0, -5,-10,-15,-20,-25,-30,-35,-40,-45,-50,    -50,-45,-40,-35,-30,-25,-20,-15,-10, -5,  0,  5, 10, 15, 20, 25, 30, 35, 40, 45, 50};
int BRx[]= {-50,-45,-40,-35,-30,-25,-20,-15,-10, -5,  0,  5, 10, 15, 20, 25, 30, 35, 40, 45, 50,     50, 45, 40, 35, 30, 25, 20, 15, 10,  5,  0, -5,-10,-15,-20,-25,-30,-35,-40,-45,-50};
int FLx[]= { 50, 45, 40, 35, 30, 25, 20, 15, 10,  5,  0, -5,-10,-15,-20,-25,-30,-35,-40,-45,-50,    -50,-45,-40,-35,-30,-25,-20,-15,-10, -5,  0,  5, 10, 15, 20, 25, 30, 35, 40, 45, 50};
int BLx[]= {-50,-45,-40,-35,-30,-25,-20,-15,-10, -5,  0,  5, 10, 15, 20, 25, 30, 35, 40, 45, 50,     50, 45, 40, 35, 30, 25, 20, 15, 10,  5,  0, -5,-10,-15,-20,-25,-30,-35,-40,-45,-50};

int FRy[]= { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,     30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30};
int BRy[]= { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,     20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20};
int FLy[]= { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,     20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20};
int BLy[]= { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,     30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30};
int lgTab = sizeof(FRx)/sizeof(int);

C'est simpliste, mais très efficace. Là c'est symétrique, mais ce n'est pas une obligation. Si un servo ne bouge pas, il suffit de répéter sa position.

Puis avec une simple moulinette, ici Forward(), je lis les tableaux et j'appelle ma fonction InverseKinematics(x,y,L,R) qui calcule les angles des 2 servos (par patte) et les actionne. Une variable Speed détermine la vitesse du mouvement.

 

void Forward(){
  for(int i=0;i<lgTab;i++){
    InverseKinematics(FRx[i],FRy[i],0,1);
    InverseKinematics(BRx[i],BRy[i],4,5);
    InverseKinematics(FLx[i],FLy[i],2,3);
    InverseKinematics(BLx[i],BLy[i],6,7);
  } 
}

J'ai, comme ça, toute une collection de tableaux que j'utilise pour mes tests. Pour chacune de mes réalisations, tu trouveras le programme sur GitHub.

 

Aujourd'hui, j'ai abandonné ce principe de tableau et j'utilise un interval en millimètre, par exemple pour x, de +50 à -10, et pour y, de -6 à +6 . C'est la trajectoire que doit effectuer la patte Avant Droite. Le mouvement est un rectangle par exemple (+50, -6, -10, +6). La position x=0 étant l'axe principal du 4 barres.

Une moulinette calcule l'angle des servos pour chaque millimètre et les active. J'ai une variable stp qui définit le pas. Par exemple, si stp=2, alors je calcule la position tous les 2mm.

 

J'analyse le mouvement avec le quadrupède sur son piedestal, avec une vitesse très lente et avec un pas de 1mm. De cette manière, je vois parfaitement les défauts.

Si cela me convient, je pose le quadrupède au sol, là c'est souvent la cata, alors je recommence. Cela fait 2 ans, maintenant.



#57 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 24 mai 2020 - 11:00

Peut être qu'Oracid pourra retrouver la discussion dont je parle =) . 

Désolé, là, je ne vois pas, mais si je le retrouve, je donnerai le lien.



#58 Jean Brunet

Jean Brunet

    Membre

  • Membres
  • 97 messages

Posté 24 mai 2020 - 12:50

Merci pour ton code, Oracid.

Dans mon tableau c'est simple, je mets les positions intermédiaires entre deux angles

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 synchronisés sur une trajectoire linéaire.

 

Mike118, je peux récupérer la valeur du tableau si il y a une interruption (mur) et la placer en mémoire de fin de position.

 

Voici une autre vidéo qui le montre bien


Modifié par Jean Brunet, 24 mai 2020 - 12:56 .


#59 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 10 165 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 - 01:58

Merci Mike118 pour ces précisions.

Si je te suis bien tu dimensionnes un tableau sur toute la longueur d'un mouvement de base, par exemple l'aller retour d'une patte et tu viens placer tes angles dedans selon la progression que tu veux.

Non,

J'ai un tableau qui contient la position actuelle de tous mes servos et j'ai un tableau qui décris la position finale souhaitée et un temps rien de plus.

Chaque trame de consigne va envoyer une consigne de position complète =  un tableau qui contient toutes les consignes de positions finales des servo  + une consigne de temps est associée pour effectuer le mouvement

Le système calcul automatiquement à partir de la position actuelle, toutes les positions intermédiaires pour arriver à la position finale dans le temps demandé. 

la position actuelle se met à jour au fur et à mesure que le mouvement se joue. 


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  

 

 

 


#60 Jean Brunet

Jean Brunet

    Membre

  • Membres
  • 97 messages

Posté 24 mai 2020 - 02:14

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.






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

0 members, 1 guests, 0 anonymous users