scipy 旋转:from_matrix ->as_quat ->from_quat ->as_matrix给出与输入不同的输出

7vux5j2d  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(275)

我有相机的内在矩阵。我做以下操作:from_matrix -〉as_quat -〉from_quat -〉as_matrix,它给出了不等于输入的输出:

from scipy.spatial.transform import Rotation as R

intrinsic = [[503.5763854980469, 0.0, 481.818115234375], [0.0, 499.7862854003906, 272.2569885253906], [0.0, 0.0, 1.0]]
r = R.from_matrix(intrinsic).as_quat()
r = R.from_quat([r[0], r[1], r[2], r[3]]).as_matrix()
print(r)

# r is equal to

[[ 0.64746546 -0.19920379  0.7355993 ]
[-0.19920379  0.88743756  0.41565903]
[-0.7355993  -0.41565903  0.53490302]]
qlfbtfca

qlfbtfca1#

the docs开始:
从旋转矩阵初始化。
3维旋转可以用3 x 3本征正交矩阵[1]表示。如果输入不是本征正交的,则使用[2]中描述的方法创建近似。
其中[2]指的是由F. Landis Markley, “Unit Quaternion from Rotation Matrix”, Journal of guidance, control, and dynamics vol. 31.2, pp. 440-442, 2008.表示的纸张。
您的输入非常不正交:

>>> intrinsic @ np.transpose(intrinsic)
array([[4.85737872e+05, 1.31178349e+05, 4.81818115e+02],
       [1.31178349e+05, 3.23910199e+05, 2.72256989e+02],
       [4.81818115e+02, 2.72256989e+02, 1.00000000e+00]])

但返回的旋转矩阵应该是:

>>> r @ r.T
array([[1.00000000e+00, 2.85398587e-17, 4.25286470e-17],
       [2.85398587e-17, 1.00000000e+00, 2.44541461e-17],
       [4.25286470e-17, 2.44541461e-17, 1.00000000e+00]])

实际上,原始矩阵的特征值与正交矩阵的特征值完全不同(单位幅值复数):

>>> np.linalg.eigvals(r)
array([0.53490302+0.84491346j, 0.53490302-0.84491346j,
       1.        +0.j        ])

>>> np.linalg.eigvals(intrinsic)
array([503.5763855, 499.7862854,   1.       ])

我不熟悉这里使用的近似和假设,但是如果你没有提供一个合理的旋转矩阵,那么当你试图把它变成一个旋转矩阵时,得到不同的结果也就不足为奇了。

相关问题