Why do matlab and python convert Euler angles to quaternions with different results?
11 次查看(过去 30 天)
显示 更早的评论
I converted the following Euler angles/radians into quaternions using matlab's built-in function eul2quat, the external order is: first around the x-axis, then around the y-axis, and finally around the z-axis.
eulars = [-1.78E-15 -0.09548759 -3.141592;
-1.78E-15 -0.09548759 -3.141592;
0 -0.1113647 -3.136936;
-0.000419181 -0.1113141 -3.132684;
-0.000802144 -0.1113117 -3.128802;
-0.001152084 -0.1113079 -3.12526;
-0.001180313 -0.1101197 -3.122032;
-0.001413606 -0.1086281 -3.119092;
-0.001928661 -0.1062565 -3.116415];
matlab_q = eul2quat(eulars,"ZYX")% first x, then y,final z
Then I also used python to convert the above data to quaternions as follows:
from scipy.spatial.transform import Rotation as R
import numpy as np
myeulars = np.array([[-1.78E-15, -0.09548759, -3.141592],
[-1.784486e-15, -0.09548759, -3.141592],
[0, -0.1113647 , -3.136936],
[-0.000419181 , -0.1113141, -3.132684],
[-0.000802144, -0.1113117, -3.128802],
[-0.001152084 , -0.1113079, -3.12526],
[-0.001180313 , -0.1101197, -3.122032],
[-0.001413606 , -0.1086281, -3.119092],
[-0.001928661 , -0.1062565, -3.116415]])
python_q = R.from_euler('xyz', myeulars, degrees=False).as_quat() # first x, then y,final z
print(python_q)
[[-4.77256586e-02 -1.55965008e-08 -9.98860482e-01 3.26422508e-07]
[-4.77256586e-02 -1.55965008e-08 -9.98860482e-01 3.26422508e-07]
[-5.56534295e-02 -1.29579605e-04 -9.98447432e-01 2.32471611e-03]
[-5.56286986e-02 -3.85220084e-05 -9.98441671e-01 4.43575562e-03]
[-5.56285404e-02 4.46916188e-05 -9.98431257e-01 6.36307029e-03]
[-5.56280572e-02 1.20882279e-04 -9.98418522e-01 8.12154965e-03]
[-5.50351559e-02 5.10113472e-05 -9.98436979e-01 9.73287224e-03]
[-5.42918402e-02 9.49786087e-05 -9.98462346e-01 1.11951287e-02]
[-5.31111500e-02 2.94403626e-04 -9.98510080e-01 1.25195214e-02]]
The above data result is left-right symmetric, according to the documentation, matlab uses quaternions of the form w+x*i+y*j+z*k output; while python uses quaternions of the form x*i+y*j+z*k+w.
It can be inferred that the matlab calculation result (a,b,c,d) should correspond to the python order (w,x,y,z), why the above result corresponds to the python is (w,z,y,x)?
b = quaternion(eulars,'euler','XYZ','point') % However, this result is consistent with Python
9×1 quaternion array
3.2642e-07 - 0.047726i - 1.5597e-08j - 0.99886k
3.2642e-07 - 0.047726i - 1.5597e-08j - 0.99886k
0.0023247 - 0.055653i - 0.00012958j - 0.99845k
0.0044358 - 0.055629i - 3.8522e-05j - 0.99844k
0.0063631 - 0.055629i + 4.4692e-05j - 0.99843k
0.0081215 - 0.055628i + 0.00012088j - 0.99842k
0.0097329 - 0.055035i + 5.1011e-05j - 0.99844k
0.011195 - 0.054292i + 9.4979e-05j - 0.99846k
0.01252 - 0.053111i + 0.0002944j - 0.99851k
0 个评论
采纳的回答
Brian Fanous
2023-3-2
@cui I believe you saw my post on other thread already. But in case someone else comes along this question, the way the MATLAB quaternion class handles euler angle conversions is detailed here:
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Specialized Messages 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!