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

Mathématiques Discussion :

Courbe de Bézier et profil trapézoïdal de vitesse


Sujet :

Mathématiques

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Courbe de Bézier et profil trapézoïdal de vitesse
    Bonjour !

    Mon objectif est de faire se déplacer un robot constitué de 2 roues selon une trajectoire définie avec une courbe de Bézier cubique.
    L'idée finale est de pouvoir donner un point au robot vers lequel il se déplacera et un angle final que le robot devra avoir sur le point.
    Le programme qui gère ce robot s'exécute périodiquement à un temps donné (toute les 2ms par exemple)

    J'arrive à générer une trajectoire avec ces formules :
    Nom : Capture3.PNG
Affichages : 1932
Taille : 11,4 Ko

    L'idée est maintenant de pouvoir faire se déplacer le robot selon cette trajectoire avec une vitesse qui suit un profil trapézoïdal de ce type :
    Nom : forme.png
Affichages : 4014
Taille : 12,5 Ko
    Avec une vitesse max, une accélération et une décélération prédéfinie.

    Mais je ne vois pas comment m'y prendre. Le fait que les points de la trajectoire dépendent de u (0 <= u<= 1) me bloque.
    Il me semble qu'il faut que je récupère une distance à parcourir par chaque roue toute les 2ms (la période d'exécution du programme) car j'ai un asservissement en position sur chaque roue.

    J'ai trouvé cet article qui a l'air de traiter de mon problème mais je n'arrive à appliquer ce qui y est expliqué : 21.pdf

    Voilà, j'ai essayé d'être assez clair. Si vous avez besoin de précisions dites le moi.
    Je vous remercie par avance

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    La trajectoire proprement dite, tu sais la déterminer. Ton problème, c'est """uniquement""" de déterminer à quelle vitesse le robot doit avancer sur cette trajectoire. C'est bien ça ?

    - Tu connais la trajectoire, donc tu peux Calculer la longueur totale de cette trajectoire. C'est l'étape 1 de ton traitement.

    - Tu as une accélération constante, et une vitesse maxi. Donc tu sais dire : La phase d'accélération va durer X secondes, et pendant cette phase d'accélération, le robot va parcourir Y mètres. Tu sais calculer X et Y.

    - Idem pour la phase de décélération, tu sais calculer la durée, et la distance parcourue.

    - Et par différence, tu sais calculer la distance de la phase intermédiaire.

    Tu veux avancer par petits à-coups, toutes les 2ms. Très bien, c'est la bonne méthode. Pour la phase d'accélération, pour calculer la distance parcourue entre t0 et t1 (t1 = t0+2ms), tu peux prendre le point milieu (t0+1ms) ; tu sais calculer la vitesse atteinte à cet instant précis. Et tu peux dire que sur tout l'intervalle [t0, t1], la vitesse est constante, et égale à la vitesse correspondant à t0+1ms. C'est une bonne approximation. C'est même mieux qu'une bonne approximation, c'est rigoureusement exact.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour la réponse.

    A force d'y réfléchir je m'emmêle les pinceaux.
    Je suis d'accord avec toi sur le calcul du temps et de la longueur parcourue pendant la phase d'accélération, constante et de décélération. Et donc la distance à parcourir et la vitesse à chaque instant t. J'applique déjà plus ou moins ce principe pour réaliser des lignes droites.

    Mais il me reste deux problèmes que je n'arrive pas à résoudre.

    • Le premier est que les points que j'ai sur la courbe ne sont pas pris à des instants t précis (les équations dépendent de u qui est compris en 0 et 1). Il me faut donc trouver un moyen de récupérer un point de la courbe à chaque instant t (toute les 2ms) et je ne vois pas comment faire (peut être en considérant que u est le pourcentage de progression du temps. C'est à dire que u=0 => t0 et u=1 => tFin, mais je n'arrive pas à aller plus loin dans cette idée).
    • Le deuxième c'est que mon robot est comme celui ci-dessous :
      Nom : Capture4.PNG
