将旋转矩阵转换为欧拉角并反向旋转-特殊情况?

时间:2019-02-10 11:49:23

标签: python opencv

我正在将旋转矩阵分解为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')

1 个答案:

答案 0 :(得分:1)

事实证明,旋转矩阵的行列式为负,这使旋转矩阵不合适。 openCV函数“ decomposeHomographyMat”有一个错误:https://github.com/opencv/opencv/issues/4978