IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Régulation PID difficile, problème de moteur ?


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 7
    Par défaut Régulation PID difficile, problème de moteur ?
    Bonjour à tous, je développe un quadcopter actuellement, et pour calculer les vitesses des moteurs, j'utilise plusieurs régulateurs PID, un pour chaque axe (YAW, PITCH, ROLL). Sauf que le régulateur peine à stabiliser le quadcopter. En effet, afin de trouver le coefficient KD j'ai mis à zero KI et KP. Sauf que le quadcopter a tendance a penché d'un côté, la réponse n'est pas la même des deux côtés. Pour détailer ce que je viens de dire j'ai réaliser une vidéo de quelques minutes dans laquelle je film le quadcopter. En fait, j'aimerais savoir s'il est possible que mes moteurs n'ont pas la même puissance, ce qui expliquerait pourquoi le drone penche plus d'un côté que l'autre. Je ne poste pas le code, car je ne trouve pas cela nécessaire, ma vidéo suffit amplement je pense.

    Voici la vidéo :


    comme on peut le voir dans la vidéo, la réponse du drone n'est pas "symétrique", on devrait observer un phénomène d'oscillation normalment

    Merci d'avance à ceux qui prendront le temps de la regarder entièrement pour tenter de m'aider

    -

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Salut,
    Il peut y avoir un tas de raison à ce problème.
    Erreur dans l'implémentation du PID ou mauvais retour de la consigne dans le PID...

    En mettant Kd et Ki à 0 alors Kp devrait effectivement causer une oscillation.

    J'imagine que tu as fait des tests au fur et mesure de l'avancée de ton projet, est ce que le PID fonctionnait bien avec un moteur et une consigne ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 7
    Par défaut
    Merci d'avoir pris le temps de lire et de répondre à ce topic car trouver des personnes qui peuvent m'aider sur la régulation pid a l'air compliqué..

    Je n'ai jamais testé le régulateur PID avec un seul moteur, je peux tester demain si tu veux.

    Je te met ci dessous la partie de mon code qui sert de réglateur pid :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    void control_update(){
     
     
      throttle = map(joystick.throttle, -32767, 32767, 1000, 2000); // On récupère la puissance à laquelle les moteurs doivent tourner, celle ci est comprise entre 1000 et 2000
      desired_pitch = map(joystick.pitch, -32767, 32767, -45, 45); // on récupère la consigne de l'angle  PITCH
     
     
      error = desired_pitch - pitch;  // Calcul de l'erreur entre la consigne et la valeur courante de l'angle PITCH
      delta_error = error-lastError; // ligne pour l'instant sans intérêt car kD vaut 0
      lastError = error;  // idem
     
      pitchOffset = ROLL_PID_KP*error + ROLL_PID_KI*errorsSum + ROLL_PID_KD*delta_error; // calcul de la future variation des  vitesses des moteurs
     
      errorsSum += error; // idem
     
    // on calcul la vitesse de chaque moteur 
      m1 = throttle + pitchOffset;
      m2 = throttle + pitchOffset;
      m3 = throttle - pitchOffset;
      m4 = throttle - pitchOffset; 
     
      Serial.print(m1);
      Serial.print("   ");
      Serial.print(m2);
      Serial.print("   ");
      Serial.print(m3);
      Serial.print("   ");
      Serial.println(m4);
     
      if(m1 < 1000) m1=1000;
      else if(m1 > 2000) m1 = 2000;
     
      if(m2 < 1000) m2=1000;
      else if(m2 > 2000) m2 = 2000;
     
      if(m3 < 1000) m3=1000;
      else if(m3 > 2000) m3 = 2000;
     
      if(m4 < 1000) m4=1000;
      else if(m4 > 2000) m4 = 2000;
     
     
    // on envoie aux moteurs leur nouvelles vitesses
      update_motors(m1, m2, m3, m4); 
     
     
    }

    Demain je vais testé les moteurs en leurs envoyant tous la même vitesse pour voir si le drone penche toujours plus d'un côté, si c'est le cas, c'est que mes moteurs ont un soucis non ? Dans ce cas, vaut mieux en racheter ou attribuer un coefficient à certains moteurs pour compenser ce manque de puissance ?

    Merci

  4. #4
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    J'ai pensé aussi à ce truc : est-ce que tes capteurs sont bien placés ? Perpendiculaires entre eux ? N'as-tu pas inversé les signaux de 2 de tes capteurs par exemple ?

    - Ce qui me surprend un peu dans ton code (peut-être que je me trompe) c'est que deux moteurs aient la même vitesse (m1 = m2 et m3 = m4)
    Je m'attendais à ce que tes calculs prennent en compte la vitesse actuelle des moteurs. Tes moteurs auraient ainsi leur vitesse propre. Est-ce que tu peux mesurer la vitesse de tes moteurs ?

    - Ensuite tu fixes des limites : qui te dit que dans tes calculs tu ne sors pas de ces limites ?

  5. #5
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Citation Envoyé par Auteur Voir le message
    - Ce qui me surprend un peu dans ton code (peut-être que je me trompe) c'est que deux moteurs aient la même vitesse (m1 = m2 et m3 = m4)
    Je m'attendais à ce que tes calculs prennent en compte la vitesse actuelle des moteurs. Tes moteurs auraient ainsi leur vitesse propre. Est-ce que tu peux mesurer la vitesse de tes moteurs ?

    - Ensuite tu fixes des limites : qui te dit que dans tes calculs tu ne sors pas de ces limites ?
    Oui en effet, cette série de if et else, vers la fin du code, vient annuler les calculs de la correction PID.

    Ce soir, je regarderai plus en détail ce que tu fais. Les algorithmes PID sont simple à implémenter et comme toujours, ceux sont les coefficients qui sont difficiles à trouver.

  6. #6
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Je m'attendais aussi à ce que la vitesse v du moteur soit une fonction de yaw, pitch et roll : v = f(y, p, r)

    Autre point, si je me fie au code et au nom des variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pitchOffset = ROLL_PID_KP*error + ROLL_PID_KI*errorsSum + ROLL_PID_KD*delta_error;
    cela voudrait dire que le "pitch" dépend de "roll" ? Et où est "yaw" ?



    Juste une confirmation également :
    yaw = altitude (z)
    roll = roulement (x)
    pitch = tangage (y)
    c'est ça ?

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 7
    Par défaut
    Citation Envoyé par Vincent PETIT Voir le message
    Oui en effet, cette série de if et else, vers la fin du code, vient annuler les calculs de la correction PID.

    Ce soir, je regarderai plus en détail ce que tu fais.

    Merci

    cela voudrait dire que le "pitch" dépend de "roll" ? Et où est "yaw" ?
    Non, c'est juste une erreur sans importance car de lorsque je modifié la valeur des coefficients du pitch je modifiais ceux de roll sans me rendre compte !

    pitchOffset = PITCH_PID_KP*error + PITCH_PID_KI*errorsSum + PITCH_PID_KD*delta_error; voilà c'est corrigé

    De plus, comme tu peux le voir dans la vidéo, le quadcopte est fixé sur un axe, donc pour d'instant je cherche les coefs PID seulement pour un seul axe (le pitch) c'est pour cette raison que pour l'instant je ne calcul ni l'erreur du pitch, ni celle du yaw.

    Juste une confirmation également :
    yaw = altitude (z)
    roll = roulement (x)
    pitch = tangage (y)
    c'est ça ?
    Oui c'est ça !

    Merci à tous

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 7
    Par défaut
    Citation Envoyé par Auteur Voir le message
    J'ai pensé aussi à ce truc : est-ce que tes capteurs sont bien placés ? Perpendiculaires entre eux ? N'as-tu pas inversé les signaux de 2 de tes capteurs par exemple ?
    Mon capteur est placé au centre du châssis, donc il est bien placé ! Non le câblage est bon, il calcul bien en temps réel les valeurs des angles, j'ai vérifié cela à coups de Serial.println(pitch) et Serial.println(roll).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    - Ce qui me surprend un peu dans ton code (peut-être que je me trompe) c'est que deux moteurs aient la même vitesse (m1 = m2 et m3 = m4) :koi: 
    Je m'attendais à ce que tes calculs prennent en compte la vitesse actuelle des moteurs. Tes moteurs auraient ainsi leur vitesse propre. Est-ce que tu peux mesurer la vitesse de tes moteurs ?
    Ce n'est pas si surprenant que ça, c'est une régulation de position angulaire, donc on se base sur la valeur de l'angle actuelle pour calculer l'erreur, et non la vitesse des moteurs qui n'est pas si significatives que ça !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    - Ensuite tu fixes des limites : qui te dit que dans tes calculs tu ne sors pas de ces limites ?
    Lorsque je test mon PID, je met en général le throttle au moins à 1200 quelque chose comme ça, or, comme on peut le voir dans ma vidéo, les vitesses des moteurs ne varient que de quelques dizaines, donc on atteint jamais la limite 1000 ( de toute façon inutile de faire voler le quadcopter à 1150 par exemple car à cette vitesse il ne pourrait pas s'envoler).

    De même pour la limite à 2000, lors de mes test je ne me jamais le throttle à plus de 1500 car c'est inutile lors d'un test, mes moteurs sont assez puissant. Par contre oui en effet, ça pourra poser problème plus tard lorsque le quadcopter volera

  9. #9
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Ton algo PID semble bon mais il y a des choses que je ne comprends pas.

    Le gyroscope va de +45° a -45° pour le pitch ? Il ne fait pas un tour du genre de 0° à 360° ?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    desired_pitch = map(joystick.pitch, -32767, 32767, -45, 45); // on récupère la consigne de l'angle  PITCH

    Je ne vois pas quand tu lis l'angle Pitch ? Alors que tu l'utilises.

    Là il y a un truc que je ne pige pas. Tu dis que throttle est l'image de la puissance du moteur qui varie entre 1000 et 2000 et tu ajoutes un offset que tu as calculé avec des angles
    Ceux sont deux grandeurs que tu penses liées mais qui ne sont pas sur la même échelle.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    m1 = throttle + pitchOffset;
    Autrement dit tu ajoutes ou retire des pouillèmes à 1000 par exemple donc le PID ne régule rien. De plus un peu plus bas tu bornes le résultat du PID avec une série de if et else ce qui n'arrange rien puisque même avec un grand gain "P" (pour rendre les puillèmes significatifs devant throttle) tu vas le borner pour ne pas qu'il dépasse 2000.

    Le problème de fond est un peu plus complexe, j'en ai bien peur.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 7
    Par défaut
    Ton algo PID semble bon mais il y a des choses que je ne comprends pas.

    Le gyroscope va de +45° a -45° pour le pitch ? Il ne fait pas un tour du genre de 0° à 360° ?
    Le gyroscope va de -90° à 90°. Il vaut 0 degré lorsque le drone est à l'horizontal, -90 et 90 quand il est à la verticale, pour le pitch.

    Avec mon joystick, je peux demander au drone de s'incliner suivant un angle de -45 à 45 degrés.

    Cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    desired_pitch = map(joystick.pitch, -32767, 32767, -45, 45); // on récupère la consigne de l'angle  PITCH
    , traduit la position de mon joystick par la position angulaire souhaitée.



    Je ne vois pas quand tu lis l'angle Pitch ? Alors que tu l'utilises.
    Je lis l'angle pitch dans un autre fichier, en voici un extrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); // on récupère les valeurs brutes de l'accéléromètre et du gyroscope pour les 3 axes
    roll = 0.96*(angle_x+float(gx)*0.01/131) + 0.04*atan2((double)ax,(double)az)*180/PI; (on leur applique un filtre complémentaire)
    pitch = 0.96*(angle_y+float(gy)*0.01/131) + 0.04*atan2((double)ay,(double)az)*180/PI;
    (j'ai vérifié avec Serial.println() que les angles sont bel et bien lu).




    Autrement dit tu ajoutes ou retire des pouillèmes à 1000 par exemple donc le PID ne régule rien.
    C'est sur si les moteurs sont tous à 1000, si le PID enlève 15 à deux moteurs, les "if else" vont annuler la correction du PID. En revanche, si comme dans mes vidéos, les moteurs tournent à 1300, si le PID diminue de 20 unités la vitesse de deux moteurs et augmentent de 20 unités la vitesse de deux autres moteurs, le drone va se pencher, et le PID régulera bien quelque chose.

    De plus, le fait de borner le résultat du PID lorsque les moteurs sont à 2000 est en effet assez problématique, sauf que pour l'instant lors des test PID, les moteurs n'atteigneront jamais cette vitesse, donc pour l'instant ce n'est pas ça qui va m'empêcher de trouver les bons coefs PID.

    ps : dans le cas d'un quadcopter, pour faire modifier son orientation, il suffit juste de faire varier la vitesse des moteurs de quelques pouièmes. Si le coef Kp valait par exemple 2, il se retournerait brutalement le drone et aucune régulation ne serait possible.

    Merci pour ton aide

  11. #11
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    roll = 0.96*(angle_x+float(gx)*0.01/131) + 0.04*atan2((double)ax,(double)az)*180/PI; 
    pitch = 0.96*(angle_y+float(gy)*0.01/131) + 0.04*atan2((double)ay,(double)az)*180/PI;
    je ne pense pas que le mélange de float et double soit une bonne idée. Mais ce n'est pas ce qui m'embête le plus dans tes équations.
    Ce qui m'ennuie c'est le /131 : là tu fais une division entière ! Donc si ton produit est inférieur à 131 (curieuse valeur cela dit en passant) le résultat de float(gx)*0.01/131 sera toujours 0. Il vaut mieux écrire :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    roll = 0.96 * (angle_x + float(gx) * 0.01 / 131.0) + 0.04 * atan2((double)ax,(double)az) * 180.0 / PI; 
    pitch = 0.96 * (angle_y + float(gy) * 0.01 / 131.0) + 0.04 * atan2((double)ay,(double)az) * 180.0 / PI;

Discussions similaires

  1. [SP-2010] Probléme avec moteur de recherche wiki
    Par ghanem86 dans le forum SharePoint
    Réponses: 7
    Dernier message: 08/10/2010, 14h20
  2. [MySQL] problème avec moteur de recherche
    Par barose dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/06/2009, 13h33
  3. Réponses: 0
    Dernier message: 10/10/2007, 13h22
  4. Problème sur moteur de recherche
    Par itachi64 dans le forum ASP
    Réponses: 9
    Dernier message: 24/03/2006, 14h41
  5. problème avec moteur de recherche
    Par allyson dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 16/02/2005, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo