【学习笔记】空间坐标系旋转与四元数

编程入门 行业动态 更新时间:2024-10-23 15:27:03

【学习笔记】空间<a href=https://www.elefans.com/category/jswz/34/1768665.html style=坐标系旋转与四元数"/>

【学习笔记】空间坐标系旋转与四元数

文章目录

  • 0 前言
  • 1 平面坐标系旋转
  • 2 空间坐标系旋转
    • 2.1 旋转矩阵的推导
    • 2.2 旋转矩阵的性质
    • 2.3 旋转矩阵的两种含义【重点!】 //2023.2.26
  • 3 齐次变化矩阵*
    • 3.1 坐标系平移
    • 3.2 齐次变换矩阵
    • 3.3 平移和旋转算子
  • 4 固定角和欧拉角
    • 4.1 X-Y-Z固定角
    • 4.2 Z-Y-X欧拉角
    • 4.3 欧拉角到底指什么?
    • 4.4 用欧拉角或固定角的弊端
  • 5 四元数
  • 总结

0 前言

  最近在学惯性器件,想着先把理论知识脉络打通,于是便开始学习空间坐标系旋转和四元数,正好结合刚刚结课的课程《机器人控制技术》,记录一下学习心得。

旋转矩阵和齐次变换矩阵部分主要参考自教材 《机器人学导论》 中的第2章 【有需要的可以去z-library上免费下载】

1 平面坐标系旋转

  推导空间坐标系旋转之前,不妨先看一下平面坐标系的旋转。
  如下图所示,存在一个向量 v v v,绕原点逆时针旋转(一般平面上的旋转都是往角度增大的方向,即逆时针方向旋转) θ \theta θ角度,得到向量 v ′ v' v′,求向量 v v v到 v ′ v' v′的旋转矩阵。【图片来源】

  假定向量 v v v的模长为 r r r,初始角度为 ϕ \phi ϕ,则 v v v的坐标为 ( r c o s ϕ , r s i n ϕ ) (rcos\phi, rsin\phi) (rcosϕ,rsinϕ),逆时针旋转 θ \theta θ角度后,得到 v ′ v' v′,其坐标变为 ( r c o s ( θ + ϕ ) , r s i n ( θ + ϕ ) ) (rcos(\theta+\phi), rsin(\theta+\phi)) (rcos(θ+ϕ),rsin(θ+ϕ)),展开得到:
[ x v ’ y v ’ ] = [ r cos ⁡ ϕ cos ⁡ θ − r sin ⁡ ϕ sin ⁡ θ r cos ⁡ ϕ sin ⁡ θ + r sin ⁡ ϕ cos ⁡ θ ] = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] [ r cos ⁡ ϕ r sin ⁡ ϕ ] = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] [ x v y v ] \left[ \begin{array}{c} x_{v’}\\ y_{v’}\\ \end{array} \right] =\left[ \begin{array}{c} r\cos \phi \cos \theta -r\sin \phi \sin \theta\\ r\cos \phi \sin \theta +r\sin \phi \cos \theta\\ \end{array} \right] =\left[ \begin{matrix} \cos \theta& -\sin \theta\\ \sin \theta& \cos \theta\\ \end{matrix} \right] \left[ \begin{array}{c} r\cos \phi\\ r\sin \phi\\ \end{array} \right] =\left[ \begin{matrix} \cos \theta& -\sin \theta\\ \sin \theta& \cos \theta\\ \end{matrix} \right] \left[ \begin{array}{c} x_v\\ y_v\\ \end{array} \right] [xv’​yv’​​]=[rcosϕcosθ−rsinϕsinθrcosϕsinθ+rsinϕcosθ​]=[cosθsinθ​−sinθcosθ​][rcosϕrsinϕ​]=[cosθsinθ​−sinθcosθ​][xv​yv​​]

故,矩阵 [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] \left[ \begin{matrix} \cos \theta& -\sin \theta\\ \sin \theta& \cos \theta\\ \end{matrix} \right] [cosθsinθ​−sinθcosθ​]即为旋转矩阵。

记住这个表达式,尤其是正负号,后面要考。

  当然,上面讨论的是向量的旋转,如果把这个向量看作坐标系的一个轴,那么这个旋转矩阵也能应用到坐标系变换当中。比如已知一个点在A坐标系下的x,y坐标,求该点在B坐标系下的x,y坐标,就可以左乘一个旋转矩阵,从而得到新坐标系下的x,y坐标。

