home > theory > math >

三维旋转笔记:欧拉角/四元数/旋转矩阵/轴角-记忆点整理

author:zhoulujun    hits:

在看《欧拉角、旋转矩阵、四元数合辑 》,就之前所学做点笔记,以便以后再次复习。坐标系我们为了能够科学的反映物体的运动特性,会在特定

在看《欧拉角、旋转矩阵、四元数合辑 》,就之前所学做点笔记,以便以后再次复习。

先复习先基本概念

坐标系

我们为了能够科学的反映物体的运动特性,会在特定的坐标系中进行描述,经常要用到以下几种坐标系:

  1. 大地坐标系统

  2. 地心固定坐标系统

  3. 本地北东地坐标系统

  4. 机载北东地坐标系统

  5. 机体轴坐标系统

其中3、4、5都是我们建模、设计控制律时经常使用的坐标系,描述物体(刚体)位姿信息的6个自由度信息都是在这三个坐标系中产生的。

机体轴坐标系示意图

机体轴坐标系的原点固连于飞行器重心,X轴指向机头,Z轴指向机腹,X轴和Z轴都位于纵向对称面内,而Y轴指向机身右侧,与X、Z轴构成右手系,该坐标系我们用body的首字母b表示。

机载NED坐标系的原点也位于飞行器重心,其X轴指向椭球模型地理北极,Y轴指向椭球模型地理东方,Z轴沿椭球面法线向下,在绝大多数理解上都可以理解成通常的北向、东向、地向,通常该坐标系用n表示。

本地NED坐标系与机载NED坐标系唯一的不同就是原点坐标位于地面上任意一点,在分析物体的旋转运动时一般不会用到。

旋转关系

描述清楚姿态信息的方式有三种:欧拉角、旋转矩阵、四元数

欧拉角

欧拉角是欧拉引入用来描述刚体姿态的三个角。欧拉角有静态和动态两种,静态的是绕静止的惯性坐标系三个轴进行旋转,而动态的在旋转过程中旋转坐标轴会发生变化,除了第一次旋转是绕惯性系的坐标轴进行之外,后续两次旋转都是动态的,并且前面旋转的角度对后面的旋转轴是有影响的,按照不同的轴顺序进行旋转得到的欧拉角也是不同的,旋转变换可以归结为若干个沿着坐标轴旋转的组合,组合个数不超过三个并且两个相邻的旋转必须沿着不同坐标轴,总共有12种旋转方式,分别是XYZ、XZY、XYX、XZX、YXZ、YZX、YXY、YZY、ZXY、ZYX、ZXZ、ZYZ。虽然存在12种旋转方式,但是每一种旋转方式都存在万向锁现象。

航空领域通常采用的旋转方式是ZYX顺序,下图是一架飞机按照ZYX组合进行旋转产生欧拉角的过程,其中,ψ为偏航角,θ为俯仰角,φ为滚转角。

航空领域通常采用的旋转方式是ZYX顺序

旋转矩阵

旋转矩阵反映了一个坐标系中的坐标在另一个坐标系中表示的转换关系。矩阵的乘法,本质是一种运动—矩阵的实质就是将坐标整体线性变换——矢量的前移相当于坐标系的后移。这里推荐阅读《透析矩阵,由浅入深娓娓道来—高数-线性代数-矩阵

关于平面向量的逆时针旋转: 

已知任意一个向量OA=(x,y),把向量OA绕其起点O沿逆时针方向旋转α角得到向量OB=(xcosα-ysinα,xsiaα+ycosα)。推导如下:

20170928205627767154890.png20170928205627856595825.png

旋转矩阵公式机载NED坐标系到机体轴坐标系的欧拉转换矩阵是
欧拉ZYX(ψ为偏航角,θ为俯仰角,φ为滚转角,{B}是绕着{B}的轴旋转的)变换拆解。只要θ≠±90°,欧拉角可以描述清楚任何刚体的姿态以及角运动信息

三维笛卡尔直角坐标系欧拉旋转俯仰角为±90°公式

若使用X-Y-Z固定角法对姿态进行描述,首先将坐标系{B}和一个已知参考坐标系{A}重合。先将{B}绕XA旋转γ角,再绕YA旋转ψ角,最后绕ZA旋转θ角。({B}是绕着{A}的轴旋转的)

[公式]

