Aller au contenu


Photo
* * * * * 1 note(s)

Asservissement polaire

polaire theta-alpha pid asservissement

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

#1 transistance

transistance

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages

Posté 08 mars 2015 - 07:15

Après m'être fait la main sur un asservissement en vitesse d'un moteur, je m'attaque à l'asservissement polaire. J'aurai ainsi une consigne de distance et une consigne d'angle qui prend en compte l'ensemble des 2 moteurs.

Au début j'ai lu pas mal de pages internet sur le sujet, j'ai griffoné pas mal de schémas bloc, je me suis demandé comment j'allais traduire ça en code et puis, petit à petit, je suis arrivé à un truc qui semble tenir la route.
Il n'y a plus que deux points que je n'arrive pas à comprendre et dont je n'ai pas trouvé les réponses en cherchant moi même. C'est la raison de ce post.   

Premier point:
Dans mon asservissement en vitesse je commence par mesurer la vitesse de rotation de la roue grâce aux nombre de "tick" compté par les encodeurs. Les "tick" sont ensuite remis à 0 pour l'échantillon suivant.
Pour l'exemple, un extrait de ma fonction d'asser en vitesse:

// affectation des compteurs de PID et reset des compteurs sur interruption
        compteurD = tickD;
        tickD = 0;
        mesure_vit_d = (freq_ech*compteurD)/tick_trm/reduction;    // vitesse mesurée en tr/s    

Maintenant je part du principe que dans un asservissement polaire, le but étant de parcourir une certaine distance (par exemple 1000 tick), je ne suis pas censé remettre à 0 le compteur de tick n'est-ce pas ?

 

 

Second point:
Contrairement à un asser en vitesse, la fonction d'asservissement polaire doit gérer le sens de rotation des moteurs (si j'ai bien compris). C'est là que je bloque car je vois pas comment faire ça.

Je poste ici la fonction d'asservissement que j'ai réalisé jusque là:

//---------------------------------------------------------------------------
//                             INTERRUPTIONS EXTERNES                             -
//---------------------------------------------------------------------------
ISR(INT0_vect)        
{
    // Le sens de rotation des moteur est décodé en hardware et sert à incrémenter ou décrémenter les compteur de tick sur interruption.
    // si EncodDSens = 0 (on avance) alors incrémenter TickD sinon décrémenter
    if ( bit_is_clear(EncodDSens_portE, EncodDSens_broche))
    {
        tickD++;
    }
        else
        {
            tickD--;
        }    
}

ISR(INT1_vect)
{
    // si EncodGSens = 0 (on avance) alors décrémenter TickG sinon incrémenter (car cet encodeur est inversé)
    if ( bit_is_clear(EncodGSens_portE, EncodGSens_broche))
    {
        tickG--;
    }
        else
        {
            tickG++;
        }
}

//---------------------------------------------------------------------------
//                     FONCTION ASSERVISSEMENT PID Polaire                     -
//---------------------------------------------------------------------------
void pid(float ConsigneDist, float ConsigneOrient)
{
    float compteurD;
    float compteurG;
    float mesure_dist;
    float mesure_orient;
    float cmd_dist;
    float cmd_orient;

        // affectation des compteurs de PID et reset des compteurs sur interruption
        //compteurD = tickD;
        //compteurG = tickG;
        //tickD = 0;
        //tickG = 0;
        
        // mesure distance et orientation
        mesure_dist = (tickD + tickG)/2;
        mesure_orient = tickD - tickG;
    
        // Calcul des erreurs de distance
        erreur_dist = ConsigneDist - mesure_dist;
        somme_erreur_dist += erreur_dist;
        delta_erreur_dist = erreur_dist - erreur_prec_dist;
        // mise à jour de l'erreur précédente
        erreur_prec_dist = erreur_dist;
      
        // Calcul des erreurs d'orientation
        erreur_orient = ConsigneOrient - mesure_orient;
        somme_erreur_orient += erreur_orient;
        delta_erreur_orient = erreur_orient - erreur_prec_orient;
        // mise à jour de l'erreur précédente
        erreur_prec_orient = erreur_orient;
    
        // calcul des commandes
        cmd_dist = ((kp_dist * erreur_dist) + (ki_dist * somme_erreur_dist) + (kd_dist * delta_erreur_dist));    // PID distance
        cmd_orient = ((kp_orient * erreur_orient) + (ki_orient * somme_erreur_orient) + (kd_orient * delta_erreur_orient)); // PID orientation
        
        // appliquer les commandes aux moteur
        PWMG = cmd_dist - cmd_orient;        // ça ne doit surement pas fonctionner de cette façon
        PWMD = cmd_dist + cmd_orient;
        
        // Normalisation des commandes PWM de sortie (le moteur ne bouge pas avec un pwm < 240)
        if (PWMD < 240) {PWMD = 240;}
            else if (PWMD > 1023) {PWMD = 1023;}
        if (PWMG < 240) {PWMG = 240;}
            else if (PWMG > 1023) {PWMG = 1023;}
}