2 空间坐标系旋转

  了解了平面坐标系旋转,再来看看空间坐标系的旋转。

2.1 旋转矩阵的推导

  参考上面的方法,即在一个固定坐标系中表示出发生旋转前后的坐标系的坐标(或者说是在旋转前的坐标系中表示出旋转后的坐标系的三个坐标轴),从而求出其旋转矩阵,我们在此基础上应用投影法来推导空间坐标系的旋转矩阵。
  如下图所示,有两个坐标系{A}和{B},其中{B}相对于{A}发生了旋转,现在在{B}中有一个矢量 B P ^BP BP(左上标代表“基于xx坐标系”),问该矢量在{A}中的坐标是多少?即求 A P ^AP AP。

  基于上面平面坐标系旋转的例子类推,我们不难猜出, P P P矢量在{A}和{B}下的坐标 A P , B P ^AP, ^BP AP,BP之间存在一个旋转矩阵的关系:

A P = B A R B P ^AP=_{B}^{A}R^{\,\,B}P AP=BA​RBP

那怎么来求这个旋转矩阵 B A R _B^AR BA​R呢?一般采用的是投影法

B A R = [ A X ^ B A Y ^ B A Z ^ B ] = [ X ^ B ⋅ X ^ A Y ^ B ⋅ X ^ A Z ^ B ⋅ X ^ A X ^ B ⋅ Y ^ A Y ^ B ⋅ Y ^ A Z ^ B ⋅ Y ^ A X ^ B ⋅ Z ^ A Y ^ B ⋅ Z ^ A Z ^ B ⋅ Z ^ A ] _{B}^{A}R=\left[ \begin{matrix} ^A\hat{X}_B& ^A\hat{Y}_B& ^A\hat{Z}_B\\ \end{matrix} \right] =\left[ \begin{matrix} \hat{X}_B\cdot \hat{X}_A& \hat{Y}_B\cdot \hat{X}_A& \hat{Z}_B\cdot \hat{X}_A\\ \hat{X}_B\cdot \hat{Y}_A& \hat{Y}_B\cdot \hat{Y}_A& \hat{Z}_B\cdot \hat{Y}_A\\ \hat{X}_B\cdot \hat{Z}_A& \hat{Y}_B\cdot \hat{Z}_A& \hat{Z}_B\cdot \hat{Z}_A\\ \end{matrix} \right] BA​R=[AX^B​​AY^B​​AZ^B​​]= ​X^B​⋅X^A​X^B​⋅Y^A​X^B​⋅Z^A​​Y^B​⋅X^A​Y^B​⋅Y^A​Y^B​⋅Z^A​​Z^B​⋅X^A​Z^B​⋅Y^A​Z^B​⋅Z^A​​

其中, B A R _{B}^{A}R BA​R描述了{B}相对于{A}的旋转(左下标相对于左上标的旋转),即在{A}中描述{B}的姿态。

  从这个角度来理解上面的等式 A P = B A R B P ^AP=_{B}^{A}R^{\,\,B}P AP=BA​RBP :等号两边是等价的,左边是矢量在旋转前坐标系{A}中的表示,等式右边由于 B P ^BP BP是在旋转后坐标系{B}中的表示,所以要左乘一个{B}相对于{A}的旋转矩阵,将这个旋转给 “抵消”

  为方便记忆,可以把左上标视为分子,左下标视为分母,然后利用分数乘法中的相消原则,来书写表达式,这个方式在多个旋转矩阵相乘时更加有用。

  此外, [ A X ^ B A Y ^ B A Z ^ B ] \left[ \begin{matrix} ^A\hat{X}_B& ^A\hat{Y}_B& ^A\hat{Z}_B\\ \end{matrix} \right] [AX^B​​AY^B​​AZ^B​​] 分别表示 {B}中三个主轴的单位矢量(含有“帽号”表示单位矢量)在{A}中三个主轴的投影,都是列向量。后面展开的矩阵,每一个元素都是两个单位矢量的点乘,其中每一列{B}中的向量保持不变,每一行{A}中的向量保持不变。

  需要注意的是,向量乘积的前提是基于同一个坐标系,因此这里的 X ^ B \hat{X}_B X^B​都是在坐标系A中的描述,如果在坐标系B中描述就直接是 [ 1 , 0 , 0 ] [1,0,0] [1,0,0]了

