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 :

Passer d'une abscisse curviligne sur une coube non prédéterminée à des coordonées carthésiennes


Sujet :

Mathématiques

  1. #1
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut Passer d'une abscisse curviligne sur une coube non prédéterminée à des coordonées carthésiennes
    Bonjour.

    Je souhaite pouvoir calculer la position d'un solide sur deux roues (un robot comme sur l'image ci-dessous) dans un repère absolu à partir de son abscisse curviligne:

    le genre de robot:

    On a pour chaque roue son abscisse curviligne s=R*theta (R rayon de la roue)

    en faisant la (somme des abscisses des deux roues)/2 on a un équivalent de l'abscisse d'une roue située au centre. avec la différence, on peut calculer langle du robot à tout instant.

    ma question serait de savoir comment calculer la position du robot en xy à partir de sa position "précédente" si possible sans faire trops de cos et sin...

    je ne sais pas si je suis bien clair

    merci

  2. #2
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 455
    Points
    1 455
    Par défaut
    le robot a pour coordonnées : x,y et teta (angle avec Ox)
    dx = (dl1+dl2)/2*cos(teta)
    dy= (dl1+dl2)/2*sin(teta)
    dteta = (dl1-dl2)/2/(distance entre les roues)
    Il n'y a qu'à intégrer, mais attention aux dérives à (pas très) long terme.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 9
    Points : 12
    Points
    12
    Par défaut Première approche de problème
    On va y aller doucement. Le problème est plus compliqué que je le pensais.

    On va commencer par une seule roue qui roule dans une direction.

    Dans ce cas et sans glissement

    s=x=R*(teta)
    y=0
    z=R

    Est-ce bien ça ?
    Images attachées Images attachées  

  4. #4
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par Nebulix Voir le message
    le robot a pour coordonnées : x,y et teta (angle avec Ox)
    dx = (dl1+dl2)/2*cos(teta)
    dy= (dl1+dl2)/2*sin(teta)
    dteta = (dl1-dl2)/2/(distance entre les roues)
    Il n'y a qu'à intégrer, mais attention aux dérives à (pas très) long terme.
    C'est effectivement ce qui m'est directement venu à l'esprit... le problème étant que si theta est facible à calculer, il me semble qu'on ne peut pas se débarasser des dérivées dans les expressions de x et y... ce qui parait normal puisque pour le même couple (l1,l2), on a plusieurs couples (x,y)=>il n'y a pas de bijection entre les deux méthodes de coordonnée...

    le seul paramètre facile à calculer est theta:
    theta= ([l1]-[l2])/(2*(distance entre les roues))

    mais pour les autres....
    x=([l1]+[l2] -dtheta*2*dy)/2
    y=([l1]+[l2] +dtheta*2*dx)/2
    x-y=dtheta(dy-dx)
    ... ?

    or calculer des cos et des sins à tout instant... c'est un peu lourd.

    En fait, je me demandais plutot s'il était posssible de précalculer une courbe pour le robot à laquelle il pourrait se repérer de façon absolue....

    Citation Envoyé par sucarno Voir le message
    On va y aller doucement. Le problème est plus compliqué que je le pensais.

    On va commencer par une seule roue qui roule dans une direction.

    Dans ce cas et sans glissement

    s=x=R*(teta)
    y=0
    z=R

    Est-ce bien ça ?
    oui, c'est bien ça pour ce cas simple. encore que pour Z on pourrait tout aussi bien parler de R/2... mais ça n'est pas tres important :p

    Merci

  5. #5
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    le seul paramètre facile à calculer est theta:
    theta= ([l1]-[l2])/(2*(distance entre les roues))

    mais pour les autres....
    x=([l1]+[l2] -dtheta*2*dy)/2
    y=([l1]+[l2] +dtheta*2*dx)/2
    x-y=dtheta(dy-dx)
    ... ?

    or calculer des cos et des sins à tout instant... c'est un peu lourd.
    Les valeur des cos/sin peuvent être précalculées dans une table, puis interpolées.

    Pour ce qui est du calcul, on peut passer par un schéma explicite. Mais on va accumuler des erreurs au fur et a mesure du temps.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // nouveau = ancien + deplacement * orientation
    x[t+dt] = x[t] + R*(theta[t+dt]-theta[t]) * cos(theta[t+dt])
    y[t+dt] = y[t] + R*(theta[t+dt]-theta[t]) * sin(theta[t+dt])
    Le dernier terme cos(theta[t+dt]) reflète l'orientation du robot "a la fin" du mouvement.
    On perd donc les variations de l'orientation durant le mouvement (entre t et t+dt) et donc de la précision dans la position finale.

    On doit pouvoir améliorer un peu les choses en calculant l'intégrale de cette variation:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x[t+dt] = x[t] + Integrale{ R*i*cos(theta[t]+i) . di }
    y[t+dt] = y[t] + Integrale{ R*i*sin(theta[t]+i) . di }
    avec i variant entre 0 et (theta[t+dt]-theta[t]).

    ce qui nous donne (sauf erreur):

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    x[t+dt] = x[t] + R * { cos(theta[t+dt]) - cos(theta[t]) + (theta[t+dt]-theta[t])*sin(theta[t+dt]) }
    y[t+dt] = y[t] + R * { sin(theta[t+dt]) - sin(theta[t]) - (theta[t+dt]-theta[t])*cos(theta[t+dt]) }

  6. #6
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 455
    Points
    1 455
    Par défaut
    CORRECTION :
    dteta = (dl1-dl2)/(distance entre les roues)
    Ton robot est-il mu par des moteurs pas-à-pas ?

  7. #7
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Les valeur des cos/sin peuvent être précalculées dans une table, puis interpolées.
    Oui, je me rapelle en avoir discuté dans un de mes précédents post.

    Citation Envoyé par pseudocode Voir le message
    Pour ce qui est du calcul, on peut passer par un schéma explicite.
    pourrais-tu expliciter ?
    D'apres wikipedia, je comprend qu'il s'agit d'une relation entre la valeur à l'instant t et celles aux instants précédents c'est ça ?

    Citation Envoyé par pseudocode Voir le message
    Mais on va accumuler des erreurs au fur et a mesure du temps.
    c'est indéniable. de toutes façon, j'en accumulerais (ne serai-ce que par-ce que un roulement sans glissement, ça n'existe pas). la question, est plutôt de savoir combien...

    Citation Envoyé par pseudocode Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // nouveau = ancien + deplacement * orientation
    x[t+dt] = x[t] + R*(theta[t+dt]-theta[t]) * cos(theta[t+dt])
    y[t+dt] = y[t] + R*(theta[t+dt]-theta[t]) * sin(theta[t+dt])
    Le dernier terme cos(theta[t+dt]) reflète l'orientation du robot "a la fin" du mouvement.
    On perd donc les variations de l'orientation durant le mouvement (entre t et t+dt) et donc de la précision dans la position finale.

    On doit pouvoir améliorer un peu les choses en calculant l'intégrale de cette variation:

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x[t+dt] = x[t] + Integrale{ R*i*cos(theta[t]+i) . di }
    y[t+dt] = y[t] + Integrale{ R*i*sin(theta[t]+i) . di }
    avec i variant entre 0 et (theta[t+dt]-theta[t]).

    ce qui nous donne (sauf erreur):

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    x[t+dt] = x[t] + R * { cos(theta[t+dt]) - cos(theta[t]) + (theta[t+dt]-theta[t])*sin(theta[t+dt]) }
    y[t+dt] = y[t] + R * { sin(theta[t+dt]) - sin(theta[t]) - (theta[t+dt]-theta[t])*cos(theta[t+dt]) }
    heu.. j'avoue que je ne comprend pas en quoi on gagne en précision.... d'autant que le calcul me semble plus compliqué... (donc plus long donc fait moins souvent donc plus de perte de précision...)

    POurrais-tu m'expliquer ce que l'on gagne en intégrant s'il te plais ?

    merci

    Citation Envoyé par Nebulix Voir le message
    CORRECTION :
    dteta = (dl1-dl2)/(distance entre les roues)
    Ton robot est-il mu par des moteurs pas-à-pas ?
    Non. il s'agit de moteurs CC controlés par des codeurs (c'est avec ça que je mesure l1 et l2).

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    pourrais-tu expliciter ?
    D'apres wikipedia, je comprend qu'il s'agit d'une relation entre la valeur à l'instant t et celles aux instants précédents c'est ça ?
    Oui, c'est ça. EtatActuel = fonction(EtatPrécedant)

    heu.. j'avoue que je ne comprend pas en quoi on gagne en précision.... d'autant que le calcul me semble plus compliqué... (donc plus long donc fait moins souvent donc plus de perte de précision...)

    POurrais-tu m'expliquer ce que l'on gagne en intégrant s'il te plais ?
    Si je prend juste en compte l'orientation finale du robot (theta[t+dt]), je ne connais pas la trajectoire exacte suivie par le robot entre l'instant initial (t) et l'instant final (t+dt).

    Pour ce que j'en sais, il aurait pu faire un "S", ou aller en ligne droite, ...

    En intégrant, je suppose que l'orientation est linéairement passée de theta[t] à theta[t+dt] durant le mouvement => que la vitesse des moteurs a été constante.

  9. #9
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    merci pseudocode


    et serait-il posible, selon toi, de précalculer une courbe (puisqu'il faut en calculer une, autant ne pas la calculer en xy) à laquelle on pourrait-essayer de "coller", si possible sans devoir passer par une masse de cos et sin (ou alors par un peu moins )


    merci

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    et serait-il posible, selon toi, de précalculer une courbe (puisqu'il faut en calculer une, autant ne pas la calculer en xy) à laquelle on pourrait-essayer de "coller", si possible sans devoir passer par une masse de cos et sin (ou alors par un peu moins )
    une courbe de quoi en fonction de quelles variables ?

  11. #11
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    une courbe de quoi en fonction de quelles variables ?
    ben justement , je sais pas

    Plus serieusement, je pensais définir une série de produit de vitesses angle/(somme des abscisses curvilignes) (ou dérivée de r en polaire centrée sur le robot) qui permettraient alors de définir une série de courbures et donc, au final, une courbe.

    le problème est que si je peux essayer d'avoir à tout moment ces vitesses, je ne vois pas comment calculer une éventuelle dérive ou erreur et encore moins comment la corriger...

    Je dis probablement une grosse bétise, mais bon, autant m'en prendre plaein la tête maintenant

    merci

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    Plus serieusement, je pensais définir une série de produit de vitesses angle/(somme des abscisses curvilignes) (ou dérivée de r en polaire centrée sur le robot) qui permettraient alors de définir une série de courbures et donc, au final, une courbe.
    Tu veux dire des profils de mouvements en fonction des variations orientation/abscisse entre deux instants ?

    F( Orientation(T0), Orientation(T1) , Abscisse(T0) , Abscisse(T1) ) = Courbe2D

    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
     
    [][] F( OT0, OT1, AT0, AT1) {
     
      // nmb de pas d'integration
      steps = 100
     
      // deplacement durant un pas
      dA = (AT1-AT0)/steps
     
      x[0]=y(0]=0
      for(t=0; t<steps; t++) {
        OT = OT0 + (t/steps)*(OT1-OT0)
        x[t+1] = x[t] + dA*cos(OT)
        y[t+1] = y[t] + dA*sin(OT)
      }
     
      return x,y
    }

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    ben justement , je sais pas

    Plus serieusement, je pensais définir une série de produit de vitesses angle/(somme des abscisses curvilignes) (ou dérivée de r en polaire centrée sur le robot) qui permettraient alors de définir une série de courbures et donc, au final, une courbe.

    le problème est que si je peux essayer d'avoir à tout moment ces vitesses, je ne vois pas comment calculer une éventuelle dérive ou erreur et encore moins comment la corriger...

    Je dis probablement une grosse bétise, mais bon, autant m'en prendre plaein la tête maintenant

    merci


    Euh..

    Moi j'aurais tendance à plutôt établir une trajectoire (par exemple à dessiner sur l'écran), et affecter des temps de passage à certains endroits.

    De là, déduire un tableau régulier de positions avec le temps associé. La position sera bien entendu la position du milieu de l'axe des roues.

    Et là en déduire un tableau (t, vitesse, angle).

  14. #14
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Tu veux dire des profils de mouvements en fonction des variations orientation/abscisse entre deux instants ?

    F( Orientation(T0), Orientation(T1) , Abscisse(T0) , Abscisse(T1) ) = Courbe2D

    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
     
    [][] F( OT0, OT1, AT0, AT1) {
     
      // nmb de pas d'integration
      steps = 100
     
      // deplacement durant un pas
      dA = (AT1-AT0)/steps
     
      x[0]=y(0]=0
      for(t=0; t<steps; t++) {
        OT = OT0 + (t/steps)*(OT1-OT0)
        x[t+1] = x[t] + dA*cos(OT)
        y[t+1] = y[t] + dA*sin(OT)
      }
     
      return x,y
    }
    En fait, j'esperais plutot me débarasser d'un repérage carthésien, et non le précalculer (j'ignore complètement si c'est possible) partant du principe que l'on pouvais suivre une courbe sans... je pensais par exemple à calculer plutôt Orientation (T) ,vitesseAngulaire(T), abcissecurviligne(T),vitessevurviligne(T), paramètres que je peux calculer sans fonction trigo...


    Citation Envoyé par souviron34 Voir le message
    Euh..

    Moi j'aurais tendance à plutôt établir une trajectoire (par exemple à dessiner sur l'écran), et affecter des temps de passage à certains endroits.

    De là, déduire un tableau régulier de positions avec le temps associé. La position sera bien entendu la position du milieu de l'axe des roues.

    Et là en déduire un tableau (t, vitesse, angle).
    je ne suis pas sûr de comprendre ...


    Merci

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    je ne suis pas sûr de comprendre ...
    Pratiquement la même chose que dit pseudocode ...

  16. #16
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 084
    Points
    16 084
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    En fait, j'esperais plutot me débarasser d'un repérage carthésien, et non le précalculer (j'ignore complètement si c'est possible) partant du principe que l'on pouvais suivre une courbe sans... je pensais par exemple à calculer plutôt Orientation (T) ,vitesseAngulaire(T), abcissecurviligne(T),vitessevurviligne(T), paramètres que je peux calculer sans fonction trigo...
    C'est sur qu'avec l'abscisse curviligne, on a besoin que d'un seul paramètre. Mais ce paramètre indique la position sur la COURBE, qui est donc supposée connue (puisque c'est le repère). Hors toi tu vas avoir une multitude de courbes (suivant tes 4 paramètres), et donc la position sur UNE courbe n'aura aucun rapport avec une position sur une AUTRE courbe. Impossible de "coller" les morceaux de courbes en utilisant seulement l'abscisse curviligne.

  17. #17
    Membre expérimenté
    Profil pro
    chercheur
    Inscrit en
    Avril 2004
    Messages
    830
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Avril 2004
    Messages : 830
    Points : 1 455
    Points
    1 455
    Par défaut
    il s'agit de moteurs CC controlés par des codeurs (c'est avec ça que je mesure l1 et l2).
    Donc tu ne mesures pas directement l1(t), l2(t) mais
    t(l1=n*dl)
    POur faire les calculs tu auras donc besoin d'inverser cette fonction par interpolation, ce qui suppose d'avoir enregistré tous les tops

    je ne vois pas comment calculer une éventuelle dérive ou erreur et encore moins comment la corriger...
    Rassure-toi, personne n'en est capable. Tu peux juste essayer de la réduire en serrant les points de mesure. Et c'est l'expérience qui tranche.

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/03/2014, 14h18
  2. [AC-2010] Simuler un clic sur une page web sur une image javascript
    Par alex en droit dans le forum VBA Access
    Réponses: 2
    Dernier message: 02/04/2012, 13h22
  3. Imprimer sur une page web sur une imprimante spécifique
    Par bleuerouge dans le forum Windows Forms
    Réponses: 0
    Dernier message: 07/12/2009, 09h51
  4. Pb sur une requête DELETE sur une chaine
    Par astrolane dans le forum Sybase
    Réponses: 4
    Dernier message: 16/02/2009, 09h11
  5. Réponses: 3
    Dernier message: 25/10/2007, 11h47

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