et la fonction principale:

int main (void)
{

    Ports_Init();                // initialisations E/S
    Init();                        // initialisation avant démarrage
    
    Consigne_Dist = 0;
    Consigne_Orient = 0;
    somme_erreur_dist = 0;
    somme_erreur_orient = 0;
    erreur_prec_dist = Consigne_Dist;         // initialisation sur consigne de depart
    erreur_prec_orient = Consigne_Orient;
    
    _delay_ms(1000);

    Consigne_Dist = 18000;                    // 18000 ticks = 1 tour de roue
    while (1)
    {
        pid(Consigne_Dist, Consigne_Orient);        
        _delay_ms(20);                        // PID à 50Hz (F=1/t)
    }
    
    return 1;
}

En vous remerciant !


N'oubliez jamais que "Ban Ki-moon n'attrape pas mousse"


#2 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é 08 mars 2015 - 09:38

Après m'être fait la main sur un asservissement en vitesse d'un moteur, je m'attaque à l'asservissement polaire. J'aurai ainsi une consigne de distance et une consigne d'angle qui prend en compte l'ensemble des 2 moteurs.

Au début j'ai lu pas mal de pages internet sur le sujet, j'ai griffoné pas mal de schémas bloc, je me suis demandé comment j'allais traduire ça en code et puis, petit à petit, je suis arrivé à un truc qui semble tenir la route.
Il n'y a plus que deux points que je n'arrive pas à comprendre et dont je n'ai pas trouvé les réponses en cherchant moi même. C'est la raison de ce post.   

Premier point:
Dans mon asservissement en vitesse je commence par mesurer la vitesse de rotation de la roue grâce aux nombre de "tick" compté par les encodeurs. Les "tick" sont ensuite remis à 0 pour l'échantillon suivant.
Pour l'exemple, un extrait de ma fonction d'asser en vitesse:

// affectation des compteurs de PID et reset des compteurs sur interruption
        compteurD = tickD;
        tickD = 0;
        mesure_vit_d = (freq_ech*compteurD)/tick_trm/reduction;    // vitesse mesurée en tr/s    

Maintenant je part du principe que dans un asservissement polaire, le but étant de parcourir une certaine distance (par exemple 1000 tick), je ne suis pas censé remettre à 0 le compteur de tick n'est-ce pas ?

 

 

 

 

Oui c'est la différence entre un asservissement en vitesse et un asservissement en position ( que cela soit une distance ou un angle ), après tu peux quand même remettre à 0 tes ticks quand tu mets à jour tes variables position et angle ^^


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  

 

 

 


#3 transistance

transistance

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages

Posté 09 mars 2015 - 05:49

 

Oui c'est la différence entre un asservissement en vitesse et un asservissement en position ( que cela soit une distance ou un angle ), après tu peux quand même remettre à 0 tes ticks quand tu mets à jour tes variables position et angle ^^

Oui. Du coup ça m'amène à me demander comment faire pour savoir quand le robot est arrivé à la position voulue... Faut mettre en place une odométrie en parallèle de l'asservissement polaire et comparer les compteur dans la fonction main ?

 

Sinon je pense avoir éclairci ma seconde interrogation que je rappelle ci-dessous en m'auto-citant :

 

Second point:
Contrairement à un asser en vitesse, la fonction d'asservissement polaire doit gérer le sens de rotation des moteurs (si j'ai bien compris). C'est là que je bloque car je vois pas comment faire ça.

 

Je me suis rendu compte que dans un asservissement polaire les consignes de distance et d'angle sont signées. Par conséquent j'en arrive à la conclusion que les commandes de sortie sont également signées, or un pwm ne pouvant être signé c'est grâce au signe (en détectant si les commandes de sortie sont suppérieur ou inférieur à zéro) que j'adapte en conséquence le sens de rotation.

 

J'ai bon ?


N'oubliez jamais que "Ban Ki-moon n'attrape pas mousse"