2.2 旋转矩阵的性质

  旋转本身就是可逆的,既然有{B}相对于{A}的旋转矩阵 B A R _B^AR BA​R,那必然也有{A}相对于{B}的旋转矩阵 A B R _A^BR AB​R,即
B P = A B R A P ^BP=_A^BR ^{\,\, A}P BP=AB​RAP
再根据上面的表达式:
A P = B A R B P ^AP=_B^AR^{\,\, B}P AP=BA​RBP
两边同时左乘 A B R _A^BR AB​R,得到
A B R A P = A B R B A R B P = B P _{A}^{B}R^AP=_{A}^{B}R _{B}^{A}R^{B}P=^{B}P AB​RAP=AB​RBA​RBP=BP
故 A B R B A R = I _{A}^{B}R_{B}^{A}R=I AB​RBA​R=I,即 A B R = B A R − 1 _{A}^{B}R=_{B}^{A}R^{-1} AB​R=BA​R−1。


  此外,根据上面的 B A R _B^AR BA​R的推导,同样可以得出{A}相对于{B}发生旋转时的旋转矩阵 A B R _A^BR AB​R:
A B R = [ B X ^ A B Y ^ A B Z ^ A ] = [ A X ^ B T A Y ^ B T A Y ^ B T ] = B A R T _{A}^{B}R=\left[ ^B\hat{X}_A^B\hat{Y}_A^B\hat{Z}_A \right] =\left[ \begin{array}{c} {^A\hat{X}_B}^T\\ {^A\hat{Y}_B}^T\\ {^A\hat{Y}_B}^T\\ \end{array} \right] ={_{B}^{A}R}^T AB​R=[BX^AB​Y^AB​Z^A​]= ​AX^B​TAY^B​TAY^B​T​ ​=BA​RT

  联立上面表达式,可以得出: B A R − 1 = B A R T _{B}^{A}R^{-1} ={_{B}^{A}R}^T BA​R−1=BA​RT,因此,可以得出,旋转矩阵为一个正交矩阵(矩阵的转置等于矩阵的逆),同时还是一个标准正交矩阵,即其行列式恒为+1(非标准正交矩阵行列式为-1).

2.3 旋转矩阵的两种含义【重点!】 //2023.2.26

  最近因为项目需要,重新阅读这篇博客时,发现一个问题,那就是对于多个旋转矩阵相乘的情况,始终不是很明白,在一个同学的帮助下,找到一篇写得非常好的博客,让我对旋转矩阵的乘法有了一个更深的理解。

  • 旋转矩阵及左右乘的意义,看这一篇就够了

  旋转矩阵其实有两重含义,分别是 坐标变换旋转向量 。在上面提到的《机器人学导论》教材中也提到了这样一句话:

即坐标变换和旋转向量虽然都是对应同一个旋转矩阵,但其理解的含义还是有很大差别的,尤其是有多次旋转操作时。

  • 坐标变换
    所谓坐标变换,是指一个向量在不同坐标系下有不同的坐标表示,需要在已知旋转矩阵 和 向量在旋转后坐标系中的坐标表示,来求该向量在旋转前坐标系中的坐标表示。 此时 A P = B A R B P ^AP=_B^AR^{\,\, B}P AP=BA​RBP中的 B A R _B^AR BA​R可以理解为一种“回退”或者“撤销”,所以如果发生了多次旋转,那么应该以旋转后的最终状态为起点,从最近一次旋转开始,依次左乘一个旋转变换矩阵;那如果以旋转前的初始状态为起点,从最早的一次旋转开始,依次右乘对应的旋转变换矩阵。这样才能“抵消”旋转产生的影响,求出向量在旋转前坐标系中的坐标表示。

  • 旋转向量
    所谓旋转向量,是指坐标系不动的情况下旋转向量,已知向量旋转前的坐标表示和旋转矩阵,求出向量旋转后的坐标表示。那么如果向量发生多次旋转,应该是按照旋转顺序依次左乘对应的旋转矩阵

这里可能会不太能理解,但是没关系,可以先看后面的固定角和欧拉角部分。

