【发布时间】:2020-09-12 22:02:55
【问题描述】:
我正在尝试旋转 vector1(红色),使其与 3D 空间中的 vector2(蓝色)对齐。但是,只能使用围绕 X 和 Z 轴的旋转。
到目前为止,我已经使用一种优化算法解决了这个问题,该算法试图最小化向量之间围绕 X 轴和 Z 轴的角度。这在大多数情况下工作得很好,但由于我必须计算很多这些向量,所以它太慢了。
我用于优化方法的代码:
vector1 = np.array([0., -1., 0.])
vector2 = np.array([0.2, -0.2, -0.5])
def find_a_c(x, *args):
vector1, vector2 = args[0], args[1]
angle_x, angle_z = x[0], x[1]
# Rotation matrices to rotate around X and Z
Rx = np.array([[1., 0., 0.],
[0., np.cos(angle_x), -np.sin(angle_x)],
[0., np.sin(angle_x), np.cos(angle_x)]])
Rz = np.array([[np.cos(angle_z), -np.sin(angle_z), 0.],
[np.sin(angle_z), np.cos(angle_z), 0.],
[0., 0., 1.]])
vector1 = vector1.dot(Rx).dot(Rz)
# calulate the angle between the vectors around X and Z
angle_x = angle_between_vectors([vector2[1], vector2[2]], [vector1[1], vector1[2]])
angle_z = angle_between_vectors([vector2[0], vector2[1]], [vector1[0], vector1[1]])
return np.abs(angle_x) + np.abs(angle_z)
solution = minimize(fun=find_a_c,
x0=[0., 0.],
args=(vector1, vector2))
angle_x, angle_z = solution.x[0], solution.x[1]
print("Angle around X: {}°\nAngle around Z: {}°".format(np.rad2deg(angle_x), np.rad2deg(angle_z)))
打印:
Angle around X: -60.46948402478365°
Angle around Z: -45.0000003467713°
现在我正在寻找一种可以解决我的问题的分析方法。例如。由两个旋转角(围绕 X 和 Z)形成的旋转矩阵,用于将 vector1 与 vector2 对齐。
【问题讨论】:
-
您能否提供您的代码https://stackoverflow.com/help/minimal-reproducible-example 的最小可重现示例,以便其他用户可以重现您的问题?谢谢!
-
this 关于向量的 2D 和 3D 旋转的文章有帮助吗?
-
Mathematics 上的这个主题可能更有帮助:math.stackexchange.com/questions/180418/…
-
@SimonFink ,是的,我已经根据this 的回答成功地尝试了这个。但这并不能解决我的问题,因为它不会阻止绕 Y 轴旋转(这在我的系统上实际上是不可能的)
标签: python numpy optimization vector linear-algebra