[视觉SLAM十四讲]学习笔记2-关于欧拉角和万向锁

1 欧拉角

1.1 维基百科定义

关于欧拉角的定义,维基百科中这样给出:莱昂哈德·欧拉提出用欧拉角来描述刚体在三维欧几里得空间的取向。对于任何参考系,一个刚体的取向是依照顺序从这参考系做三个欧拉角的旋转而设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定。换句话说,任何关于刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的。
对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系(固定系)又称为实验室参考系,是静止不动的。而坐标系(固连系)则固定于刚体,随着刚体的旋转而旋转。
简单来说,相对于旋转向量和旋转矩阵,欧拉角非常直观的描述了旋转,3个分离的转角可以把一个旋转分解成3次绕不同轴的旋转。
另外,在学习欧拉角之前,需要引入一些其他概念。

  • 参考系的概念
    参考坐标系可以放在空间的任何位置’每个参考坐标系都有其特定的物理意义。我们总是要定义一个相对静止的固定坐标系(fixed frame),即空间坐标系(space frame),例如,将空间坐标系选在房间的某个角落中。类似地,我们也经常至少选择一个附着在某一运动刚体上的随动坐标系,例如,选在房间中飞舞的四旋翼飞行器机体上。这个坐标系称为物体坐标系(body frame),它是一个在任一瞬时都与刚体随动坐标系相重合的静止坐标系。
    为简单起见,我们通常将附着在运动刚体上的坐标系称为物体坐标系。尽管如此,任一瞬时’物体坐标系实质上都是一个瞬时与刚体随动的坐标系相重合的静止坐标系。
    注意:所有坐标系都是静止的。
    这里所说的固定坐标系即为上述固定系,物体坐标系即为固连系。
  • 欧拉角正负的概念
    坐标系有左手坐标系与右手坐标系之分,这里,我们所描述的所有坐标系都遵循右于定则,如下图所示。其中正向转动的转轴方向可通过手指的指向来确定:当拇指指向轴线时,右手卷曲的方向。简答来说:右手系,旋转轴正方向面对观察者时,逆时针方向的旋转是正、顺时针方向的旋转是负
    右手定则
  • 旋转类型的概念
    内部旋转(固有旋转):是围绕附加到移动物体的坐标系XYZ的轴发生的基本旋转。因此,它们在每次元素旋转后都会改变方向。XYZ系统旋转,而xyz是固定的。从XYZ重叠xyz开始,三个固有旋转的组合可用于达到XYZ的任何目标方向。
    内旋
    由欧拉角 (α,β,γ) = (−60°, 30°, 45°)表示的旋转,使用z-x’-z″内部旋转
    外部旋转:是围绕固定坐标系xyz的轴发生的基本旋转。XYZ系统旋转,而xyz是固定的。从XYZ重叠xyz开始,三个外部旋转的组合可用于达到XYZ的任何目标方向。
    外旋
    相同的旋转由 (γ, β, α) = (45°, 30°, −60°) 表示,使用zxz外部旋转
    欧拉角通常表示为α、β、γ或ψ、θ、φ。不同的作者可能使用不同的旋转轴组来定义欧拉角,或者相同的角度有不同的名称。因此,任何使用欧拉角的讨论都应该先于它们的定义。
    不考虑使用两种不同约定来定义旋转轴(内部或外部)的可能性,存在十二种可能的旋转轴序列,分为两组:
  • 真欧拉角 (z - x - z, x - y - x, y - z - y, z - y - z, x - z - x, y - x - y)
  • (泰特-布赖恩角)Tait–Bryan角 (x - y - z, y - z - x, z - x - y, x - z - y, z - y - x, y - x - z)
    泰特-布赖恩角也称为万向角;航海角度;航向、海拔和坡度;或偏航、俯仰和滚转。有时,这两种序列都称为“欧拉角”。在这种情况下,第一组的序列称为适当的或经典的欧拉角。泰特-布赖恩角的内在旋转为z - y ′- x ″,外在旋转为x - y - z(内在旋转被称为:偏航(roll)、俯仰(pitch)和滚转(yaw))。
    飞机模型中的坐标很好的解释了这三个名词
    对于一架飞机,如果按正确的顺序完成,它们可以绕其主轴旋转三圈获得。偏航将获得方位,俯仰将产生仰角,滚动将产生倾斜角。因此,在航空航天中,它们有时被称为偏航、俯仰和滚转。请注意,如果以任何其他顺序应用旋转,或者如果飞机轴从任何不等于参考系的位置开始,这将不起作用
    飞机模型

