作者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/cn.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