gpt4 book ai didi

python - 旋转矩阵到四元数等价

转载 作者:行者123 更新时间:2023-11-28 16:30:44 26 4
gpt4 key购买 nike

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

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

但是,我观察到主要只有 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)

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

最佳答案

这里的关键问题是,您将仅适用于正确的 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],你会得到看起来几乎是纯卷的东西。

请注意:这同样适用于从矩阵中提取欧拉角的算法。这些算法都假设矩阵是一个适当的旋转矩阵。当您将它们不正确地应用于不正确的旋转矩阵时,您会变得胡说八道。

关于python - 旋转矩阵到四元数等价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32208838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com