3 齐次变化矩阵*

  以上关于空间旋转的叙述,可以发现其实都含有一个前提:坐标原点不变,但在实际的机器人控制过程中,机构的运动并不是单独的旋转,还包含平移运动,所以一般描述位姿变换,常采用4*4的齐次变换矩阵。【如果只想看旋转部分,这节可以跳过

3.1 坐标系平移

  首先来看坐标系平移。和旋转要保持坐标原点不变的前提一样,讨论坐标系平移时,也要保证姿态一样,即不发生旋转。
  坐标系{B}相对于坐标系{A}发生了平移,一般只需要描述{B}原点相对于{A}的位置即可:
A P B o r g = [ A p x A p y A p z ] ^AP_{Borg} =\left[ \begin{array}{c} ^Ap_x\\ ^Ap_y\\ ^Ap_z\\ \end{array} \right] APBorg​= ​Apx​Apy​Apz​​
这里,同样采用了左上标的符号来表示“相对”, o r g org org下标表示origin,即原点。

3.2 齐次变换矩阵

  以上讨论的都是单独的平移和旋转,因此都要满足一定的前提条件,那能不能把这两者给结合起来呢?答案肯定是可以的。
[ A P 1 ] = [ B A R A P B o r g 0 0  0 1 ] [ B P 1 ] \left[ \begin{array}{c} ^AP\\ 1\\ \end{array} \right] =\left[ \begin{matrix} _{B}^{A}R& ^AP_{Borg}\\ \text{0 0 }0& 1\\ \end{matrix} \right] \left[ \begin{array}{c} ^BP\\ 1\\ \end{array} \right] [AP1​]=[BA​R0 0 0​APBorg​1​][BP1​]

通过增加0和1,巧妙地将旋转矩阵和平移向量结合到一个4*4的矩阵当中,这个矩阵称为齐次变换矩阵,用 B A T _B^AT BA​T表示,即
[ A P 1 ] = B A T [ B P 1 ] \left[ \begin{array}{c} ^AP\\ 1\\ \end{array} \right] =_{B}^{A}T\left[ \begin{array}{c} ^BP\\ 1\\ \end{array} \right] [AP1​]=BA​T[BP1​]

如果要计算多次变换,只需要把多个齐次变换矩阵依次相乘即可。

3.3 平移和旋转算子

  所谓算子,即能够单独进行某一种特定运算的表达式,其概念类似于“函数”。这里相当于是齐次变换矩阵的一种特殊情况。

  • 平移算子
    对于两个坐标系 P 1 P_1 P1​和 P 2 P_2 P2​,满足这样的平移关系 A P 2 = A P 1 + A Q ^AP_2=^AP_1+^AQ AP2​=AP1​+AQ,其中, A Q = [ q x q y q z ] T ^AQ=\left[ \begin{matrix} q_x& q_y& q_z\\ \end{matrix} \right] ^T AQ=[qx​​qy​​qz​​]T 将其用齐次变换矩阵对应的算子表示,即 A P 2 = D Q ( q ) A P 1 ^AP_2=D_Q\left( q \right) ^AP_1 AP2​=DQ​(q)AP1​,则:
    D Q ( q ) = [ 1 0 0 q x 0 1 0 q y 0 0 1 q z 0 0 0 1 ] D_Q\left( q \right) =\left[ \begin{matrix} 1& 0& 0& q_x\\ 0& 1& 0& q_y\\ 0& 0& 1& q_z\\ 0& 0& 0& 1\\ \end{matrix} \right] DQ​(q)= ​1000​0100​0010​qx​qy​qz​1​
  • 绕z轴旋转算子
    对于两个坐标系 P 1 P_1 P1​和 P 2 P_2 P2​,满足这样的旋转关系 A P 2 = R z ( θ ) A P 1 ^AP_2=R_z(\theta)^AP_1 AP2​=Rz​(θ)AP1​,如下图所示。

    那么其对应的齐次变换矩阵算子 T z ( θ ) T_z(\theta) Tz​(θ)为
    T z ( θ ) = [ cos ⁡ θ − sin ⁡ θ 0 0 sin ⁡ θ cos ⁡ θ 0 0 0 0 1 0 0 0 0 1 ] T_z\left( \theta \right) =\left[ \begin{matrix} \cos \theta& -\sin \theta& 0& 0\\ \sin \theta& \cos \theta& 0& 0\\ 0& 0& 1& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] Tz​(θ)= ​cosθsinθ00​−sinθcosθ00​0010​0001​

