欧拉角
什么是欧拉角
欧拉角是一种描述物体姿态的方法
它是一种相对坐标,非常直观
想要定义一个旋转,对于欧拉角来说需要4个元素
首先是定义XYZ的顺序,一共有6种,这个是随意的,但是描述的双方需要遵守同一套顺序
之后是输出XYZ的旋转角度值(弧度)
姿态用欧拉角表示的结果并不是唯一的,即使指定好旋转顺序,也会出现多种欧拉角表示同一姿态的情况
而且欧拉角在表示姿态时有死点(万向死锁)
在进行运算时耗费的算力较大
欧拉角的坐标系
欧拉角的坐标系一般使用右手系(即使用右手从X轴正方向到Y轴正方向握拳,Z轴正方向是大拇指所指向的)
旋转的正方向也是右手系(按照X->Y->Z->X的顺序来判断)
即Z轴旋转正方向是另外两轴从X握向Y的方向
另外对于XYZ的三个轴的旋转有专用的名字
绕Z轴旋转,叫偏航角 yaw
绕Y轴旋转,叫俯仰角 pitch
绕X轴旋转,叫滚转角 roll
至于坐标系的指向是随意的,在不同的用途时多有不同
如下图
欧拉角的坐标系是在被描述姿态的物体上的,随着旋转而变化的
欧拉角的顺序
常规欧拉角的顺序有6种
分别是 X-Y-Z,X-Z-Y,Y-X-Z,Y-Z-X,Z-X-Y,Z-Y-X
就是XYZ的全排列
还有一种特殊的欧拉角,就是可以只用两个方向的旋转来描述(没研究过,等看看再补充)
常用的欧拉角顺序是Z-Y-X
欧拉角过程
首先明确一点
欧拉角是状态量,是描述当前状态的,而不是变化量
欧拉角永远是描述从初始状态(一般是上电时记为初始状态)到现在状态的
假设现在状态为状态1,那输出的欧拉角是指的通过3个顺序的旋转从初始状态变到状态1
如果物体的姿态发生了变化,变成了状态2,那输出的欧拉角是指的通过3个顺序的旋转从初始状态变到状态2,
而不是从状态1变化来的,这一点很重要
以欧拉角顺序是Z-Y-X为例介绍
步骤分为3步
- 绕物体的Z轴旋转,得到偏航角yaw;
- 绕旋转之后的Y轴旋转,得到俯仰角pitch;
- 绕旋转之后的X轴旋转,得到滚转角roll;
需要注意:
- 永远是从初始状态开始进行旋转
- 三个轴都是随着旋转而改变的(比如绕Z旋转之后(不考虑0°),XY轴就与初始状态的轴不一样了)
- 要按照规定的顺序进行
网上盗的演示图
以Z-Y-X顺序,按[X,Y,Z]=[15,30,45]为例子演示
首先是按Z(偏航角yaw)旋转45°
之后按旋转后的Y轴(这里没有标出来,网页的),Y轴(俯仰角pitch)旋转30°
最后按X轴(滚转角roll)旋转15°
万向死锁
欧拉角的问题
欧拉角很直观,但是他有个原理上无法解决的问题
万向死锁----当排在中间的旋转90°时,会出现一个自由度丢失(即没法移动到全部位置)
如Z-Y-X的旋转顺序,Y旋转90°时则会出现万向死锁
就像这样,Z和X均控制了同一个维度的运动
万向死锁成因
因为欧拉角的旋转轴是随着旋转的过程而变化的
还是以Z-Y-X顺序为例子
当Z轴旋转之后,Y轴的旋转会带动X轴发生变化,而因为Z的旋转是在Y之前(欧拉角都是从初始状态开始经过Z-Y-X顺序进行旋转)
所以Z的旋转轴无需跟随Y改变(反正在Y之前,改变之后也不会再绕Z旋转了,还改它干啥)
同样的,X的旋转也无需改变Z和Y的旋转轴
也就意味着,当Y轴旋转90°时,X轴已经被旋转到了与一开始Z轴(实际绕行的Z轴)重叠的位置
所以当这时改变X的数值,从效果上和改变Z是一样的,也就是发生了万向死锁
下面借着实物来演示一下
初始状态(图中的坐标系为当前坐标系,会随着欧拉角的旋转而旋转)
绕Z旋转一个角度
再绕Y旋转90°
可以发现,旋转后的X轴(即将旋转的轴)和原来的Z轴(初始状态的Z轴,已经按照这个轴旋转过了)共线了
那如果我们现在改变Z的角度会如何呢
改变一个Z的角度
注意,要从头开始进行旋转
再绕Y旋转90°
可以看出发生了万向死锁现象,导致了一个自由度的缺失
而且欧拉角再进行计算时较复杂,因此常使用四元数来表示旋转
而欧拉角较为直观,一般在人机交互界面使用欧拉角