Affichages : 1850
Taille : 6,4 Ko
      Donc, après avoir calculé la distance parcourue par le centre du robot entre t0 et t1, il faut que je calcul la distance à parcourir pour chaque roue. Pour calculer la position des roues qui va servir à avoir la distance à parcourir par chaque roue, il faut l'orientation θ du robot à chaque point. Comment calculer cette orientation?

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Tout problème doit être et peut être décomposé en problèmes plus simples.

    1. Le centre du robot, quelle est sa trajectoire, où doit-il être à chaque instant. Tu as besoin de résoudre cet exercice, même si effectivement, ce n'est pas suffisant. Donc concentre-toi sur cet exercice seul.

    2. Ensuite, il va falloir effectivement s'attaquer à chacune des roues. Si je comprend bien, le robots à 2 roues motrices, et pas de direction. Et pour faire tourner le robot vers la droite par exemple, on fait avancer la roue gauche plus vite que la roue droite.

    Pour ça, oublie tes splines quelques instants. Oublie tes problèmes d'accélération et de décélération aussi. Et essaie de trouver la solution au problème suivant : mon robot doit parcourir avec une vitesse V un cercle de rayon R (R c'est le rayon pour le centre du robot, la roue droite fera donc un cercle de rayon R-quelquechose, et la roue gauche fera un cercle de rayon R+quelque chose).

    Quand tu sauras déterminer la trajectoire du centre du robot, avec les bonnes vitesses, et quand tu sauras comment faire pour que le robot parcoure un arc de cercle de rayon fixé, tu pourras combiner tout ça.

    Le point 1 est un exercice compliqué, le point 2 aussi, et combiner les 2 points est également un exercice compliqué.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Effectivement il faut que je m'occupe d'un problème à la fois.

    Il faudrait que je calcul un u qui dépend du temps pour avoir une distance constante à parcourir entre chaque point.
    J'ai trouvé dans cet article (qui traite en fait exactement de ce que je veux faire) une formule pour trouver u(t) mais je ne vois pas du tout comment l'appliquer (la somme me parait étrange) : 21.pdf
    Voici la formule :
    Nom : Capture6.PNG
Affichages : 2737
Taille : 2,7 Ko
    Pour simplifier les choses, je peux utiliser mon v(t) en forme de trapèze.

    Si quelqu'un peut m'expliquer comment trouver u(t), le reste devrait être plus simple...

  6. #6
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Courbe de Bézier et profil trapézoïdal de vitesse
    Bonjour,

    Citation Envoyé par Villanut Voir le message
    ... Il faudrait que je calcule un u qui dépend du temps pour avoir une distance constante à parcourir entre chaque point.
    J'ai trouvé dans cet article (qui traite en fait exactement de ce que je veux faire) une formule pour trouver u(t) mais je ne vois pas du tout comment l'appliquer (la somme me parait étrange) : 21.pdf
    Voici la formule :
    Nom : Capture6.PNG
