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

Physique Discussion :

[général] orientation controllée


Sujet :

Physique

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut [général] orientation controllée
    Bonjour, j'ai un problème épineux à soumettre.
    ( j'utilise ODE, enfin... OgreOde pour être précis, mais j'imagine que c'est un problème pas vraiment lié à un moteur de physique particulier )

    Le but est d'appliquer des forces à un objet physique ( body ) pour qu'il s'oriente depuis son orientation actuelle vers une orientation souhaitée.

    l'orientation actuelle est obtenue sous la forme d'un quaternion uniquement.
    l'orientation souhaitée est exprimée sous forme de 3 angles ou donc d'un quaternion.

    les forces à appliquer peuvent être un torque ou des forces en certains points de l'objet.


    L'algo en résumé :
    en entrée : 2 quaternions
    en sortie : des forces ( torque )
    l'algo doit aussi déterminer le plus court chemin de rotation.

    ODE ne permet d'appliquer un torque que sous la forme :
    addTorque( pitch, yaw, roll )


    J'ai imaginé et testé plusieurs solutions, mais aucune n'est satifaisante.
    Exemple : transformer un quaternion en angles d'Euler ne marche pas bien puisqu'il y a des singularités à PI/2 ou -PI/2.
    Exemple2 : trouver un arc quaternion (SLERP) entre les deux quaternion d'entrée fonctionne, mais comment convertir ce SLERP en forces ??

    Dernièrement, je tente de prendre des points de l'objet ( les axes ) dans leurs positions actuelles et souhaitées et de determiner pour chaque angle ( yaw, pitch, roll ) le plus court chemin ( signe du produit scalaire )... mais c'est pas génial non plus...


    J'imagine que les ingénieurs qui fabriquent des satellites ou des sondes spatiales connaissent ce problème, mais j'aimerai pas avoir à comprendre leur algos :/
    La, c'est pour un jeu, il y a moyen de simplifier les choses...


    Donc si quelqu'un a une idée a proposer.... merci d'avance.

  2. #2
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    Je sais pas si tu le sais mais torque en anglais cela veut dire : "Couple" un couple mécanique, un bras de levier... Donc normal que tu puisses en ajouter que sous la "forme d'angle d'Euler" pitch, roll, yall.

    Mais tu veux passé d'une orientation h0 à h1 (Avec h0 et h1 des hamiltoniens).
    "Donc" des orientations alors que tu cherches une force ce qui n'as pas de sens puisque tu donnes un couple. Un couple est une force multiplier par une longueur..

    Si tu cherches une interpolation SLERP est assez bonne. Mais je ne comprends vraiment pas ce que tu cherches force, couple, plus court chemin en rotation. Si tu cherches un couple à donné pour arrivée à h1 il faut plus de précision en ce qui concerne ton systeme puisque si on est dans le vide ton corps bougera toujours puisque après avoir donnée un couple rien ne l'arrete...

    En gros j'ai rien compris puisque tous est mélangé couple, force, angle, ...

    Si tu veux des infos sur les quaternions :
    ROTATION ET QUATERNION D'ATTITUDE
    IH

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Oui, désolé, j'ai fais de mon mieux pour expliquer mon problème le plus clairement possible, mais c'est pas très réussi...

    Après quelques heures de réflexion supplémentaires, je peux encore préciser mon besoin :
    Il me faut obtenir le sens du couple (uniquement) a appliquer à un objet pour qu'il soriente depuis son orientation actuelle vers une orientation souhaitée. Comme dit précédemment, l'orientation actuelle est obtenue sous forme de quaternion et l'orientation souhaitée est exprimée en angles d'Euler.

    C'est un peu comme le positionnement d'une sonde dans l'espace, j'imagine qu'elle est orientée régulièrement pendant sa trajectoire, et surtout avant d'appliquer un forte poussée du réacteur principal .


    Pour ce qui est de la rotation dans le vide, je triche en appliquant un fort "angular damping". Donc j'applique un très petit couple si besoin à chaque frame et le "freinage angulaire" fait le reste... surtout qu'il peut y avoir des facteurs externes qui modifie l'orientation de l'objet... si je voulais simuler une sonde spatiale (facteurs externes négligeables), j'aurais évité d'utiliser un moteur de physique pour ça C'est pour un jeu, pas pour une simulation scientifique.


    J'ai une nouvelle idée qui peut marcher ( a base de produit scalaire pour obtenir le sens du couple ), mais pas le temps de l'expliquer maintenant...
    D'ailleurs je copierai un bout de code, ça sera probablement plus clair
    ( mmh, on pourrait dire que si on arrive pas a expliquer clairement un problème, c'est qu'on a pas bien compris le problème, hein ?! :p )

    Quoi qu'il en soit, merci pour la réponse...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    J'ai trouvé !

    Si quelqu'un est en passe de construire un satellite, j'ai l'algo qu'il faut pour l'orienter suivant une position désirée

    Plus sérieusement, si quelqu'un est intéressé par la solution, je tenterai d'expliquer comment ça peut marcher...

  5. #5
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    Ben met ta solution ici ou dans contribuez Physique si la section existe...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Méthode et principes
    Problème :
    ----------------

    Etant donné deux orientations; A l'orientation actuelle et D l'orientation désirée, trouver le signe du couple (le sens de rotation) a appliquer sur les trois axes pour que, au bout d'un certain temps, A soit égale à B en effectuant le nombre minimum de rotations.

    L'énoncé du problème est plus complexe que la solution... quoique...

    Principe en 2D :
    ----------------
    Prenons deux points quelconques P1 et P2 sur un cercle.
    ( note: P1 et P2 peuvent êtres vus comme un point P auquel on a appliqué 2 rotations différentes. )

    Question :
    Dans quel sens P1 doit parcourir le cercle pour arriver en P2 par le plus court chemin ?
    Réponse :
    Dit simplement : "ça dépend de quel coté est P2 par rapport à la diagonale passant par P1".
    Une utilisation judicieuse du produit scalaire nous donne le sens désiré.


    En 3D : c'est le même principe, sauf que l'on travaille dans une sphere.
    ------------------------------------------------------------------------
    On cherche dans quelle demi-sphere P2 se trouve par rapport à un plan (M) passant par P1. Produit scalaire aussi, tout ça...


    Pour trouver le sens du couple sur un seul axe, il suffit de choisir avec soin le fameux plan M qui passe par P1 et qui nous permet de décider "comment qu'y faut tourner" pour aller vers P2, et recommencer pour les autes axes.
    Quand je dis "choisir avec soin", c'est un plan bien bateau, ( comme xOy ou xOz ou zOy...) auquel on aura fait subir une rotation basée sur A.


    Mais, là, vous me dites : " c'est bien joli tout ça, mais comment on s'arrête de tourner ?"

    Et je répond qu'il faut, pour chacun des trois axes de rotation du couple ( pour lesquels on vient de se faire des noeuds au cerveau ), trouver la normale N au plan M ( celui qu'on a choisi avec soin ). Et si N est égal à la normale N' du plan M' ( qui est le plan "bateau" choisi plus haut que l'on aura orienté par B ) c'est qu'on est arrivé. ( il ne faut plus appliquer de force pour cet angle de couple ).



    Note :
    ------
    Avec cette méthode, on travaille dans un espace vectoriel; on n'utilise pas d'angle ni de coordonnées de points ( enfin... pas vraiment ... )



    Note finale :
    -------------
    Cette méthode n'est sûrement pas la seule et je ne sais pas si elle est bien trop complexe pour résoudre le problème ou que au contraire elle est super-géniallisimme, ou simplement élégante ou alors monstrueuse,..... enfin vous voyez, quoi.
    Je suis juste content d'avoir trouvé ( par moi-même, finalement; j'y croyais plus ! )


    C'est pas forcément très clair, je n'utilise pas le language mathématique, je n'ai pas le code sous la main pour le coller ici, mais vous avez, je pense, un bon aperçu du principe.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Pour la postérité :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
     
            // compute the aimed-at orientation
     
            Q1.FromAngleAxis( Ogre::Radian(mRoll), Ogre::Vector3( 0,0,1) );
            Q2.FromAngleAxis ( Ogre::Radian(mPitch), Ogre::Vector3( 1,0,0) );
            Q3.FromAngleAxis ( Ogre::Radian(mYaw), Ogre::Vector3( 0,1,0) );
            aimQ=Q3*Q1*Q2;   // the order is important.
            aimQ.normalise();
     
            curQ=mPhysBody->getOrientation();
     
     
            // take 3 points ( axis ) in the two different orientations 
            // ( current and aimed-at )
            // We really only need two points/planes,
            //  but it looks better like that ! :)
     
            AimYaw=aimQ*Ogre::Vector3(0,0,1); 
            CurYaw=curQ*Ogre::Vector3(0,0,1);
     
            AimPitch=aimQ*Ogre::Vector3(0,1,0);
            CurPitch=curQ*Ogre::Vector3(0,1,0);
     
            AimRoll=aimQ*Ogre::Vector3(1,0,0);
            CurRoll=curQ*Ogre::Vector3(1,0,0);
     
     
            // Yaw :
            // Find the yaw direction to go from the current position
            // to the aimed-at position.
            // CurRoll is used here as the normal of the plane passing through 
            // the CurYaw point and perpendicular to the "Yaw plane".
     
            mYawPs=CurRoll.dotProduct( AimYaw );
     
            if( AimYaw.crossProduct( CurYaw ) != CurRoll ) {    // stop condition 
                forceYaw=mYawPs<0?-impulseYaw:impulseYaw;       // apply forces even if the dot product is 0 
            }
            else forceYaw=0;
     
     
            // Pitch
            mPitchPs=CurYaw.dotProduct( AimPitch );
     
             if( AimPitch.crossProduct( CurPitch ) != CurYaw ) {
                forcePitch=mPitchPs<0?-impulsePitch:impulsePitch;
            }
            else forcePitch=0;
     
     
            // Roll
            mRollPs=CurPitch.dotProduct( AimRoll );
     
             if( AimRoll.crossProduct( CurRoll ) != CurPitch ) {
                forceRoll=mRollPs<0?-impulseRoll:impulseRoll;
            }
            else forceRoll=0;
     
     
    // and finally :
    mPhysBody->addRelativeTorque ( Ogre::Vector3( forcePitch, forceYaw, forceRoll ));

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2006
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Felicitations.
    Cependant, une chose m'échappe: tu dis que le corps s'arrête de tourner lorsqu'aucune force ne lui est appliquée. Je doute que cela soit vrai. Il faut certainement appliquer une force opposée à celle qui a induit le mouvement (force de freinage, poussée, ...)

  9. #9
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    Il l'a dit lui même il ajoute un couple d'attenuation :
    Citation Envoyé par lanael
    Pour ce qui est de la rotation dans le vide, je triche en appliquant un fort "angular damping".

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    27
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2006
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    ah oui pardon autant pour moi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. orientation des onglets du tpage control
    Par redoran dans le forum Composants VCL
    Réponses: 5
    Dernier message: 10/10/2010, 13h41
  2. Réponses: 10
    Dernier message: 16/11/2007, 07h37
  3. Changer l'orientation d'un TEXT CONTROL.
    Par parp1 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 24/07/2007, 11h30
  4. [controle] propriété read only
    Par Fizgig dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/08/2002, 10h30
  5. Rx Controls Gif animés
    Par toufou dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/08/2002, 14h09

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