这两种方法得到的最终旋转矩阵一致,即有对偶关系,记这样得到的旋转矩阵为:[r11,r21,r31;r12,r22,r32,r13,r23,r33]

[公式]=>[公式] 

其中atan2(y,x)表示在计算arctan(y/x)时,根据x和y的符号判别角度所在象限。注意当ψ=90°时 ,θ=0º,Ψ=90º,γ=atan2(r12,r22)

四元数

四元数是由爱尔兰数学家Hamilton发明的。四元数是由1个实数加上3个复数组合而成,通常可以表示成w+xi+yj+zk或者(w,(x,y,z)),其中w、x、y、z都是实数,而i^2 = j^2 =k^2 = -1, i^0 = j^0 = k^0 = 1。那复数与四元数之间的关系、以及如何从复数这样一个概念扩展到四元数呢?

空间中的子空间:一般而言,空间(维度>2)都存在更低维的子空间,比如二维空间中一维子空间,也就是直线;三维空间中的一维子空间和二维子空间,也就是直线和面。当超过三维的概念我们就很难去想象是什么样子,但四维空间一定会存在三维子空间或二维子空间。我们这里会加一个前缀超(hyper)来形容这些空间,比如高维空间中的平面我们称为超平面。

空间和子空间的映射:我们将二维空间表示为(x,y),当y=0时,其实可以看成是一维的,只不过它表示成(x,0)这种形式。推到四维,(w,x,y,z),当w=0时,(0,x,y,z)就是一个三维子空间,这也是为什么我们可以用单位四元数对三维向量进行操作,其实我们是将三维向量映射到四维的三维子空间(w=0,这种形式也成纯四元数),然后对其进行旋转,最终得到的向量结果依然是这个三维子空间中的,因而可以映射回三维空间。

广义球:这里的球是广义上的。我们在二维平面上,广义球其实指代circle,三维空间上就是我们认知上的球,称为two-sphere,而四维空间中广义球其实是一个超球(hyper-sphere),又称为three-sphere。单位向量其实就是广义球上面的点,而单位四元数也就是three-sphere上面的点。

约束与特征向量:空间中的一点由x, y, z等参数来表示,一般来说参数的数量与维数相等,二维空间的点用{x, y}参数,四维空间的点用{x, y, z, w}参数。但是对于空间的点加以约束,则该会减少参数的数量,比如三维空间的点在某一单位球面上,原本三个参数{x, y, z}才能表达的点现在只需要两个参数{u, v}就可以表达。如果{u, v}是单位向量,也可以称{u, v}是{x, y, z}的特征向量。

四元数特性

  • 四元数(以后不特指四元数=单位四元数)是四维空间中一个超球上面的点,满足w²+x²+y²+z²=1;而纯四元数是四维空间在w=0时的一个子空间的点,形式为{0, q},特别注意的是纯四元数与四元数是不同的概念。

  • 四元数是复数虚部扩展的结果,复数的虚部为1个,而四元数虚部有3个,且两两互相正交,其中实部是cosθ/2,而虚部为一个単位轴乘以sinθ/2。

  • 四元数自由度并没有四个维度,由于存在w²+x²+y²+z²=1这个约束,它的自由度其实只有3,且每个四元数可以对应一个特征向量,即n。但请记住四元数并不是与特征向量一一对应的,后文会有说。

由于四元数存在于四维空间,所以如何利用低维信息去理解高维信息就显得尤为重要。我们这里先用三维举个例子,三维的球用代数表示为x²+y²+z²=1,虽然球上面的点是由x,y,z三个参数来确定,但实际上我们只需要两个。假设取x和z表示,其中y可以通过x和z进行求解。那么,我们将y轴信息给隐去,只看投影平面,如下图所示。这张图的意思是,整个球在XOZ平面上投影是一个圆,当球面一点投影在圆上时,y=0;投影的位置位于圆内时,则分别两种情况,y>0处于北半球,y<0处于南半球。所以我们仅通过投影后的圆即可还原出整个球体。

让我们推广到四维,w²+x²+y²+z²=1中取x、y和z来表示超球。如下图所示,四维空间投影到三维超平面(w=0)可能是一个two-sphere。当投影点在整个two-sphere的边缘时,w一定为0,值得一提的是在这个空间内的四元数是一个纯四元数。当投影点落在two-sphere的内部时,也分为两种情况,w>0和w<0。但是我们可以发现这两种情况下对应的特征向量是一样的,所以我们将旋转矩阵向四元数转换时,是有两个对应值的,四元数的范围是2倍覆盖于3D旋转(2:1 mapping)。