1.2 ZYX欧拉角与rpy角

对于SLAM十四讲中的例子,我们可以看出,按照的是欧拉角ZYX内旋的方式进行的,
1.绕物体的Z轴旋转γ度,得到偏航角yaw;
2.绕旋转之后的Y轴旋转β度,得到俯仰角pitch;
3.绕旋转之后的X轴旋转α度,得到滚转角roll。
欧拉角形式旋转

ZYX欧拉角:按照内旋方式,Z-Y-X旋转顺序(指先绕自身轴Z,再绕自身轴Y,最后绕自身轴X),可得旋转矩阵(内旋是右乘):
R i = R z ( γ ) ∗ R y ( β ) ∗ R x ( α ) R_i=R_z(\gamma)*R_y(\beta)*R_x(\alpha) Ri=Rz(γ)Ry(β)Rx(α)rpy角:按照外旋方式,x-y-z旋转顺序(指先绕固定轴x,再绕固定轴y,最后绕固定轴z),可得旋转矩阵(外旋是左乘):
R o = R z ( γ ) ∗ R y ( β ) ∗ R x ( α ) R_o=R_z(\gamma)*R_y(\beta)*R_x(\alpha) Ro=Rz(γ)Ry(β)Rx(α)显然,按照内旋类型进行旋转的Z-Y-X欧拉角与按照外旋类型进行旋转的rpy(x-y-z)角等价。
关于内旋右乘,外旋左乘的知识,请参考这篇文章:旋转的左乘与右乘
欧拉角转换成旋转矩阵(相对于世界坐标系的旋转矩阵)通常是按外旋方式(绕固定轴),即X-Y-Z顺序。

2 万向锁

2.1 万向节

维基百科解释道,万向节是一种枢轴支撑,允许物体绕轴旋转。一组三个万向节,一个安装在另一个具有正交枢轴的万向节上,可用于允许安装在最里面的万向节上的对象保持独立于其支撑的旋转(如下图动画中的垂直)。例如,在船上,陀螺仪、船上罗盘、炉子,甚至饮料架通常都使用万向节来使它们相对于地平线保持直立,尽管船在上下颠簸。
万向节
根据下图动画可知,欧拉角的工作方式与万向节几乎是一样的。
对应欧拉角
为了更清晰的观察万向节和欧拉角的相同之处,我们将上图动画进行分解,

  • X轴旋转->滚转(roll)
    roll
  • Y轴旋转->俯仰(pitch)
    pitch
  • Z轴旋转->偏航(yaw)
    yaw

2.1 万向锁的产生

根据上节对欧拉角的介绍,我们知道了欧拉角把3D 空间中任意一个旋转分解成了三次欧拉角旋转,并且介绍了rpy角和对偶的ZYX欧拉角,最终的旋转矩阵写成了三个矩阵相乘的形式。其中,每一次旋转变换就代表着有一个万向节。所以,在这里我们一共有固定的三个万向节。我们可以改变每次旋转的角度,但是不论怎么变化角度这个旋转的顺序都是不能改变的。
大部分情况下,这一套顺序都能够对三个不同的轴分别进行三次旋转。然而,在某一些特殊情况下,它其中的某两个旋转变换可能变换的是同一个轴(这里指的不是物体自身的轴,而是外部或者世界的轴),这样就导致我们丧失了一个轴的自由度,从而导致万向锁的产生。
假设我们使用𝑥-𝑦-𝑧的顺序旋转任意一个点。其中,我们沿𝑥轴旋转任意度数,沿𝑦轴旋转𝜋/2弧度,最后,我们再沿着𝑧轴旋转任意的度数。

