【问题标题】:numpy huge error in rotational coordinate transformation旋转坐标变换中的numpy巨大错误
【发布时间】:2015-03-20 12:03:56
【问题描述】:

我想通过旋转在欧几里得空间中进行坐标变换。我想通过找到将当前 z 轴与给定输入向量对齐的矩阵来做到这一点。目前这些旋转并不能提供令人满意的输出。

import numpy as np

vec_in = np.array([1*np.tan(np.pi/180*45), 1*np.tan(np.pi/180*45), 1]) 
vec_in /= np.linalg.norm(vec_in) #normalize, so we can use np.dot as scalar product
print vec_in

#find angles between vec_in and our x and y axis
#avoid inverse trigonometric functions, thereby increase accuracy
cosx = np.dot(vec_in, np.array([1,0,0]))
sinx = np.sqrt(1-cosx**2) 
cosy = np.dot(vec_in, np.array([0,1,0]))
siny = np.sqrt(1-cosy**2)

#turn around z to bring x fraction to zero
Rz = np.array([[cosx,-sinx,0], [sinx,cosx,0], [0,0,1]])
Rzi = np.linalg.inv(Rz)
print 'accuracy Rz\n', np.dot(Rz, Rzi)

#turn around y to align z to vector
Ry = np.array([[cosy,0,siny], [0,1,0], [-siny,0,cosy]])
Ryi = np.linalg.inv(Ry)
print 'accuracy Ry\n', np.dot(Ry, Ryi)

print np.dot(Ryi, np.dot(Rzi, vec_in)), '\tshould be [1,0,0]'
print np.dot(Rz, np.dot(Ry ,[0,0,1])), '\tshould be', vec_in

输出是:

[ 0.57735027  0.57735027  0.57735027]
accuracy Rz
[[  1.00000000e+00   5.55111512e-17   0.00000000e+00]
 [  0.00000000e+00   1.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00]]
accuracy Ry
[[  1.00000000e+00   0.00000000e+00  -7.70426082e-17]
 [  0.00000000e+00   1.00000000e+00   0.00000000e+00]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00]]
[-0.0067889  -0.13807119  0.99039904]   should be [1,0,0]
[ 0.47140452  0.66666667  0.57735027]   should be [ 0.57735027  0.57735027  0.57735027]

np.dot(Rx,Rxi) 我现在得出结论,逆矩阵工作得很好;只是实际结果与我所期望的完全不同。为什么?我怎样才能得到我想要的?

【问题讨论】:

    标签: python numpy matrix coordinate-transformation


    【解决方案1】:

    您必须首先围绕 y 轴旋转矢量,使其位于 xy 平面上,我称之为 v1。如果没有标准化,v1 应该是 [sqrt(2), 1, 0]。 (占cosy,siny

    然后旋转 v1 使其也位于 xz 平面上。所以它在 x 轴上。

    import numpy as np
    
    vec_in = np.array([1*np.tan(np.pi/180*45), 1*np.tan(np.pi/180*45), 1]) 
    vec_in /= np.linalg.norm(vec_in) #normalize, so we can use np.dot as scalar product
    print vec_in
    
    #find angles between vec_in and our x and y axis
    #avoid inverse trigonometric functions, thereby increase accuracy
    
    cosy = vec_in[0]/np.sqrt((vec_in[2]**2+vec_in[0]**2)) 
    siny = np.sqrt(1-cosy**2)
    
    #turn around y to align z to vector
    Ry = np.array([[cosy,0,siny], [0,1,0], [-siny,0,cosy]])
    Ryi = np.linalg.inv(Ry)
    print 'accuracy Ry\n', np.dot(Ry, Ryi)
    
    v1 = Ry.dot(vec_in) #z = 0
    cosx = v1[0]/np.sqrt((v1[1]**2+v1[0]**2)) 
    sinx = np.sqrt(1-cosx**2)
    
    #turn around z to bring x fraction to zero
    Rz = np.array([[cosx,-sinx,0], [sinx,cosx,0], [0,0,1]])
    Rzi = np.linalg.inv(Rz)
    print 'accuracy Rz\n', np.dot(Rz, Rzi)
    
    
    print np.dot(Rzi, np.dot(Ry, vec_in)), '\tshould be [1,0,0]'
    

    【讨论】:

    • 您的代码产生了正确的解决方案。尽管您进行了描述,但您仍然使用围绕 z 和 y 的旋转,在这种情况下,这对于给定的示例向量并不重要。我打算绕其他轴和命令,基本上遵循相同的想法。不同之处在于角度cosxsinx - 给定任意vec_in,您将如何计算它们?
    • 嗨,我修改了一般情况下的代码。刚刚手动测试了一些随机的vec_in
    • 这行得通。我显然计算了错误的角度。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多