基本运算规律

对于四元数的运算法则,我们要清楚的有以下几个,假设有两个四元数分别为q1=(w1,(x1,y1,z1))和q2=(w2,(x2,y2,z2)),令v1 = (x1,y1,z1),v2= (x2,y2,z2),则

四元数的姿态表示

了解了四元数的基本运算规律后,我们来看下它如何表征姿态,假设存在一根旋转轴u,有一个绕u轴旋转σ角度的这么一个旋转存在,那这时候代表这个旋转的四元数是这样子的:q=[cos(σ/2),u·sin(σ/2)]。其中u是旋转轴的单位向量,q是一个单位四元数。

那上述这个四元数有什么用呢,它对任何向量施加以下算子运算后可以得到该向量绕u轴旋转σ角度后的向量:w=qvq*

其实四元数表征旋转关系,跟旋转矩阵的表示方法类似,只不过它只需要4个元素,而旋转矩阵需要9个元素。

四元数相比其他形式变换的优点:

  • 解决万向节死锁(Gimbal Lock)问题

  • 仅需存储4个浮点数,相比矩阵更加轻量

  • 四元数无论是求逆、串联等操作,相比矩阵更加高效

现在主流游戏或动画引擎都会以缩放向量+旋转四元数+平移向量的形式进行存储角色的运动数据。看看旋转矩阵和四元数

首先将坐标系{B}和一个已知参考坐标系{A}重合,将{B}绕单位矢量 [公式] 旋转θ角。旋转矩阵

[公式] =>[公式] 

其中vθ=1-cosθ

Def. 设$i^2=j^2=k^2=ijk=-1$,将ijk表示为直角坐标系,称q=t+xi+yj+zk为一般四元数,其共轭复数 q=t-xi-yj=zk=½·(t²+x²+y²+z²)=-(q+iqi+jqj+kqk)/2

设q0=cos(θ/2) ,q1=kxSin(θ/2),q2=kysin(θ/2),,q3=kzsin(θ/2),那么:q0² + q1² + q3² = 1,且

[公式]

具体查看《机器人运动学:旋转,D-H表示法与雅可比矩阵


欧拉角、旋转矩阵、四元数之间相互转换

先回顾一下这三个角运动的微分方程。


欧拉角角运动方程:

欧拉角角运动方程:

旋转矩阵角运动方程:

旋转矩阵角运动方程

四元数角运动方程:

四元数角运动方程:

推荐阅读《欧拉角、旋转矩阵、四元数角运动微分方程

四元数转旋转矩阵

已知四元数:q=(q1,q2,q2,q3)

旋转矩阵为(利用罗德里格斯公式即可):

旋转矩阵转四元数

已知旋转矩阵:[r11,r21,r31;r12,r22,r32,r13,r23,r33]

则求解四元数时根据的方法就是从四元数转旋转矩阵的公式中得到:

求解四元数时根据的方法就是从四元数转旋转矩阵的公式上式中是无法确定正负号的

四元数转欧拉角

已知四元数:q=(q1,q2,q2,q3)

欧拉角为:

但是当β角度为90度时,四元数反向计算欧拉角时会出现奇点,是无法计算的。

因为这时候简化后的四元数是这样的:[.707·cos[(α-λ)/2],.707·[(α-λ)/2],.707·cos[(α-λ)½],.707·cos[(α-λ)½]]

所以atan2中后面那一项就变成了0:1-2×(q1²^2+q)=0
这时候我们通常令α=0,然后解出欧拉角的值。

欧拉角转四元数:

已知欧拉角:α、β、γ

四元数为:


学习文章:

欧拉角、旋转矩阵、四元数合辑 

欧拉角、旋转矩阵、四元数角运动微分方程

机器人运动学:旋转,D-H表示法与雅可比矩阵

四元数——基本概念

三维旋转:欧拉角、四元数、旋转矩阵、轴角之间的转换

https://www.zhihu.com/question/47736315/answer/236808639

https://zhuanlan.zhihu.com/p/25936257





转载本站文章《三维旋转笔记:欧拉角/四元数/旋转矩阵/轴角-记忆点整理》, 请注明出处:https://www.zhoulujun.cn/html/theory/math/2019_0912_8149.html