旋转矩阵到四元数等价
我正在跟踪刚体上的3个点(3D,xyz),我用它来定义局部坐标系。 我使用这个局部坐标系的方向(在全局参照系中)来设置VR程序中的视图方向。 要做到这一点,并避免使用欧拉角的万向节锁,我试图使用四元数来设置视图方向。
我从3个点创建一个旋转矩阵,然后使用维基百科上描述的这种方法来提取假定的等价四元数。 然后,我简单地将视图方向设置为计算的四元数。
然而,我观察到,当我也能够同时看到偏航和摇摆的变化时,主要只有1个自由度(俯仰)。 我已经从旋转矩阵中提取了欧拉角,并且除了万向节锁之外,它运作良好。 所以我确定旋转矩阵是可用的,虽然在我的情况下是不合适的。
我的问题是,为什么所谓的等价四元数似乎只会改变'pitch'的自由度?
我知道四元数是围绕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)
任何帮助或想法都会很棒!
这里的关键问题在于,您仅将一种算法仅适用于适当的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]
,你会看到似乎几乎是纯粹的滚动。
注意:这同样适用于从矩阵中提取欧拉角的算法。 这些算法都假设矩阵是一个适当的旋转矩阵。 当你不恰当地将它们应用到不正确的旋转矩阵时,你会得到废话。
链接地址: http://www.djcxy.com/p/81783.html