这里可以发现,其中旋转矩阵部分使用的表达式正好是前面二维平面旋转的表达式。

  • 绕x轴旋转算子
    对于两个坐标系 P 1 P_1 P1​和 P 2 P_2 P2​,满足这样的旋转关系 A P 2 = R x ( θ ) A P 1 ^AP_2=R_x(\theta)^AP_1 AP2​=Rx​(θ)AP1​,即绕x轴逆时针旋转 θ \theta θ角度。空间想象一下,和上面各个坐标系对应一下(X指向纸面外;Y代替X;Z代替Y),可以推出齐次变换算子 T x ( θ ) T_x(\theta) Tx​(θ)
    T x ( θ ) = [ 1 0 0 0 0 cos ⁡ θ − sin ⁡ θ 0 0 sin ⁡ θ cos ⁡ θ 0 0 0 0 1 ] T_x\left( \theta \right) =\left[ \begin{matrix} 1& 0& 0& 0\\ 0& \cos \theta& -\sin \theta& 0\\ 0& \sin \theta& \cos \theta& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] Tx​(θ)= ​1000​0cosθsinθ0​0−sinθcosθ0​0001​

  • 绕y轴旋转算子
    对于两个坐标系 P 1 P_1 P1​和 P 2 P_2 P2​,满足这样的旋转关系 A P 2 = R y ( θ ) A P 1 ^AP_2=R_y(\theta)^AP_1 AP2​=Ry​(θ)AP1​,即绕y轴逆时针旋转 θ \theta θ角度。空间想象一下,绕z轴旋转的情况对应一下(Y指向纸面外;X代替Y;Z代替X),这里有点特殊,不能直接套用上面的样式,需要计算一下,可以得到齐次变换算子 T y ( θ ) T_y(\theta) Ty​(θ)
    T y ( θ ) = [ cos ⁡ θ 0 sin ⁡ θ 0 0 1 0 0 − sin ⁡ θ 0 cos ⁡ θ 0 0 0 0 1 ] T_y\left( \theta \right) =\left[ \begin{matrix} \cos \theta& 0& \sin \theta& 0\\ 0& 1& 0& 0\\ -\sin \theta& 0& \cos \theta& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] Ty​(θ)= ​cosθ0−sinθ0​0100​sinθ0cosθ0​0001​

  前面提到,旋转算子本质上也是齐次变换矩阵,因此在理解和使用旋转算子时,也要按照上面提到的两种方式去理解。

4 固定角和欧拉角

  旋转矩阵虽然直观易懂,且对于公式的推导具有很大的便利,但是它也存在一个很大的问题,那就是描述一个角度需要9个变量,这在进行大量旋转运算时是很耗费性能的。但是可以发现旋转矩阵的9个变量并不是独立,而是存在6个约束条件(比如它是标准正交矩阵,秩为1等),因此实际的变量个数为3(具体证明建议翻阅上面提到的教材),那能不能找到3个参数来描述空间中的旋转呢?
  最直观的想法就是将空间旋转转换到矢量绕坐标系三个轴的旋转,但是这里存在一个难点,那就是空间中的旋转是不可交换的,即先绕x轴旋转再绕y轴旋转并不等价于先绕y轴旋转再绕x轴旋转,其本质原因在于矩阵相乘并不满足交换律。因此,在寻找这三个参数时,也需要约定旋转的先后顺序。这里介绍两种比较常用的表达方式:X-Y-Z固定角Z-Y-X欧拉角

4.1 X-Y-Z固定角

   首先将坐标系{B}和一个已知的参考坐标系{A}重合,先将{B}绕 X ^ A \hat{X}_A X^A​旋转 γ \gamma γ角,再绕 Y ^ A \hat{Y}_A Y^A​旋转 β \beta β角,最后绕 Z ^ A \hat{Z}_A Z^A​旋转 α \alpha α角

  以上每一次旋转都是绕固定的坐标系A的轴,即所谓“固定”。
  根据前面总结的原则,每进行一次旋转,旋转后的坐标都要左乘一个旋转矩阵,才能得到旋转前坐标系中的坐标。因此可以推导出按照X-Y-Z旋转固定角的旋转矩阵:

其中 c α c\alpha cα是 c o s α cos\alpha cosα的缩写, s α s\alpha sα是 s i n α sin\alpha sinα的缩写,等等。将矩阵相乘,得到:

