作者magic83v (R7)
看板Math
標題[其他] 請教歐拉角計算公式/有向角
時間Sat Jul 25 20:16:11 2020
參考維基的公式
(
https://zh.m.wikipedia.org/zh-tw/欧拉角)
有參考座標系xyz已經相對座標系XYZ
想照公式得到alpha beta gamma
有兩個問題:
為何beta角:z軸與Z軸夾角範圍是0~pi
跟空間中計算有向角的公式
a,b 夾角範圍0~2pi
感謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.12.65.110 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Math/M.1595679373.A.94C.html
1F:推 hwanger : a,b間夾角T是用內積算 T= cos^{-1}(<a,b>) 其中<a,b07/26 14:40
2F:→ hwanger : >是用內積 座標用舊的即可07/26 14:40
3F:推 hwanger : beta角只需要0到pi是因為pi到2pi的部份是多餘的 可07/26 14:44
4F:→ hwanger : 以透過旋轉不同的alpha和gamma達到相同的結果07/26 14:44
5F:推 hwanger : 另外你問a,b之間的"有向角" 這個問題必須在 "對於a,07/26 15:10
6F:→ hwanger : b所展開的子空間中 有給定一個「有序基底」" 的前07/26 15:10
7F:→ hwanger : 提下才有意義07/26 15:10
8F:推 hwanger : 如果你的方向就是a轉到b 那用gram-schmidt可以找到07/26 15:16
9F:→ hwanger : 一組同方向的正交基 e1 e2 將a b的座標用e1 e2表示07/26 15:16
10F:→ hwanger : 就可以用平面的方法求有向角07/26 15:16
感謝大大 我後來有發現是我需要任意ab平面的有序基底
可以定出n(法向量) 但得到的不會是有序的第三個基底
我只有參考座標系xyz 跟目標座標系XYZ
是能得到有序基底的嗎?
※ 編輯: magic83v (101.12.65.110 臺灣), 07/26/2020 18:25:40
11F:推 hwanger : 我不太清楚你的想法 不過我猜下列可能解答你的問題07/26 18:54
12F:→ hwanger : 對三維空間中的一平面及選定的一個法向量 在保持右07/26 18:54
13F:→ hwanger : 手定則的情況下 平面上的方向是唯一的07/26 18:54
14F:推 hwanger : 也就是說 為了配合你選的法向量 你子空間的有序基07/26 19:02
15F:→ hwanger : 不再能亂選07/26 19:02
16F:推 hwanger : 現在假設在三維空間下已經給定一組基底e1,e2,e3 現07/26 19:41
17F:→ hwanger : 在給一個平面L及一個法向量n(假設為單位向量) 07/26 19:41
18F:→ hwanger : 那你可以用高斯消去法去確定n,e1,e2,e3的相依性 並 07/26 19:41
19F:→ hwanger : 決定一組basis{n,ei,ej} 07/26 19:41
20F:→ hwanger : 用gram-schmidt得到一組正交基 n, f1,f2 07/26 19:41
21F:→ hwanger : 如果det[n,f1,f2]>0 則f1,f2就是平面的有序基 如果 07/26 19:41
22F:→ hwanger : 小於0 則有序基是f2,f1 07/26 19:41
23F:推 hwanger : 以上的算法一定不是最快的 但是直觀性最強的 07/26 19:44
了解 正在往這方向思考
似乎有找到有序基底和我要的n
不過還在驗證正確性
還有一個問題是我按照wiki的zxz轉動得到的歐拉角
歐拉角的逆運會是唯一嗎
(x,y,z) (X,Y,Z) 得到(a,b,r) (表歐拉角)
我再用x,y,z也都能得到一樣的(X,Y,Z)嗎
真的是感謝h大!
前面講的是假設我有有序基底
如果沒有的話還有什麼做法嗎?
(如wiki的圖
https://i.imgur.com/0Qf1UUR.jpg
這個交點線的方向 只用z,Z 外積得到的話
方向也是取決於角度
但是我只有zZ兩軸 也定不出有序基底的樣子
※ 編輯: magic83v (101.12.65.110 臺灣), 07/26/2020 20:17:55
24F:推 hwanger : 歐拉角的逆運會是唯一嗎>>>我不太懂這段的意思 07/26 20:28
我以xyz參考座標系 和 XYZ相對座標系 得到的歐拉角
(這裡先當作xyz=e1,e2,e3 )
照歐拉角得到的旋轉矩陣R
一定能得到 [XYZ] = R [e1,e2,e3]嗎
※ 編輯: magic83v (101.12.65.110 臺灣), 07/26/2020 20:37:53
25F:推 hwanger : "這個交點線的方向 只用z,Z 外積得到的話 方向也是07/26 20:36
26F:→ hwanger : 取決於角度">>>你算的方向不會取決於角度 注意beta07/26 20:36
27F:→ hwanger : 介於0到pi之間07/26 20:36
28F:→ hwanger : zxZ的方向是從z出發 經由zZ之間小於pi的角 再到Z07/26 20:36
29F:→ hwanger : 用右手四指表示旋的方向 大姆指指向外積結果的方向07/26 20:36
30F:推 hwanger : "前面講的是假設我有有序基底07/26 20:43
31F:→ hwanger : 如果沒有的話還有什麼做法嗎?">>>這邊我其實一直07/26 20:43
32F:→ hwanger : 都不太懂為什麼要特地討論有向角 算歐拉角其實不用07/26 20:43
33F:→ hwanger : 考慮這些東西07/26 20:43
囧 還麻煩指正這部分的觀念
我是照著wiki給的zxz旋轉範圍
alpha gamma要介於0~2pi
若沒考慮(俯視)方向計算夾角的話
只會得到0~pi的範圍
(我是用程式下去跑 驗證範圍)
34F:推 hwanger : "一定能得到 [XYZ] = R [e1,e2,e3]嗎" >>>對 更嚴07/26 20:53
35F:→ hwanger : 謹的說 一個向量v在xyz下的座標是(a,b,c) 在XYZ下07/26 20:54
36F:→ hwanger : 的座標是(A,B,C) 則 (A,B,C)^t= [R] (a,b,c)^t07/26 20:54
37F:推 hwanger : 其實不會太難看出來 R其實就是連續作用三次平面旋07/26 20:59
38F:→ hwanger : 轉 每次都把舊座標換成新的中途點座標07/26 20:59
39F:推 hwanger : 例如x軸在你只轉z軸alpha時 其座標變成(cos alpha, 07/26 21:03
40F:→ hwanger : -sin alpha, 0)07/26 21:03
我計算歐拉角的觀念是
已經有的是參考軸xyz 目標軸XYZ
1. 先用z,Z cross 得到N(交點線)
2. 再繞正z旋轉 x軸轉到N 得alpha
繞
3. 再繞正N旋轉 z軸到Z 得beta
4. 繞正Z旋轉 N軸到X 得gamma
(我是看維基上那張範例圖算的
要方向角是因為 我是先定義俯視軸看旋轉角度的
回推的部分就直接combine旋轉矩陣R
R*[e1,e2,e3]T = [e1’,e2’,e3’]T
即得XYZ基底 但是問題是反推回去 並不是得到原本的XYZ基底
推測是出在前面的2. 使用沒定義有序方向z,Z得到的N 出問題
觀念上哪裡有不對嗎?
謝謝QQ
※ 編輯: magic83v (101.12.65.110 臺灣), 07/26/2020 21:27:25
41F:→ hwanger : Ok 是我沒有想清楚 算x和N的角度 及 N和X的角度時 07/26 21:28
42F:→ hwanger : 的確需要有向角的觀念07/26 21:29
43F:推 hwanger : "我計算歐拉角的觀念是" >>>這段是對的 不過beta其07/26 21:35
44F:→ hwanger : 實就用zZ夾角就可以了07/26 21:36
45F:→ hwanger : "並不是得到原本的XYZ基底">>> 這段我不懂07/26 21:38
好像發現問題是出在這裡
這邊是指我下面說的
我的XYZ基底的意思 就是XYZ軸的單位方向
想要[e1,e2,e3] 經過R之後得到XYZ軸的單位方向
46F:→ hwanger : [R]是用來轉換任一個向量的舊座標和新座標用的07/26 21:41
47F:→ hwanger : 比如說 一個向量v在舊座標下是(1,0,0) 則新座標就是07/26 21:43
48F:→ hwanger : (cos a cos r - cos b sin a sin r, -cos a sin r -07/26 21:45
49F:→ hwanger : cos b sin a cos r, sin b sin a)07/26 21:46
50F:→ hwanger : 跟高中時的平面旋轉的座標轉換一樣07/26 21:47
51F:推 hwanger : 另外 你所謂的"俯視軸" 其實就是之前我說的選定的07/26 21:58
52F:→ hwanger : 法向量07/26 21:58
53F:推 hwanger : 而 N 就是 z cross Z這點是沒有問題的07/26 22:02
目前是這樣計算N
還在想怎麼驗證 感謝!
54F:推 hwanger : 下面這篇文章可能幫助理解 [R]07/26 22:16
55F:→ hwanger : shorturl.at/bdHR707/26 22:17
57F:→ hwanger : [R]就是座標變換矩陣07/26 22:20
58F:推 hwanger : 更正 [R]就是"基底變換矩陣"07/26 22:22
謝謝大大我再認真看一次這篇!xd
還有個問題是 大部分像我舉例計算到歐拉角的方式(wiki上寫靜態歐拉角)
我得到的alpha beta gamma
並非繞x y’ z”這樣轉的順序
(求得的beta是繞N旋轉 即zZ法向量
等於我上面寫的 “順推跟回推”的”角”並不一樣
這問題有辦法解決嗎?
※ 編輯: magic83v (36.224.121.158 臺灣), 07/26/2020 22:51:54
59F:推 hwanger : "想要[e1,e2,e3] 經過R之後得到XYZ軸的單位方向">>> 07/26 23:52
60F:→ hwanger : 如果你的[e1,e2,e3]是個3x3矩陣 那就有些問題 07/26 23:52
61F:→ hwanger : 實際上 如果你把XYZ用相對於xyz的座標表示 則[ X,Y,07/26 23:52
62F:→ hwanger : Z]=R^{-1}07/26 23:52
63F:推 hwanger : "並非繞x y’ z”這樣轉的順序">>>歐拉角是z x' z'' 07/26 23:55
64F:→ hwanger : 這樣轉 其中N就是x' 07/26 23:55
65F:推 hwanger : 「等於我上面寫的 “順推跟回推”的”角”並不一樣 07/27 00:05
66F:→ hwanger : 」>>>我還是不太懂這段 07/27 00:05
67F:→ hwanger : 如果相對xyz, 我們寫出X=(Xx, Xy, Xz)^t ;Y=(Yx, Yy 07/27 00:05
68F:→ hwanger : , Yz)^t; Z=(Zx, Zy, Zz)^t, 則R^{-1}這個矩陣 就是07/27 00:05
69F:→ hwanger : [X,Y,Z]07/27 00:05
70F:推 hwanger : 如果e1=(1,0,0) e2=(0,1,0) e3=(0,0,1) 則R^{-1}[e107/27 00:12
71F:→ hwanger : ,e2,e3] =[X,Y,Z]07/27 00:12
72F:→ magic83v : 感謝大大 我是照這邏輯思考 在程式計算不清楚哪裡出07/28 22:40
73F:→ magic83v : 問題QQ 我手算一次看是哪裡錯再請教你07/28 22:40
74F:推 hwanger : 沒有看到你的程式碼 很難判斷到底哪裡出了問題 不過07/28 23:05
75F:→ hwanger : 你可以先試試簡單的case 譬如beta=0的狀況 去debug07/28 23:05
https://paste.ofcode.org/bjpHEfEY6MDPnEbdzbF86C
這是我寫的function
遇到的問題是正負號有不對
https://i.imgur.com/ISMCFMV.jpg
還不知道是哪個方向定錯之類 囧
感謝h大qq
※ 編輯: magic83v (36.224.120.33 臺灣), 07/29/2020 13:18:14
77F:→ hwanger : 這是我修改後的代碼 主要修改了theta3d(a,b,n)這個 07/29 16:51
78F:→ hwanger : 函數 因為我看不懂你原來的邏輯 所以我就用我之前說 07/29 16:52
79F:→ hwanger : 的邏輯重寫 另外我修改了euler_reverse的typo 07/29 16:53
81F:→ hwanger : 上面這個是我重新理解你的邏輯後做修改的 你原本的 07/29 18:49
82F:→ hwanger : 問題主要是發生在你不管arctan2產出什麼 都加了Pi 07/29 18:50
83F:推 hwanger : 你應該是介於0到pi的不動 介於-pi到0的平移2pi才對 07/29 18:53
84F:推 hwanger : 如果你接受alpha和gamma的值可以在-pi到pi之間的話 07/29 20:26
85F:→ hwanger : 那theta3d可以直接傳回np.arctan2(det, dot) 07/29 20:27
86F:推 hwanger : 順帶一提 euler這個函數並沒有處理大N為0的情況 或 07/29 20:30
87F:→ hwanger : 設定大N接近0的敏感度 如果這個程式只是練手的話 就 07/29 20:31
88F:→ hwanger : 不需要特別管他 07/29 20:32
感謝h大!沒想到問題是出在-pi~pi的範圍
現在想起來早該發現 囧
是還打算用來處理一些方向偵測的問題
想再請教如果大N夾角接近0或太小該怎麼處理?
視為xy平面上旋轉嗎
※ 編輯: magic83v (101.10.9.236 臺灣), 07/29/2020 20:49:45
89F:推 hwanger : 最簡單的方法 就是如果大N的長度夠小時(比如小10的 07/29 21:01
90F:→ hwanger : -6或-7 或在高精度下-14之類的) 就讓beta為0或pi 07/29 21:04
91F:→ hwanger : 並讓gamma為0 只算alpha就可以了 07/29 21:05
92F:→ hwanger : 但應該視你之後應用數據的東西的特性再做更詳細的判 07/29 21:08
93F:→ hwanger : 別方法 07/29 21:08
94F:推 hwanger : 如果照上面最簡單的想法 那就是 07/29 21:13
95F:→ hwanger : alpha = theta3d(x_axis, X_axis, z_axis) 07/29 21:14
96F:→ hwanger : beta = 0 if Z_axis[2] > 0 else np.pi 07/29 21:17
97F:→ hwanger : gamma = 0 07/29 21:18
98F:推 hwanger : 更進階的方法就是用微積分的線性逼近對不同的情況作 07/30 11:51
99F:→ hwanger : 處理 可以參照下列兩個分析的精神 07/30 11:53
102F:推 hwanger : 依照英文wiki解歐拉角的思路 解alpha, beta, gamma 08/01 09:41
103F:→ hwanger : 的確不需要特別去處理三維空間的有向角 08/01 09:41
104F:→ hwanger : 如果我們讓X=(X0,X1,X2),Y=(Y0,Y1,Y2),Z=(Z0,Z1,Z3) 08/01 09:42
105F:→ hwanger : 則 X2=sin(b)sin(r), Y2=sin(b)cos(r) 08/01 09:43
106F:→ hwanger : Z0=sin(b)cos(a), Z1=-sin(b)cos(a), Z2=cos(b) 08/01 09:43
107F:推 hwanger : 依此邏輯我重寫了程式碼 08/01 09:46