#4 transistance

transistance

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages

Posté 10 mars 2015 - 02:29

J'ai mis en pratique ma "découverte" avec cette histoire de signe et effectivement, en faisant passer les commandes finales dans des fonctions appropriée pour détecter le signe, ça marche enfin ! :) :) :)

C'est ultra motivant pour la suite, même s'il me reste encore pas mal d'arrachage de cheveux en perspective.

 

 

 

Oui c'est la différence entre un asservissement en vitesse et un asservissement en position ( que cela soit une distance ou un angle ), après tu peux quand même remettre à 0 tes ticks quand tu mets à jour tes variables position et angle ^^

Oui. Du coup ça m'amène à me demander comment faire pour savoir quand le robot est arrivé à la position voulue... Faut mettre en place une odométrie en parallèle de l'asservissement polaire et comparer les compteur dans la fonction main ?

Plus j'y réfléchi moins j'ai l'impression que ça puisse fonctionner ainsi pour la simple raison que -et ça j'ai tout le loisir de l'observer maintenant que ça fonctionne- l'asservissement travail en continu même quand les roues sont en position voulue. Partant de ce constat, j'ai bien l'impression que même si ça marche la précision ne sera pas au rendez-vous.


N'oubliez jamais que "Ban Ki-moon n'attrape pas mousse"


#5 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é 11 mars 2015 - 03:07

Oui. Du coup ça m'amène à me demander comment faire pour savoir quand le robot est arrivé à la position voulue... 

 

Que fait un robot asservie en vitesse quand il atteint la vitesse demandée ? => Il la maintient ^^ 
 

Pour de l'asservissement en position avec moteurs  à courant continue une bonne approche selon moi est le mode d'excitation " locked antiphase"  qui permet de bloquer les roue en exerçant un couple de bloquage en faisant rapidemement changer le sens de rotation du moteur.

Ainsi quand tu aurras atteint ta position => Tu bloques les roues...

Sinon oui il faut détecter le signe mais pas nécessairement " contrairement à un asservissement en vitesse " car un asservissement en vitesse peut très bien prendre en entrée des vitesse positive ou négative si il gère aussi la gestion du sens des roues comme ton code via mise en pratique de ta "découverte" doit maintenant le faire si j'ai bien compris =).

Après je sais pas si tu l'as fais mais histoire de mettre bien les chose en claire dans ta tête ( surtout la notion d'autre boucle d'odométrie ) il est intéressant d'utiliser la représentation sous forme de schémas bloque. 
Beaucoup de type d'asservissement sont possible, avec des boucles imbriquées etc...  quel type d'asservissement veux tu mettre en place ? 
Combien de bouclage ? Comment effectue le bouclage ? etc ... 

 

 


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  

 

 

 


#6 transistance

transistance

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages

Posté 11 mars 2015 - 04:02

Pour de l'asservissement en position avec moteurs  à courant continue une bonne approche selon moi est le mode d'excitation " locked antiphase"  qui permet de bloquer les roue en exerçant un couple de bloquage en faisant rapidemement changer le sens de rotation du moteur.

Ainsi quand tu aurras atteint ta position => Tu bloques les roues...

 

 

 

Pour moi c'est déjà ce qui se passe: qd le robot est arrivé à la position voulue, l'asservissement étant toujours actif il impose de rapides changements de sens pour maintenir cette position. Ou alors j'ai pas compris ce que tu voulais dire.

 

Mais concrétement, comment je peut détecter que je le robot est arrivé à la position voulue pour passer à la consigne suivante ?

 

 

Après je sais pas si tu l'as fais mais histoire de mettre bien les chose en claire dans ta tête ( surtout la notion d'autre boucle d'odométrie ) il est intéressant d'utiliser la représentation sous forme de schémas bloque. 
Beaucoup de type d'asservissement sont possible, avec des boucles imbriquées etc...  quel type d'asservissement veux tu mettre en place ? 
Combien de bouclage ? Comment effectue le bouclage ? etc ...

 

Oh que si, comme je disais dans mon premier message, j'ai fais beaucoup de schémas bloc (j'ai d'ailleurs prévu de les mettre sur mon site, quand mon robot sera au point) et j'ai lu également beaucoup de pages internet, essentiellement issues d'équipes participant à la coupe de france de robotique.

 

EDIT: Ah oui j'oubliais, j'ai également vu les pid pendant mon BTS uniquement de manière théorique et je me suis farcis les fonctions de transferts et toutes les #*! d'équations qui vont avec. Et dire qu'à l'époque je comptais sur ce cours pour un ancien projet. :rolleyes: 


