给定一个单位向量,找出使该向量与轴对齐的两个旋转角度

Joh*_*ith 6 python numpy rotation linear-algebra

所以我不太精通线性代数,所以我正在努力解决这个问题。

我有一个单位向量v。我想找到两个角度(角度 1,绕 x 轴旋转,角度 2,绕 z 轴旋转),这样当我旋转v它们时,矢量v与 y 轴对齐。从这个问题我有一个函数可以找到任意向量之间的角度并返回一个旋转。但是这个函数返回 3 个角度。本质上有无数个v与 y 轴对齐的 3d 旋转,所以我想要两个独特的角度。

这是我现在拥有的代码,它需要 numpy 和 scipy:

import numpy as np
import random
from scipy.spatial.transform import Rotation as R

def rotation_from_unit_vectors(a, b):
    v = np.cross(a, b)
    c = np.dot(a, b)
    s = np.linalg.norm(v)
    kmat = np.array([[0, -v[2], v[1]], [v[2], 0, -v[0]], [-v[1], v[0], 0]])
    rotation_matrix = np.eye(3) + kmat + kmat.dot(kmat) * ((1 - c) / (s ** 2))
    return  R.from_matrix(rotation_matrix)


y_axis = np.asarray([0.0, 1.0, 0.0])

alpha = random.uniform(0, 10)
beta = random.uniform(0, 10)
gamma = random.uniform(0, 10)

v = np.asarray([alpha, beta, gamma])
v = v / np.linalg.norm(v)

r = rotation_from_unit_vectors(v, y_axis)
print(r.as_euler('xyz', degrees = True))
print(r.apply(v))
Run Code Online (Sandbox Code Playgroud)

Dav*_*ing 2

利用固定目标对齐,这可以通过三角学以简单的方式完成:

import math

def to_y(x,y,z):
  rx=-math.atan2(z,y)              # or +math.atan2(z,-y)
  y2=y*math.cos(rx)-z*math.sin(rx) # -> (x,y2,0)
  return rx,math.atan2(x,y2)
Run Code Online (Sandbox Code Playgroud)

当从+ x或 + z(右手定则)看原点时,旋转被定义为逆时针;旋转方向始终是幅度较小的方向,但可能会找到物理上较小的旋转,如注释中所示。请注意,输入不需要标准化,并且永远不会生成 NaN(除非它出现在输入中)。