首先沿着𝑥轴旋转任意的度数:沿着𝑥轴旋转任意的度数
接下来,我们沿𝑦轴旋转𝜋/2弧度:
沿𝑦轴旋转𝜋/2弧度
注意,经过这一次的变换之后,我们将𝑧轴变换到原来𝑥轴方向,而𝑥轴变到原来−𝑧的方向。
这个变换执行完毕后,我们仅仅只剩下一个𝑧轴的旋转矩阵了。然而,当前的𝑧轴与原来的𝑥轴重合,也就是说,最后𝑧轴的旋转与𝑥轴的旋转其实操纵的是同一个轴(同样,这里指的是外部的旋转轴,在图中用红色标出)。三次旋转变换仅仅覆盖了两个外部轴的旋转,一个自由度就这样丢失了,这也就导致了万向锁的现象。
现在,如果我们想要操纵第三个轴的旋转(也就是在𝑦轴变换之前𝑧轴所表示的竖直方向),就需要对𝑦轴变换之后的𝑥轴进行旋转.然而,唯一的𝑥轴万向节(或者变换)优先级在最外部,我们当时操纵它的时候,它操纵的外部旋转轴还与现在的𝑧方向相同,并不能补回这个自由度。
在此,假设绕XYZ三个轴旋转的角度分别为α、β、γ,给出三次旋转矩阵计算的公式
R x ( α ) = [ 1 0 0 0 c o s α − s i n α 0 s i n α − c o s α ] , R y ( β ) = [ c o s β 0 s i n β 0 1 0 − s i n β 0 c o s β ] , R z ( γ ) = [ c o s γ − s i n γ 0 s i n γ c o s γ 0 0 0 1 ] R_x(\alpha)= \begin{bmatrix} 1&0&0 \\ 0 &cos{\alpha}&-sin{\alpha} \\ 0&sin{\alpha} &-cos{\alpha} \end{bmatrix},R_y(\beta)= \begin{bmatrix} cos{\beta}&0 &sin{\beta} \\ 0 &1&0 \\ -sin{\beta}& 0 &cos{\beta} \end{bmatrix},R_z(\gamma)= \begin{bmatrix} cos{\gamma}&-sin{\gamma}&0 \\ sin{\gamma} &cos{\gamma}&0 \\ 0&0&1 \end{bmatrix} Rx(α)= 1000cosαsinα0sinαcosα Ry(β)= cosβ0sinβ010sinβ0cosβ Rz(γ)= cosγsinγ0sinγcosγ0001 下面,我们通过旋转矩阵对产生万向锁的变换进行数学上的理解
E ( α , π / 2 , β ) = R z ( β ) R y ( π / 2 ) R x ( α ) = [ 0 c o s ( β ) ∗ s i n ( α ) − c o s ( α ) ∗ s i n ( β ) s i n ( α ) ∗ s i n ( β ) + c o s ( α ) ∗ c o s ( β ) 0 s i n ( α ) ∗ s i n ( β ) + c o s ( α ) ∗ c o s ( β ) c o s ( α ) ∗ s i n ( β ) − c o s ( β ) ∗ s i n ( α ) − 1 0 0 ] = [ 0 s i n ( α − β ) c o s ( α − β ) 0 c o s ( α − β ) − s i n ( α − β ) − 1 0 0 ] = R y ( π / 2 ) R x ( α − β ) E({\alpha},{\pi/2},{\beta})=R_z(\beta)R_y(\pi/2)R_x(\alpha) =\begin{bmatrix} 0&cos(\beta)*sin(\alpha)-cos(\alpha)*sin(\beta)&sin(\alpha)*sin(\beta)+cos(\alpha)*cos(\beta) \\ 0 &sin(\alpha)*sin(\beta)+cos(\alpha)*cos(\beta)&cos(\alpha)*sin(\beta)-cos(\beta)*sin(\alpha) \\ -1&0&0 \end{bmatrix} =\begin{bmatrix} 0&sin(\alpha-\beta)&cos(\alpha-\beta) \\ 0 &cos(\alpha-\beta)&-sin(\alpha-\beta) \\ -1&0&0 \end{bmatrix}=R_y(\pi/2)R_x(\alpha-\beta) E(α,π/2,β)=Rz(β)Ry(π/2)Rx(α)= 001cos(β)sin(α)cos(α)sin(β)sin(α)sin(β)+cos(α)cos(β)0sin(α)sin(β)+cos(α)cos(β)cos(α)sin(β)cos(β)sin(α)0 = 001sin(αβ)cos(αβ)0cos(αβ)sin(αβ)0 =Ry(π/2)Rx(αβ)利用一些三角恒等式,我将原本由三个旋转矩阵所组成的变换化简成了两个变换矩阵。即便我们分别对𝑥-𝑦-𝑧三轴进行了旋转,实际上这个矩阵仅仅旋转了𝑥-𝑦两轴,它并没有对(初始的)𝑧轴进行变换。 𝑅 𝑧 ( β ) 𝑅_𝑧(\beta) Rz(β) 𝑅 𝑥 ( α ) 𝑅_𝑥(\alpha) Rx(α)这两个变换被合并为单独的一个 𝑅 𝑥 ( α − β ) 𝑅_𝑥(\alpha − \beta) Rx(αβ)变换(因为化简完之后变换顺序不一样了,严格来说并不是合并,只不过是能够使用一步来完成)。
注意,我们在这里化简的并不是单独的一个变换,而是一系列变换。因为它对任意𝛼 和𝛽 角都是成立的。也就是说,一旦𝑦轴上的变换角将这两个旋转轴对齐,我们就没有任何办法对最初的𝑧轴进行旋转了。无论𝑥轴与𝑧轴的旋转角是多少,变换都会丧失一个自由度。
当然这也不是说现在没有办法对最初的𝑧轴进行变换.我们只需要在最内部添加一个𝑥轴万向节,或者说在变换序列的最后再添加一个𝑥轴的旋转变换,就能解决问题了(注意下面经过 𝑅 𝑦 𝑅_𝑦 Ry变换之后 𝑅 𝑥 𝑅_𝑥 Rx操纵的其实是原本的𝑧轴):
E ( α , π / 2 , β , γ ) = R x ( γ ) R z ( β ) R y ( π / 2 ) R x ( α ) = R x ( γ ) R y ( π / 2 ) R x ( α − β ) E({\alpha},{\pi/2},{\beta},{\gamma})=R_x(\gamma)R_z(\beta)R_y(\pi/2)R_x(\alpha)=R_x(\gamma)R_y(\pi/2)R_x(\alpha-\beta) E(α,π/2,β,γ)=Rx(γ)Rz(β)Ry(π/2)Rx(α)=Rx(γ)Ry(π/2)Rx(αβ)然而,我们之前说过,我们选择的是固定的三个旋转顺序,实际上并没有这个第四个万向节,所以没办法解决这个问题。虽然你在当初选择顺序的时候也可以选择采用四个万向节的设计,但是这仍不能完全解决问题,因为除了𝑦轴之外其它轴的旋转仍然可能将其中的两个轴或者三个轴对齐,只不过现在万向锁产生的几率可能会变小而已。万向锁问题的核心还是在于我们采用了固定的旋转顺序。

创作不易,希望大家支持,多多点赞收藏!!!!非常感谢!!!!

参考资料:
https://en.wikipedia.org/wiki/Euler_angles
https://en.wikipedia.org/wiki/Davenport_chained_rotations
欧拉角与万向锁
https://en.wikipedia.org/wiki/Gimbal
https://wiki.ogre3d.org/tiki-index.php?page=Euler+Angle+Class
视觉SLAM十四讲:从理论到实践(第2版)(ISBN:9787121369421)
现代机器人学:机构、规划与控制(ISBN:9787111639848)
机器人学:建模、控制与视觉(ISBN:9787568062350)

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羊羊羊ox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值