3D物体是如何旋转滴1

  1. 1. 轴角表示法
  2. 2. 欧拉角表示法
  3. 3. 旋转矩阵 方向余弦
  4. 4. 四元数

表示二维物体的旋转十分简单,通过一个旋转矩阵就可以把一个二维向量旋转任意角度(就如同前面文章中所说的Park变换与反Park变换那样),所以二维的旋转可以用一个2X2的矩阵表示。
然鹅,三维物体虽然也可用3X3矩阵表示,但它涉及到的运算与限制较二维要更麻烦一些,这次我们来讨论一下三维空间中的旋转(搞控制的和做游戏的都可以留下来康康啊!)

这篇文章借鉴了许多CSDN、知乎上的大佬们,很多图都不是自己画的,侵删侵删!
尤其感谢知乎大佬,也是哈工大电气的亲学长FrancisZhao,您在知乎的专栏控制工程师笔记给我带来了很多收获!

研究物体如何旋转,首先要知道旋转是什么,我理解中的旋转是:

  1. 对坐标系的旋转,使其中点在新旧坐标系中的坐标发生变化,并且能够用数学方式表达这个变化;
  2. 或者你可以认为是直接对点、向量进行旋转,而坐标系不变。

接下来我们就要研究物体旋转的表示方法,也就是坐标变换的方法,最常用的旋转表示方法有如下几种

  1. 轴角法
  2. 欧拉角法
  3. 旋转矩阵、方向余弦
  4. 四元数

我们主要就是来讲解一下这几种旋转表示法————

轴角表示法

zhoujiao.png
轴角表示法,顾名思义,就是使用一个轴(可以认为是一个单位向量,也可认为是一条过原点的直线)加一个角度来表示旋转。
三维空间中,轴是二自由度的,角是一个自由度,所以一共三自由度,来表示这个旋转完全没有问题。
其实,我们在二维旋转中一直在使用轴角法,只不过轴恰好就是Z轴,而角就是那个角,放到三维也是很好理解滴!

欧拉角表示法

eular.jpg
前面提到的轴角法将两个自由度的轴和一个自由度的角结合到了一起,而欧拉角则由三个旋转组成,即三个自由度都由角组成。
这三次旋转所绕的轴都是确定的,即坐标轴,根据选择轴的顺序、选择固定轴或者运动轴(即使用上次旋转后得到的新坐标系还是使用最初的坐标系)与选择三轴都转或者只转两轴,一共有24种欧拉角!
我们做控制最常用的一种欧拉角就是zxy,也就是在云台指向y轴的情况下先转yaw,再转pitch,再转roll(比如RM的云台角度解算用的就是这种)
要注意的是,在做结算之前,一定要先约定好欧拉角的类型,否则无论如何也得不到正确的角度!

旋转矩阵 方向余弦

二维情况——绕Z轴转动,可得到一个2X2的矩阵来表示这个旋转,我们称其为旋转矩阵;
2d.jpg
三维情况下,如果也是绕坐标轴进行旋转,我们也可利用一个旋转矩阵(3X3)来表示,这就是接下来我们要讨论的旋转矩阵!
(注:由于旋转矩阵是正交矩阵,因此它的逆就是变换θ的符号,也就是反向旋转,因此要注意旋转矩阵的形式,顺时针OR逆时针)
本文讨论的向量或点都是列向量形式!
向量或点左乘旋转矩阵,得到的结果是向量或点旋转过后得到的新向量或点相对于原坐标系的坐标(即第二种理解方式,向量或点的旋转)
若要求得在坐标系旋转A后,一个固定的点相对于新坐标系的坐标变化(即第一种理解方式,坐标系的旋转),则需要左乘那个旋转矩阵的逆矩阵也就是A’,即相当于点的反向旋转!
z-rotate.PNG
上面这些旋转矩阵都是逆时针为正的旋转。

这三次旋转(每次都绕新得到的坐标系旋转,角度即为三个欧拉角)的最终结果可以用矩阵乘法来计算(乘积顺序由对应的欧拉角旋转顺序决定),最终我们可以得到一个总的旋转矩阵:
multi.jpg
full.jpg
(注意!有时我们在计算中会由于数值原因产生非正交的旋转矩阵,这时就要进行归一化,这点对任何正交矩阵数值计算都适用)
旋转矩阵也不是每次必须通过麻烦地三个矩阵乘积来计算,他还可以通过旋转前后坐标系之间的角度关系来推算,这时我们就称它为方向余弦矩阵(DCM),具体算法如下:
dcm.jpg
其中大写字母是原坐标系的坐标轴,而小写字母则是旋转后坐标系的坐标轴。
DCM与旋转矩阵是等价的!

四元数

终于到了重头戏四元数!
四元数表示法是所有旋转表示法中最完美的,它不受万向节锁(Gimbal Lock)的限制,可以把多个旋转合并,具有唯一性,可以说是融合了前几种方案的所有优点!可能真的是因为用三个数表示三自由度就会出问题所以我们要用四个吧o( ̄▽ ̄)o
四元数的形式如下:
4vector.jpg
与轴角法类似,四元数的数学意义也是绕轴旋转特定角度,只不过表示形式发生了变换:
4zhoujiao.jpg
一个向量或点 可以用一个纯四元数来表示(θ=0,旋转了0°),而一个非纯四元数则表示一种旋转(θ!=0,旋转了非0°),其实把四元数可以看做是四维空间下的一个向量,而纯四元数则相当于在这个四维空间下的三位超平面上的一个点(很难以置信吧!)
四元数的运算与复数的运算十分类似,只不过i、j、k相当于不同的虚数轴,而求逆则相当于转-θ!
四元数这样表示一个旋转:
rotatef.jpg
这里用的也是对旋转的第二种理解方式,若想旋转坐标系q,则需把q用q^-1替换来得到新的坐标。
(注:四元数轴向量u要是一个单位向量!)
下面这个图完美解释了为什么要左右都乘且为什么是θ/2:
why.jpg

这次我们主要讨论了坐标表示法,下一篇我们将重点讲解利用四元数进行坐标解算,以及一些常用的互补滤波算法!