N'oubliez jamais que "Ban Ki-moon n'attrape pas mousse"


#7 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é 12 mars 2015 - 04:32

Alors juste un mot sur " Locked Antiphase"

 

Une recherche pourra t'expliquer bien mieux que les quelques lignes de résumé que je vais mettre ici mais, 
il y a une différence fondamentale entre un contrôle qui est fait pour générer une vitesse dans un seul sens puis dans l'autre ( commande PWM standard ) et un contrôle qui commande à la fois une réaction et la contre réaction. ( Locked antiphase ). 

Pour plus de précision : Quand tu fais un PWM en standard à X % : tu tourne dans un sens à X %, alors quand locked antiphase tu tourne à X % dans un sens et à 100 - X % dans l'autre sens tout le temps. 
Du coup si tu met 50% en locked antiphase tu es à l'arrête avec un couple résistant. 

 

Pour répondre à ta question :  "Mais concrétement, comment je peut détecter que je le robot est arrivé à la position voulue pour passer à la consigne suivante ? " 

Si tu n'as aucune autre info de capteurs tu peux simplement te contenter de regarder l'erreur de ton asservissement en position et quand elle est suffisamment faible c'est que tu es arrivé. ( libre à toi de définir la valeur de "suffisament faible "

 

Pour en revenir un peu plus sur ton sujet, au final mis à part ta dernière question , où est ton problème du coup ?


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  

 

 

 


#8 transistance

transistance

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages

Posté 12 mars 2015 - 11:17

Merci pour les explications je cerne bien le principe du verrouillage anti-phase.

 

 

Pour en revenir un peu plus sur ton sujet, au final mis à part ta dernière question , où est ton problème du coup ?

Mon problème est lié à ça. Comme je n'arrive pas à détecter que le robot est arrivé à sa consigne je ne peut pas exécuter une suite de commandes.

 

Concrétement, la boucle principale du programme ressemble à ça:

        while (1) 
	{
                Deplacement(0, 180); 					// rotation 180° sur place	
		pid(Consigne_Dist, Consigne_Orient);	
		_delay_ms(20);						// PID à 50Hz (F=1/t)
	}

Il faudrait donc y faire un test pour savoir quand le robot est arrivé afin de remettre à 0 les compteurs pour passer à la commande suivante.

Pour se faire une idée, ça devrait donner un truc dans le genre:

while (1)
{
si consigne atteinte alors ma_variable = ma_variable +1 et RAZ des compteurs
switch(ma_variable)
{
 case 0' :
    faire_déplacement_1;
    break;

 case '1' :
    faire_déplacement_2;
    break;

 case '2' :
    faire_déplacement_3;
    break;

 case '3' :
    faire_déplacement_4;
    break;
}
pid(Consigne_Dist, Consigne_Orient);    
_delay_ms(20);
}

N'oubliez jamais que "Ban Ki-moon n'attrape pas mousse"


#9 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é 13 mars 2015 - 01:56

 

Merci pour les explications je cerne bien le principe du verrouillage anti-phase.

 

Mon problème est lié à ça. Comme je n'arrive pas à détecter que le robot est arrivé à sa consigne je ne peut pas exécuter une suite de commandes.

 

Concrétement, la boucle principale du programme ressemble à ça:

        while (1) 
	{
                Deplacement(0, 180); 					// rotation 180° sur place	
		pid(Consigne_Dist, Consigne_Orient);	
		_delay_ms(20);						// PID à 50Hz (F=1/t)
	}

Il faudrait donc y faire un test pour savoir quand le robot est arrivé afin de remettre à 0 les compteurs pour passer à la commande suivante.

Pour se faire une idée, ça devrait donner un truc dans le genre:

while (1)
{
si consigne atteinte alors ma_variable = ma_variable +1 et RAZ des compteurs
switch(ma_variable)
{
 case 0' :
    faire_déplacement_1;
    break;

 case '1' :
    faire_déplacement_2;
    break;

 case '2' :
    faire_déplacement_3;
    break;

 case '3' :
    faire_déplacement_4;
    break;
}
pid(Consigne_Dist, Consigne_Orient);    
_delay_ms(20);
}

 C'est exactement cela. 

concernant  "si consigne atteinte"
 en fait de manière plus pratique dans ton cas il faut traduire ça par
