接上篇《旋转矩阵的作用:世界坐标变换;求解局部坐标系下的局部坐标》,理解欧拉角:内旋;外旋;万向节死锁
1、什么是欧拉角、静态欧拉角、动态欧拉角
用一句话说,欧拉角就是物体绕坐标系三个坐标轴(x,y,z轴)的旋转角度。
在这里,坐标系可以是世界坐标系,也可以是物体坐标系,旋转顺序也是任意的,可以是xyz,xzy,yxz,zxy,yzx,zyx中的任何一种,甚至可以是xyx,xyy,xzz,zxz等等等等。。。。。。
这里的物体坐标系也可以称之为模型坐标系、局部坐标系
所以说欧拉角多种多样。欧拉角可分为两种情况:
1)静态欧拉角:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态欧拉角。
2)动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态欧拉角。
(版权声明:本文为CSDN博主「caimouse」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/caimouse/article/details/55259669)
2、内旋、外旋及计算方式
1)外旋:以静态欧拉角进行旋转称之为外旋
计算方式:
比如世界一点P,沿着X-Y-Z顺序,旋转角度为θ,按照外旋方式,求旋转后P’点新的世界坐标,那么就有:
假设世界坐标系为E,则:
P
w
o
r
l
d
E
′
P'_{worldE}
PworldE′=
R
z
(
θ
)
R_z(θ)
Rz(θ)x
R
y
(
θ
)
R_y(θ)
Ry(θ)x
R
x
(
θ
)
R_x(θ)
Rx(θ)x
P
w
o
r
l
d
E
P_{worldE}
PworldE
2)内旋:以动态欧拉角进行旋转称之为内旋
计算方式:
首先给出一个结论:内旋和外旋,旋转方向和角度相同,旋转顺序相反的情况下,内旋和外旋结果相同,以下是证明:
计算世界一点P,沿着Z-Y-X顺序,旋转角度为θ,按照内旋方式,求旋转后P’点的新的世界坐标。
思路是:利用物体内旋后的物体坐标系下的坐标反向计算其世界坐标即可证明上述结论。
a、首先我们明确一点,无论怎么旋转,按着哪个坐标系的哪个轴来旋转,物体在物体坐标系下的坐标不会发生变化;
b、假设初始状态下物体坐标系(同时也是世界坐标系,即初始状态下物体坐标系和世界坐标系重合)为E,坐标系E沿E的Z轴旋转后的物体坐标系为F,坐标系F沿着F的Y轴旋转的物体坐标系为G,坐标系G沿着G的X轴旋转的物体坐标系为H,以上每次旋转都是按照物体坐标系进行旋转,即内旋;
c、P’点在H坐标系下的与P点的世界坐标(即P点在初始物体坐标系下的坐标相同,因为a),即
P
p
a
r
t
H
′
P'_{partH}
PpartH′=
P
w
o
r
l
d
E
,
P_{worldE},
PworldE,那么根据《旋转矩阵的作用:世界坐标变换;求解局部坐标系下的局部坐标》中的结论有:
P
p
a
r
t
H
′
P'_{partH}
PpartH′=
R
x
−
1
(
θ
)
R_x^{-1}(θ)
Rx−1(θ)x
P
p
a
r
t
G
′
P'_{partG}
PpartG′,其中
P
p
a
r
t
H
′
P'_{partH}
PpartH′是P’点在H坐标系下的坐标,
P
p
a
r
t
G
′
P'_{partG}
PpartG′是P‘点在G坐标系下的坐标;
则有:
P
p
a
r
t
G
′
P'_{partG}
PpartG′=
R
x
(
θ
)
R_x(θ)
Rx(θ)x
P
p
a
r
t
H
′
P'_{partH}
PpartH′ (1)
同理,P’点在F坐标系下的坐标表示为:
P
p
a
r
t
G
′
P'_{partG}
PpartG′=
R
y
−
1
(
θ
)
R_y^{-1}(θ)
Ry−1(θ)x
P
p
a
r
t
F
′
P'_{partF}
PpartF′
P
p
a
r
t
F
′
P'_{partF}
PpartF′=
R
y
(
θ
)
R_y(θ)
Ry(θ)x
P
p
a
r
t
G
′
P'_{partG}
PpartG′ 把(1)带入有
P
p
a
r
t
F
′
P'_{partF}
PpartF′=
R
y
(
θ
)
R_y(θ)
Ry(θ)x
R
x
(
θ
)
R_x(θ)
Rx(θ)x
P
p
a
r
t
H
′
P'_{partH}
PpartH′ (2),其中
P
p
a
r
t
F
′
P'_{partF}
PpartF′是P’点在F坐标系下的坐标;
同理,P’点在E坐标系下的坐标表示为
P
p
a
r
t
F
′
P'_{partF}
PpartF′=
R
z
−
1
(
θ
)
R_z^{-1}(θ)
Rz−1(θ)x
P
p
a
r
t
E
′
P'_{partE}
PpartE′
P
p
a
r
t
E
′
P'_{partE}
PpartE′=
R
z
(
θ
)
R_z(θ)
Rz(θ)x
P
p
a
r
t
F
′
P'_{partF}
PpartF′ 把(2)带入有
P
p
a
r
t
E
′
P'_{partE}
PpartE′=
R
z
(
θ
)
R_z(θ)
Rz(θ)x
R
y
(
θ
)
R_y(θ)
Ry(θ)x
R
x
(
θ
)
R_x(θ)
Rx(θ)x
P
p
a
r
t
H
′
P'_{partH}
PpartH′ (3)
其中
P
p
a
r
t
E
′
P'_{partE}
PpartE′是P’点在E坐标系下的坐标,这意味着
P
p
a
r
t
E
′
P'_{partE}
PpartE′和
P
w
o
r
l
d
E
′
P'_{worldE}
PworldE′是相等的,只是一个是P’在物体坐标系的表示方法,一个是在世界坐标系中的表示方法,但是此时物体坐标系=世界坐标系,因此
P
p
a
r
t
E
′
P'_{partE}
PpartE′和
P
w
o
r
l
d
E
′
P'_{worldE}
PworldE′是相等!
那么(3)式可以改写为:
P
w
o
r
l
d
E
′
P'_{worldE}
PworldE′=
R
z
(
θ
)
R_z(θ)
Rz(θ)x
R
y
(
θ
)
R_y(θ)
Ry(θ)x
R
x
(
θ
)
R_x(θ)
Rx(θ)x
P
p
a
r
t
H
′
P'_{partH}
PpartH′ (4)
而
P
p
a
r
t
H
′
P'_{partH}
PpartH′=
P
w
o
r
l
d
E
P_{worldE}
PworldE(上文中有提到),代入(4)式则有:
P
w
o
r
l
d
E
′
P'_{worldE}
PworldE′=
R
z
(
θ
)
R_z(θ)
Rz(θ)x
R
y
(
θ
)
R_y(θ)
Ry(θ)x
R
x
(
θ
)
R_x(θ)
Rx(θ)x
P
w
o
r
l
d
E
P_ {worldE}
PworldE
这个公式正好是上文按X-Y-Z顺序,按外旋旋转角度为θ的公式,由此证毕。(这里有点不严谨,无论内旋外旋,都应该按三个轴旋转不同的角度θ,γ,α,但是我懒得打字了,三个轴旋转角度都设置为θ了,但是结论肯定是一样的)。
3、万向节死锁及实际会产生什么问题
万向节死锁通常都被解释为失去了一个自由度,这样解释当然是没有问题的,但是个人觉得不便于理解,至少不便于我理解。
首先我们还是来给出定义:
无论是内旋还是外旋,都要经历三次旋转变换,每次旋转时所使用的旋转轴,对于外旋来说这三个旋转轴肯定是不同的(外旋是绕着世界坐标轴旋转,世界坐标轴是不变且三个轴不同的);但是内旋就不一定了,当三个旋转轴中出现相同的轴时,将这种情况称为万向节死锁。
示例:
(图片引用自https://blog.csdn.net/tiao_god/article/details/112534095)
当我们绕x轴旋转90°后,此时的物体坐标系的z轴和第一次的旋转轴重合,这时第三次旋转和第一次旋转的轴是相同的,也就是说想要得到上面的最终结果只需要旋转两个轴就够了,一共三个旋转轴,但是少了一个(有两个一样),这就是网上所说的失去了一个自由度(因为实际只有两个轴了,第三个轴没了)。
所以,判别是否发生了万向节死锁直接判断三次旋转的是否使用了三个不同的旋转轴;同理,避免万向节死锁发生的办法就是避免三次旋转所用的旋转轴发生重合即可。
到这里我们清楚了万向节死锁的概念,但是好像感觉也没什么大不了的,旋转轴重合就重合呗,按照如上要求的欧拉角进行内旋变换,就应该出现旋转轴重合的情况,没什么问题呀!那么死锁究竟会产生什么实际问题呢?
经过两天的寻找,我终于找到了死锁在实际应用中导致问题的案例,B站这个视频有案例的详细描述https://www.bilibili.com/video/BV1MZ4y1m7CT/?spm_id_from=333.337.search-card.all.click&vd_source=0f805e57bae4caccd39bef0a80028bec
下面是案例的图文版本:https://blog.51cto.com/u_15273495/2915377
我自己的理解:当发生万向节死锁时,意味着经历了一次欧拉旋转(按照不同的旋转轴顺序所进行三次旋转),这次旋转过程中经历了三次旋转,但是只有两个线性无关的旋转轴,这就意味着,如果是一个点经历了这次旋转过程,也就是说这个点围绕这两个线性无关的轴旋转,把所有旋转后的结果汇总的结果只能得到一个平面,不会超出这个平面。如果是三维物体,那么这个三维物体的所有顶点也是同理,但是我们的本意是在三维空间旋转,理论上我们的旋转结果可以在三维空间的任意平面上,而不是只能落在一个固定的平面上。这就是要避免死锁的原因,一句话:当发生万向节死锁时,所有的旋转结果并不能表示三维空间的任意位置,而是在某个平面内。