Creating uniform random quaternion and multiplication of two quaternions

ぐ巨炮叔叔 提交于 2019-12-20 04:25:25

问题


I have a python (NumPy) function which creates a uniform random quaternion. I would like to get two quaternion multiplication as 2-dimensional returned array from the same or an another function. The formula of quaternion multiplication in my recent case is Q1*Q2 and Q2*Q1. Here, Q1=(w0, x0, y0, z0) and Q2=(w1, x1, y1, z1) are two quaternions. The expected two quaternion multiplication output (as 2-d returned array) should be

return([-x1*x0 - y1*y0 - z1*z0 + w1*w0, x1*w0 + y1*z0 - z1*y0 +
    w1*x0, -x1*z0 + y1*w0 + z1*x0 + w1*y0, x1*y0 - y1*x0 + z1*w0 +
    w1*z0])

Can anyone help me please? My codes are here:

def randQ(N):
    #Generates a uniform random quaternion
    #James J. Kuffner 2004 
    #A random array 3xN
    s = random.rand(3,N)
    sigma1 = sqrt(1.0 - s[0])
    sigma2 = sqrt(s[0])
    theta1 = 2*pi*s[1]
    theta2 = 2*pi*s[2]
    w = cos(theta2)*sigma2
    x = sin(theta1)*sigma1
    y = cos(theta1)*sigma1
    z = sin(theta2)*sigma2
    return array([w, x, y, z])

回答1:


A simple rendition of your request would be:

In [70]: def multQ(Q1,Q2):
    ...:     w0,x0,y0,z0 = Q1   # unpack
    ...:     w1,x1,y1,z1 = Q2
    ...:     return([-x1*x0 - y1*y0 - z1*z0 + w1*w0, x1*w0 + y1*z0 - z1*y0 +
    ...:     w1*x0, -x1*z0 + y1*w0 + z1*x0 + w1*y0, x1*y0 - y1*x0 + z1*w0 +
    ...:     w1*z0])
    ...:     

In [72]: multQ(randQ(1),randQ(2))
Out[72]: 
[array([-0.37695449,  0.79178506]),
 array([-0.38447116,  0.22030199]),
 array([ 0.44019022,  0.56496059]),
 array([ 0.71855397,  0.07323243])]

The result is a list of 4 arrays. Just wrap it in np.array() to get a 2d array:

In [73]: M=np.array(_)

In [74]: M
Out[74]: 
array([[-0.37695449,  0.79178506],
       [-0.38447116,  0.22030199],
       [ 0.44019022,  0.56496059],
       [ 0.71855397,  0.07323243]])

I haven't tried to understand or clean up your description - just rendering it as working code.




回答2:


A 2-Dimensional Array is an array like this: foo[0][1]

You don't need to do that. Multiplying two quaternions yields one single quaternion. I don't see why you would need a two-dimensional array, or how you would even use one.

Just have a function that takes two arrays as arguments:

def multQuat(q1, q2):

then return the relevant array.

return array([-q2[1] * q1[1], ...])


来源:https://stackoverflow.com/questions/38978441/creating-uniform-random-quaternion-and-multiplication-of-two-quaternions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!