Aligner deux vecteurs

Bonjour,

Dans le cadre de mon travail, je suis confronté un un problème. Nous usinons des pièces sur machine outil 5 axes, trois linéaire (XYZ) et deux rotatif (AB) et je développe un logiciel pour aider les opérateurs à entrer les corrections d'axes pour rattraper les dérives. Mon problème est le suivant, après usinage d'une face nous la contrôlons en plusieurs points. J'en "détermine" le plan moyen par la méthode des moindres carrés et un vecteur normal à ce plan. Maintenant je souhaiterais connaitre les angles à entrer en machines pour aligner ce vecteur au vecteur théorique. Les rotations que je peux effectuer sont les suivant:
-axe B suivant axe Y
-axe A suivant axe Z
Je souhaiterais avoir quelques pistes, sachant que les vecteurs théorique et obtenu ne sont pas forcement sur le même plan. Merci d'avance pour aide.

Cordialement.

Réponses

  • J'en suis a ce niveau.
    j'effectue une rotation de mon vecteur réel (x,y,z) suivant l'axe Z, ma matrice de rotation:
    cos(A) -sin(A) 0
    sin(A) cos (A) 0
    0 0 1

    mon nouveau vecteur est le suivant
    cos(A)*x+sin(A)*y
    -sin(A)*x+cos(A)*y
    z

    puis rotation suivant axe Y, ma matrice de rotation:
    cos(B) 0 sin(B)
    0 1 0
    -sin(B) 0 cos(B)


    A nouveau mon nouveau vecteur est le suivant:
    cos(B)*(cos(A)*x+sin(A)*y)-sin(B)*z
    -sin(A)*x+cos(A)*y
    sin(B)*(cos(A)*x+sin(A)*y)+cos(B)*z


    Maintenant déterminer les valeurs mini de A et B pour que
    cos(B)*(cos(A)*x+sin(A)*y)-sin(B)*z = xthéo
    -sin(A)*x+cos(A)*y = ythéo
    sin(B)*(cos(A)*x+sin(A)*y)+cos(B)*z = zthéo

    Désolé pour le formatage, est-ce la bonne voie?
  • La rotation suivant l'axe A ne bouge-t-elle pas l'axe de rotation B ?
  • Non en effet, l'axe A est monté sur l'axe B.81206
  • La chaîne cinématique est donc :
    bâti fixe relié par articulation pivot d'axe B à un bras relié par articulation pivot d'axe A à la pièce ?
  • Oui c'est bien ça!
  • Je note $\vec n$ ton vecteur unitaire normal mesuré, et $\vec u$ le vecteur unitaire normal souhaité (théorique), tous deux dans le repère fixe. Je note $\alpha$ l'angle mesuré selon l'axe $A$ et $\beta$ l'angle mesuré selon l'axe $B$, pour la position actuelle de la pièce. Pour trouver des $\alpha'$ et $\beta'$ convenables :
    1°) choisir $\alpha'$ pour que $R_{Y,\alpha'} R_{Y,\alpha}^{\mathsf T} R_{Z,\beta}^{\mathsf T}\vec n$ ait même dernière coordonnée que $\vec u$.
    2°) S'il a été possible de trouver un tel $\alpha'$, choisir $\beta'$ tel que
    $$R_{Z,\beta'}R_{Y,\alpha'} R_{Y,\alpha}^{\mathsf T} R_{Z,\beta}^{\mathsf T}\vec n=\vec u\;.$$
  • Merci pour votre réponse, mais je dois avouer que je ne comprends pas trop votre annotation 1°) et 2°).
    Pourriez-vous simplifier l'écriture, s'il vous plaît. Merci infiniment.
  • $R_{Y,\alpha}$ est la matrice de rotation d'axe l'axe des $Y$ et d'angle $\alpha$ :
    $$R_{Y,\alpha}=\begin{pmatrix} \cos \alpha&0&\sin\alpha\\ 0&1&0\\ -\sin\alpha&0&\cos\alpha\end{pmatrix}\;.$$
    Je pense que tu peux deviner sans peine ce qu'est $R_{Z,\beta}$. $M^{\mathsf T}$ désigne selon la norme en vigueur la transposée de la matrice $M$. À noter que $R_{Y,\alpha}^{\mathsf T}=R_{Y,-\alpha}$.
  • Hop, un petit code en Sage :
    def RY(a) :
        return matrix(3,3,[cos(a),0,sin(a),\
                           0,1,0,\
                           -sin(a),0,cos(a)])
    def RZ(b) :
        return matrix(3,3,[cos(b),-sin(b),0,\
                          sin(b),cos(b),0,\
                          0,0,1])
    def rectif(n,u,a,b) :
        n=1/(n.norm().n())*n
        u=1/(u.norm().n())*u
        nn=(RY(a*pi.n()/180).transpose())*(RZ(b*pi.n()/180).transpose())*n
        r=sqrt(nn[0]^2+nn[2]^2).n()
        t=arctan2(nn[2],nn[0]).n()
        if u[2].abs()>r : return "error"
        else :
            aa=(t-arcsin(u[2]/r)).n()
            v=RY(aa)*nn
            bb=arctan2(v[0]*u[1]-v[1]*u[0], u[0]*v[0]+u[1]*v[1]).n()
            return aa*180/pi.n(), bb*180/pi.n()
        
    
    La procédure "rectif" prend en entrée : le vecteur $\vec n$, le vecteur $\vec u$ (pas nécessairement normalisés), $\alpha$ et $\beta$ (en degrés) avec mes notations ci-dessus et donne en sortie la correction $\alpha'$ et $\beta'$ (également en degrés). Exemple :
    in :
    rectif(vector([1,0.11,0.08]),vector([1,0.1,0.1]),37.1,12.3)
    
    out :
    (35.9578595264813, 11.7440302503542)
    
  • Merci beaucoup!
    Je vais essayer de transposer ce code en c++.
    Je remarque que dans votre code la position initiale des axes A et B sont nécessaires.
    Dans mon esprit, peu importe la position des axes, enfin pas vraiment, je ramène toujours mon axe B à 0° pour effectuer mes calculs et pour avoir mon axe A aligné à l'axe Z, je voudrais déterminer la quantité de déplacement angulaire pour coller au mieux à mon vecteur théorique depuis mon vecteur réel.

    exemple:
    L'axe A est réglé à 21.6365°

    axe B à 95°
    Normal - Absolu
    théo I = 0.285149640 réel I = 0.286286055836
    théo J = -0.912802536 réel J = -0.912610314905
    théo K = -0.292371705 réel K = -0.291860767084


    axe B à 0°
    Normal - Absolu
    théo I = -0.316111571 réel I = -0.315701622585
    théo J = -0.912802536 réel J = -0.912610314905
    théo K = -0.258582687 réel K = -0.259759309027


    Dans mes simulations en 3D, j'en déduis qu'il faut une correction de :
    0.034941914 sur l'axe A
    -0.213221911 sur l'axe B

    181024101735244951.png
  • L'angle $\alpha$ n'est pas nécessaire, on peut calculer directement la différence $\alpha'-\alpha$. Par contre, le $\beta$ me semble indispensable ! D'ailleurs, pour "ramener $\beta$ à $0$" comme tu le fais, il faut bien connaître $\beta$.

    J'ai quelques petits soucis avec tes données. Pour moi, le passage du schéma du bas au schéma du haut correspond à une rotation de -95° (rotation de 95° dans le sens horaire) et pas à une rotation de 95°. Ça me semble confirmé par la partie droite des schémas qui indique que l'axe Y est bien orienté vers le haut.

    J'ai repris ma procédure pour que les axes de rotation correspondent bien à ton modèle, et aussi pour avoir en sortie les accroissements angulaires. Aussi, je fais maintenant des tests pour que l'accroissement angulaire retourné soit bien le plus petit possible.
    def RY(b) :
        return matrix(3,3,[cos(b),0,sin(b),\
                           0,1,0,\
                           -sin(b),0,cos(b)])
    def RZ(a) :
        return matrix(3,3,[cos(a),-sin(a),0,\
                          sin(a),cos(a),0,\
                          0,0,1])
    def rectif2(n,u,b) :
        p=pi.n()
        n=1/(n.norm())*n
        u=1/(u.norm())*u
        nn=RY(-b*p/180)*n
        r=sqrt(nn[0]^2+nn[1]^2)
        t=arctan2(nn[0],nn[1])
        if u[1].abs()>r : return "error"
        else :
            delta=arccos(u[1]/r)+t
            if delta>p : delta=delta-2*p
            deltabis=-arccos(u[1]/r)+t
            if deltabis<-p : deltabis=deltabis+2*p
            if deltabis.abs()<delta.abs() : delta=deltabis
            v=RZ(delta)*nn
            bb=arctan2(v[2]*u[0]-v[0]*u[2], u[0]*v[0]+u[2]*v[2]).n()
            return delta*180/p, bb*180/p - b
    

    Quand j'essaie avec tes données, j'obtiens un résultat différent du tien.
    in:
    n=vector([0.286286055836 , -0.912610314905, -0.291860767084])
    u=vector([0.285149640,  -0.912802536,  -0.292371705])
    a=21.6365
    b=95
    rectif2(n,u,b)
    
    out :
    (-0.0414868311193395, 0.234458380037836)
    
    Mais quand je change b=95 en b=-95 dans les données, ça colle, à un signe près.
    out :
    (0.0349163440358128, 0.213591100739237)
    
    Tu mesures les angles dans le sens horaire ? On dirait que c'est le cas quand on compare le 21.6365° à la partie droite des schémas. C'est un peu troublant, et contraire à la pratique mathématique.
  • Un grand merci pour le temps que vous avez pris à me répondre!
    Quand je parle de +95° sur l'axe B, c'est la position programmée en machine. En effet, je ramène l'axe B en faisant -95°.
    J'ai eu du mal à reproduire votre algorithme d'abord sur Excel. Les arguments de arctan2 sont inversés entre sageMath et Excel!. Encore une fois merci beaucoup!
  • Tu confirmes bien que les angles sont mesurés dans le sens horaire ? C'est assez déroutant quand on écrit des matrices de rotation !
  • Oui je te le confirme, c'est moi qui me suit trompé dans l'écriture de la matrice de rotation.
    Quand l'axe B est à 0° voila comment se déplace les axes.

    181025111404615257.png

    Merci encore!
  • Effectivement, ton schéma montre que la façon de mesurer les angles de rotation est exactement contraire aux conventions habituelles en mathématiques et en physique (règle du tire-bouchon).
Connectez-vous ou Inscrivez-vous pour répondre.