我正在尝试找到欧拉角,以使点A
在三维空间中转换到点B
。
考虑归一化向量A=[1,0,0]
和B=[0.32 0.88 -0.34]
。
我理解通过计算A×B
即可获得旋转轴。A
和B
之间的角度由tan⁻¹(||cross||,A·B)
给出,其中A·B
是A
和B
的点积。
这给我提供了旋转向量rotvec=[0 0.36 0.93 1.24359531111]
,其中rotvec=[A × B; angle]
(叉积已归一化)。
现在我的问题是:我该如何从这里开始获得与从A
到B
变换对应的欧拉角?
在MATLAB中,函数vrrotvec2mat接收旋转向量作为输入并输出旋转矩阵。然后函数rotm2eul应返回相应的欧拉角。根据XYZ
约定,我得到以下结果(以弧度为单位):[0.2456 0.3490 1.2216]
。然而,这不是预期的结果。
正确答案是[0 0.3490 1.2216]
,对应于Y
和Z
上的20°
和70°
旋转。
当我使用eul2rot([0 0.3490 1.2216])
(使用此处的eul2rot
)验证结果的旋转矩阵时,它与使用vrrotvec2mat(rotvec)
获得的旋转矩阵不同。
我还有一个Python片段,产生与上述完全相同的结果。
--- Python(2.7)使用transform3d ---
import numpy as np
import transforms3d
cross = np.cross(A, B)
dot = np.dot(A, B.transpose())
angle = math.atan2(np.linalg.norm(cross), dot)
rotation_axes = sklearn.preprocessing.normalize(cross)
rotation_m = transforms3d.axangles.axangle2mat(rotation_axes[0], angle, True)
rotation_angles = transforms3d.euler.mat2euler(rotation_m, 'sxyz')
我在这里缺少什么?我应该做些什么呢?
谢谢。