旋转矩阵到四元数等价

时间:2015-08-25 16:04:36

标签: python quaternions rotational-matrices euler-angles vizard

我在刚体上跟踪3个点(3D,x y z),我用它来定义局部坐标系。我正在使用此局部坐标系的方向(在全局参照系中)来设置VR程序中的视图方向。要做到这一点,并避免使用欧拉角度的万向节锁定,我试图使用四元数来设置视图方向。

我从3个点创建一个旋转矩阵,然后我使用Wikipedia上描述的这个方法来提取假定的等效四元数。然后我只是将视图方向设置为计算的四元数。

然而,我观察到的是,当我还应该能够同时看到偏航和滚动的变化时,主要只有1个自由度(俯仰)。我从旋转矩阵中提取了欧拉角,除了万向节锁外,它的效果很好。所以我确定旋转矩阵是可用的,但在我的情况下是不合适的。

我的问题是为什么所谓的等效四元数似乎只会改变“音调”自由度?

我知道四元数是一个绕1轴的旋转,但是我想如果它是从旋转矩阵导出的,那么最终结果与设置欧拉角是一样的吗?

这是我在python中的代码:

import viz
import numpy as np

vec1 = np.array([-0.96803,-0.25022,0.01751],dtype=float)
vec3 = np.array([-0.024815,0.96553,0.07863],dtype=float)
vec4 = np.array([-0.03655,0.07178,-0.99675],dtype=float)
#normalize to unit length
vec1 = vec1 / np.linalg.norm(vec1)
vec3 = vec3 / np.linalg.norm(vec3)
vec4 = vec4 / np.linalg.norm(vec4)

M1 = np.zeros((3,3),dtype=float) #rotation matrix

#rotation matrix setup
M1[:,0] = vec1
M1[:,1] = vec3
M1[:,2] = vec4

#get the real part of the quaternion first
r = np.math.sqrt(float(1)+M1[0,0]+M1[1,1]+M1[2,2])*0.5
i = (M1[2,1]-M1[1,2])/(4*r)
j = (M1[0,2]-M1[2,0])/(4*r)
k = (M1[1,0]-M1[0,1])/(4*r)

viz.MainView.setQuat(i,j,k,r)

任何帮助或想法都会很棒!

1 个答案:

答案 0 :(得分:2)

这里的关键问题是你将一个仅适用于正确3x3旋转矩阵的算法应用于一个非正交的矩阵,并且非常接近一个不正确的旋转矩阵。后者是你问题的主要根源。

你的矩阵M1是

array([[-0.9994477 , -0.02887993,  0.0164005 ],
       [-0.02958325,  0.99862763, -0.04323132],
       [ 0.01513678,  0.0436899 ,  0.99893047]])

当你不正确地应用该算法从正确的旋转矩阵中提取四元数到这个不正确的矩阵时,你会得到废话。特别是,因为M[2,1]大约等于-M[1,2]M[0,2]大约等于M[2,0],而M[1,0]大约等于M[0,1],你会得到几乎纯粹的滚动。

注意:这同样适用于从矩阵中提取欧拉角的算法。这些算法都假设矩阵是适当的旋转矩阵。当你不正确地将它们应用到不正确的旋转矩阵时,你会得到废话。