出現乙個尤拉角對應多個旋轉矩陣的問題

2021-10-01 23:49:54 字數 1927 閱讀 4321

這是我實際中遇到的乙個問題,暫時考慮是萬向鎖問題:

假如給定矩陣

test_r = np.array([(

-0.8480481

,0.52991926,0

),(0.52991926

,0.8480481,0

),(0

,0,1

)])

我們如果用下面的尤拉角轉旋轉矩陣和旋轉矩陣轉尤拉角的python例程,會發現這個矩陣轉換回尤拉角,然後就轉不回來了…

def

euler_angles_to_rotation_matrix

(theta)

: r_x = np.array([[

1,0,

0],[

0, math.cos(theta[0]

),-math.sin(theta[0]

)],[

0, math.sin(theta[0]

), math.cos(theta[0]

)]])

r_y = np.array(

[[math.cos(theta[1]

),0, math.sin(theta[1]

)],[

0,1,

0],[

-math.sin(theta[1]

),0, math.cos(theta[1]

)]])

r_z = np.array(

[[math.cos(theta[2]

),-math.sin(theta[2]

),0]

,[math.sin(theta[2]

), math.cos(theta[2]

),0]

,[0,

0,1]

])r = np.dot(r_z, np.dot( r_y, r_x )

)return r

def

is_rotation_matrix

(r):

rt = np.transpose(r)

shouldbeidentity = np.dot(rt, r)

i = np.identity(

3, dtype = r.dtype)

n = np.linalg.norm(i - shouldbeidentity)

return n <1e-

6def

rotation_matrix_to_euler_angles

(r):

assert

(is_rotation_matrix(r)

) sy = math.sqrt(r[0,

0]* r[0,

0]+ r[1,

0]* r[1,

0]) singular = sy <1e-

6ifnot singular:

x = math.atan2(r[2,

1], r[2,

2]) y = math.atan2(

-r[2,0

], sy)

z = math.atan2(r[1,

0], r[0,

0])else

: x = math.atan2(

-r[1,2

], r[1,

1]) y = math.atan2(

-r[2,0

], sy)

z =0 r = x

p = y

y = z

return

[r, p, y]

找了很久,發現可用用四元數來代替尤拉角可以解決此問題,猜測是出現萬向鎖的問題。

python的話這裡推薦使用transforms3d庫

乙個ViewController對應多個Xib

比例係數開發的大概步驟 1.選著乙個尺寸作為開發設計的基準 2.制定其他螢幕的適配規則 3.特殊的適配給出具體的效果圖 例如攜程的比例係數 5 autosizescalex 1 autosizescaley 1 6 autosizescalex 1.171875 autosizescaley 1.1...

乙個Key對應多個Value

map 乙個key對應乙個value,它可以滿足大部分需求。但有時我要用到乙個key對應多個value怎麼辦?1.普通做法 map map new hashmap 2.apache commons工具包裡有個org.apache.commons.collections.map.multivaluem...

關於乙個Action對應多個Form

由於乙個action可以用多個path來訪問,所以我們可以通過在struts config.xml中配置一下action來達到乙個action來對應多個form。下面是乙個action對應多個form的 struts config.xml的配置 type com.mac.struts.form.in...