@@ -27,6 +27,14 @@ def quat2rot(quats):
27
27
return Rs
28
28
29
29
30
+ def rot2quat (Rs ):
31
+ q0 = sp .sqrt (1 + Rs [:, 0 , 0 ] + Rs [:, 1 , 1 ] + Rs [: 2 , 2 ]) / 2
32
+ q1 = (Rs [:, 2 , 1 ] - Rs [:, 1 , 2 ]) / (4 * q0 )
33
+ q2 = (Rs [:, 0 , 2 ] - Rs [:, 2 , 0 ]) / (4 * q0 )
34
+ q3 = (Rs [:, 1 , 0 ] - Rs [:, 0 , 1 ]) / (4 * q0 )
35
+ return sp .Matrix ([q0 , q1 , q2 , q3 ])
36
+
37
+
30
38
def euler2quat (eulers ):
31
39
eulers = np .array (eulers )
32
40
if len (eulers .shape ) > 1 :
@@ -52,9 +60,22 @@ def euler2quat(eulers):
52
60
return quats .reshape (output_shape )
53
61
54
62
63
+ def quat2euler (quats ):
64
+ q0 , q1 , q2 , q3 = quats [:, 0 ], quats [:, 1 ], quats [:, 2 ], quats [:, 3 ]
65
+ gamma = sp .atan2 (2 * (q0 * q1 + q2 * q3 ), 1 - 2 * (q1 ** 2 + q2 ** 2 ))
66
+ theta = sp .asin (2 * (q0 * q2 - q3 * q1 ))
67
+ psi = sp .atan2 (2 * (q0 * q3 + q1 * q2 ), 1 - 2 * (q2 ** 2 + q3 ** 2 ))
68
+ return sp .Matrix ([gamma , theta , psi ])
69
+
70
+
55
71
def euler2rot (eulers ):
56
72
return quat2rot (euler2quat (eulers ))
57
73
74
+
75
+ def rot2euler (Rs ):
76
+ return quat2euler (rot2quat (Rs ))
77
+
78
+
58
79
rotations_from_quats = quat2rot
59
80
60
81
0 commit comments