si  "( position - position voulue ) < erreur position acceptable et (angle - angle voulue) < erreur angle acceptable "

 ou pour reprendre tes variables en asservissant directement sur les "tic"  
erreur_prec_dist < erreur position acceptable

erreur_prec_orient < erreur angle acceptable 

Concernant "ma_variable = ma_variable +1"  c'est exactement ça et pour cela rien de mieux que faire un tableau de structure consigne,

 

Concernant le RAZ des compteurs tu es pas obligé de le faire qu'à ce moment là tu peux le faire dès que tu mets à jour tes variable angle et position. En fait le mieux est d'avoir un timer qui permet de réactualiser en continu tes variable " position " et "angle" qui traduisent la position de ton robot plutôt que de travailler directement sur les tic ( problème de très grand nombre possible en fonction des consignes données et de la résolution )  .  Après tu peux aussi travailler directement en "Ticks " / uniquement " à partir de ton dernier point de consigne " mais il me semble plus intéressant de travailles " à partir du point de départ " 

Autre chose intéressante avec les encodeur et le timer qui met à jour les variable position et angle c'est de faire aussi de l'apprentissage de trajectoire ... et un mode " replay" à " x vitesse" après que tu ais déplacer le robot une fois à la main. Bref énormément de chose très intéressante à faire quand tu as une architecture mécanique correcte mise en place =) . 

En tout cas si ça te rassure de mon point de vue je vois que tu n'as aucun "problèmes" tu te diriges naturellement vers une solution qui fonctionne... 


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  

 

 

 


#10 transistance

transistance

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages

Posté 13 mars 2015 - 01:37

 

concernant  "si consigne atteinte"
 en fait de manière plus pratique dans ton cas il faut traduire ça par
si  "( position - position voulue ) < erreur position acceptable et (angle - angle voulue) < erreur angle acceptable "  ou pour reprendre tes variables en asservissant directement sur les "tic"  
erreur_prec_dist < erreur position acceptable

erreur_prec_orient < erreur angle acceptable

Ok. Mais du coup ça induit une erreur de positionnement ça non ? Je vais tenter de coder ça en croisant les doigts.

 

 

Autre chose intéressante avec les encodeur et le timer qui met à jour les variable position et angle c'est de faire aussi de l'apprentissage de trajectoire ... et un mode " replay" à " x vitesse" après que tu ais déplacer le robot une fois à la main. Bref énormément de chose très intéressante à faire quand tu as une architecture mécanique correcte mise en place =) .

Interessant mais pas possible dans mon cas. Les encodeurs sont montés à l'arrière des moteurs et ceux-ci sont trop réductés pour espérer les faire bouger en poussant le robot.


N'oubliez jamais que "Ban Ki-moon n'attrape pas mousse"


#11 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é 14 mars 2015 - 12:11

Ok. Mais du coup ça induit une erreur de positionnement ça non ? Je vais tenter de coder ça en croisant les doigts.

 

 

 

Bah tu peux aussi remplacer   : si  "( position - position voulue ) < erreur position acceptable et (angle - angle voulue) < erreur angle acceptable "

par : 
si  "( position == position voulue )  et (angle == angle voulue)  "
Mais le problème dans ce cas c'est les oscillations autour de la position d'arrivé...  même si il n'est qu'un point intermédiaire de la trajectoire totale ...
En soit quand tu commande des position points par point tu es plus intéressé par le fais de faire un certains parcours de manière fluide entre les point que de passer par exactement ta valeur de position au centième près. 

 

à toi de définir ton erreur acceptable ;) 

Après côté positif : ton erreur acceptable reste " constante" tu n'as pas d'effet direct d'intégrale sur l'erreur acceptable du à cette acceptance... (  contrairement à toutes les erreurs de dérive du à un arrondis sur les dimension etc...   ) 

 


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  

 

 

 


#12 transistance

transistance

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages

Posté 14 mars 2015 - 07:18

J'ai enfin fini par arriver à un truc correct :) Il ne reste plus qu'à affiner le réglage des coefs des pid et mettre en place la communication i²c pour dialoguer avec la carte maîtresse.

 

J'ai remarqué que la quasi-totalité des pages qui parlent de ce genre d'asservissement évoquent l'intérêt de mettre en place un trapèze de vitesse sans vraiment expliquer comment.

J'immagine que ce trapèze implique l'ajout d'un asservissement de vitesse en sortie d'asservissement polaire n'est-ce pas ? Quoi qu'il en soit le trapèze s'applique en sortie de l'asservissement polaire.


