J'ai dû calculer l'angle du graisseur z-y-x à partir du quaternion.
De plus, comme c'est une question qui doit être écrite en Python 2.7, vous ne pouvez pas en utiliser une pratique comme scipy.spatial.transform.Rotation.
Quand j'ai recherché la formule, j'ai trouvé un exemple de code C ++ sur Wikipedia.
Wikipedia / Quaternion to Euler Angles Conversion
J'ai écrit le code Python 2.7 en me référant à l'exemple de code de Wikipedia.
import math
import numpy as np
from pyquaternion import Quaternion
def quaternion_to_euler_zyx(q):
    """
Quarternion z-y-Convertir en angle de graisseur de type X.
    Parameters
    ----------
    q : Quaternion
Quarternion(format pyquaternion)
    Returns
    -------
    np.array
        z-y-angle de graisseur basé sur x
    """
    # roll :rotation de l'axe x
    sinr_cosp = 2 * (q[0] * q[1] + q[2] * q[3])
    cosr_cosp = 1 - 2 * (q[1] * q[1] + q[2] * q[2])
    roll = math.atan2(sinr_cosp, cosr_cosp)
    # pitch :rotation de l'axe y
    sinp = 2 * (q[0] * q[2] - q[3] * q[1])
    if math.fabs(sinp) >= 1:
        pitch = math.copysign(math.pi / 2, sinp)
    else:
        pitch = math.asin(sinp)
    # yaw :rotation de l'axe z
    siny_cosp = 2 * (q[0] * q[3] + q[1] * q[2])
    cosy_cosp = 1 - 2 * (q[2] * q[2] + q[3] * q[3])
    yaw = math.atan2(siny_cosp, cosy_cosp)
    
    #Angle du graisseur
    retrun np.array([
        math.degrees(roll), 
        math.degrees(pitch), 
        math.degrees(yaw)
    ])
numpy 1.16.6
C'est celui utilisé pour le calcul vectoriel. 1.16.6 semble être la dernière prise en charge de Python 2.7.
pyquaternion 0.9.5
J'utilise «pyquaternion» pour calculer Quaternion.
numpy-quaternion semble être plus compatible avec numpy, mais je n'ai pas pu l'installer dans l'environnement Python 2.7.
Si vous utilisez scipy.spatial.transform.Rotation, vous pouvez l'écrire plus simplement.
import numpy as np
from pyquaternion import Quaternion
from scipy.spatial.transform import Rotation as R
def quaternion_to_euler_zyx(q):
	r = R.from_quat([q[0], q[1], q[2], q[3]])
	return r.as_euler('zyx', degrees=True)
Cependant, scipy.spatial.transform.Rotation ne semble pas prendre en charge Python 2.7. Pardon.
Je ne touche généralement que l'angle de graissage z-x-y d'Unity, donc le système z-y-x était assez confus.
En créant cet article, j'ai fait référence aux articles suivants. Merci beaucoup!
Recommended Posts