Comment faire fonctionner un correcteur sur un problème simple
Répondre à la discussion
Affichage des résultats 1 à 24 sur 24

Comment faire fonctionner un correcteur sur un problème simple



  1. #1
    Ultimatom

    Comment faire fonctionner un correcteur sur un problème simple


    ------

    Bonjour !

    Voilà, je suis programmeur mais totalement novice sur en automatique. Actuellement, je me diverti en programmant sur codingame le problème de Mars Lander Fuel. Le but était de faire atterir un vaisseau spatial sur une zone horizontale.

    Nom : Capture d’écran 2023-07-11 144725.png
Affichages : 183
Taille : 19,2 Ko

    Voici une image du puzzle.

    Le jeu modélise une chute libre sans atmosphère. La gravité sur Mars est de 3,711 m/s². Pour une puissance des fusées de X, on génère une poussée équivalente à X m/s² et on consomme X litres de fuel. Il faut donc une poussée de 4 quasi verticale pour compenser la gravité de Mars.

    En sortie, nous donnons l'orientation du vaisseau suivant un angle de -90 à +90° et sa puissance qui varie de 0 à 4.

    Chaque tour le jeu nous envoi une liste d'informations :
    X,Y sont les coordonnées en mètres de la capsule.
    hSpeed et vSpeed sont respectivement la vitesse horizontale et la vitesse verticale de Mars Lander (en m/s). Suivant le déplacement de Mars Lander, les vitesses peuvent être négatives.
    fuel est la quantité de fuel restant en litre. Quand le fuel vient à manquer, la puissance des fusées tombe à zéro.
    rotate est l’angle de rotation de Mars Lander en degré.
    power est la puissance des fusées de la capsule.

    Pour qu’un atterrissage soit réussi, la capsule doit :
    atterrir sur un sol plat
    atterrir dans une position verticale (angle = 0°)
    la vitesse verticale doit être limitée ( ≤ 40 m/s en valeur absolue)
    la vitesse horizontale doit être limitée ( ≤ 20 m/s en valeur absolue)

    J'aimerai pour ce problème utiliser un correcteur afin d'apprendre quelque chose de nouveau plutôt que de faire une correction un peu bête et méchant (si je suis dans cette range, je fais ca, si je suis dans cette range, je fais ca, etc....)

    Pour information je programme en python. Pour l'instant, j'arrive à récupérer les coordonnées x de la zone d'atterissage possible, et de sa position en y. J'ai aussi calculé le milieu de la zone (en coordonnée X) afin d'avoir une marge d'erreur possible lors de l'atterissage qui sera donc le point visé en X.

    Pour commencer, je souhaite utiliser un correcteur pour gérer l'angle de rotation de mon vaisseau.
    Donc mes entrées utiles pour calculer ma consigne en X sont :
    • la coordonnée X visée pour atterir
    • la coordonnée X actuelle du vaisseau
    • la vitesse horizontale
    • auxquelles je peux rajouter la puissance du vaisseau actuelle

    Je suis donc parti sur l'utilisation d'un correcteur. Ne voulant pas trop complexifier, je me suis dit que je commencerai déjà par réaliser un correcteur P même si celui si risque d'être insuffisant dans mon cas.

    Malheureusement, je bloque vite. Puisque je n'ai pas de fonction de transfert de mon système... Je ne vois pas comment je peux corriger sa position et commencer mes calculs.

    C'est pourquoi je vous solicite !

    Merci d'avance

    -----
    Dernière modification par Ultimatom ; 11/07/2023 à 15h19.

  2. #2
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    En relisant mon titre, je me dis que ce n'est peut être pas si simple comme problème

  3. #3
    umfred

    Re : Comment faire fonctionner un correcteur sur un problème simple

    le résultat que tu veux obtenir c'est la trajectoire idéale, donc elle a une certaine définition. Tu sais aussi (je crois) que si tu appliques une certaine poussée pendant un temps déterminé, tu vas avoir une certaine vitesse (ou accélération), et une certaine consommation.

  4. #4
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Daccord. Le problème reste insoluble dans ce cas, car je ne connais pas la définition de la fonction de la trajectoire idéale

  5. A voir en vidéo sur Futura
  6. #5
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Surtout que la carte varie à chaque niveau. Quelqu'un aurait une piste ?

  7. #6
    umfred

    Re : Comment faire fonctionner un correcteur sur un problème simple

    une "trajectoire" simple pourrait être un vol horizontal à x mètres d'altitude (ou à x mètre du sol) jusqu'au centre de la zone d'atterrissage et une descente verticale contrôlée jusqu'à atterrissage.

  8. #7
    polo974

    Re : Comment faire fonctionner un correcteur sur un problème simple

    40 m/s, ça fait 144 km/h. C'est plus un crash test qu'un atterrissage...
    Jusqu'ici tout va bien...

  9. #8
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Daccord prenons le cas simple ou l'on veut positionner notre vaisseau au milieu de la zone d'atterrissage notée X1 et en conservant sa valeur en y.

    Il y a deux variables en entrée qui font modifier sa valeur en x : l'angle du vaisseau noté a et la poussée (qui varie de 0 à 4). Peut être puis je négligé la poussée pour simplifier le problème et définir ma fonction telle que :

    f(a, x) = a * K * (X1 - x)

    avec a : l'angle du vaisseau
    K : un coefficient à calculer (je ne sais pas comment pour l'instant)
    X1 : le point d'atterissage en x
    X : la position actuelle du vaisseau

    Cette fonction f(a,x) me donnera une poussée en accélération/vitesse en x

    C'est un bon début selon vous ?

    Après ca, je ne vois pas comment utiliser un correcteur P pour corriger ma poussée en X.

    Oula je viens de penser qu'il faut quand même que cette fonction se limite à -90 et +90° d'angle....
    Dernière modification par Ultimatom ; 12/07/2023 à 09h29.

  10. #9
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Bien-sûr faut imaginer !

    (le sol est peut être très souple)

  11. #10
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    JE CORRIGE MON MESSAGE PRECEDENT !

    f(x) = K * (X1 - x)

    avec
    K : un coefficient à calculer (je ne sais pas comment pour l'instant)
    X1 : le point d'atterissage en x
    X : la position actuelle du vaisseau

    Cette fonction f(x) me donnera un angle à donner au vaisseau

    Après ca, je ne vois pas comment utiliser un correcteur P pour corriger ma poussée en X.

    Oula je viens de penser qu'il faut quand même que cette fonction se limite à -90 et +90° d'angle....
    Il faudrait donc qu'elle ait plus ou moins cette alure :

    Nom : Sans titre.png
Affichages : 137
Taille : 3,7 Ko

    Comment puis je trouver cette définition de fonction avec deux asymptôtes horizontale à -90 et +90° ?

  12. #11
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Et du coup je dis plein de betises parce que cette fonction ne sera pas définit telle que K *(x-x1) puisque ceci est une fonction affine, et ma fonction n'est pas affine...

  13. #12
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Sur excel j'ai tracé une allure de courbe qui pourrait ressemble à mon correcteur, mais malheureusement excel n'arrive pas à me donner une equation qui possède une asymptote à 90°...

    Nom : Capture d’écran 2023-07-12 103302.jpg
Affichages : 140
Taille : 43,2 Ko

  14. #13
    ArchoZaure

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Bonjour.

    J'ai l'impression que vous vous égarez.
    Il faut commencer par définir une trajectoire idéale, comme dans le domaine spatial en somme.
    Et c'est d'autant plus critique ici qu'on a des montagnes...

    Donc
    1. trouver une trajectoire parabolique, qui n'intersecte pas avec les segments de montagne.
    2. trouver une méthode pour faire avancer la sonde le long de cette trajectoire.
    Ici vous n'avez pas accès au calcul de la trajectoire, comme lorsque vous avez affaire à la réalité.
    Vous avez des "capteurs" qui vous donnent des informations :
    X,Y sont les coordonnées en mètres de la capsule.
    hSpeed et vSpeed sont respectivement la vitesse horizontale et la vitesse verticale de Mars Lander (en m/s). Suivant le déplacement de Mars Lander, les vitesses peuvent être négatives.
    fuel est la quantité de fuel restant en litre. Quand le fuel vient à manquer, la puissance des fusées tombe à zéro.
    rotate est l’angle de rotation de Mars Lander en degré.
    power est la puissance des fusées de la capsule.
    Je vous propose donc de tenter des variations de puissance et d'angle non pas calculés avec précision mais ASSERVIS.
    Ici à mon sens c'est un exercice d'asservissement.
    Pour donner une idée de la question :
    https://www.pm-robotix.eu/2022/02/02...obot-autonome/

  15. #14
    umfred

    Re : Comment faire fonctionner un correcteur sur un problème simple

    j'ai l'impression (à moins d'avoir rater un truc) est qu'il manquerait l'altitude (ou la distance fusée-sol) ? à moins que ce ne soit donné par y ?

    Ah on peut calculer la distance au sol, vu qu'initialement on as les informations du relief
    la page de l'exercice https://www.codingame.com/ide/puzzle/mars-lander (on peut y accéder en choisissant continuer sans compte si besoin)

  16. #15
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Merci pour le lien vers codingame. J'ignorai qu'on peut y avoir accès sans compte ! Ce sera plus simple pour tout le monde

    Oui il est fort probable que je m'égare ^^'. Je fouille un peu partout. Merci pour le lien.


    1. Trouver une trajectoire parabolique :

    J'imagine que la trajectoire parabolique doit s'exprimer sous la forme de f(x) = - a*(x-x1)² + b

    Le facteur a, me permet d'élargir plus ou moins ma parabole
    Le coefficient x1 me permet de glisser ma fonction sur l'axe des x
    Le coefficient b me permet de glisser ma fonction sur l'axe des y

    Comment trouver les bons coefficients en fonction de la carte et du départ initial du robot ... Je me disais que b est égale à la position y du robot au démarrage de la partie. Mais pour le reste...


    Alors comment dois-je définir ma trajectoire idéale ? J'imagine que je dois définir une liste de point grâce à ma fonction par lequel le robot devrait passé ?

    L = [(x1,y1), (x2,y2), (x3,y3), ... ] jusqu'au point d'atterissage ?

    Ou bien simplement imaginer une stratégie qui suit la pente de la montagne avec un écart de 100 sur les y, jusqu'au survol de la zone d'atterissage ? Qu'en pensez vous ?

    2. trouver une méthode pour faire avancer la sonde le long de cette trajectoire :
    Déterminons déjà le premier point avant d'attaquer le second
    Dernière modification par Ultimatom ; 12/07/2023 à 13h59.

  17. #16
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Alors j'ai posé mes calculs.

    Si ma fonction est sous la forme de f(x)= - a * (x -x1)² + b, je peux en théorie trouver les valeurs de mes coefficients.

    Je connais v1 = (Xv,Yv) les coordonnées de mon vaisseau au démarrage => f(Xv) = -a (Xv-x1)² + b = Yv

    Je sais que a1 = (Xa,Ya) les coordonnées du point d'atterrissage => f(Xa) = -a (Xa-x1)² + b = Ya

    Je sais que p1 = (Xp1, Yp1) les coordonnées du pic de la montagne 1 , je souhaite avoir au moins 100 de distance minimal entre le pic de la montagne et ma trajectoire d'où
    => 100 + f(Xp1) = -a (Xp1-x1)² + b +100 = Yp1

    De même pour les autres pics de montagne.

    J'ai 3 inconnus ici : a , x1 et b

    J'ai au moins 3 équations. C'est résolvable... Maintenant, faut que je trouve comment les résoudre facilement en python...
    Dernière modification par Ultimatom ; 12/07/2023 à 14h30.

  18. #17
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Petite coquille ici, il me semble :

    Je sais que p1 = (Xp1, Yp1) les coordonnées du pic de la montagne 1 , je souhaite avoir au moins 100 de distance minimal entre le pic de la montagne et ma trajectoire d'où
    => f(Xp1) = -a (Xp1-x1)² + b > Yp1 + 100
    Dernière modification par Ultimatom ; 12/07/2023 à 14h36.

  19. #18
    umfred

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Je vais revenir avec mon histoire de trajectoire simple: vol horizontal à une altitude a ( a supérieur à la plus grande montagne/pic entre la fusée et l'aire d'atterrissage) jusqu'à arriver au dessus de la zone plane d'atterrissage, et atterrissage vertical (chute contrôlée). (on s'autorise des oscillations sur le vol horizontal).
    Et surtout fais des essais de tes théories
    Pour tes calculs, choisi un repère judicieux, par exemple point (0,0) = point d'atterrissage ou point d'apparition de la fusée, ça simplifiera les calculs, et il n'y aura qu'une translation (x,y) à faire par rapport au repère initial de coordonnées.

  20. #19
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Rebonjour !

    En effet, j'ai pris votre remarque en compte. J'ai donc implementé des chemins simples que le vaisseau prendra.

    Si le vaisseau est assez haut par rapport au point le plus culminant de la carte, il devra se déplacer horizontalement jusqu'à arriver à la zone d'atterrisage, puis descendre verticalement sur la zone.

    En revanche, si il n'est pas assez haut, il aura un chemin supplémentaire qui est de monter verticalement pour être au dessus de la montagne la plus haute avec une marge de 100 points en y

    J'ai récupéré la classe PID depuis ce lien git : https://github.com/korfuri/PIDContro...dcontroller.py

    et j'ai donc 3 listes de points (x,y) qui sont les trajectoires à suivre pour mon vaisseau. (Monter, aller horizontalement au dessus de la zone, redescendre jusqu'à la zone d'atterissage)

    Comment dois-je utiliser mon correcteur maintenant ? (trouver les bons coefficients)

    Je me dis que pour commencer je devrais essayer de modulé seulement les gaz pour conserver une hauteur donné en Y, en mesurant la position de vaisseau actuelle avec la position voulu.

    Erreur = objectif.y - vaisseau.y

    donc cette erreur sera mis dans le correcteur.

    Donc 2 questions me viennent.

    - quels sont les coefficients de mon correcteur ?
    - dans quel formule dois-je utiliser les 3 valeurs retourner par ma fonction PID.Update ?

    Merci encore une fois de votre aide

  21. #20
    umfred

    Re : Comment faire fonctionner un correcteur sur un problème simple

    En consultant les autres pages du projet github que tu indiques, tu serais tombé sur le lien vers wikipedia https://en.wikipedia.org/wiki/PID_controller qui explique en anglais le PID avec ses formules
    Une autre vision moins mathématiques (en français):
    http://www.ferdinandpiette.com/blog/...re-de-calculs/

  22. #21
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Oui merci ! J'avance ! Je réussi a corriger mon altitude pour tendre vers une valeur en Y donné !
    Je vous tiens au courant de la suite

    Merci beaucoup !

  23. #22
    polo974

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Pour résoudre le système d'équations (et plein d'autres trucs), il y a sympy (sym pour symbolique):
    https://www.sympy.org/en/index.html

    À ne pas confondre avec simpy (sim pour simulation):
    https://simpy.readthedocs.io/en/latest
    Jusqu'ici tout va bien...

  24. #23
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Bonjour !
    Alors j'ai réussi à implémenter deux correcteurs PID pour la correction en X et en Y. J'ai adapté le chemin en fonction des montagnes sur le parcours et tout fonctionne.

    Si je me motive a améliorer le programme il serait bien que je prenne en compte la vitesse en X et en Y pour améliorer la correction, ainsi que modifier l'angle pour corriger le vitesse en Y (j'utilise actuellement que la puissance des gaz)

  25. #24
    Ultimatom

    Re : Comment faire fonctionner un correcteur sur un problème simple

    Bonjour !
    Alors j'ai réussi à implémenter deux correcteurs PID pour la correction en X et en Y. J'ai adapté le chemin en fonction des montagnes sur le parcours et tout fonctionne.

    Si je me motive a améliorer le programme il serait bien que je prenne en compte la vitesse en X et en Y pour améliorer la correction, ainsi que modifier l'angle pour corriger le vitesse en Y (j'utilise actuellement que la puissance des gaz)

Discussions similaires

  1. VMC simple flux : la faire fonctionner par intermittence ?
    Par invite1f04c039 dans le forum Habitat bioclimatique, isolation et chauffage
    Réponses: 19
    Dernier message: 19/06/2017, 22h29
  2. comment faire fonctionner MikroC ?
    Par invite91822b8c dans le forum Électronique
    Réponses: 11
    Dernier message: 24/10/2013, 20h28
  3. Comment faire fonctionner les ventilateur de PC
    Par invite0b3899fe dans le forum Électronique
    Réponses: 10
    Dernier message: 23/10/2013, 16h51
  4. [Brun] Comment faire fonctionner cette tv ?
    Par invite9aa1085e dans le forum Dépannage
    Réponses: 2
    Dernier message: 05/05/2011, 23h06
  5. comment faire fonctionner un PID???
    Par invite253d7dda dans le forum Électronique
    Réponses: 8
    Dernier message: 20/04/2007, 09h10