N'oubliez jamais que "Ban Ki-moon n'attrape pas mousse"


#13 transistance

transistance

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages

Posté 23 mars 2015 - 04:56

Petit up.


N'oubliez jamais que "Ban Ki-moon n'attrape pas mousse"


#14 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 mars 2015 - 03:01

 

J'immagine que ce trapèze implique l'ajout d'un asservissement de vitesse en sortie d'asservissement polaire n'est-ce pas ? Quoi qu'il en soit le trapèze s'applique en sortie de l'asservissement polaire.

En fait tout dépend en fonction de la représentation que tu fais... Tu peux parfaitement faire un asservissement imbriqué, ou bien un asservissement " en série" dans ce cas là puisque la sortie de l'un rentre dans l'entrée de l'autre et vice versa. Les deux sont possible, il est même possible de faire de l'asservissement parallèle croisé en réinjectant le résultat dans l'autre ... 

je ne sais pas si ça va t'intéressé mais de manière simple j'avais il y a quelque année j'avais fais ça : Au final un double asservissement en " distance " et en " vitesse" un peu particulier.  http://www.robot-maker.com/forum/topic/6870-rmad-le-robot-fou-p/  Tu peux éventuellement y jeter un oeil ;)

Quoi qu'il en soit je t'encourage vivement à faire des schémas bloc quand tu poses tes questions sinon difficile de te répondre car il existe plusieurs façon d'arriver au même résultat et personnellement je ne saurais te dire quelle est la meilleur façon ... Par contre chacune à ses avantages et inconvénients et je peux éventuellement te donner mon avis sur ce point. 

Pour simuler des schémas bloc rien de tel que des trucs tels que simulink ou sa version gratuite qu'on utilise facilement en cours ;) 

 


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  

 

 

 


#15 transistance

transistance

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages

Posté 24 mars 2015 - 08:13

Hé bien pour l'instant j'ai codé ça (asserv polaire):

Asserv_polaire_filig_mini.png

Et j'immagine que sur un simple asserv polaire tel que celui-ci il n'est pas possible d'intégrer un trapéze de vitesse.

 

Du coup il faudrait donc que je code ça:

polaire_vitesse_filig_mini.png

Suis-je dans le vrai ?


N'oubliez jamais que "Ban Ki-moon n'attrape pas mousse"


#16 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 mars 2015 - 03:32

Ta première proposition correspond à  un asservissement parallèle croisé. 
Ta seconde 
proposition correspondrait à une combinaison d'un asservissement  en série + parallèle croisé.

Cependant : des remarques sur le vif comme ça : 

=> tu as la même unité d'entrée sur tes  " boucles d'asservissement et de vitesse " hors l'unité de l'un devrait être la position et l'autre la vitesse... 
=> tu n'as pas de consigne en vitesse donc tu ne peux toujours pas imposer un asservissement de vitesse en trapèze. 


 


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  

 

 

 


#17 transistance

transistance

    Membre passionné

  • Membres
  • PipPipPip
  • 411 messages

Posté 25 mars 2015 - 03:45

Oui maintenant que tu le dis cet oubli saute aux yeux !

 

En admettant que je n'ai pas omis la consigne de vitesse sur le schéma n°2 ( je vais vite corriger ça) c'est bon comme façon de procéder ?

 

PS : merci pour le jargon :)


N'oubliez jamais que "Ban Ki-moon n'attrape pas mousse"


#18 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é 26 mars 2015 - 07:22

Juste une précision concernant le "Jargon" : Je ne fais que répéter la façon dont je l'ai appris en cours il y a quelques années maintenant. En aucun cas j'affirme que c'est une façon universelle de nommer la chose, mais quoi qu'il en soit je ne connais que cette façon de décrire ... 

Ensuite concernant le fait de procéder ainsi et bien oui ça peut être une façon de faire ;)
(Par contre toujours la même remarque : tu as la même unité d'entrée sur tes  " boucles d'asservissement et de vitesse " hors l'unité de l'un devrait être la position et l'autre la vitesse... en fait je te fais cette remarque car si tu mets pas en place une base de temps fixe qui te permet de faire un calcul de vitesse correcte tu pourras pas faire d'asservissement en vitesse alors qu'avec ton premier asservissement tu n'as pas besoin de cela ;)


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  

 

 

 






Aussi étiqueté avec au moins un de ces mots-clés : polaire, theta-alpha, pid, asservissement

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

0 members, 0 guests, 0 anonymous users