pyquaternion: ValueError: Unexpected number of elements in sequence
pyquaternion: ValueError: Unexpected number of elements in sequence
使用 pyquaternion module 我想获得 3x3 旋转矩阵的四元数表示。执行时,它 returns ValueError: Unexpected number of elements in sequence. Got: 3, Expected: 4.
。根据文档,用 3x3 矩阵实例化四元数应该可行,或者我可能误解了一些东西。
为了测试这个,我发现这个 method 用于随机旋转矩阵生成。如上所述,我只收到此错误消息。
import numpy as np
from pyquaternion import Quaternion
def rand_rotation_matrix(deflection=1.0, randnums=None):
"""
Creates a random rotation matrix.
deflection: the magnitude of the rotation. For 0, no rotation; for 1, competely random
rotation. Small deflection => small perturbation.
randnums: 3 random numbers in the range [0, 1]. If `None`, they will be auto-generated.
"""
# from http://www.realtimerendering.com/resources/GraphicsGems/gemsiii/rand_rotation.c
if randnums is None:
randnums = np.random.uniform(size=(3,))
theta, phi, z = randnums
theta = theta * 2.0*deflection*np.pi # Rotation about the pole (Z).
phi = phi * 2.0*np.pi # For direction of pole deflection.
z = z * 2.0*deflection # For magnitude of pole deflection.
# Compute a vector V used for distributing points over the sphere
# via the reflection I - V Transpose(V). This formulation of V
# will guarantee that if x[1] and x[2] are uniformly distributed,
# the reflected points will be uniform on the sphere. Note that V
# has length sqrt(2) to eliminate the 2 in the Householder matrix.
r = np.sqrt(z)
Vx, Vy, Vz = V = (
np.sin(phi) * r,
np.cos(phi) * r,
np.sqrt(2.0 - z)
)
st = np.sin(theta)
ct = np.cos(theta)
R = np.array(((ct, st, 0), (-st, ct, 0), (0, 0, 1)))
# Construct the rotation matrix ( V Transpose(V) - I ) R.
M = (np.outer(V, V) - np.eye(3)).dot(R)
return M
rotation1 = rand_rotation_matrix()
rotation2 = rand_rotation_matrix()
print(Quaternion(rotation1.dot(rotation2.T)))
根据文档中的 Object Initialisation 部分(向下滚动方式),要从旋转矩阵进行初始化,您必须使用 matrix=
关键字参数,例如Quaternion(matrix=R)
.
使用 pyquaternion module 我想获得 3x3 旋转矩阵的四元数表示。执行时,它 returns ValueError: Unexpected number of elements in sequence. Got: 3, Expected: 4.
。根据文档,用 3x3 矩阵实例化四元数应该可行,或者我可能误解了一些东西。
为了测试这个,我发现这个 method 用于随机旋转矩阵生成。如上所述,我只收到此错误消息。
import numpy as np
from pyquaternion import Quaternion
def rand_rotation_matrix(deflection=1.0, randnums=None):
"""
Creates a random rotation matrix.
deflection: the magnitude of the rotation. For 0, no rotation; for 1, competely random
rotation. Small deflection => small perturbation.
randnums: 3 random numbers in the range [0, 1]. If `None`, they will be auto-generated.
"""
# from http://www.realtimerendering.com/resources/GraphicsGems/gemsiii/rand_rotation.c
if randnums is None:
randnums = np.random.uniform(size=(3,))
theta, phi, z = randnums
theta = theta * 2.0*deflection*np.pi # Rotation about the pole (Z).
phi = phi * 2.0*np.pi # For direction of pole deflection.
z = z * 2.0*deflection # For magnitude of pole deflection.
# Compute a vector V used for distributing points over the sphere
# via the reflection I - V Transpose(V). This formulation of V
# will guarantee that if x[1] and x[2] are uniformly distributed,
# the reflected points will be uniform on the sphere. Note that V
# has length sqrt(2) to eliminate the 2 in the Householder matrix.
r = np.sqrt(z)
Vx, Vy, Vz = V = (
np.sin(phi) * r,
np.cos(phi) * r,
np.sqrt(2.0 - z)
)
st = np.sin(theta)
ct = np.cos(theta)
R = np.array(((ct, st, 0), (-st, ct, 0), (0, 0, 1)))
# Construct the rotation matrix ( V Transpose(V) - I ) R.
M = (np.outer(V, V) - np.eye(3)).dot(R)
return M
rotation1 = rand_rotation_matrix()
rotation2 = rand_rotation_matrix()
print(Quaternion(rotation1.dot(rotation2.T)))
根据文档中的 Object Initialisation 部分(向下滚动方式),要从旋转矩阵进行初始化,您必须使用 matrix=
关键字参数,例如Quaternion(matrix=R)
.