我正在将旋转矩阵分解为Euler角(更确切地说是Tait-Bryan角,按x-y-z顺序,即先绕x轴旋转),然后分解回旋转矩阵。我使用了transforms3d python库(https://github.com/matthew-brett/transforms3d),并且还遵循了本教程www.gregslabaugh.net/publications/euler.pdf两者给出的结果相同。
问题在于重新设定的旋转矩阵与我刚开始的旋转矩阵不匹配。
我正在使用的矩阵是由openCV的“ decomposeHomographyMat”函数创建的,因此我希望它是有效的旋转矩阵。也许是特例? 矩阵是
三个角度为[-1.8710997,0.04623301,-0.03679793]。如果将它们转换回旋转矩阵,我将得到
R_23不能是舍入错误。
在上面的纸之后,可以通过asin(-R_31)计算绕y轴(β)的旋转。另一个有效角度为pi-asin(-R_31)。 可以通过atan2(R_32,R_33)计算绕x轴(α)的角度。我也可以通过asin(R_32 / cosbeta)或acos(R_33 / cosbeta)获得alpha。如果使用后两个方程式,则当我使用beta = pi-arcsin(-R_31)时,对于alpha只会得到相同的结果,这意味着对于beta只有一个有效的解决方案。 atan2(R_32,R_33)给出的结果不同。
无论如何,我的矩阵似乎出了点问题,或者我无法弄清楚为什么无法正常运行。
import numpy as np
def rot2eul(R):
beta = -np.arcsin(R[2,0])
alpha = np.arctan2(R[2,1]/np.cos(beta),R[2,2]/np.cos(beta))
gamma = np.arctan2(R[1,0]/np.cos(beta),R[0,0]/np.cos(beta))
return np.array((alpha, beta, gamma))
def eul2rot(theta) :
R = np.array([[np.cos(theta[1])*np.cos(theta[2]), np.sin(theta[0])*np.sin(theta[1])*np.cos(theta[2]) - np.sin(theta[2])*np.cos(theta[0]), np.sin(theta[1])*np.cos(theta[0])*np.cos(theta[2]) + np.sin(theta[0])*np.sin(theta[2])],
[np.sin(theta[2])*np.cos(theta[1]), np.sin(theta[0])*np.sin(theta[1])*np.sin(theta[2]) + np.cos(theta[0])*np.cos(theta[2]), np.sin(theta[1])*np.sin(theta[2])*np.cos(theta[0]) - np.sin(theta[0])*np.cos(theta[2])],
[-np.sin(theta[1]), np.sin(theta[0])*np.cos(theta[1]), np.cos(theta[0])*np.cos(theta[1])]])
return R
R = np.array([[ 0.9982552 , -0.03323557, -0.04880523],
[-0.03675031, 0.29723396, -0.95409716],
[-0.04621654, -0.95422606, -0.29549393]])
ang = rot2eul(R)
eul2rot(ang)
import transforms3d.euler as eul
ang = eul.mat2euler(R, axes='sxyz')
eul.euler2mat(ang[0], ang[1], ang[2], axes='sxyz')
答案 0 :(得分:1)
事实证明,旋转矩阵的行列式为负,这使旋转矩阵不合适。 openCV函数“ decomposeHomographyMat”有一个错误:https://github.com/opencv/opencv/issues/4978