Affichages : 2737
Taille : 2,7 Ko
    Pour simplifier les choses, je peux utiliser mon v(t) en forme de trapèze.

    Si quelqu'un peut m'expliquer comment trouver u(t), le reste devrait être plus simple ...
    L'étude du mouvement du centre (C) du robot paraît difficile, parce que les équations paramétriques de sa trajectoire ne conduisent pas à une expression de la distance parcourue entre deux valeurs données (u1, u2); on peut seulement envisager un calcul numérique, lourd au demeurant.

    La courbe de Bézier est définie par les polynômes de degré (3):
    x = F(u) , y = G(u) ,
    dans lesquels le paramètre (u) varie de (0) à (1) sur la portion de graphe envisagée.

    Une variation élémentaire (du) du paramètre s'accompagne des variations conjointes des coordonnées:
    dx = F'(u)*du ,
    dy = G'(u)*du ,
    et d'un déplacement élémentaire du point de longueur ds = (dx2 + dy2)1/2 ;
    de sorte que la distance parcourue sur la trajectoire depuis la position initiale (u0 = 0) est théoriquement donnée par la différence:
    L0(u) = H(u) - H(0) , où la fonction en cause admet pour dérivée:
    H'(u) = (F'(u)2 + G'(u)2)1/2 .

    Malheureusement, il n'existe pas de fonction explicite H(u) primitive de l'expression précédente (H'(u)), où l'on trouve sous le radical un polynôme du 4me degré ! Et quand bien même un résultat serait envisageable, il serait à coup sûr impossible de passer à la fonction réciproque u = H-1(L) ...

    La seule issue est une approximation utilisant un unique calcul numérique, celui de la longueur de la spline entre les points extrêmes (0) et (1): L = H(1) - H(0) , qui peut être obtenue par divers procédés d'intégration de précision connue.
    L'un des plus simples consiste à calculer la somme :
    S = (1/N)*(H'(0)/2 + H'(1)/2 + Somk=1N-1H'(k/N))
    qui représente tout simplement la valeur moyenne de H'(u) sur l'intervalle [0 ; 1]:
    H'moy = (H(1) - H(0))/(1 - 0) = L .

    L'approximation consiste à remplacer l'expression inaccessible L0(u) = H(u) - H(0) par la fonction linéaire L1(u) = L*u , dont la valeur coïncide avec celle de la précédente aux extrémités du domaine:
    L0(0) = L1(0) = 0; L0(1) = L1(1) = L .

    C'est ce que j'ai cru comprendre à la lecture (assez difficile pour moi) de ton document, où la distance (L) est représentée par le terme (Bd):

    Nom : Expression_Bd.png
Affichages : 1736
Taille : 48,1 Ko

    Cette difficulté franchie, il ne te reste plus qu'à faire le lien avec les caractéristiques de ta courbe de vitesse: en notant (T1, T2, T3) les durées respectives des trois phases du mouvement, il vient: L = Vmax*(T1/2 + T2 + T3/2) .


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  7. #7
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Courbe de Bézier et profil trapézoïdal de vitesse
    Le problème des roues paraît encore plus difficile, et je me demande si tu ne t'engage pas là dans une impasse ...

    Citation Envoyé par Villanut Voir le message
    ... Donc, après avoir calculé la distance parcourue par le centre du robot entre t0 et t1, il faut que je calcule la distance à parcourir pour chaque roue. Pour calculer la position des roues qui va servir à avoir la distance à parcourir par chaque roue, il faut l'orientation θ du robot à chaque point. Comment calculer cette orientation?[/LIST]
    Mais je me trompe peut-être, faute de connaître suffisamment ton projet.

    Le parcours des centres des roues est celui des extrémités d'un segment (AB) de longueur constante, de milieu (C) et toujours perpendiculaire au vecteur vitesse, tangent à la spline étudiée.

    Nom : Robot_01.PNG
Affichages : 869
Taille : 41,2 Ko

    Les courbes décrites par (A) et (B), parallèles à cette spline, n'en sont pas elles-même.
    Une discussion sur un sujet voisin a eu lieu sur ce forum.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  8. #8
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 393
    Points
    9 393
    Par défaut
    Peu importe que la trajectoire de chaque roue soit une spline, ou un parabole ou autre...
    Le problème est une succession de micro-problèmes. A un instant t, on doit donner les instructions à chaque roue pour le mouvement à faire pendant la milli-seconde qui suit.
    Et quand on se pose cette question, on connaît la position actuelle du robot (x,y et orientation) et la position cible (x,y, et orientation) ; la position cible est forcément devant le robot (pas derrière ni sur le côté)... au pire, le robot va devoir faire un angle de quelques degrés.

    Pour les roues, et la vitesse de chaque roue, mathématiquement, ça se fait.
    On a une portion de spline à parcourir sur la milli-seconde en cours (c'est le centre du robot qui doit parcourir cette portion de spline). On peut calculer le rayon de courbure de cette portion de spline.
    Notons R ce rayon de courbure.
    Notons e la distance roue / axe du robot (e = le demi-empattement, c'est une constante).

    Et compte-tenu de la vitesse à ce moment-là, on sait que le robot doit parcourir une distance d.
    Pour que le robot parcoure cette distance, et effectue un léger virage, il faut que la roue droite parcoure une distance d*(R-e)/R et la roue gauche une distance d*(R+e)/R .

    Si le robot doit aller en ligne droite, c'est le cas ou R=infini, et dans ces 2 cas, les formules marchent encore, les 2 roues doivent avancer de la distance d.

    Ca peut être l'inverse si le virage est vers la gauche et non vers la droite.

    Mais dans tout ça, je me limite à une approche uniquement mathématique, et j'oublie l'aspect physique des choses. Dans un mouvement comme ça, il y a des frottements, ou plutôt des glissements. Et donc des pertes, difficiles à évaluer.
    Notre robot est un peu comme un tank. Pour tourner à droite, il fait en sorte que la chenille gauche avance plus vite que la chenille droite. Dans le cas d'un tank, il y a une masse très importante, et il y a des chenilles crantées, qui adhèrent parfaitement au sol. Le virage est correctement effectué.
    Ici, selon l'adhérence des roues au sol, selon tout un tas de critères, même si on applique les bonnes formules, le robot aura tendance à suivre un parcours intermédiaire entre une ligne droite, et la courbe voulue.

    -Soit il y a un capteur qui permet à tout instant de mesurer le décalage entre la trajectoire voulue et la trajectoire suivie, et qui permet donc de rectifier la trajectoire, et tout va bien
    -Soit il faut faire quelques expériences, et se dire : Quand je veux tourner de 4°, il faut en fait que je tourne de 5°, voire 6° ou 7°... et à l'arrivée, comme il y a des glissements, le robot tournera de 4°.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  9. #9
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Courbe de Bézier et profil trapézoïdal de vitesse
    Le mouvement des centres des roues se déduit de celui du centre (C) par les relations:
    CA = (D/2*Vc).Vc×uz (orienté vers la droite de l'observateur debout, regardant dans le sens de la vitesse du point C);
    CB = (-D/2*Vc).Vc×uz (de sens opposé, orienté vers la gauche).

    Convenons de faire intervenir deux vecteurs unitaires liés au mobile:
    # le vecteur tangent (ut) porté par la tangente locale à la trajectoire, colinéaire au vecteur vitesse et de même sens, et qui admet pour expression:
    ut = (1/Vc).Vc ;
    # le vecteur normal (un) situé dans le plan (xOy), orthogonal au précédent et orienté vers la gauche de l'observateur déjà invoqué (donc de A vers B); il est donné par le produit vectoriel:
    un = uz×ut .
    Il vient dans ces conditions:
    CA = (D/2).ut×uz = (-D/2).uz×ut = (-D/2).un ;
    CB = (-D/2).ut×uz = (D/2).uz×ut = (D/2).un (le produit vectoriel est anticommutatif), et
    CA + CB = 0 (vecteur nul): (C) est le milieu de (AB) - ce que l'on savait déjà.

    Les positions des centres des roues sont définies dans le repère lié au laboratoire par les relations:
    OA = OC + CA = OC - (D/2).un ,
    OB = OC + CB = OC + (D/2).un ;
    d'où: OA + OB = 2.OC ,
    et par dérivation: Va + Vb = 2.Vc .
    Au-delà, les choses sont cependant plus complexes, du fait que (A) et (B) restent à distance constante (D) l'un de l'autre.

    De la composante normale de l'accélération, on doit pouvoir tirer la vitesse angulaire instantanée de rotation du chariot autour de son centre (C); on retrouve effectivement la notion de rayon de courbure.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

Discussions similaires

  1. Courbe de Bézier
    Par acacia dans le forum Mathématiques
    Réponses: 11
    Dernier message: 31/03/2010, 17h59
  2. Courbes de bézier sous CSS 2?
    Par sirbaldur dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 18/09/2007, 15h27
  3. Position sur une Courbe de Bézier
    Par Kurisu dans le forum Mathématiques
    Réponses: 2
    Dernier message: 29/06/2007, 07h49
  4. recherche doc sur les courbe de bézier
    Par amaury pouly dans le forum OpenGL
    Réponses: 4
    Dernier message: 29/04/2003, 22h41

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