这相当于已知绕各个固定轴的旋转角,计算出其对应的旋转矩阵。那么它的逆问题就变成了已知这样一个旋转矩阵,怎么求出其对应的绕各个固定轴的旋转角,即 α , β , γ \alpha, \beta, \gamma α,β,γ。
  令

故可以根据正余弦之间的关系求出三个旋转角:

其中 A t a n 2 Atan2 Atan2函数叫双反正切函数,需要传入两个参数:正弦值和余弦值,其表达式为 A t a n 2 ( s i n α , c o s α ) Atan2(sin\alpha, cos\alpha) Atan2(sinα,cosα),它会根据正余弦的正负来确定角度,因此它的函数值范围不再是-90° ~ 90°, 而是-180° ~ 180°。

4.2 Z-Y-X欧拉角

  首先将坐标系{B}和一个已知的参考坐标系{A}重合,先将{B}绕 Z ^ B \hat{Z}_B Z^B​旋转 α \alpha α角,再绕 Y ^ B \hat{Y}_B Y^B​旋转 β \beta β角,最后绕 X ^ B \hat{X}_B X^B​旋转 γ \gamma γ角

  以上每一次都是绕运动的坐标系{B}的轴旋转而不是绕固定的坐标系{A}的轴旋转,这样的三个一组的旋转称为 欧拉角。注意这里每一次旋转的轴取决于上一次的旋转。{B}初始与{A}重合,不妨假定{B}第一次旋转后得到{B’},第二次旋转得到{B’'},第三次旋转得到最终姿态{B},故{B}相对于{A}的旋转矩阵为中间坐标系对应的旋转矩阵相乘:
B A R = B ′ A R B ′ ′ B ′ R B B ′ ′ R _{B}^{A}R=_{B'}^{A}R_{B''}^{B'}R_{B}^{B''}R BA​R=B′A​RB′′B′​RBB′′​R
代入旋转算子,可以得到:

把相乘计算出来,可以得到:

惊奇地发现,这个结果和上面固定角旋转得到的结果的一样的!因此可以得到一个结论:三次绕固定轴旋转的最终姿态和以相反顺序绕运动坐标系的轴转动的姿态相同。因此,如果要求出其对应的欧拉角,也可以套用上面总结的公式。

  如果不理解上面固定角和欧拉角的区别,建议再次阅读2.3章节。
  对于固定角,可以按照旋转向量的角度来理解。即存在一个向量绕一个固定的坐标系的三个轴发生了三次旋转,因此应该从右往左看,依次左乘,相当于依次旋转这个向量。
  对于欧拉角,可以按照坐标变换的角度来理解。即假定有一个向量方向始终没变,但是坐标系相对于原坐标系发生了三次旋转,而且是已知旋转后的坐标系中该向量的坐标,要求该向量在原坐标系中的坐标表示。因此应该以最终的一次旋转为起点,依次左乘对应的旋转算子。


  上面的这种情况可以概括为:左乘旋转矩阵绕固定坐标系旋转,右乘旋转矩阵绕自身坐标系旋转。 注意这里的左乘和右乘是指多个矩阵之间的关系,而不是矩阵和坐标向量之间的关系,后者固定是左乘。

4.3 欧拉角到底指什么?

  在很多不太专业的博客中,关于欧拉角上来就是Yaw,Pitch,Roll,都没有搞清楚欧拉角是怎么定义的,是绕哪个轴在转动。
  通过对比不同领域的文献,我发现关于欧拉角的定义似乎有所差别,比如在一些文献当中,是不区分固定角和欧拉角的,绕固定轴和绕运动轴的区别称为外旋和内旋。因此,为了和上面保持一致,这里就以Z-Y-X绕运动轴旋转的角度称为欧拉角,一般用Yaw,Pitch,Roll表示。
  在讨论旋转时,首先明确一下坐标系,一般来说,会有一个世界的参考坐标系,常用右手系东北天坐标系,即“东-X,北-Y,天-Z”,如下图所示。

而在讨论物体姿态时,初始位置一般和参考坐标系对齐,即“前面为Y,右边为X,上面为Z”(想象一架飞机平放在你的眼前)这样直观的认识。而在讨论欧拉角转动方向时,按照“右手定则”: 坐标轴正方向为拇指所指方向,四指所指方向为转动正方向

  • 偏航角Yaw:绕Z轴转动,从X到Y为正方向(机头从右往左水平转)

  • 俯仰角Pitch:绕X轴转动,从Y到Z为正方向(飞机从下往上抬头)

  • 横滚角Roll:绕Y轴转动,从Z到X为正方向(飞机从左往右翻滚)

以上图片来自参考链接

4.4 用欧拉角或固定角的弊端

  再仔细看看上面那个求固定角的表达式。

会发现一个问题,那就是当 β = 90 ° \beta=90\degree β=90°时, α , γ \alpha, \gamma α,γ是解不出来的,也可以将其代入到展开的矩阵当中:
B A R X Y Z ( γ , β , α ) = [ 0 c α s γ − s α c γ c α c γ + s α s γ 0 s α s γ + c α c γ s α c γ − c α s γ − 1 0 0 ] _{B}^{A}R_{XYZ}\left( \gamma ,\beta ,\alpha \right) =\left[ \begin{matrix} 0& c\alpha s\gamma -s\alpha c\gamma& c\alpha c\gamma +s\alpha s\gamma\\ 0& s\alpha s\gamma +c\alpha c\gamma& s\alpha c\gamma -c\alpha s\gamma\\ -1& 0& 0\\ \end{matrix} \right] BA​RXYZ​(γ,β,α)= ​00−1​cαsγ−sαcγsαsγ+cαcγ0​cαcγ+sαsγsαcγ−cαsγ0​
这只能求出 α + γ \alpha+\gamma α+γ,在一些特定场合,可以指定某个角度为多少,然后求出另一个角度,如指定 α = 0 \alpha=0 α=0。

  这个问题一般称为万向节死锁(Gimbal Lock),这也是用欧拉角(固定角)表示旋转最大的问题,由此也引出了下文的四元数

5 四元数

  对于如何理解四元数,有一种公认的比较好的方式,那就是从复数角度去理解。这里提供一个学习链接,是中文翻译版的,文中也附了英文原版链接。个人建议先详细阅读一遍。

  上面的教程关于四元数旋转部分讲得不够明确,这里简单总结一下。
  用四元数来描述旋转,一般是 “ p 1 p_1 p1​矢量绕 p 2 p_2 p2​矢量转动 θ \theta θ角度” 这样的形式,同时,由于 p 1 p_1 p1​和 p 2 p_2 p2​都是实际三维空间中的矢量,所以都是纯四元数,其对应的四元数分别是 q 1 = ( 0,  v ⃗ 1 ) q_1=\left( \text{0, }\vec{v}_1 \right) q1​=(0, v 1​), q 2 = ( 0,  v ⃗ 2 ) q_2=\left( \text{0, }\vec{v}_2 \right) q2​=(0, v 2​),

q = ( cos ⁡ θ 2 , sin ⁡ θ 2 v ⃗ 2 ) q=\left( \cos \frac{\theta}{2}, \sin \frac{\theta}{2}\vec{v}_2 \right) q=(cos2θ​,sin2θ​v 2​)

注意,这里的角度是需要旋转角度的一半,同样,其旋转的正方向也要符合右手定则。

则 p 1 p_1 p1​旋转后的矢量 p 1 ′ p_{1}^{'} p1′​等于
p 1 ′ = q p 1 q ∗ p_{1}^{'}=qp_1q^* p1′​=qp1​q∗
其中, q ∗ q^* q∗为 q q q的共轭四元数,其表达式如下所示。
q ∗ = ( cos ⁡ θ 2 , − sin ⁡ θ 2 v ⃗ 2 ) q^*=\left( \cos \frac{\theta}{2}, -\sin \frac{\theta}{2}\vec{v}_2 \right) q∗=(cos2θ​,−sin2θ​v 2​)

参考链接——还有一些代码实现值得一看
四元数与欧拉角之间的转换

总结

  本文参考了教材《机器人学导论》,并借鉴了当前比较流行的教程,总结了旋转矩阵,欧拉角,四元数等的基本概念和使用,也介绍了他们各自的优缺点和转换方式,清晰易懂。

更多推荐

【学习笔记】空间坐标系旋转与四元数

本文发布于:2024-02-06 23:59:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1752029.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:坐标系   学习笔记   空间   四元数

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!